Add branch for JetStream v1.1

This is a copy of JetStream v1.1 as of https://commits.webkit.org/210186@main
diff --git a/8bitbench/ABOUT.md b/8bitbench/ABOUT.md
deleted file mode 100644
index 2c50e80..0000000
--- a/8bitbench/ABOUT.md
+++ /dev/null
@@ -1,486 +0,0 @@
-# 8 bit emulator WASM subtest
-
-Full source: https://github.com/justinmichaud/8bitbench
-
-8bitbench is a simple 8-bit emulator targeting wasm, written in rust, and designed as a microbenchmark for wasm engines.
-
-This should hopefully be representative of:
-- a rust project that was quickly ported to wasm
-- without any special optimization effort
-- and without any biases towards the performance characteristics of wasm engines of today.
-
-The code included here is not compatible with any existing 8-bit system.
-
-# Attribution
-This subtest uses the following libraries. Special thanks to the developers of these projects.
-
-
-# Emscripten
-https://github.com/emscripten-core/emsdk/blob/main/LICENSE
-
-Copyright (c) 2018 Emscripten authors (see AUTHORS in Emscripten)
-
-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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-----------------------------------------------------------------------------
-
-This is the MIT/Expat Licence. For more information see:
-
-1. http://www.opensource.org/licenses/mit-license.php
-
-2. http://en.wikipedia.org/wiki/MIT_License
-
-# PHF
-https://github.com/rust-phf/rust-phf
-The MIT License (MIT)
-
-Copyright (c) 2014-2022 Steven Fackler, Yuki Okushi
-
-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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-# Dyn_clone
-https://github.com/dtolnay/dyn-clone
-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", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
-# image-rs
-https://github.com/image-rs/image
-The MIT License (MIT)
-
-Copyright (c) 2014 PistonDevelopers
-
-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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-# wasm-bindgen
-https://github.com/rustwasm/wasm-bindgen
-Copyright (c) 2014 Alex Crichton
-
-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", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
-# wasm-pack
-https://github.com/rustwasm/wasm-pack
-Copyright (c) 2018 Ashley Williams
-
-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", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
-# coi-serviceworker
-https://github.com/gzuidhof/coi-serviceworker
-MIT License
-
-Copyright (c) 2021 Guido Zuidhof
-
-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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-
-# (for cli) fast-text-encoding
-https://github.com/samthor/fast-text-encoding
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   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.
-
-
-# console_error_panic_hook
-https://github.com/rustwasm/console_error_panic_hook
-Copyright (c) 2018 Nick Fitzgerald
-
-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", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
-# cc65 (used only to build program.bin, not included in the benchmark itself)
-https://github.com/cc65/cc65
-This software is provided 'as-is', without any express or implied warranty.
-In no event will the authors be held liable for any damages arising from
-the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
-claim that you wrote the original software. If you use this software in
-a product, an acknowledgment in the product documentation would be
-appreciated but is not required.
-
-2. Altered source versions must be plainly marked as such, and must not
-be misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any source distribution.
-
-
-# NESDOUG game tutorial (program.bin)
-https://github.com/nesdoug/26_Full_Game
-The MIT License (MIT)
-Copyright (c) 2018 Doug Fraker
-www.nesdoug.com
-
-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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-# Transitive dependencies
-
-MIT: color_quant, crunchy, emu_bench, image, memoffset, phf, phf_generator, phf_macros, phf_shared, scoped_threadpool, spin, tiff
-BSD-3-Clause: exr, lebe
-Zlib: nanorand
-Unlicense / MIT: byteorder
-0BSD / MIT / Apache-2.0: adler
-MIT / Apache-2.0: bit_field, bitflags, bumpalo, cfg-if, console_error_panic_hook, crc32fast, crossbeam-channel, crossbeam-deque, crossbeam-epoch, crossbeam-utils, dyn-clone, either, flate2, flume, futures-core, futures-sink, getrandom, gif, half, hermit-abi, jpeg-decoder, js-sys, libc, lock_api, log, num-integer, num-rational, num-traits, num_cpus, once_cell, pin-project, pin-project-internal, png, proc-macro2, quote, rand, rand_core, rayon, rayon-core, scopeguard, siphasher, smallvec, syn, threadpool, wasm-bindgen, wasm-bindgen-backend, wasm-bindgen-macro, wasm-bindgen-macro-support, wasm-bindgen-shared, weezl
-MIT / Apache-2.0 / Apache-2.0 WITH LLVM-exception: wasi
-MIT / Apache-2.0 / Zlib: bytemuck, miniz_oxide
-(MIT / Apache-2.0) AND Unicode-DFS-2016: unicode-ident
\ No newline at end of file
diff --git a/8bitbench/assets/program.bin b/8bitbench/assets/program.bin
deleted file mode 100644
index 06f7377..0000000
--- a/8bitbench/assets/program.bin
+++ /dev/null
Binary files differ
diff --git a/8bitbench/js3harness.js b/8bitbench/js3harness.js
deleted file mode 100644
index 9dbce62..0000000
--- a/8bitbench/js3harness.js
+++ /dev/null
@@ -1,50 +0,0 @@
-async function doRun() {
-
-function log(str) { }
-globalObject.log = log
-
-globalObject.getInput = function() {
-    return "t"
-}
-
-let verifyVideo = false
-let videoSum = 0
-globalObject.updateVideo = function(vec) {
-    if (vec.length != 4 * 256 * 240)
-        throw new Error("Wrong vec length")
-    if (!verifyVideo)
-        return
-    for (let i = 0, length = globalObject.video.length; i < length; ++i) {
-        videoSum += vec[i]
-    }
-}
-
-let ab = new ArrayBuffer(Int16Array.BYTES_PER_ELEMENT * 4 * 256 * 240)
-globalObject.video = new Int16Array(ab)
-
-let start = benchmarkTime()
-if (!Module.wasmBinary.length || !Module.romBinary.length)
-    throw new Error("Needed binary not loaded");
-
-await init(Module.wasmBinary)
-loadRom(Module.romBinary)
-js_tick()
-reportCompileTime(benchmarkTime() - start)
-start = benchmarkTime()
-
-let frames = 40 * 60
-for (let i = 0; i < frames; ++i) {
-    js_tick()
-}
-
-verifyVideo = true
-js_tick()
-
-if (video.length != 256 * 240 * 4)
-    throw "Length is wrong"
-
-if (videoSum != 45833688)
-    throw "Wrong video sum, the picture is wrong: " + videoSum
-
-reportRunTime(benchmarkTime() - start)
-}
\ No newline at end of file
diff --git a/8bitbench/lib/fast-text-encoding-1.0.3/text.js b/8bitbench/lib/fast-text-encoding-1.0.3/text.js
deleted file mode 100644
index 2438c76..0000000
--- a/8bitbench/lib/fast-text-encoding-1.0.3/text.js
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * Copyright 2017 Sam Thorogood. 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 Polyfill for TextEncoder and TextDecoder.
- *
- * You probably want `text.min.js`, and not this file directly.
- */
-
-//JSC
-const global = (0,eval)("this");
-
-(function(scope) {
-'use strict';
-
-// fail early
-if (scope['TextEncoder'] && scope['TextDecoder']) {
-  return false;
-}
-
-// used for FastTextDecoder
-const validUtfLabels = ['utf-8', 'utf8', 'unicode-1-1-utf-8'];
-
-/**
- * @constructor
- */
-function FastTextEncoder() {
-  // This does not accept an encoding, and always uses UTF-8:
-  //   https://www.w3.org/TR/encoding/#dom-textencoder
-}
-
-Object.defineProperty(FastTextEncoder.prototype, 'encoding', {value: 'utf-8'});
-
-/**
- * @param {string} string
- * @param {{stream: boolean}=} options
- * @return {!Uint8Array}
- */
-FastTextEncoder.prototype['encode'] = function(string, options={stream: false}) {
-  if (options.stream) {
-    throw new Error(`Failed to encode: the 'stream' option is unsupported.`);
-  }
-
-  let pos = 0;
-  const len = string.length;
-
-  let at = 0;  // output position
-  let tlen = Math.max(32, len + (len >>> 1) + 7);  // 1.5x size
-  let target = new Uint8Array((tlen >>> 3) << 3);  // ... but at 8 byte offset
-
-  while (pos < len) {
-    let value = string.charCodeAt(pos++);
-    if (value >= 0xd800 && value <= 0xdbff) {
-      // high surrogate
-      if (pos < len) {
-        const extra = string.charCodeAt(pos);
-        if ((extra & 0xfc00) === 0xdc00) {
-          ++pos;
-          value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000;
-        }
-      }
-      if (value >= 0xd800 && value <= 0xdbff) {
-        continue;  // drop lone surrogate
-      }
-    }
-
-    // expand the buffer if we couldn't write 4 bytes
-    if (at + 4 > target.length) {
-      tlen += 8;  // minimum extra
-      tlen *= (1.0 + (pos / string.length) * 2);  // take 2x the remaining
-      tlen = (tlen >>> 3) << 3;  // 8 byte offset
-
-      const update = new Uint8Array(tlen);
-      update.set(target);
-      target = update;
-    }
-
-    if ((value & 0xffffff80) === 0) {  // 1-byte
-      target[at++] = value;  // ASCII
-      continue;
-    } else if ((value & 0xfffff800) === 0) {  // 2-byte
-      target[at++] = ((value >>>  6) & 0x1f) | 0xc0;
-    } else if ((value & 0xffff0000) === 0) {  // 3-byte
-      target[at++] = ((value >>> 12) & 0x0f) | 0xe0;
-      target[at++] = ((value >>>  6) & 0x3f) | 0x80;
-    } else if ((value & 0xffe00000) === 0) {  // 4-byte
-      target[at++] = ((value >>> 18) & 0x07) | 0xf0;
-      target[at++] = ((value >>> 12) & 0x3f) | 0x80;
-      target[at++] = ((value >>>  6) & 0x3f) | 0x80;
-    } else {
-      continue;  // out of range
-    }
-
-    target[at++] = (value & 0x3f) | 0x80;
-  }
-
-  // Use subarray if slice isn't supported (IE11). This will use more memory
-  // because the original array still exists.
-  return target.slice ? target.slice(0, at) : target.subarray(0, at);
-}
-
-/**
- * @constructor
- * @param {string=} utfLabel
- * @param {{fatal: boolean}=} options
- */
-function FastTextDecoder(utfLabel='utf-8', options={fatal: false}) {
-  if (validUtfLabels.indexOf(utfLabel.toLowerCase()) === -1) {
-    throw new RangeError(
-      `Failed to construct 'TextDecoder': The encoding label provided ('${utfLabel}') is invalid.`);
-  }
-  // if (options.fatal) {
-  //   throw new Error(`Failed to construct 'TextDecoder': the 'fatal' option is unsupported.`);
-  // }
-}
-
-Object.defineProperty(FastTextDecoder.prototype, 'encoding', {value: 'utf-8'});
-
-Object.defineProperty(FastTextDecoder.prototype, 'fatal', {value: false});
-
-Object.defineProperty(FastTextDecoder.prototype, 'ignoreBOM', {value: false});
-
-/**
- * @param {!Uint8Array} bytes
- * @return {string}
- */
-function decodeBuffer(bytes) {
-  return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString('utf-8');
-}
-
-/**
- * @param {!Uint8Array} bytes
- * @return {string}
- */
-function decodeSyncXHR(bytes) {
-  const b = new Blob([bytes], {type: 'text/plain;charset=UTF-8'});
-  const u = URL.createObjectURL(b);
-
-  // This hack will fail in non-Edgium Edge because sync XHRs are disabled (and
-  // possibly in other places), so ensure there's a fallback call.
-  try {
-    const x = new XMLHttpRequest();
-    x.open('GET', u, false);
-    x.send();
-    return x.responseText;
-  } catch (e) {
-    return decodeFallback(bytes);
-  } finally {
-    URL.revokeObjectURL(u);
-  }
-}
-
-/**
- * @param {!Uint8Array} bytes
- * @return {string}
- */
-function decodeFallback(bytes) {
-  let inputIndex = 0;
-
-  // Create a working buffer for UTF-16 code points, but don't generate one
-  // which is too large for small input sizes. UTF-8 to UCS-16 conversion is
-  // going to be at most 1:1, if all code points are ASCII. The other extreme
-  // is 4-byte UTF-8, which results in two UCS-16 points, but this is still 50%
-  // fewer entries in the output.
-  const pendingSize = Math.min(256 * 256, bytes.length + 1);
-  const pending = new Uint16Array(pendingSize);
-  const chunks = [];
-  let pendingIndex = 0;
-
-  for (;;) {
-    const more = inputIndex < bytes.length;
-
-    // If there's no more data or there'd be no room for two UTF-16 values,
-    // create a chunk. This isn't done at the end by simply slicing the data
-    // into equal sized chunks as we might hit a surrogate pair.
-    if (!more || (pendingIndex >= pendingSize - 1)) {
-      // nb. .apply and friends are *really slow*. Low-hanging fruit is to
-      // expand this to literally pass pending[0], pending[1], ... etc, but
-      // the output code expands pretty fast in this case.
-      chunks.push(String.fromCharCode.apply(null, pending.subarray(0, pendingIndex)));
-
-      if (!more) {
-        return chunks.join('');
-      }
-
-      // Move the buffer forward and create another chunk.
-      bytes = bytes.subarray(inputIndex);
-      inputIndex = 0;
-      pendingIndex = 0;
-    }
-
-    // The native TextDecoder will generate "REPLACEMENT CHARACTER" where the
-    // input data is invalid. Here, we blindly parse the data even if it's
-    // wrong: e.g., if a 3-byte sequence doesn't have two valid continuations.
-
-    const byte1 = bytes[inputIndex++];
-    if ((byte1 & 0x80) === 0) {  // 1-byte or null
-      pending[pendingIndex++] = byte1;
-    } else if ((byte1 & 0xe0) === 0xc0) {  // 2-byte
-      const byte2 = bytes[inputIndex++] & 0x3f;
-      pending[pendingIndex++] = ((byte1 & 0x1f) << 6) | byte2;
-    } else if ((byte1 & 0xf0) === 0xe0) {  // 3-byte
-      const byte2 = bytes[inputIndex++] & 0x3f;
-      const byte3 = bytes[inputIndex++] & 0x3f;
-      pending[pendingIndex++] = ((byte1 & 0x1f) << 12) | (byte2 << 6) | byte3;
-    } else if ((byte1 & 0xf8) === 0xf0) {  // 4-byte
-      const byte2 = bytes[inputIndex++] & 0x3f;
-      const byte3 = bytes[inputIndex++] & 0x3f;
-      const byte4 = bytes[inputIndex++] & 0x3f;
-
-      // this can be > 0xffff, so possibly generate surrogates
-      let codepoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0c) | (byte3 << 0x06) | byte4;
-      if (codepoint > 0xffff) {
-        // codepoint &= ~0x10000;
-        codepoint -= 0x10000;
-        pending[pendingIndex++] = (codepoint >>> 10) & 0x3ff | 0xd800;
-        codepoint = 0xdc00 | codepoint & 0x3ff;
-      }
-      pending[pendingIndex++] = codepoint;
-    } else {
-      // invalid initial byte
-    }
-  }
-}
-
-// Decoding a string is pretty slow, but use alternative options where possible.
-let decodeImpl = decodeFallback;
-if (typeof Buffer === 'function' && Buffer.from) {
-  // Buffer.from was added in Node v5.10.0 (2015-11-17).
-  decodeImpl = decodeBuffer;
-} else if (typeof Blob === 'function' && typeof URL === 'function' && typeof URL.createObjectURL === 'function') {
-  // Blob and URL.createObjectURL are available from IE10, Safari 6, Chrome 19
-  // (all released in 2012), Firefox 19 (2013), ...
-  decodeImpl = decodeSyncXHR;
-}
-
-/**
- * @param {(!ArrayBuffer|!ArrayBufferView)} buffer
- * @param {{stream: boolean}=} options
- * @return {string}
- */
-FastTextDecoder.prototype['decode'] = function(buffer, options={stream: false}) {
-  if (options['stream']) {
-    throw new Error(`Failed to decode: the 'stream' option is unsupported.`);
-  }
-
-  if (!buffer)
-    return;
-
-  let bytes;
-
-  if (buffer instanceof Uint8Array) {
-    // Accept Uint8Array instances as-is.
-    bytes = buffer;
-  } else if (buffer.buffer instanceof ArrayBuffer) {
-    // Look for ArrayBufferView, which isn't a real type, but basically
-    // represents all the valid TypedArray types plus DataView. They all have
-    // ".buffer" as an instance of ArrayBuffer.
-    bytes = new Uint8Array(buffer.buffer);
-  } else {
-    // The only other valid argument here is that "buffer" is an ArrayBuffer.
-    // We also try to convert anything else passed to a Uint8Array, as this
-    // catches anything that's array-like. Native code would throw here.
-    bytes = new Uint8Array(buffer);
-  }
-
-  return decodeImpl(/** @type {!Uint8Array} */ (bytes));
-}
-
-scope['TextEncoder'] = FastTextEncoder;
-scope['TextDecoder'] = FastTextDecoder;
-
-}(typeof window !== 'undefined' ? window : (typeof global !== 'undefined' ? global : this)));
diff --git a/8bitbench/rust/pkg/emu_bench.js b/8bitbench/rust/pkg/emu_bench.js
deleted file mode 100644
index bdef81d..0000000
--- a/8bitbench/rust/pkg/emu_bench.js
+++ /dev/null
@@ -1,277 +0,0 @@
-
-let wasm;
-
-const heap = new Array(32).fill(undefined);
-
-heap.push(undefined, null, true, false);
-
-function getObject(idx) { return heap[idx]; }
-
-let heap_next = heap.length;
-
-function dropObject(idx) {
-    if (idx < 36) return;
-    heap[idx] = heap_next;
-    heap_next = idx;
-}
-
-function takeObject(idx) {
-    const ret = getObject(idx);
-    dropObject(idx);
-    return ret;
-}
-
-const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
-
-cachedTextDecoder.decode();
-
-let cachedUint8Memory0 = new Uint8Array();
-
-function getUint8Memory0() {
-    if (cachedUint8Memory0.byteLength === 0) {
-        cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
-    }
-    return cachedUint8Memory0;
-}
-
-function getStringFromWasm0(ptr, len) {
-    return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
-}
-
-function logError(f, args) {
-    try {
-        return f.apply(this, args);
-    } catch (e) {
-        let error = (function () {
-            try {
-                return e instanceof Error ? `${e.message}\n\nStack:\n${e.stack}` : e.toString();
-            } catch(_) {
-                return "<failed to stringify thrown value>";
-            }
-        }());
-        console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:", error);
-        throw e;
-    }
-}
-
-function addHeapObject(obj) {
-    if (heap_next === heap.length) heap.push(heap.length + 1);
-    const idx = heap_next;
-    heap_next = heap[idx];
-
-    heap[idx] = obj;
-    return idx;
-}
-
-let WASM_VECTOR_LEN = 0;
-
-const cachedTextEncoder = new TextEncoder('utf-8');
-
-const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
-    ? function (arg, view) {
-    return cachedTextEncoder.encodeInto(arg, view);
-}
-    : function (arg, view) {
-    const buf = cachedTextEncoder.encode(arg);
-    view.set(buf);
-    return {
-        read: arg.length,
-        written: buf.length
-    };
-});
-
-function passStringToWasm0(arg, malloc, realloc) {
-
-    if (realloc === undefined) {
-        const buf = cachedTextEncoder.encode(arg);
-        const ptr = malloc(buf.length);
-        getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
-        WASM_VECTOR_LEN = buf.length;
-        return ptr;
-    }
-
-    let len = arg.length;
-    let ptr = malloc(len);
-
-    const mem = getUint8Memory0();
-
-    let offset = 0;
-
-    for (; offset < len; offset++) {
-        const code = arg.charCodeAt(offset);
-        if (code > 0x7F) break;
-        mem[ptr + offset] = code;
-    }
-
-    if (offset !== len) {
-        if (offset !== 0) {
-            arg = arg.slice(offset);
-        }
-        ptr = realloc(ptr, len, len = offset + arg.length * 3);
-        const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
-        const ret = encodeString(arg, view);
-
-        offset += ret.written;
-    }
-
-    WASM_VECTOR_LEN = offset;
-    return ptr;
-}
-
-let cachedInt32Memory0 = new Int32Array();
-
-function getInt32Memory0() {
-    if (cachedInt32Memory0.byteLength === 0) {
-        cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
-    }
-    return cachedInt32Memory0;
-}
-
-function getArrayU8FromWasm0(ptr, len) {
-    return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
-}
-/**
-*/
-function main() {
-    wasm.main();
-}
-
-function passArray8ToWasm0(arg, malloc) {
-    const ptr = malloc(arg.length * 1);
-    getUint8Memory0().set(arg, ptr / 1);
-    WASM_VECTOR_LEN = arg.length;
-    return ptr;
-}
-/**
-* @param {Uint8Array} file
-*/
-function loadRom(file) {
-    const ptr0 = passArray8ToWasm0(file, wasm.__wbindgen_malloc);
-    const len0 = WASM_VECTOR_LEN;
-    wasm.loadRom(ptr0, len0);
-}
-
-/**
-*/
-function js_tick() {
-    wasm.js_tick();
-}
-
-async function load(module, imports) {
-    if (typeof Response === 'function' && module instanceof Response) {
-        if (typeof WebAssembly.instantiateStreaming === 'function') {
-            try {
-                return await WebAssembly.instantiateStreaming(module, imports);
-
-            } catch (e) {
-                if (module.headers.get('Content-Type') != 'application/wasm') {
-                    console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
-
-                } else {
-                    throw e;
-                }
-            }
-        }
-
-        const bytes = await module.arrayBuffer();
-        return await WebAssembly.instantiate(bytes, imports);
-
-    } else {
-        const instance = await WebAssembly.instantiate(module, imports);
-
-        if (instance instanceof WebAssembly.Instance) {
-            return { instance, module };
-
-        } else {
-            return instance;
-        }
-    }
-}
-
-function getImports() {
-    const imports = {};
-    imports.wbg = {};
-    imports.wbg.__wbg_new_abda76e883ba8a5f = function() {
-        const ret = new Error();
-        return addHeapObject(ret);
-    };
-    imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) {
-        const ret = getObject(arg1).stack;
-        const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
-        const len0 = WASM_VECTOR_LEN;
-        getInt32Memory0()[arg0 / 4 + 1] = len0;
-        getInt32Memory0()[arg0 / 4 + 0] = ptr0;
-    };
-    imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) {
-        try {
-            console.error(getStringFromWasm0(arg0, arg1));
-        } finally {
-            wasm.__wbindgen_free(arg0, arg1);
-        }
-    };
-    imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
-        takeObject(arg0);
-    };
-    imports.wbg.__wbg_log_0c1cf5a571c1a0ca = function(arg0, arg1) {
-        log(getStringFromWasm0(arg0, arg1));
-    };
-    imports.wbg.__wbg_getInput_5fe2acd6b0cdc0fc = function(arg0) {
-        const ret = getInput();
-        const ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
-        const len0 = WASM_VECTOR_LEN;
-        getInt32Memory0()[arg0 / 4 + 1] = len0;
-        getInt32Memory0()[arg0 / 4 + 0] = ptr0;
-    };
-    imports.wbg.__wbg_updateVideo_e31fabf62b1c5896 = function(arg0, arg1) {
-        updateVideo(getArrayU8FromWasm0(arg0, arg1));
-    };
-    imports.wbg.__wbindgen_throw = function(arg0, arg1) {
-        throw new Error(getStringFromWasm0(arg0, arg1));
-    };
-    imports.wbg.__wbindgen_rethrow = function(arg0) {
-        throw takeObject(arg0);
-    };
-
-    return imports;
-}
-
-function initMemory(imports, maybe_memory) {
-}
-
-function finalizeInit(instance, module) {
-    wasm = instance.exports;
-    init.__wbindgen_wasm_module = module;
-    cachedInt32Memory0 = new Int32Array();
-    cachedUint8Memory0 = new Uint8Array();
-
-    wasm.__wbindgen_start();
-    return wasm;
-}
-
-function initSync(module) {
-    const imports = getImports();
-
-    initMemory(imports);
-
-    if (!(module instanceof WebAssembly.Module)) {
-        module = new WebAssembly.Module(module);
-    }
-
-    const instance = new WebAssembly.Instance(module, imports);
-
-    return finalizeInit(instance, module);
-}
-
-async function init(input) {
-    const imports = getImports();
-
-    if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
-        input = fetch(input);
-    }
-
-    initMemory(imports);
-
-    const { instance, module } = await load(await input, imports);
-
-    return finalizeInit(instance, module);
-}
\ No newline at end of file
diff --git a/8bitbench/rust/pkg/emu_bench_bg.wasm.debug b/8bitbench/rust/pkg/emu_bench_bg.wasm.debug
deleted file mode 100644
index 591acb7..0000000
--- a/8bitbench/rust/pkg/emu_bench_bg.wasm.debug
+++ /dev/null
Binary files differ
diff --git a/8bitbench/rust/pkg/emu_bench_bg.wasm.release b/8bitbench/rust/pkg/emu_bench_bg.wasm.release
deleted file mode 100644
index f7f0dfc..0000000
--- a/8bitbench/rust/pkg/emu_bench_bg.wasm.release
+++ /dev/null
Binary files differ
diff --git a/ARES-6/Air/README.md b/ARES-6/Air/README.md
deleted file mode 100644
index 9e45b6c..0000000
--- a/ARES-6/Air/README.md
+++ /dev/null
@@ -1,152 +0,0 @@
-# All about Air.js
-
-Air.js is an ES6 benchmark. It tries to faithfully use new features like arrow
-functions, classes, for-of, and Map/Set, among others. Air.js doesn't avoid any
-features out of fear that they might be slow, in the hope that we might learn
-how to make those features fast by looking at how Air.js and other benchmarks
-use them.
-
-This documents the motivation, design, and license of Air.js.
-
-To run Air.js, simply open "[Air.js/test.html](test.html)" in your browser. It
-will only run correctly if your browser supports ES6.
-
-## Motivation
-
-At the time that Air.js was written, most JavaScript benchmarks used ES5 or
-older versions of the language. ES6 testing mostly relied on microbenchmarks or
-conversions of existing tests to ES6. We try to use larger benchmarks to avoid
-over-optimizing for small pieces of code, and we avoid making changes to
-existing benchmarks because that approach has no limiting principle: if it's OK
-to change a benchmark to use a feature, does that mean we can also change it to
-remove the use of a feature we don't like? We feel that the best way to avoid
-falling into the trap of creating benchmarks that reinforce what some JS engine
-is already good at is to create a new benchmark from first principles.
-
-We only recently completed our new JavaScript compiler, called
-[B3](https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/). B3's
-backend, called
-[Air](https://webkit.org/docs/b3/assembly-intermediate-representation.html), is
-very CPU-intensive and uses a combination of object-oriented and functional
-idioms in C++. Additionally, it relies heavily on high speed maps and sets. It
-goes so far as to use customized map/set implementations - even more so than
-the rest of WebKit. This makes Air a great candidate for ES6 benchmarking.
-Air.js is a faithful ES6 implementation of Air. It pulls no punches: just as
-the original C++ Air was written with expressiveness as a top priority, Air.js
-is liberal in its use of modern ES6 idioms whenever this helps make the code
-more readable. Unlike the original C++ Air, Air.js doesn't exploit a deep
-understanding of compilers to make the code easy to compile.
-
-## Design
-
-Air.js runs one of the more expensive Air phases, Air::allocateStack(). This
-turns abstract stack references into concrete stack references, by selecting
-how to lay out stack slots in the stack frame. This requires liveness analysis
-and an interference graph.
-
-Air.js relies on three major ES6 features more so than most of the others:
-
-- Arrow functions. Like the C++ Air, Air.js uses a functional style of
-  iterating most non-trivial data-structures:
-
-        inst.forEachArg((arg, role, type, width) => ...)
-  
-  This is because the functional style allows the callbacks to mutate the data
-  being iterated: if the callback returns a non-null value, forEachArg() will
-  replace the argument with that value. This would not have been possible with
-  for-of.
-
-- For-of. Many Air data structures are amenable to for-of iteration. While the
-  innermost loops tend to use functional iteration, pretty much all of the
-  outer logic uses for-of heavily. For example:
-
-        for (let block of code) // Iterate over the basic blocks
-            for (let inst of block) // Iterate over the instructions in a block
-                ...
-
-- Map/Set. The liveness analysis and Air::allocateStack() rely on maps and
-  sets. For example, we use a liveAtHead map that is keyed by basic block. Its
-  values are sets of live stack slots. This is a relatively crude way of doing
-  liveness, but it is exactly how the original Air::LivenessAnalysis worked, so
-  we view it as being quite faithful to how a sensible programmer might use Map
-  and Set.
-
-Air.js also uses some other ES6 features. For example, it uses a Proxy
-in one place, though we doubt that it's on a critical path. Air.js uses classes
-and let/const extensively, as well a symbols. Symbols are used as enumeration
-elements, and so they frequently show up as cases in switch statements.
-
-The workflow of an Air.js run is pretty simple: we do 150 runs of allocateStack
-on four IR payloads.
-
-Each IR payload is a large piece of ES6 code that constructs an Air.js Code
-object, complete with blocks, temporaries, stack slots, and instructions. These
-payloads are generated by running Air::dumpAsJS() phase just prior to the
-native allocateStack phase on the largest hot function in four major JS
-benchmarks according to JavaScriptCore's internal profiling:
-
-- Octane/GBEmu, the executeIteration function.
-- Kraken/imaging-gaussian-blur, the gaussianBlur function.
-- Octane/Typescript, the scanIdentifier function,
-- Air.js, an anonymous closure identified by our profiler as ACLj8C.
-
-These payloads allow Air.js to precisely replay allocateStack on those actual
-functions.
-
-It was an a priori goal of Air.js to spend most of the time in the
-allocateStack phase. This is a faithful reproduction of the C++ allocateStack
-phase, including its use of an abstract liveness analysis. It's abstract in the
-sense that the same liveness algorithm can be reused for temporaries,
-registers, or stack slots. In C++ this meant using templates, while in ES6 it
-means more run-time dynamic dispatch.
-
-Each IR payload is executable code that allocates the IR, and about 15% of
-benchmark execution time is spent in that code. This is significant, but having
-learned this, we don't feel that it would be honest to try to change the
-efficiency of payload initialization. What if the payload initialization was
-more expensive on our engine than others? If it was, then such a change would
-not be fair.
-
-Air.js validates its results. We added a Code hashing capability to both the
-C++ Air and Air.js, and we assert each payload looks identical after
-allocateStack to what it would have looked like after the original C++
-allocateStack. We also validate that payloads hash properly before
-allcoateStack, to help catch bugs during payload initialization. We have not
-measured how long hashing takes, but it's a O(N) operation, while allocateStack
-is closer to O(N^2). We suspect that barring some engine pathologies, hashing
-should be much faster than allocateStack, and allocateStack should be where the
-bulk of time is spent.
-
-## License
-
-Copyright (C) 2016 Apple Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
-
-## Summary
-
-At the time that Air.js was written, we weren't happy with the ES6 benchmarks
-that were available to us. Air.js uses some ES6 features in anger, in the hope
-that we can learn about possible optimization strategies by looking at this and
-other benchmarks.
diff --git a/ARES-6/Air/airjs-tests.yaml b/ARES-6/Air/airjs-tests.yaml
deleted file mode 100644
index 6d55fbe..0000000
--- a/ARES-6/Air/airjs-tests.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2016 Apple Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1.  Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer. 
-# 2.  Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution. 
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-- path: .
-  tests:
-    - stress-test.js
-  cmd: defaultRunNoisyTest unless parseRunCommands
-
diff --git a/ARES-6/Air/all.js b/ARES-6/Air/all.js
deleted file mode 100644
index 825d97b..0000000
--- a/ARES-6/Air/all.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-
-load("symbols.js");
-load("tmp_base.js");
-load("arg.js");
-load("basic_block.js");
-load("code.js");
-load("frequented_block.js");
-load("inst.js");
-load("opcode.js");
-load("reg.js");
-load("stack_slot.js");
-load("tmp.js");
-load("util.js");
-load("custom.js");
-load("liveness.js");
-load("insertion_set.js");
-load("allocate_stack.js");
diff --git a/ARES-6/Air/allocate_stack.js b/ARES-6/Air/allocate_stack.js
deleted file mode 100644
index bada197..0000000
--- a/ARES-6/Air/allocate_stack.js
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-function allocateStack(code)
-{
-    if (code.frameSize)
-        throw new Error("Frame size already determined");
-    
-    function attemptAssignment(slot, offsetFromFP, otherSlots)
-    {
-        if (offsetFromFP > 0)
-            throw new Error("Expect negative offset");
-        
-        offsetFromFP = -roundUpToMultipleOf(slot.alignment, -offsetFromFP);
-        
-        for (let otherSlot of otherSlots) {
-            if (!otherSlot.offsetFromFP)
-                continue;
-            let overlap = rangesOverlap(
-                offsetFromFP,
-                offsetFromFP + slot.byteSize,
-                otherSlot.offsetFromFP,
-                otherSlot.offsetFromFP + otherSlot.byteSize);
-            if (overlap)
-                return false;
-        }
-        
-        slot.setOffsetFromFP(offsetFromFP);
-        return true;
-    }
-    
-    function assign(slot, otherSlots)
-    {
-        if (attemptAssignment(slot, -slot.byteSize, otherSlots))
-            return;
-        
-        for (let otherSlot of otherSlots) {
-            if (!otherSlot.offsetFromFP)
-                continue;
-            if (attemptAssignment(slot, otherSlot.offsetFromFP - slot.byteSize, otherSlots))
-                return;
-        }
-        
-        throw new Error("Assignment failed");
-    }
-    
-    // Allocate all of the escaped slots in order. This is kind of a crazy algorithm to allow for
-    // the possibility of stack slots being assigned frame offsets before we even get here.
-    let assignedEscapedStackSlots = [];
-    let escapedStackSlotsWorklist = [];
-    for (let slot of code.stackSlots) {
-        if (slot.isLocked) {
-            if (slot.offsetFromFP)
-                assignedEscapedStackSlots.push(slot);
-            else
-                escapedStackSlotsWorklist.push(slot);
-        } else {
-            if (slot.offsetFromFP)
-                throw new Error("Offset already assigned");
-        }
-    }
-    
-    // This is a fairly espensive loop, but it's OK because we'll usually only have a handful of
-    // escaped stack slots.
-    while (escapedStackSlotsWorklist.length) {
-        let slot = escapedStackSlotsWorklist.pop();
-        assign(slot, assignedEscapedStackSlots);
-        assignedEscapedStackSlots.push(slot);
-    }
-    
-    // Now we handle the spill slots.
-    let liveness = new Liveness(StackSlot, code);
-    let interference = new Map();
-    for (let slot of code.stackSlots)
-        interference.set(slot, new Set());
-    let slots = [];
-    
-    for (let block of code) {
-        let localCalc = liveness.localCalc(block);
-        
-        function interfere(instIndex)
-        {
-            Inst.forEachDef(
-                StackSlot, block.get(instIndex), block.get(instIndex + 1),
-                (slot, role, type, width) => {
-                    if (!slot.isSpill)
-                        return;
-                    
-                    for (let otherSlot of localCalc.liveSet) {
-                        interference.get(slot).add(otherSlot);
-                        interference.get(otherSlot).add(slot);
-                    }
-                });
-        }
-        
-        for (let instIndex = block.size; instIndex--;) {
-            // Kill dead stores. For simplicity we say that a store is killable if it has only late
-            // defs and those late defs are to things that are dead right now. We only do that
-            // because that's the only kind of dead stack store we will see here.
-            let inst = block.at(instIndex);
-            if (!inst.hasNonArgEffects) {
-                let ok = true;
-                inst.forEachArg((arg, role, type, width) => {
-                    if (Arg.isEarlyDef(role)) {
-                        ok = false;
-                        return;
-                    }
-                    if (!Arg.isLateDef(role))
-                        return;
-                    if (!arg.isStack) {
-                        ok = false;
-                        return;
-                    }
-                    
-                    let slot = arg.stackSlot;
-                    if (!slot.isSpill) {
-                        ok = false;
-                        return;
-                    }
-                    
-                    if (localCalc.liveSet.has(slot)) {
-                        ok = false;
-                        return;
-                    }
-                });
-                if (ok)
-                    inst.clear();
-            }
-            
-            interfere(instIndex);
-            localCalc.execute(instIndex);
-        }
-        interfere(-1);
-        
-        removeAllMatching(block.insts, inst => inst.opcode == Nop);
-    }
-    
-    // Now we assign stack locations. At its heart this algorithm is just first-fit. For each
-    // StackSlot we just want to find the offsetFromFP that is closest to zero while ensuring no
-    // overlap with other StackSlots that this overlaps with.
-    for (let slot of code.stackSlots) {
-        if (slot.offsetFromFP)
-            continue;
-        
-        assign(slot, assignedEscapedStackSlots.concat(Array.from(interference.get(slot))));
-    }
-    
-    // Figure out how much stack we're using for stack slots.
-    let frameSizeForStackSlots = 0;
-    for (let slot of code.stackSlots) {
-        frameSizeForStackSlots = Math.max(
-            frameSizeForStackSlots,
-            -slot.offsetFromFP);
-    }
-    
-    frameSizeForStackSlots = roundUpToMultipleOf(stackAlignmentBytes, frameSizeForStackSlots);
-
-    // No we need to deduce how much argument area we need.
-    for (let block of code) {
-        for (let inst of block) {
-            for (let arg of inst.args) {
-                if (arg.isCallArg) {
-                    // For now, we assume that we use 8 bytes of the call arg. But that's not
-                    // such an awesome assumption.
-                    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=150454
-                    if (arg.offset < 0)
-                        throw new Error("Did not expect negative offset for callArg");
-                    code.requestCallArgAreaSize(arg.offset + 8);
-                }
-            }
-        }
-    }
-    
-    code.setFrameSize(frameSizeForStackSlots + code.callArgAreaSize);
-    
-    // Finally transform the code to use Addrs instead of StackSlots. This is a lossless
-    // transformation since we can search the StackSlots array to figure out which StackSlot any
-    // offset-from-FP refers to.
-
-    // FIXME: This may produce addresses that aren't valid if we end up with a ginormous stack frame.
-    // We would have to scavenge for temporaries if this happened. Fortunately, this case will be
-    // extremely rare so we can do crazy things when it arises.
-    // https://bugs.webkit.org/show_bug.cgi?id=152530
-    
-    let insertionSet = new InsertionSet();
-    for (let block of code) {
-        for (let instIndex = 0; instIndex < block.size; ++instIndex) {
-            let inst = block.at(instIndex);
-            inst.forEachArg((arg, role, type, width) => {
-                function stackAddr(offset)
-                {
-                    return Arg.createStackAddr(offset, code.frameSize, width);
-                }
-                
-                switch (arg.kind) {
-                case Arg.Stack: {
-                    let slot = arg.stackSlot;
-                    if (Arg.isZDef(role)
-                        && slot.isSpill
-                        && slot.byteSize > Arg.bytes(width)) {
-                        // Currently we only handle this simple case because it's the only one
-                        // that arises: ZDef's are only 32-bit right now. So, when we hit these
-                        // assertions it means that we need to implement those other kinds of
-                        // zero fills.
-                        if (slot.byteSize != 8) {
-                            throw new Error(
-                                `Bad spill slot size for ZDef: ${slot.byteSize}, width is ${width}`);
-                        }
-                        if (width != 32)
-                            throw new Error("Bad width for ZDef");
-                        
-                        insertionSet.insert(
-                            instIndex + 1,
-                            new Inst(
-                                StoreZero32,
-                                [stackAddr(arg.offset + 4 + slot.offsetFromFP)]));
-                    }
-                    return stackAddr(arg.offset + slot.offsetFromFP);
-                }
-                case Arg.CallArg:
-                    return stackAddr(arg.offset - code.frameSize);
-                default:
-                    break;
-                }
-            });
-        }
-        insertionSet.execute(block.insts);
-    }
-}
diff --git a/ARES-6/Air/arg.js b/ARES-6/Air/arg.js
deleted file mode 100644
index 07aceda..0000000
--- a/ARES-6/Air/arg.js
+++ /dev/null
@@ -1,1064 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Arg {
-    constructor()
-    {
-        this._kind = Arg.Invalid;
-    }
-    
-    static isAnyUse(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseDef:
-        case Arg.UseZDef:
-        case Arg.LateUse:
-        case Arg.LateColdUse:
-        case Arg.Scratch:
-            return true;
-        case Arg.Def:
-        case Arg.ZDef:
-        case Arg.UseAddr:
-        case Arg.EarlyDef:
-            return false;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isColdUse(role)
-    {
-        switch (role) {
-        case Arg.ColdUse:
-        case Arg.LateColdUse:
-            return true;
-        case Arg.Use:
-        case Arg.UseDef:
-        case Arg.UseZDef:
-        case Arg.LateUse:
-        case Arg.Def:
-        case Arg.ZDef:
-        case Arg.UseAddr:
-        case Arg.Scratch:
-        case Arg.EarlyDef:
-            return false;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isWarmUse(role)
-    {
-        return Arg.isAnyUse(role) && !Arg.isColdUse(role);
-    }
-    
-    static cooled(role)
-    {
-        switch (role) {
-        case Arg.ColdUse:
-        case Arg.LateColdUse:
-        case Arg.UseDef:
-        case Arg.UseZDef:
-        case Arg.Def:
-        case Arg.ZDef:
-        case Arg.UseAddr:
-        case Arg.Scratch:
-        case Arg.EarlyDef:
-            return role;
-        case Arg.Use:
-            return Arg.ColdUse;
-        case Arg.LateUse:
-            return Arg.LateColdUse;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-
-    static isEarlyUse(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseDef:
-        case Arg.UseZDef:
-            return true;
-        case Arg.Def:
-        case Arg.ZDef:
-        case Arg.UseAddr:
-        case Arg.LateUse:
-        case Arg.LateColdUse:
-        case Arg.Scratch:
-        case Arg.EarlyDef:
-            return false;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isLateUse(role)
-    {
-        switch (role) {
-        case Arg.LateUse:
-        case Arg.LateColdUse:
-        case Arg.Scratch:
-            return true;
-        case Arg.ColdUse:
-        case Arg.Use:
-        case Arg.UseDef:
-        case Arg.UseZDef:
-        case Arg.Def:
-        case Arg.ZDef:
-        case Arg.UseAddr:
-        case Arg.EarlyDef:
-            return false;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isAnyDef(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseAddr:
-        case Arg.LateUse:
-        case Arg.LateColdUse:
-            return false;
-        case Arg.Def:
-        case Arg.UseDef:
-        case Arg.ZDef:
-        case Arg.UseZDef:
-        case Arg.EarlyDef:
-        case Arg.Scratch:
-            return true;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isEarlyDef(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseAddr:
-        case Arg.LateUse:
-        case Arg.Def:
-        case Arg.UseDef:
-        case Arg.ZDef:
-        case Arg.UseZDef:
-        case Arg.LateColdUse:
-            return false;
-        case Arg.EarlyDef:
-        case Arg.Scratch:
-            return true;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isLateDef(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseAddr:
-        case Arg.LateUse:
-        case Arg.EarlyDef:
-        case Arg.Scratch:
-        case Arg.LateColdUse:
-            return false;
-        case Arg.Def:
-        case Arg.UseDef:
-        case Arg.ZDef:
-        case Arg.UseZDef:
-            return true;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static isZDef(role)
-    {
-        switch (role) {
-        case Arg.Use:
-        case Arg.ColdUse:
-        case Arg.UseAddr:
-        case Arg.LateUse:
-        case Arg.Def:
-        case Arg.UseDef:
-        case Arg.EarlyDef:
-        case Arg.Scratch:
-        case Arg.LateColdUse:
-            return false;
-        case Arg.ZDef:
-        case Arg.UseZDef:
-            return true;
-        default:
-            throw new Error("Bad role");
-        }
-    }
-    
-    static typeForB3Type(type)
-    {
-        switch (type) {
-        case Int32:
-        case Int64:
-            return GP;
-        case Float:
-        case Double:
-            return FP;
-        default:
-            throw new Error("Bad B3 type");
-        }
-    }
-    
-    static widthForB3Type(type)
-    {
-        switch (type) {
-        case Int32:
-        case Float:
-            return 32;
-        case Int64:
-        case Double:
-            return 64;
-        default:
-            throw new Error("Bad B3 type");
-        }
-    }
-    
-    static conservativeWidth(type)
-    {
-        return type == GP ? Ptr : 64;
-    }
-    
-    static minimumWidth(type)
-    {
-        return type == GP ? 8 : 32;
-    }
-    
-    static bytes(width)
-    {
-        return width / 8;
-    }
-    
-    static widthForBytes(bytes)
-    {
-        switch (bytes) {
-        case 0:
-        case 1:
-            return 8;
-        case 2:
-            return 16;
-        case 3:
-        case 4:
-            return 32;
-        default:
-            if (bytes > 8)
-                throw new Error("Bad number of bytes");
-            return 64;
-        }
-    }
-    
-    static createTmp(tmp)
-    {
-        let result = new Arg();
-        result._kind = Arg.Tmp;
-        result._tmp = tmp;
-        return result;
-    }
-    
-    static fromReg(reg)
-    {
-        return Arg.createTmp(reg);
-    }
-    
-    static createImm(value)
-    {
-        let result = new Arg();
-        result._kind = Arg.Imm;
-        result._value = value;
-        return result;
-    }
-    
-    static createBigImm(lowValue, highValue = 0)
-    {
-        let result = new Arg();
-        result._kind = Arg.BigImm;
-        result._lowValue = lowValue;
-        result._highValue = highValue;
-        return result;
-    }
-    
-    static createBitImm(value)
-    {
-        let result = new Arg();
-        result._kind = Arg.BitImm;
-        result._value = value;
-        return result;
-    }
-    
-    static createBitImm64(lowValue, highValue = 0)
-    {
-        let result = new Arg();
-        result._kind = Arg.BitImm64;
-        result._lowValue = lowValue;
-        result._highValue = highValue;
-        return result;
-    }
-    
-    static createAddr(base, offset = 0)
-    {
-        let result = new Arg();
-        result._kind = Arg.Addr;
-        result._base = base;
-        result._offset = offset;
-        return result;
-    }
-    
-    static createStack(slot, offset = 0)
-    {
-        let result = new Arg();
-        result._kind = Arg.Stack;
-        result._slot = slot;
-        result._offset = offset;
-        return result;
-    }
-    
-    static createCallArg(offset)
-    {
-        let result = new Arg();
-        result._kind = Arg.CallArg;
-        result._offset = offset;
-        return result;
-    }
-    
-    static createStackAddr(offsetFromFP, frameSize, width)
-    {
-        let result = Arg.createAddr(Reg.callFrameRegister, offsetFromFP);
-        if (!result.isValidForm(width))
-            result = Arg.createAddr(Reg.stackPointerRegister, offsetFromFP + frameSize);
-        return result;
-    }
-    
-    static isValidScale(scale, width)
-    {
-        switch (scale) {
-        case 1:
-        case 2:
-        case 4:
-        case 8:
-            return true;
-        default:
-            return false;
-        }
-    }
-    
-    static logScale(scale)
-    {
-        switch (scale) {
-        case 1:
-            return 0;
-        case 2:
-            return 1;
-        case 4:
-            return 2;
-        case 8:
-            return 3;
-        default:
-            throw new Error("Bad scale");
-        }
-    }
-    
-    static createIndex(base, index, scale = 1, offset = 0)
-    {
-        let result = new Arg();
-        result._kind = Arg.Index;
-        result._base = base;
-        result._index = index;
-        result._scale = scale;
-        result._offset = offset;
-        return result;
-    }
-    
-    static createRelCond(condition)
-    {
-        let result = new Arg();
-        result._kind = Arg.RelCond;
-        result._condition = condition;
-        return result;
-    }
-    
-    static createResCond(condition)
-    {
-        let result = new Arg();
-        result._kind = Arg.ResCond;
-        result._condition = condition;
-        return result;
-    }
-    
-    static createDoubleCond(condition)
-    {
-        let result = new Arg();
-        result._kind = Arg.DoubleCond;
-        result._condition = condition;
-        return result;
-    }
-    
-    static createWidth(width)
-    {
-        let result = new Arg();
-        result._kind = Arg.Width;
-        result._width = width;
-        return result;
-    }
-    
-    static createSpecial()
-    {
-        let result = new Arg();
-        result._kind = Arg.Special;
-        return result;
-    }
-    
-    get kind() { return this._kind; }
-    get isTmp() { return this._kind == Arg.Tmp; }
-    get isImm() { return this._kind == Arg.Imm; }
-    get isBigImm() { return this._kind == Arg.BigImm; }
-    get isBitImm() { return this._kind == Arg.BitImm; }
-    get isBitImm64() { return this._kind == Arg.BitImm64; }
-    get isSomeImm()
-    {
-        switch (this._kind) {
-        case Arg.Imm:
-        case Arg.BitImm:
-            return true;
-        default:
-            return false;
-        }
-    }
-    get isSomeBigImm()
-    {
-        switch (this._kind) {
-        case Arg.BigImm:
-        case Arg.BitImm64:
-            return true;
-        default:
-            return false;
-        }
-    }
-    get isAddr() { return this._kind == Arg.Addr; }
-    get isStack() { return this._kind == Arg.Stack; }
-    get isCallArg() { return this._kind == Arg.CallArg; }
-    get isIndex() { return this._kind == Arg.Index; }
-    get isMemory()
-    {
-        switch (this._kind) {
-        case Arg.Addr:
-        case Arg.Stack:
-        case Arg.CallArg:
-        case Arg.Index:
-            return true;
-        default:
-            return false;
-        }
-    }
-    get isStackMemory()
-    {
-        switch (this._kind) {
-        case Arg.Addr:
-            return this._base == Reg.callFrameRegister
-                || this._base == Reg.stackPointerRegister;
-        case Arg.Stack:
-        case Arg.CallArg:
-            return true;
-        default:
-            return false;
-        }
-    }
-    get isRelCond() { return this._kind == Arg.RelCond; }
-    get isResCond() { return this._kind == Arg.ResCond; }
-    get isDoubleCond() { return this._kind == Arg.DoubleCond; }
-    get isCondition()
-    {
-        switch (this._kind) {
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-            return true;
-        default:
-            return false;
-        }
-    }
-    get isWidth() { return this._kind == Arg.Width; }
-    get isSpecial() { return this._kind == Arg.Special; }
-    get isAlive() { return this.isTmp || this.isStack; }
-    
-    get tmp()
-    {
-        if (this._kind != Arg.Tmp)
-            throw new Error("Called .tmp for non-tmp");
-        return this._tmp;
-    }
-    
-    get value()
-    {
-        if (!this.isSomeImm)
-            throw new Error("Called .value for non-imm");
-        return this._value;
-    }
-    
-    get lowValue()
-    {
-        if (!this.isSomeBigImm)
-            throw new Error("Called .lowValue for non-big-imm");
-        return this._lowValue;
-    }
-    
-    get highValue()
-    {
-        if (!this.isSomeBigImm)
-            throw new Error("Called .highValue for non-big-imm");
-        return this._highValue;
-    }
-    
-    get base()
-    {
-        switch (this._kind) {
-        case Arg.Addr:
-        case Arg.Index:
-            return this._base;
-        default:
-            throw new Error("Called .base for non-address");
-        }
-    }
-    
-    get hasOffset() { return this.isMemory; }
-    
-    get offset()
-    {
-        switch (this._kind) {
-        case Arg.Addr:
-        case Arg.Index:
-        case Arg.Stack:
-        case Arg.CallArg:
-            return this._offset;
-        default:
-            throw new Error("Called .offset for non-address");
-        }
-    }
-    
-    get stackSlot()
-    {
-        if (this._kind != Arg.Stack)
-            throw new Error("Called .stackSlot for non-address");
-        return this._slot;
-    }
-    
-    get index()
-    {
-        if (this._kind != Arg.Index)
-            throw new Error("Called .index for non-Index");
-        return this._index;
-    }
-    
-    get scale()
-    {
-        if (this._kind != Arg.Index)
-            throw new Error("Called .scale for non-Index");
-        return this._scale;
-    }
-    
-    get logScale()
-    {
-        return Arg.logScale(this.scale);
-    }
-    
-    get width()
-    {
-        if (this._kind != Arg.Width)
-            throw new Error("Called .width for non-Width");
-        return this._width;
-    }
-    
-    get isGPTmp() { return this.isTmp && this.tmp.isGP; }
-    get isFPTmp() { return this.isTmp && this.tmp.isFP; }
-    
-    get isGP()
-    {
-        switch (this._kind) {
-        case Arg.Imm:
-        case Arg.BigImm:
-        case Arg.BitImm:
-        case Arg.BitImm64:
-        case Arg.Addr:
-        case Arg.Index:
-        case Arg.Stack:
-        case Arg.CallArg:
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-        case Arg.Width:
-        case Arg.Special:
-            return true;
-        case Arg.Tmp:
-            return this.isGPTmp;
-        case Arg.Invalid:
-            return false;
-        default:
-            throw new Error("Bad kind");
-        }
-    }
-    
-    get isFP()
-    {
-        switch (this._kind) {
-        case Arg.Imm:
-        case Arg.BitImm:
-        case Arg.BitImm64:
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-        case Arg.Width:
-        case Arg.Special:
-        case Arg.Invalid:
-            return false;
-        case Arg.Addr:
-        case Arg.Index:
-        case Arg.Stack:
-        case Arg.CallArg:
-        case Arg.BigImm:
-            return true;
-        case Arg.Tmp:
-            return this.isFPTmp;
-        default:
-            throw new Error("Bad kind");
-        }
-    }
-    
-    get hasType()
-    {
-        switch (this._kind) {
-        case Arg.Imm:
-        case Arg.BitImm:
-        case Arg.BitImm64:
-        case Arg.Tmp:
-            return true;
-        default:
-            return false;
-        }
-    }
-    
-    get type()
-    {
-        return this.isGP ? GP : FP;
-    }
-    
-    isType(type)
-    {
-        switch (type) {
-        case Arg.GP:
-            return this.isGP;
-        case Arg.FP:
-            return this.isFP;
-        default:
-            throw new Error("Bad type");
-        }
-    }
-    
-    isCompatibleType(other)
-    {
-        if (this.hasType)
-            return other.isType(this.type);
-        if (other.hasType)
-            return this.isType(other.type);
-        return true;
-    }
-    
-    get isGPR() { return this.isTmp && this.tmp.isGPR; }
-    get gpr() { return this.tmp.gpr; }
-    get isFPR() { return this.isTmp && this.tmp.isFPR; }
-    get fpr() { return this.tmp.fpr; }
-    get isReg() { return this.isTmp && this.tmp.isReg; }
-    get reg() { return this.tmp.reg; }
-    
-    static isValidImmForm(value)
-    {
-        return isRepresentableAsInt32(value);
-    }
-    static isValidBitImmForm(value)
-    {
-        return isRepresentableAsInt32(value);
-    }
-    static isValidBitImm64Form(value)
-    {
-        return isRepresentableAsInt32(value);
-    }
-    
-    static isValidAddrForm(offset, width)
-    {
-        return true;
-    }
-    
-    static isValidIndexForm(scale, offset, width)
-    {
-        if (!isValidScale(scale, width))
-            return false;
-        return true;
-    }
-    
-    isValidForm(width)
-    {
-        switch (this._kind) {
-        case Arg.Invalid:
-            return false;
-        case Arg.Tmp:
-            return true;
-        case Arg.Imm:
-            return Arg.isValidImmForm(this.value);
-        case Arg.BigImm:
-            return true;
-        case Arg.BitImm:
-            return Arg.isValidBitImmForm(this.value);
-        case Arg.BitImm64:
-            return Arg.isValidBitImm64Form(this.value);
-        case Arg.Addr:
-        case Arg.Stack:
-        case Arg.CallArg:
-            return Arg.isValidAddrForm(this.offset, width);
-        case Arg.Index:
-            return Arg.isValidIndexForm(this.scale, this.offset, width);
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-        case Arg.Width:
-        case Arg.Special:
-            return true;
-        default:
-            throw new Error("Bad kind");
-        }
-    }
-    
-    forEachTmpFast(func)
-    {
-        switch (this._kind) {
-        case Arg.Tmp: {
-            let replacement;
-            if (replacement = func(this._tmp))
-                return Arg.createTmp(replacement);
-            break;
-        }
-        case Arg.Addr: {
-            let replacement;
-            if (replacement = func(this._base))
-                return Arg.createAddr(replacement, this._offset);
-            break;
-        }
-        case Arg.Index: {
-            let baseReplacement = func(this._base);
-            let indexReplacement = func(this._index);
-            if (baseReplacement || indexReplacement) {
-                return Arg.createIndex(
-                    baseReplacement ? baseReplacement : this._base,
-                    indexReplacement ? indexReplacement : this._index,
-                    this._scale, this._offset);
-            }
-            break;
-        }
-        default:
-            break;
-        }
-    }
-    
-    usesTmp(expectedTmp)
-    {
-        let usesTmp = false;
-        forEachTmpFast(tmp => {
-            usesTmp |= tmp == expectedTmp;
-        });
-        return usesTmp;
-    }
-    
-    forEachTmp(role, type, width, func)
-    {
-        switch (this._kind) {
-        case Arg.Tmp: {
-            let replacement;
-            if (replacement = func(this._tmp, role, type, width))
-                return Arg.createTmp(replacement);
-            break;
-        }
-        case Arg.Addr: {
-            let replacement;
-            if (replacement = func(this._base, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr))
-                return Arg.createAddr(replacement, this._offset);
-            break;
-        }
-        case Arg.Index: {
-            let baseReplacement = func(this._base, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr);
-            let indexReplacement = func(this._index, Arg.Use, GP, role == Arg.UseAddr ? width : Ptr);
-            if (baseReplacement || indexReplacement) {
-                return Arg.createIndex(
-                    baseReplacement ? baseReplacement : this._base,
-                    indexReplacement ? indexReplacement : this._index,
-                    this._scale, this._offset);
-            }
-            break;
-        }
-        default:
-            break;
-        }
-    }
-    
-    is(thing) { return !!thing.extract(this); }
-    as(thing) { return thing.extract(this); }
-    
-    // This lets you say things like:
-    // arg.forEach(Tmp | Reg | Arg | StackSlot, ...)
-    //
-    // It's used for abstract liveness analysis.
-    forEachFast(thing, func)
-    {
-        return thing.forEachFast(this, func);
-    }
-    forEach(thing, role, type, width, func)
-    {
-        return thing.forEach(this, role, type, width, func);
-    }
-    
-    static extract(arg) { return arg; }
-    static forEachFast(arg, func) { return func(arg); }
-    static forEach(arg, role, type, width, func) { return func(arg, role, type, width); }
-
-    get condition()
-    {
-        switch (this._kind) {
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-            return this._condition;
-        default:
-            throw new Error("Called .condition for non-condition");
-        }
-    }
-    
-    get isInvertible()
-    {
-        switch (this._kind) {
-        case Arg.RelCond:
-        case Arg.DoubleCold:
-            return true;
-        case Arg.ResCond:
-            switch (this._condition) {
-            case Zero:
-            case NonZero:
-            case Signed:
-            case PositiveOrZero:
-                return true;
-            default:
-                return false;
-            }
-        default:
-            return false;
-        }
-    }
-    
-    static kindCode(kind)
-    {
-        switch (kind) {
-        case Arg.Invalid:
-            return 0;
-        case Arg.Tmp:
-            return 1;
-        case Arg.Imm:
-            return 2;
-        case Arg.BigImm:
-            return 3;
-        case Arg.BitImm:
-            return 4;
-        case Arg.BitImm64:
-            return 5;
-        case Arg.Addr:
-            return 6;
-        case Arg.Stack:
-            return 7;
-        case Arg.CallArg:
-            return 8;
-        case Arg.Index:
-            return 9;
-        case Arg.RelCond:
-            return 10;
-        case Arg.ResCond:
-            return 11;
-        case Arg.DoubleCond:
-            return 12;
-        case Arg.Special:
-            return 13;
-        case Arg.WidthArg:
-            return 14;
-        default:
-            throw new Error("Bad kind");
-        }
-    }
-    
-    hash()
-    {
-        let result = Arg.kindCode(this._kind);
-        
-        switch (this._kind) {
-        case Arg.Invalid:
-        case Arg.Special:
-            break;
-        case Arg.Tmp:
-            result += this._tmp.hash();
-            result |= 0;
-            break;
-        case Arg.Imm:
-        case Arg.BitImm:
-            result += this._value;
-            result |= 0;
-            break;
-        case Arg.BigImm:
-        case Arg.BitImm64:
-            result += this._lowValue;
-            result |= 0;
-            result += this._highValue;
-            result |= 0;
-            break;
-        case Arg.CallArg:
-            result += this._offset;
-            result |= 0;
-            break;
-        case Arg.RelCond:
-            result += relCondCode(this._condition);
-            result |= 0;
-            break;
-        case Arg.ResCond:
-            result += resCondCode(this._condition);
-            result |= 0;
-            break;
-        case Arg.DoubleCond:
-            result += doubleCondCode(this._condition);
-            result |= 0;
-            break;
-        case Arg.WidthArg:
-            result += this._width;
-            result |= 0;
-            break;
-        case Arg.Addr:
-            result += this._offset;
-            result |= 0;
-            result += this._base.hash();
-            result |= 0;
-            break;
-        case Arg.Index:
-            result += this._offset;
-            result |= 0;
-            result += this._scale;
-            result |= 0;
-            result += this._base.hash();
-            result |= 0;
-            result += this._index.hash();
-            result |= 0;
-            break;
-        case Arg.Stack:
-            result += this._offset;
-            result |= 0;
-            result += this.stackSlot.index;
-            result |= 0;
-            break;
-        }
-        
-        return result >>> 0;
-    }
-    
-    toString()
-    {
-        switch (this._kind) {
-        case Arg.Invalid:
-            return "<invalid>";
-        case Arg.Tmp:
-            return this._tmp.toString();
-        case Arg.Imm:
-            return "$" + this._value;
-        case Arg.BigImm:
-        case Arg.BitImm64:
-            return "$0x" + this._highValue.toString(16) + ":" + this._lowValue.toString(16);
-        case Arg.Addr:
-            return "" + (this._offset ? this._offset : "") + "(" + this._base + ")";
-        case Arg.Index:
-            return "" + (this._offset ? this._offset : "") + "(" + this._base +
-                "," + this._index + (this._scale == 1 ? "" : "," + this._scale) + ")";
-        case Arg.Stack:
-            return "" + (this._offset ? this._offset : "") + "(" + this._slot + ")";
-        case Arg.CallArg:
-            return "" + (this._offset ? this._offset : "") + "(callArg)";
-        case Arg.RelCond:
-        case Arg.ResCond:
-        case Arg.DoubleCond:
-            return symbolName(this._condition);
-        case Arg.Special:
-            return "special";
-        case Arg.Width:
-            return "" + this._value;
-        default:
-            throw new Error("Bad kind");
-        }
-    }
-}
-
-// Arg kinds
-Arg.Invalid = Symbol("Invalid");
-Arg.Tmp = Symbol("Tmp");
-Arg.Imm = Symbol("Imm");
-Arg.BigImm = Symbol("BigImm");
-Arg.BitImm = Symbol("BitImm");
-Arg.BitImm64 = Symbol("BitImm64");
-Arg.Addr = Symbol("Addr");
-Arg.Stack = Symbol("Stack");
-Arg.CallArg = Symbol("CallArg");
-Arg.Index = Symbol("Index");
-Arg.RelCond = Symbol("RelCond");
-Arg.ResCond = Symbol("ResCond");
-Arg.DoubleCond = Symbol("DoubleCond");
-Arg.Special = Symbol("Special");
-Arg.Width = Symbol("Width");
-
-// Arg roles
-Arg.Use = Symbol("Use");
-Arg.ColdUse = Symbol("ColdUse");
-Arg.LateUse = Symbol("LateUse");
-Arg.LateColdUse = Symbol("LateColdUse");
-Arg.Def = Symbol("Def");
-Arg.ZDef = Symbol("ZDef");
-Arg.UseDef = Symbol("UseDef");
-Arg.UseZDef = Symbol("UseZDef");
-Arg.EarlyDef = Symbol("EarlyDef");
-Arg.Scratch = Symbol("Scratch");
-Arg.UseAddr = Symbol("UseAddr");
-
diff --git a/ARES-6/Air/basic_block.js b/ARES-6/Air/basic_block.js
deleted file mode 100644
index dd9cea6..0000000
--- a/ARES-6/Air/basic_block.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class BasicBlock {
-    constructor(index, frequency)
-    {
-        this._index = index;
-        this._frequency = frequency;
-        this._insts = [];
-        this._successors = [];
-        this._predecessors = [];
-    }
-    
-    get index() { return this._index; }
-    get size() { return this._insts.length; }
-    
-    [Symbol.iterator]()
-    {
-        return this._insts[Symbol.iterator]();
-    }
-    
-    at(index)
-    {
-        if (index >= this._insts.length)
-            throw new Error("Out of bounds access");
-        return this._insts[index];
-    }
-    
-    get(index)
-    {
-        if (index < 0 || index >= this._insts.length)
-            return null;
-        return this._insts[index];
-    }
-    
-    get last()
-    {
-        return this._insts[this._insts.length - 1];
-    }
-    
-    get insts() { return this._insts; }
-    
-    append(inst) { this._insts.push(inst); }
-    
-    get numSuccessors() { return this._successors.length; }
-    successor(index) { return this._successors[index]; }
-    get successors() { return this._successors; }
-    
-    successorBlock(index) { return this._successors[index].block; }
-    get successorBlocks()
-    {
-        return new Proxy(this._successors, {
-            get(target, property) {
-                if (typeof property == "string"
-                    && (property | 0) == property)
-                    return target[property].block;
-                return target[property];
-            },
-            
-            set(target, property, value) {
-                if (typeof property == "string"
-                    && (property | 0) == property) {
-                    var oldValue = target[property];
-                    target[property] = new FrequentedBlock(
-                        value, oldValue ? oldValue.frequency : Normal);
-                    return;
-                }
-                
-                target[property] = value;
-            }
-        });
-    }
-    
-    get numPredecessors() { return this._predecessors.length; }
-    predecessor(index) { return this._predecessors[index]; }
-    get predecessors() { return this._predecessors; }
-    
-    get frequency() { return this._frequency; }
-
-    toString()
-    {
-        return "#" + this._index;
-    }
-    
-    get headerString()
-    {
-        let result = "";
-        result += `BB${this}: ; frequency = ${this._frequency}\n`;
-        if (this._predecessors.length)
-            result += "  Predecessors: " + this._predecessors.join(", ") + "\n";
-        return result;
-    }
-    
-    get footerString()
-    {
-        let result = "";
-        if (this._successors.length)
-            result += "  Successors: " + this._successors.join(", ") + "\n";
-        return result;
-    }
-    
-    toStringDeep()
-    {
-        let result = "";
-        result += this.headerString;
-        for (let inst of this)
-            result += `    ${inst}\n`;
-        result += this.footerString;
-        return result;
-    }
-}
-
diff --git a/ARES-6/Air/benchmark.js b/ARES-6/Air/benchmark.js
deleted file mode 100644
index 89c7629..0000000
--- a/ARES-6/Air/benchmark.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Benchmark {
-    constructor()
-    {
-        this._verbose = false;
-        
-        this._payloads = [
-            {generate: createPayloadGbemuExecuteIteration, earlyHash: 632653144, lateHash: 372715518},
-            {generate: createPayloadImagingGaussianBlurGaussianBlur, earlyHash: 3677819581, lateHash: 1252116304},
-            {generate: createPayloadTypescriptScanIdentifier, earlyHash: 1914852601, lateHash: 837339551},
-            {generate: createPayloadAirJSACLj8C, earlyHash: 1373599940, lateHash: 3981283600}
-        ];
-    }
-    
-    runIteration()
-    {
-        for (let payload of this._payloads) {
-            // Sadly about 17% of our time is in generate. I don't think that's really avoidable,
-            // and I don't mind testing VMs' ability to run such "data definition" code quickly. I
-            // would not have expected it to be so slow from first principles!
-            let code = payload.generate();
-            
-            if (this._verbose) {
-                print("Before allocateStack:");
-                print(code);
-            }
-            
-            let hash = code.hash();
-            if (hash != payload.earlyHash)
-                throw new Error(`Wrong early hash for ${payload.generate.name}: ${hash}`);
-            
-            allocateStack(code);
-            
-            if (this._verbose) {
-                print("After allocateStack:");
-                print(code);
-            }
-
-            hash = code.hash();
-            if (hash != payload.lateHash)
-                throw new Error(`Wrong late hash for ${payload.generate.name}: ${hash}`);
-        }
-    }
-}
diff --git a/ARES-6/Air/code.js b/ARES-6/Air/code.js
deleted file mode 100644
index 013814a..0000000
--- a/ARES-6/Air/code.js
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Code {
-    constructor()
-    {
-        this._blocks = [];
-        this._stackSlots = [];
-        this._gpTmps = [];
-        this._fpTmps = [];
-        this._callArgAreaSize = 0;
-        this._frameSize = 0;
-    }
-    
-    addBlock(frequency = 1)
-    {
-        return addIndexed(this._blocks, BasicBlock, frequency);
-    }
-    
-    addStackSlot(byteSize, kind)
-    {
-        return addIndexed(this._stackSlots, StackSlot, byteSize, kind);
-    }
-    
-    newTmp(type)
-    {
-        return addIndexed(this[`_${lowerSymbolName(type)}Tmps`], Tmp, type);
-    }
-    
-    get size() { return this._blocks.length; }
-    at(index) { return this._blocks[index]; }
-    
-    [Symbol.iterator]()
-    {
-        return this._blocks[Symbol.iterator]();
-    }
-    
-    get blocks() { return this._blocks; }
-    get stackSlots() { return this._stackSlots; }
-    
-    tmps(type) { return this[`_${lowerSymbolName(type)}Tmps`]; }
-    
-    get callArgAreaSize() { return this._callArgAreaSize; }
-    
-    requestCallArgAreaSize(size)
-    {
-        this._callArgAreaSize = Math.max(this._callArgAreaSize, roundUpToMultipleOf(stackAlignmentBytes, size));
-    }
-    
-    get frameSize() { return this._frameSize; }
-    
-    setFrameSize(frameSize) { this._frameSize = frameSize; }
-    
-    hash()
-    {
-        let result = 0;
-        for (let block of this) {
-            result *= 1000001;
-            result |= 0;
-            for (let inst of block) {
-                result *= 97;
-                result |= 0;
-                result += inst.hash();
-                result |= 0;
-            }
-            for (let successor of block.successorBlocks) {
-                result *= 7;
-                result |= 0;
-                result += successor.index;
-                result |= 0;
-            }
-        }
-        for (let slot of this.stackSlots) {
-            result *= 101;
-            result |= 0;
-            result += slot.hash();
-            result |= 0;
-        }
-        return result >>> 0;
-    }
-    
-    toString()
-    {
-        let result = "";
-        for (let block of this) {
-            result += block.toStringDeep();
-        }
-        if (this.stackSlots.length) {
-            result += "Stack slots:\n";
-            for (let slot of this.stackSlots)
-                result += `    ${slot}\n`;
-        }
-        if (this._frameSize)
-            result += `Frame size: ${this._frameSize}\n`;
-        if (this._callArgAreaSize)
-            result += `Call arg area size: ${this._callArgAreaSize}\n`;
-        return result;
-    }
-}
diff --git a/ARES-6/Air/custom.js b/ARES-6/Air/custom.js
deleted file mode 100644
index 04c73cb..0000000
--- a/ARES-6/Air/custom.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-const ShuffleCustom = {
-    forEachArg(inst, func)
-    {
-        var limit = Math.floor(inst.args.length / 3) * 3;
-        for (let i = 0; i < limit; i += 3) {
-            let src = inst.args[i + 0];
-            let dst = inst.args[i + 1];
-            let widthArg = inst.args[i + 2];
-            let width = widthArg.width;
-            let type = src.isGP && dst.isGP ? GP : FP;
-            inst.visitArg(i + 0, func, Arg.Use, type, width);
-            inst.visitArg(i + 1, func, Arg.Def, type, width);
-            inst.visitArg(i + 2, func, Arg.Use, GP, 8);
-        }
-    },
-    
-    hasNonArgNonControlEffects(inst)
-    {
-        return false;
-    }
-};
-
-const PatchCustom = {
-    forEachArg(inst, func)
-    {
-        for (let i = 0; i < inst.args.length; ++i) {
-            let {type, role, width} = inst.patchArgData[i];
-            inst.visitArg(i, func, role, type, width);
-        }
-    },
-    
-    hasNonArgNonControlEffects(inst)
-    {
-        return inst.patchHasNonArgEffects;
-    }
-};
-
-const CCallCustom = {
-    forEachArg(inst, func)
-    {
-        let index = 0;
-        inst.visitArg(index++, func, Arg.Use, GP, Ptr); // callee
-        
-        if (inst.cCallType != Void) {
-            inst.visitArg(
-                index++, func, Arg.Def, Arg.typeForB3Type(inst.cCallType),
-                Arg.widthForB3Type(inst.cCallType));
-        }
-        
-        for (let type of inst.cCallArgTypes) {
-            inst.visitArg(
-                index++, func, Arg.Use, Arg.typeForB3Type(type), Arg.widthForB3Type(type));
-        }
-    },
-    
-    hasNonArgNonControlEffects(inst)
-    {
-        return true;
-    }
-};
-
-const ColdCCallCustom = {
-    forEachArg(inst, func)
-    {
-        CCallCustom.forEachArg(
-            inst,
-            (arg, role, type, width) => {
-                return func(arg, Arg.cooled(role), type, width);
-            });
-    },
-    
-    hasNonArgNonControlEffects(inst)
-    {
-        return true;
-    }
-};
-
diff --git a/ARES-6/Air/frequented_block.js b/ARES-6/Air/frequented_block.js
deleted file mode 100644
index 6e0fa1f..0000000
--- a/ARES-6/Air/frequented_block.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class FrequentedBlock {
-    constructor(block, frequency)
-    {
-        this.block = block;
-        this.frequency = frequency;
-    }
-    
-    toString()
-    {
-        return (this.frequency == Normal ? "" : "Rare:") + this.block;
-    }
-}
diff --git a/ARES-6/Air/insertion_set.js b/ARES-6/Air/insertion_set.js
deleted file mode 100644
index b070a15..0000000
--- a/ARES-6/Air/insertion_set.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Insertion {
-    constructor(index, element)
-    {
-        this._index = index;
-        this._element = element;
-    }
-    
-    get index() { return this._index; }
-    get element() { return this._element; }
-    
-    lessThan(other)
-    {
-        return this._index < other._index;
-    }
-}
-
-class InsertionSet {
-    constructor()
-    {
-        this._insertions = []
-    }
-    
-    appendInsertion(insertion)
-    {
-        this._insertions.push(insertion);
-    }
-    
-    append(index, element)
-    {
-        this.appendInsertion(new Insertion(index, element));
-    }
-    
-    execute(target)
-    {
-        // We bubble-sort because that's what the C++ code, and for the same reason as we do it:
-        // the stdlib doesn't have a stable sort and mergesort is slower in the common case of the
-        // array usually being sorted. This array is usually sorted.
-        bubbleSort(this._insertions, (a, b) => (a.lessThan(b)));
-        
-        let numInsertions = this._insertions.length;
-        if (!numInsertions)
-            return 0;
-        let originalTargetSize = target.length;
-        target.length += numInsertions;
-        let lastIndex = target.length;
-        for (let indexInInsertions = numInsertions; indexInInsertions--;) {
-            let insertion = this._insertions[indexInInsertions];
-            if (indexInInsertions && insertion.index < this._insertions[indexInInsertions - 1].index)
-                throw new Error("Insertions out of order");
-            if (insertion.index > originalTargetSize)
-                throw new Error("Out-of-bounds insertion");
-            let firstIndex = insertion.index + indexInInsertions;
-            let indexOffset = indexInInsertions + 1;
-            for (let i = lastIndex; --i > firstIndex;)
-                target[i] = target[i - indexOffset];
-            target[firstIndex] = insertion.element;
-            lastIndex = firstIndex;
-        }
-        this._insertions = [];
-        return numInsertions;
-    }
-}
-
diff --git a/ARES-6/Air/inst.js b/ARES-6/Air/inst.js
deleted file mode 100644
index 2af5706..0000000
--- a/ARES-6/Air/inst.js
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Inst {
-    constructor(opcode, args = [])
-    {
-        this._opcode = opcode;
-        this._args = args;
-    }
-    
-    append(...args)
-    {
-        this._args.push(...args);
-    }
-    
-    clear()
-    {
-        this._opcode = Nop;
-        this._args = [];
-    }
-    
-    get opcode() { return this._opcode; }
-    get args() { return this._args; }
-    
-    visitArg(index, func, ...args)
-    {
-        let replacement = func(this._args[index], ...args);
-        if (replacement)
-            this._args[index] = replacement;
-    }
-    
-    forEachTmpFast(func)
-    {
-        for (let i = 0; i < this._args.length; ++i) {
-            let replacement;
-            if (replacement = this._args[i].forEachTmpFast(func))
-                this._args[i] = replacement;
-        }
-    }
-    
-    forEachArg(func)
-    {
-        Inst_forEachArg(this, func);
-    }
-    
-    forEachTmp(func)
-    {
-        this.forEachArg((arg, role, type, width) => {
-            return arg.forEachTmp(role, type, width, func);
-        });
-    }
-    
-    forEach(thing, func)
-    {
-        this.forEachArg((arg, role, type, width) => {
-            return arg.forEach(thing, role, type, width, func);
-        });
-    }
-    
-    static forEachDef(thing, prevInst, nextInst, func)
-    {
-        if (prevInst) {
-            prevInst.forEach(
-                thing,
-                (value, role, type, width) => {
-                    if (Arg.isLateDef(role))
-                        return func(value, role, type, width);
-                });
-        }
-        
-        if (nextInst) {
-            nextInst.forEach(
-                thing,
-                (value, role, type, width) => {
-                    if (Arg.isEarlyDef(role))
-                        return func(value, role, type, width);
-                });
-        }
-    }
-    
-    static forEachDefWithExtraClobberedRegs(thing, prevInst, nextInst, func)
-    {
-        forEachDef(thing, prevInst, nextInst, func);
-        
-        let regDefRole;
-        
-        let reportReg = reg => {
-            let type = reg.isGPR ? GP : FP;
-            func(thing.fromReg(reg), regDefRole, type, Arg.conservativeWidth(type));
-        };
-        
-        if (prevInst && prevInst.opcode == Patch) {
-            regDefRole = Arg.Def;
-            prevInst.extraClobberedRegs.forEach(reportReg);
-        }
-        
-        if (nextInst && nextInst.opcode == Patch) {
-            regDefRole = Arg.EarlyDef;
-            nextInst.extraEarlyClobberedRegs.forEach(reportReg);
-        }
-    }
-    
-    get hasNonArgEffects() { return Inst_hasNonArgEffects(this); }
-    
-    hash()
-    {
-        let result = opcodeCode(this.opcode);
-        for (let arg of this.args) {
-            result += arg.hash();
-            result |= 0;
-        }
-        return result >>> 0;
-    }
-    
-    toString()
-    {
-        return "" + symbolName(this._opcode) + " " + this._args.join(", ");
-    }
-}
-
diff --git a/ARES-6/Air/liveness.js b/ARES-6/Air/liveness.js
deleted file mode 100644
index f0ea319..0000000
--- a/ARES-6/Air/liveness.js
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Liveness {
-    constructor(thing, code)
-    {
-        this._thing = thing;
-        this._code = code;
-        
-        this._liveAtHead = new Map();
-        this._liveAtTail = new Map();
-        
-        for (let block of code) {
-            this._liveAtHead.set(block, new Set());
-            
-            let liveAtTail = new Set();
-            this._liveAtTail.set(block, liveAtTail);
-            
-            block.last.forEach(
-                thing,
-                (value, role, type, width) => {
-                    if (Arg.isLateUse(role))
-                        liveAtTail.add(value);
-                });
-        }
-        
-        let dirtyBlocks = new Set(code);
-        
-        let changed;
-        do {
-            changed = false;
-            
-            for (let blockIndex = code.size; blockIndex--;) {
-                let block = code.at(blockIndex);
-                if (!block)
-                    continue;
-                
-                if (!dirtyBlocks.delete(block))
-                    continue;
-                
-                let localCalc = this.localCalc(block);
-                for (let instIndex = block.size; instIndex--;)
-                    localCalc.execute(instIndex);
-                
-                // Handle the early def's of the first instruction.
-                block.at(0).forEach(
-                    thing,
-                    (value, role, type, width) => {
-                        if (Arg.isEarlyDef(role))
-                            localCalc.liveSet.remove(value);
-                    });
-                
-                let liveAtHead = this._liveAtHead.get(block);
-                
-                if (!mergeIntoSet(liveAtHead, localCalc.liveSet))
-                    continue;
-                
-                for (let predecessor of block.predecessors) {
-                    if (mergeIntoSet(this._liveAtTail.get(predecessor), liveAtHead)) {
-                        dirtyBlocks.add(predecessor);
-                        changed = true;
-                    }
-                }
-            }
-        } while (changed);
-    }
-    
-    get thing() { return this._thing; }
-    get code() { return this._code; }
-    get liveAtHead() { return this._liveAtHead; }
-    get liveAtTail() { return this._liveAtTail; }
-    
-    localCalc(block)
-    {
-        let liveness = this;
-        class LocalCalc {
-            constructor()
-            {
-                this._liveSet = new Set(liveness.liveAtTail.get(block));
-            }
-            
-            get liveSet() { return this._liveSet; }
-            
-            execute(instIndex)
-            {
-                let inst = block.at(instIndex);
-                
-                // First handle the early defs of the next instruction.
-                if (instIndex + 1 < block.size) {
-                    block.at(instIndex + 1).forEach(
-                        liveness.thing,
-                        (value, role, type, width) => {
-                            if (Arg.isEarlyDef(role))
-                                this._liveSet.delete(value);
-                        });
-                }
-                
-                // Then handle defs.
-                inst.forEach(
-                    liveness.thing,
-                    (value, role, type, width) => {
-                        if (Arg.isLateDef(role))
-                            this._liveSet.delete(value);
-                    });
-                
-                // Then handle uses.
-                inst.forEach(
-                    liveness.thing,
-                    (value, role, type, width) => {
-                        if (Arg.isEarlyUse(role))
-                            this._liveSet.add(value);
-                    });
-                
-                // Finally handle the late uses of the previous instruction.
-                if (instIndex - 1 >= 0) {
-                    block.at(instIndex - 1).forEach(
-                        liveness.thing,
-                        (value, role, type, width) => {
-                            if (Arg.isLateUse(role))
-                                this._liveSet.add(value);
-                        });
-                }
-            }
-        }
-        
-        return new LocalCalc();
-    }
-}
-
diff --git a/ARES-6/Air/make_dist.sh b/ARES-6/Air/make_dist.sh
deleted file mode 100644
index fe4c9a7..0000000
--- a/ARES-6/Air/make_dist.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-
-set -e
-set -x
-
-MARKDOWN="perl $HOME/Documents/Markdown.pl"
-
-rm -rf Air.js
-mkdir Air.js
-${MARKDOWN} < README.md > Air.js/index.html
-cp \
-    all.js \
-    allocate_stack.js \
-    arg.js \
-    basic_block.js \
-    benchmark.js \
-    code.js \
-    custom.js \
-    frequented_block.js \
-    insertion_set.js \
-    inst.js \
-    liveness.js \
-    opcode.js \
-    payload-airjs-ACLj8C.js \
-    payload-gbemu-executeIteration.js \
-    payload-imaging-gaussian-blur-gaussianBlur.js \
-    payload-typescript-scanIdentifier.js \
-    reg.js \
-    stack_slot.js \
-    symbols.js \
-    test.html \
-    test.js \
-    tmp.js \
-    tmp_base.js \
-    util.js \
-    Air.js/
-
-tar -czvf Air.js.tar.gz Air.js
-
diff --git a/ARES-6/Air/opcode.js b/ARES-6/Air/opcode.js
deleted file mode 100644
index 0f05c31..0000000
--- a/ARES-6/Air/opcode.js
+++ /dev/null
@@ -1,1655 +0,0 @@
-"use strict";
-// Generated by opcode_generator.rb from JavaScriptCore/b3/air/AirOpcode.opcodes -- do not edit!
-const Nop = Symbol("Nop");
-const Add32 = Symbol("Add32");
-const Add8 = Symbol("Add8");
-const Add16 = Symbol("Add16");
-const Add64 = Symbol("Add64");
-const AddDouble = Symbol("AddDouble");
-const AddFloat = Symbol("AddFloat");
-const Sub32 = Symbol("Sub32");
-const Sub64 = Symbol("Sub64");
-const SubDouble = Symbol("SubDouble");
-const SubFloat = Symbol("SubFloat");
-const Neg32 = Symbol("Neg32");
-const Neg64 = Symbol("Neg64");
-const NegateDouble = Symbol("NegateDouble");
-const Mul32 = Symbol("Mul32");
-const Mul64 = Symbol("Mul64");
-const MultiplyAdd32 = Symbol("MultiplyAdd32");
-const MultiplyAdd64 = Symbol("MultiplyAdd64");
-const MultiplySub32 = Symbol("MultiplySub32");
-const MultiplySub64 = Symbol("MultiplySub64");
-const MultiplyNeg32 = Symbol("MultiplyNeg32");
-const MultiplyNeg64 = Symbol("MultiplyNeg64");
-const Div32 = Symbol("Div32");
-const Div64 = Symbol("Div64");
-const MulDouble = Symbol("MulDouble");
-const MulFloat = Symbol("MulFloat");
-const DivDouble = Symbol("DivDouble");
-const DivFloat = Symbol("DivFloat");
-const X86ConvertToDoubleWord32 = Symbol("X86ConvertToDoubleWord32");
-const X86ConvertToQuadWord64 = Symbol("X86ConvertToQuadWord64");
-const X86Div32 = Symbol("X86Div32");
-const X86Div64 = Symbol("X86Div64");
-const Lea = Symbol("Lea");
-const And32 = Symbol("And32");
-const And64 = Symbol("And64");
-const AndDouble = Symbol("AndDouble");
-const AndFloat = Symbol("AndFloat");
-const XorDouble = Symbol("XorDouble");
-const XorFloat = Symbol("XorFloat");
-const Lshift32 = Symbol("Lshift32");
-const Lshift64 = Symbol("Lshift64");
-const Rshift32 = Symbol("Rshift32");
-const Rshift64 = Symbol("Rshift64");
-const Urshift32 = Symbol("Urshift32");
-const Urshift64 = Symbol("Urshift64");
-const Or32 = Symbol("Or32");
-const Or64 = Symbol("Or64");
-const Xor32 = Symbol("Xor32");
-const Xor64 = Symbol("Xor64");
-const Not32 = Symbol("Not32");
-const Not64 = Symbol("Not64");
-const AbsDouble = Symbol("AbsDouble");
-const AbsFloat = Symbol("AbsFloat");
-const CeilDouble = Symbol("CeilDouble");
-const CeilFloat = Symbol("CeilFloat");
-const FloorDouble = Symbol("FloorDouble");
-const FloorFloat = Symbol("FloorFloat");
-const SqrtDouble = Symbol("SqrtDouble");
-const SqrtFloat = Symbol("SqrtFloat");
-const ConvertInt32ToDouble = Symbol("ConvertInt32ToDouble");
-const ConvertInt64ToDouble = Symbol("ConvertInt64ToDouble");
-const ConvertInt32ToFloat = Symbol("ConvertInt32ToFloat");
-const ConvertInt64ToFloat = Symbol("ConvertInt64ToFloat");
-const CountLeadingZeros32 = Symbol("CountLeadingZeros32");
-const CountLeadingZeros64 = Symbol("CountLeadingZeros64");
-const ConvertDoubleToFloat = Symbol("ConvertDoubleToFloat");
-const ConvertFloatToDouble = Symbol("ConvertFloatToDouble");
-const Move = Symbol("Move");
-const Swap32 = Symbol("Swap32");
-const Swap64 = Symbol("Swap64");
-const Move32 = Symbol("Move32");
-const StoreZero32 = Symbol("StoreZero32");
-const SignExtend32ToPtr = Symbol("SignExtend32ToPtr");
-const ZeroExtend8To32 = Symbol("ZeroExtend8To32");
-const SignExtend8To32 = Symbol("SignExtend8To32");
-const ZeroExtend16To32 = Symbol("ZeroExtend16To32");
-const SignExtend16To32 = Symbol("SignExtend16To32");
-const MoveFloat = Symbol("MoveFloat");
-const MoveDouble = Symbol("MoveDouble");
-const MoveZeroToDouble = Symbol("MoveZeroToDouble");
-const Move64ToDouble = Symbol("Move64ToDouble");
-const Move32ToFloat = Symbol("Move32ToFloat");
-const MoveDoubleTo64 = Symbol("MoveDoubleTo64");
-const MoveFloatTo32 = Symbol("MoveFloatTo32");
-const Load8 = Symbol("Load8");
-const Store8 = Symbol("Store8");
-const Load8SignedExtendTo32 = Symbol("Load8SignedExtendTo32");
-const Load16 = Symbol("Load16");
-const Load16SignedExtendTo32 = Symbol("Load16SignedExtendTo32");
-const Store16 = Symbol("Store16");
-const Compare32 = Symbol("Compare32");
-const Compare64 = Symbol("Compare64");
-const Test32 = Symbol("Test32");
-const Test64 = Symbol("Test64");
-const CompareDouble = Symbol("CompareDouble");
-const CompareFloat = Symbol("CompareFloat");
-const Branch8 = Symbol("Branch8");
-const Branch32 = Symbol("Branch32");
-const Branch64 = Symbol("Branch64");
-const BranchTest8 = Symbol("BranchTest8");
-const BranchTest32 = Symbol("BranchTest32");
-const BranchTest64 = Symbol("BranchTest64");
-const BranchDouble = Symbol("BranchDouble");
-const BranchFloat = Symbol("BranchFloat");
-const BranchAdd32 = Symbol("BranchAdd32");
-const BranchAdd64 = Symbol("BranchAdd64");
-const BranchMul32 = Symbol("BranchMul32");
-const BranchMul64 = Symbol("BranchMul64");
-const BranchSub32 = Symbol("BranchSub32");
-const BranchSub64 = Symbol("BranchSub64");
-const BranchNeg32 = Symbol("BranchNeg32");
-const BranchNeg64 = Symbol("BranchNeg64");
-const MoveConditionally32 = Symbol("MoveConditionally32");
-const MoveConditionally64 = Symbol("MoveConditionally64");
-const MoveConditionallyTest32 = Symbol("MoveConditionallyTest32");
-const MoveConditionallyTest64 = Symbol("MoveConditionallyTest64");
-const MoveConditionallyDouble = Symbol("MoveConditionallyDouble");
-const MoveConditionallyFloat = Symbol("MoveConditionallyFloat");
-const MoveDoubleConditionally32 = Symbol("MoveDoubleConditionally32");
-const MoveDoubleConditionally64 = Symbol("MoveDoubleConditionally64");
-const MoveDoubleConditionallyTest32 = Symbol("MoveDoubleConditionallyTest32");
-const MoveDoubleConditionallyTest64 = Symbol("MoveDoubleConditionallyTest64");
-const MoveDoubleConditionallyDouble = Symbol("MoveDoubleConditionallyDouble");
-const MoveDoubleConditionallyFloat = Symbol("MoveDoubleConditionallyFloat");
-const Jump = Symbol("Jump");
-const Ret32 = Symbol("Ret32");
-const Ret64 = Symbol("Ret64");
-const RetFloat = Symbol("RetFloat");
-const RetDouble = Symbol("RetDouble");
-const Oops = Symbol("Oops");
-const Shuffle = Symbol("Shuffle");
-const Patch = Symbol("Patch");
-const CCall = Symbol("CCall");
-const ColdCCall = Symbol("ColdCCall");
-function Inst_forEachArg(inst, func)
-{
-    let replacement;
-    switch (inst.opcode) {
-    case Nop:
-        break;
-        break;
-    case Add32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Add8:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.UseDef, GP, 8);
-        break;
-        break;
-    case Add16:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.UseDef, GP, 16);
-        break;
-        break;
-    case Add64:
-        switch (inst.args.length) {
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Def, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case AddDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case AddFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Sub32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-        break;
-        break;
-    case Sub64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.UseDef, GP, 64);
-        break;
-        break;
-    case SubDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case SubFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Neg32:
-        inst.visitArg(0, func, Arg.UseZDef, GP, 32);
-        break;
-        break;
-    case Neg64:
-        inst.visitArg(0, func, Arg.UseDef, GP, 64);
-        break;
-        break;
-    case NegateDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case Mul32:
-        switch (inst.args.length) {
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Mul64:
-        switch (inst.args.length) {
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Def, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MultiplyAdd32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case MultiplyAdd64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case MultiplySub32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case MultiplySub64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case MultiplyNeg32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case MultiplyNeg64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.ZDef, GP, 64);
-        break;
-        break;
-    case Div32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Div64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case MulDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MulFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case DivDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case DivFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case X86ConvertToDoubleWord32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case X86ConvertToQuadWord64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case X86Div32:
-        inst.visitArg(0, func, Arg.UseZDef, GP, 32);
-        inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        break;
-        break;
-    case X86Div64:
-        inst.visitArg(0, func, Arg.UseZDef, GP, 64);
-        inst.visitArg(1, func, Arg.UseZDef, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        break;
-        break;
-    case Lea:
-        inst.visitArg(0, func, Arg.UseAddr, GP, Ptr);
-        inst.visitArg(1, func, Arg.Def, GP, Ptr);
-        break;
-        break;
-    case And32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case And64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Def, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case AndDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case AndFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case XorDouble:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Def, FP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 64);
-            inst.visitArg(1, func, Arg.UseDef, FP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case XorFloat:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Def, FP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, FP, 32);
-            inst.visitArg(1, func, Arg.UseDef, FP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Lshift32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Lshift64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.ZDef, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Rshift32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Rshift64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.ZDef, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Urshift32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Urshift64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.ZDef, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Or32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Or64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Def, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Xor32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.ZDef, GP, 32);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Xor64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Def, GP, 64);
-            break;
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Not32:
-        switch (inst.args.length) {
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.ZDef, GP, 32);
-            break;
-        case 1:
-            inst.visitArg(0, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case Not64:
-        switch (inst.args.length) {
-        case 2:
-            inst.visitArg(0, func, Arg.Use, GP, 64);
-            inst.visitArg(1, func, Arg.Def, GP, 64);
-            break;
-        case 1:
-            inst.visitArg(0, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case AbsDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case AbsFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case CeilDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case CeilFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case FloorDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case FloorFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case SqrtDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case SqrtFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case ConvertInt32ToDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case ConvertInt64ToDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case ConvertInt32ToFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case ConvertInt64ToFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case CountLeadingZeros32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case CountLeadingZeros64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case ConvertDoubleToFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case ConvertFloatToDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case Move:
-        inst.visitArg(0, func, Arg.Use, GP, Ptr);
-        inst.visitArg(1, func, Arg.Def, GP, Ptr);
-        break;
-        break;
-    case Swap32:
-        inst.visitArg(0, func, Arg.UseDef, GP, 32);
-        inst.visitArg(1, func, Arg.UseDef, GP, 32);
-        break;
-        break;
-    case Swap64:
-        inst.visitArg(0, func, Arg.UseDef, GP, 64);
-        inst.visitArg(1, func, Arg.UseDef, GP, 64);
-        break;
-        break;
-    case Move32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case StoreZero32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        break;
-        break;
-    case SignExtend32ToPtr:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Def, GP, Ptr);
-        break;
-        break;
-    case ZeroExtend8To32:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case SignExtend8To32:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case ZeroExtend16To32:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case SignExtend16To32:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case MoveFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case MoveDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveZeroToDouble:
-        inst.visitArg(0, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case Move64ToDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        inst.visitArg(1, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case Move32ToFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Def, FP, 32);
-        break;
-        break;
-    case MoveDoubleTo64:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        inst.visitArg(1, func, Arg.Def, GP, 64);
-        break;
-        break;
-    case MoveFloatTo32:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        inst.visitArg(1, func, Arg.Def, GP, 32);
-        break;
-        break;
-    case Load8:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Store8:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.Def, GP, 8);
-        break;
-        break;
-    case Load8SignedExtendTo32:
-        inst.visitArg(0, func, Arg.Use, GP, 8);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Load16:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Load16SignedExtendTo32:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Store16:
-        inst.visitArg(0, func, Arg.Use, GP, 16);
-        inst.visitArg(1, func, Arg.Def, GP, 16);
-        break;
-        break;
-    case Compare32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Compare64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Test32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Test64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case CompareDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 64);
-        inst.visitArg(2, func, Arg.Use, FP, 64);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case CompareFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 32);
-        inst.visitArg(2, func, Arg.Use, FP, 32);
-        inst.visitArg(3, func, Arg.ZDef, GP, 32);
-        break;
-        break;
-    case Branch8:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 8);
-        inst.visitArg(2, func, Arg.Use, GP, 8);
-        break;
-        break;
-    case Branch32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        break;
-        break;
-    case Branch64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        break;
-        break;
-    case BranchTest8:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 8);
-        inst.visitArg(2, func, Arg.Use, GP, 8);
-        break;
-        break;
-    case BranchTest32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        break;
-        break;
-    case BranchTest64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        break;
-        break;
-    case BranchDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 64);
-        inst.visitArg(2, func, Arg.Use, FP, 64);
-        break;
-        break;
-    case BranchFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 32);
-        inst.visitArg(2, func, Arg.Use, FP, 32);
-        break;
-        break;
-    case BranchAdd32:
-        switch (inst.args.length) {
-        case 4:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.ZDef, GP, 32);
-            break;
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.UseZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case BranchAdd64:
-        switch (inst.args.length) {
-        case 4:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Use, GP, 64);
-            inst.visitArg(3, func, Arg.ZDef, GP, 64);
-            break;
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.UseDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case BranchMul32:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.UseZDef, GP, 32);
-            break;
-        case 4:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.ZDef, GP, 32);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Scratch, GP, 32);
-            inst.visitArg(4, func, Arg.Scratch, GP, 32);
-            inst.visitArg(5, func, Arg.ZDef, GP, 32);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case BranchMul64:
-        switch (inst.args.length) {
-        case 3:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.UseZDef, GP, 64);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Use, GP, 64);
-            inst.visitArg(3, func, Arg.Scratch, GP, 64);
-            inst.visitArg(4, func, Arg.Scratch, GP, 64);
-            inst.visitArg(5, func, Arg.ZDef, GP, 64);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case BranchSub32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.UseZDef, GP, 32);
-        break;
-        break;
-    case BranchSub64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.UseDef, GP, 64);
-        break;
-        break;
-    case BranchNeg32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.UseZDef, GP, 32);
-        break;
-        break;
-    case BranchNeg64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.UseZDef, GP, 64);
-        break;
-        break;
-    case MoveConditionally32:
-        switch (inst.args.length) {
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveConditionally64:
-        switch (inst.args.length) {
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Use, GP, 64);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Use, GP, 64);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveConditionallyTest32:
-        switch (inst.args.length) {
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveConditionallyTest64:
-        switch (inst.args.length) {
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 64);
-            inst.visitArg(2, func, Arg.Use, GP, 64);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, GP, 32);
-            inst.visitArg(2, func, Arg.Use, GP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveConditionallyDouble:
-        switch (inst.args.length) {
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Use, FP, 64);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 64);
-            inst.visitArg(2, func, Arg.Use, FP, 64);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveConditionallyFloat:
-        switch (inst.args.length) {
-        case 6:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Use, FP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.Use, GP, Ptr);
-            inst.visitArg(5, func, Arg.Def, GP, Ptr);
-            break;
-        case 5:
-            inst.visitArg(0, func, Arg.Use, GP, 32);
-            inst.visitArg(1, func, Arg.Use, FP, 32);
-            inst.visitArg(2, func, Arg.Use, FP, 32);
-            inst.visitArg(3, func, Arg.Use, GP, Ptr);
-            inst.visitArg(4, func, Arg.UseDef, GP, Ptr);
-            break;
-        default:
-            throw new Error("Bad overload");
-            break;
-        }
-        break;
-    case MoveDoubleConditionally32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveDoubleConditionally64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveDoubleConditionallyTest32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 32);
-        inst.visitArg(2, func, Arg.Use, GP, 32);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveDoubleConditionallyTest64:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, GP, 64);
-        inst.visitArg(2, func, Arg.Use, GP, 64);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveDoubleConditionallyDouble:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 64);
-        inst.visitArg(2, func, Arg.Use, FP, 64);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case MoveDoubleConditionallyFloat:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        inst.visitArg(1, func, Arg.Use, FP, 32);
-        inst.visitArg(2, func, Arg.Use, FP, 32);
-        inst.visitArg(3, func, Arg.Use, FP, 64);
-        inst.visitArg(4, func, Arg.Use, FP, 64);
-        inst.visitArg(5, func, Arg.Def, FP, 64);
-        break;
-        break;
-    case Jump:
-        break;
-        break;
-    case Ret32:
-        inst.visitArg(0, func, Arg.Use, GP, 32);
-        break;
-        break;
-    case Ret64:
-        inst.visitArg(0, func, Arg.Use, GP, 64);
-        break;
-        break;
-    case RetFloat:
-        inst.visitArg(0, func, Arg.Use, FP, 32);
-        break;
-        break;
-    case RetDouble:
-        inst.visitArg(0, func, Arg.Use, FP, 64);
-        break;
-        break;
-    case Oops:
-        break;
-        break;
-    case Shuffle:
-        ShuffleCustom.forEachArg(inst, func);
-        break;
-    case Patch:
-        PatchCustom.forEachArg(inst, func);
-        break;
-    case CCall:
-        CCallCustom.forEachArg(inst, func);
-        break;
-    case ColdCCall:
-        ColdCCallCustom.forEachArg(inst, func);
-        break;
-    default:
-        throw "Bad opcode";
-    }
-}
-function Inst_hasNonArgEffects(inst)
-{
-    switch (inst.opcode) {
-    case Branch8:
-    case Branch32:
-    case Branch64:
-    case BranchTest8:
-    case BranchTest32:
-    case BranchTest64:
-    case BranchDouble:
-    case BranchFloat:
-    case BranchAdd32:
-    case BranchAdd64:
-    case BranchMul32:
-    case BranchMul64:
-    case BranchSub32:
-    case BranchSub64:
-    case BranchNeg32:
-    case BranchNeg64:
-    case Jump:
-    case Ret32:
-    case Ret64:
-    case RetFloat:
-    case RetDouble:
-    case Oops:
-        return true;
-    case Shuffle:
-        return ShuffleCustom.hasNonArgNonControlEffects(inst);
-    case Patch:
-        return PatchCustom.hasNonArgNonControlEffects(inst);
-    case CCall:
-        return CCallCustom.hasNonArgNonControlEffects(inst);
-    case ColdCCall:
-        return ColdCCallCustom.hasNonArgNonControlEffects(inst);
-    default:
-        return false;
-    }
-}
-function opcodeCode(opcode)
-{
-    switch (opcode) {
-    case AbsDouble:
-        return 0
-    case AbsFloat:
-        return 1
-    case Add16:
-        return 2
-    case Add32:
-        return 3
-    case Add64:
-        return 4
-    case Add8:
-        return 5
-    case AddDouble:
-        return 6
-    case AddFloat:
-        return 7
-    case And32:
-        return 8
-    case And64:
-        return 9
-    case AndDouble:
-        return 10
-    case AndFloat:
-        return 11
-    case Branch32:
-        return 12
-    case Branch64:
-        return 13
-    case Branch8:
-        return 14
-    case BranchAdd32:
-        return 15
-    case BranchAdd64:
-        return 16
-    case BranchDouble:
-        return 17
-    case BranchFloat:
-        return 18
-    case BranchMul32:
-        return 19
-    case BranchMul64:
-        return 20
-    case BranchNeg32:
-        return 21
-    case BranchNeg64:
-        return 22
-    case BranchSub32:
-        return 23
-    case BranchSub64:
-        return 24
-    case BranchTest32:
-        return 25
-    case BranchTest64:
-        return 26
-    case BranchTest8:
-        return 27
-    case CCall:
-        return 28
-    case CeilDouble:
-        return 29
-    case CeilFloat:
-        return 30
-    case ColdCCall:
-        return 31
-    case Compare32:
-        return 32
-    case Compare64:
-        return 33
-    case CompareDouble:
-        return 34
-    case CompareFloat:
-        return 35
-    case ConvertDoubleToFloat:
-        return 36
-    case ConvertFloatToDouble:
-        return 37
-    case ConvertInt32ToDouble:
-        return 38
-    case ConvertInt32ToFloat:
-        return 39
-    case ConvertInt64ToDouble:
-        return 40
-    case ConvertInt64ToFloat:
-        return 41
-    case CountLeadingZeros32:
-        return 42
-    case CountLeadingZeros64:
-        return 43
-    case Div32:
-        return 44
-    case Div64:
-        return 45
-    case DivDouble:
-        return 46
-    case DivFloat:
-        return 47
-    case FloorDouble:
-        return 48
-    case FloorFloat:
-        return 49
-    case Jump:
-        return 50
-    case Lea:
-        return 51
-    case Load16:
-        return 52
-    case Load16SignedExtendTo32:
-        return 53
-    case Load8:
-        return 54
-    case Load8SignedExtendTo32:
-        return 55
-    case Lshift32:
-        return 56
-    case Lshift64:
-        return 57
-    case Move:
-        return 58
-    case Move32:
-        return 59
-    case Move32ToFloat:
-        return 60
-    case Move64ToDouble:
-        return 61
-    case MoveConditionally32:
-        return 62
-    case MoveConditionally64:
-        return 63
-    case MoveConditionallyDouble:
-        return 64
-    case MoveConditionallyFloat:
-        return 65
-    case MoveConditionallyTest32:
-        return 66
-    case MoveConditionallyTest64:
-        return 67
-    case MoveDouble:
-        return 68
-    case MoveDoubleConditionally32:
-        return 69
-    case MoveDoubleConditionally64:
-        return 70
-    case MoveDoubleConditionallyDouble:
-        return 71
-    case MoveDoubleConditionallyFloat:
-        return 72
-    case MoveDoubleConditionallyTest32:
-        return 73
-    case MoveDoubleConditionallyTest64:
-        return 74
-    case MoveDoubleTo64:
-        return 75
-    case MoveFloat:
-        return 76
-    case MoveFloatTo32:
-        return 77
-    case MoveZeroToDouble:
-        return 78
-    case Mul32:
-        return 79
-    case Mul64:
-        return 80
-    case MulDouble:
-        return 81
-    case MulFloat:
-        return 82
-    case MultiplyAdd32:
-        return 83
-    case MultiplyAdd64:
-        return 84
-    case MultiplyNeg32:
-        return 85
-    case MultiplyNeg64:
-        return 86
-    case MultiplySub32:
-        return 87
-    case MultiplySub64:
-        return 88
-    case Neg32:
-        return 89
-    case Neg64:
-        return 90
-    case NegateDouble:
-        return 91
-    case Nop:
-        return 92
-    case Not32:
-        return 93
-    case Not64:
-        return 94
-    case Oops:
-        return 95
-    case Or32:
-        return 96
-    case Or64:
-        return 97
-    case Patch:
-        return 98
-    case Ret32:
-        return 99
-    case Ret64:
-        return 100
-    case RetDouble:
-        return 101
-    case RetFloat:
-        return 102
-    case Rshift32:
-        return 103
-    case Rshift64:
-        return 104
-    case Shuffle:
-        return 105
-    case SignExtend16To32:
-        return 106
-    case SignExtend32ToPtr:
-        return 107
-    case SignExtend8To32:
-        return 108
-    case SqrtDouble:
-        return 109
-    case SqrtFloat:
-        return 110
-    case Store16:
-        return 111
-    case Store8:
-        return 112
-    case StoreZero32:
-        return 113
-    case Sub32:
-        return 114
-    case Sub64:
-        return 115
-    case SubDouble:
-        return 116
-    case SubFloat:
-        return 117
-    case Swap32:
-        return 118
-    case Swap64:
-        return 119
-    case Test32:
-        return 120
-    case Test64:
-        return 121
-    case Urshift32:
-        return 122
-    case Urshift64:
-        return 123
-    case X86ConvertToDoubleWord32:
-        return 124
-    case X86ConvertToQuadWord64:
-        return 125
-    case X86Div32:
-        return 126
-    case X86Div64:
-        return 127
-    case Xor32:
-        return 128
-    case Xor64:
-        return 129
-    case XorDouble:
-        return 130
-    case XorFloat:
-        return 131
-    case ZeroExtend16To32:
-        return 132
-    case ZeroExtend8To32:
-        return 133
-    default:
-        throw new Error("bad opcode");
-    }
-}
diff --git a/ARES-6/Air/payload-airjs-ACLj8C.js b/ARES-6/Air/payload-airjs-ACLj8C.js
deleted file mode 100644
index 013b87a..0000000
--- a/ARES-6/Air/payload-airjs-ACLj8C.js
+++ /dev/null
@@ -1,1730 +0,0 @@
-"use strict";
-// Generated by Air::dumpAsJS from #ACLj8C in Air.js
-function createPayloadAirJSACLj8C()
-{
-    let code = new Code();
-    let bb0 = code.addBlock();
-    let bb1 = code.addBlock();
-    let bb2 = code.addBlock();
-    let bb3 = code.addBlock();
-    let bb4 = code.addBlock();
-    let bb5 = code.addBlock();
-    let bb6 = code.addBlock();
-    let bb7 = code.addBlock();
-    let bb8 = code.addBlock();
-    let bb9 = code.addBlock();
-    let bb10 = code.addBlock();
-    let bb11 = code.addBlock();
-    let bb12 = code.addBlock();
-    let bb13 = code.addBlock();
-    let bb14 = code.addBlock();
-    let bb15 = code.addBlock();
-    let slot0 = code.addStackSlot(160, Locked);
-    let slot1 = code.addStackSlot(8, Spill);
-    let slot2 = code.addStackSlot(8, Spill);
-    let slot3 = code.addStackSlot(8, Spill);
-    let slot4 = code.addStackSlot(40, Locked);
-    slot4.setOffsetFromFP(-40);
-    let tmp61 = code.newTmp(GP);
-    let tmp60 = code.newTmp(GP);
-    let tmp59 = code.newTmp(GP);
-    let tmp58 = code.newTmp(GP);
-    let tmp57 = code.newTmp(GP);
-    let tmp56 = code.newTmp(GP);
-    let tmp55 = code.newTmp(GP);
-    let tmp54 = code.newTmp(GP);
-    let tmp53 = code.newTmp(GP);
-    let tmp52 = code.newTmp(GP);
-    let tmp51 = code.newTmp(GP);
-    let tmp50 = code.newTmp(GP);
-    let tmp49 = code.newTmp(GP);
-    let tmp48 = code.newTmp(GP);
-    let tmp47 = code.newTmp(GP);
-    let tmp46 = code.newTmp(GP);
-    let tmp45 = code.newTmp(GP);
-    let tmp44 = code.newTmp(GP);
-    let tmp43 = code.newTmp(GP);
-    let tmp42 = code.newTmp(GP);
-    let tmp41 = code.newTmp(GP);
-    let tmp40 = code.newTmp(GP);
-    let tmp39 = code.newTmp(GP);
-    let tmp38 = code.newTmp(GP);
-    let tmp37 = code.newTmp(GP);
-    let tmp36 = code.newTmp(GP);
-    let tmp35 = code.newTmp(GP);
-    let tmp34 = code.newTmp(GP);
-    let tmp33 = code.newTmp(GP);
-    let tmp32 = code.newTmp(GP);
-    let tmp31 = code.newTmp(GP);
-    let tmp30 = code.newTmp(GP);
-    let tmp29 = code.newTmp(GP);
-    let tmp28 = code.newTmp(GP);
-    let tmp27 = code.newTmp(GP);
-    let tmp26 = code.newTmp(GP);
-    let tmp25 = code.newTmp(GP);
-    let tmp24 = code.newTmp(GP);
-    let tmp23 = code.newTmp(GP);
-    let tmp22 = code.newTmp(GP);
-    let tmp21 = code.newTmp(GP);
-    let tmp20 = code.newTmp(GP);
-    let tmp19 = code.newTmp(GP);
-    let tmp18 = code.newTmp(GP);
-    let tmp17 = code.newTmp(GP);
-    let tmp16 = code.newTmp(GP);
-    let tmp15 = code.newTmp(GP);
-    let tmp14 = code.newTmp(GP);
-    let tmp13 = code.newTmp(GP);
-    let tmp12 = code.newTmp(GP);
-    let tmp11 = code.newTmp(GP);
-    let tmp10 = code.newTmp(GP);
-    let tmp9 = code.newTmp(GP);
-    let tmp8 = code.newTmp(GP);
-    let tmp7 = code.newTmp(GP);
-    let tmp6 = code.newTmp(GP);
-    let tmp5 = code.newTmp(GP);
-    let tmp4 = code.newTmp(GP);
-    let tmp3 = code.newTmp(GP);
-    let tmp2 = code.newTmp(GP);
-    let tmp1 = code.newTmp(GP);
-    let tmp0 = code.newTmp(GP);
-    let inst;
-    let arg;
-    bb0.successors.push(new FrequentedBlock(bb1, Normal));
-    bb0.successors.push(new FrequentedBlock(bb15, Normal));
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276424800, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 16);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 72);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 64);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 56);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 48);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(2, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276327648, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r8, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(21);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r12, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(372);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r12, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, -40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276321024, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 72);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 64);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 56);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 48);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 40);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Xor64);
-    arg = Arg.createImm(6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot2, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot3, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    bb1.successors.push(new FrequentedBlock(bb3, Normal));
-    bb1.successors.push(new FrequentedBlock(bb2, Normal));
-    bb1.predecessors.push(bb0);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r8, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(468);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb1.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r8, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb1.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276741160, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb1.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb1.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb1.append(inst);
-    bb2.predecessors.push(bb1);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb2.append(inst);
-    inst = new Inst(Oops);
-    bb2.append(inst);
-    bb3.successors.push(new FrequentedBlock(bb4, Normal));
-    bb3.successors.push(new FrequentedBlock(bb7, Normal));
-    bb3.predecessors.push(bb1);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r8, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb3.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(23);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb3.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(275739616, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb3.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb3.append(inst);
-    bb4.successors.push(new FrequentedBlock(bb5, Normal));
-    bb4.successors.push(new FrequentedBlock(bb6, Normal));
-    bb4.predecessors.push(bb3);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 0);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 32);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 24);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 16);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 8);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276645872, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276646496, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb4.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Xor64);
-    arg = Arg.createImm(6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb4.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb4.append(inst);
-    bb5.successors.push(new FrequentedBlock(bb8, Normal));
-    bb5.predecessors.push(bb4);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(419);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(276168608, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Jump);
-    bb5.append(inst);
-    bb6.successors.push(new FrequentedBlock(bb8, Normal));
-    bb6.predecessors.push(bb4);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Jump);
-    bb6.append(inst);
-    bb7.successors.push(new FrequentedBlock(bb12, Normal));
-    bb7.successors.push(new FrequentedBlock(bb9, Normal));
-    bb7.predecessors.push(bb3);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(5);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(48);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(56);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(48);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(56);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb7.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb7.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb7.append(inst);
-    bb8.successors.push(new FrequentedBlock(bb13, Normal));
-    bb8.successors.push(new FrequentedBlock(bb10, Normal));
-    bb8.predecessors.push(bb6);
-    bb8.predecessors.push(bb5);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb8.append(inst);
-    bb9.successors.push(new FrequentedBlock(bb11, Normal));
-    bb9.predecessors.push(bb7);
-    inst = new Inst(Jump);
-    bb9.append(inst);
-    bb10.successors.push(new FrequentedBlock(bb11, Normal));
-    bb10.predecessors.push(bb8);
-    inst = new Inst(Jump);
-    bb10.append(inst);
-    bb11.predecessors.push(bb9);
-    bb11.predecessors.push(bb10);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(20);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb11.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb11.append(inst);
-    inst = new Inst(Oops);
-    bb11.append(inst);
-    bb12.successors.push(new FrequentedBlock(bb14, Normal));
-    bb12.predecessors.push(bb7);
-    inst = new Inst(Jump);
-    bb12.append(inst);
-    bb13.successors.push(new FrequentedBlock(bb14, Normal));
-    bb13.predecessors.push(bb8);
-    inst = new Inst(Jump);
-    bb13.append(inst);
-    bb14.predecessors.push(bb12);
-    bb14.predecessors.push(bb13);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(And64);
-    arg = Arg.createImm(-9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb14.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    bb15.predecessors.push(bb0);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    return code;
-}
diff --git a/ARES-6/Air/payload-gbemu-executeIteration.js b/ARES-6/Air/payload-gbemu-executeIteration.js
deleted file mode 100644
index 2b0b80b..0000000
--- a/ARES-6/Air/payload-gbemu-executeIteration.js
+++ /dev/null
@@ -1,3229 +0,0 @@
-"use strict";
-// Generated by Air::dumpAsJS from executeIteration#EVx8pJ in Octane/gbemu
-function createPayloadGbemuExecuteIteration()
-{
-    let code = new Code();
-    let bb0 = code.addBlock();
-    let bb1 = code.addBlock();
-    let bb2 = code.addBlock();
-    let bb3 = code.addBlock();
-    let bb4 = code.addBlock();
-    let bb5 = code.addBlock();
-    let bb6 = code.addBlock();
-    let bb7 = code.addBlock();
-    let bb8 = code.addBlock();
-    let bb9 = code.addBlock();
-    let bb10 = code.addBlock();
-    let bb11 = code.addBlock();
-    let bb12 = code.addBlock();
-    let bb13 = code.addBlock();
-    let bb14 = code.addBlock();
-    let bb15 = code.addBlock();
-    let bb16 = code.addBlock();
-    let bb17 = code.addBlock();
-    let bb18 = code.addBlock();
-    let bb19 = code.addBlock();
-    let bb20 = code.addBlock();
-    let bb21 = code.addBlock();
-    let bb22 = code.addBlock();
-    let bb23 = code.addBlock();
-    let bb24 = code.addBlock();
-    let bb25 = code.addBlock();
-    let bb26 = code.addBlock();
-    let bb27 = code.addBlock();
-    let bb28 = code.addBlock();
-    let bb29 = code.addBlock();
-    let bb30 = code.addBlock();
-    let bb31 = code.addBlock();
-    let bb32 = code.addBlock();
-    let bb33 = code.addBlock();
-    let bb34 = code.addBlock();
-    let bb35 = code.addBlock();
-    let bb36 = code.addBlock();
-    let bb37 = code.addBlock();
-    let bb38 = code.addBlock();
-    let bb39 = code.addBlock();
-    let bb40 = code.addBlock();
-    let bb41 = code.addBlock();
-    let bb42 = code.addBlock();
-    let slot0 = code.addStackSlot(64, Locked);
-    let slot1 = code.addStackSlot(8, Spill);
-    let slot2 = code.addStackSlot(8, Spill);
-    let slot3 = code.addStackSlot(8, Spill);
-    let slot4 = code.addStackSlot(8, Spill);
-    let slot5 = code.addStackSlot(8, Spill);
-    let slot6 = code.addStackSlot(8, Spill);
-    let slot7 = code.addStackSlot(8, Spill);
-    let slot8 = code.addStackSlot(8, Spill);
-    let slot9 = code.addStackSlot(8, Spill);
-    let slot10 = code.addStackSlot(8, Spill);
-    let slot11 = code.addStackSlot(8, Spill);
-    let slot12 = code.addStackSlot(40, Locked);
-    slot12.setOffsetFromFP(-40);
-    let tmp190 = code.newTmp(GP);
-    let tmp189 = code.newTmp(GP);
-    let tmp188 = code.newTmp(GP);
-    let tmp187 = code.newTmp(GP);
-    let tmp186 = code.newTmp(GP);
-    let tmp185 = code.newTmp(GP);
-    let tmp184 = code.newTmp(GP);
-    let tmp183 = code.newTmp(GP);
-    let tmp182 = code.newTmp(GP);
-    let tmp181 = code.newTmp(GP);
-    let tmp180 = code.newTmp(GP);
-    let tmp179 = code.newTmp(GP);
-    let tmp178 = code.newTmp(GP);
-    let tmp177 = code.newTmp(GP);
-    let tmp176 = code.newTmp(GP);
-    let tmp175 = code.newTmp(GP);
-    let tmp174 = code.newTmp(GP);
-    let tmp173 = code.newTmp(GP);
-    let tmp172 = code.newTmp(GP);
-    let tmp171 = code.newTmp(GP);
-    let tmp170 = code.newTmp(GP);
-    let tmp169 = code.newTmp(GP);
-    let tmp168 = code.newTmp(GP);
-    let tmp167 = code.newTmp(GP);
-    let tmp166 = code.newTmp(GP);
-    let tmp165 = code.newTmp(GP);
-    let tmp164 = code.newTmp(GP);
-    let tmp163 = code.newTmp(GP);
-    let tmp162 = code.newTmp(GP);
-    let tmp161 = code.newTmp(GP);
-    let tmp160 = code.newTmp(GP);
-    let tmp159 = code.newTmp(GP);
-    let tmp158 = code.newTmp(GP);
-    let tmp157 = code.newTmp(GP);
-    let tmp156 = code.newTmp(GP);
-    let tmp155 = code.newTmp(GP);
-    let tmp154 = code.newTmp(GP);
-    let tmp153 = code.newTmp(GP);
-    let tmp152 = code.newTmp(GP);
-    let tmp151 = code.newTmp(GP);
-    let tmp150 = code.newTmp(GP);
-    let tmp149 = code.newTmp(GP);
-    let tmp148 = code.newTmp(GP);
-    let tmp147 = code.newTmp(GP);
-    let tmp146 = code.newTmp(GP);
-    let tmp145 = code.newTmp(GP);
-    let tmp144 = code.newTmp(GP);
-    let tmp143 = code.newTmp(GP);
-    let tmp142 = code.newTmp(GP);
-    let tmp141 = code.newTmp(GP);
-    let tmp140 = code.newTmp(GP);
-    let tmp139 = code.newTmp(GP);
-    let tmp138 = code.newTmp(GP);
-    let tmp137 = code.newTmp(GP);
-    let tmp136 = code.newTmp(GP);
-    let tmp135 = code.newTmp(GP);
-    let tmp134 = code.newTmp(GP);
-    let tmp133 = code.newTmp(GP);
-    let tmp132 = code.newTmp(GP);
-    let tmp131 = code.newTmp(GP);
-    let tmp130 = code.newTmp(GP);
-    let tmp129 = code.newTmp(GP);
-    let tmp128 = code.newTmp(GP);
-    let tmp127 = code.newTmp(GP);
-    let tmp126 = code.newTmp(GP);
-    let tmp125 = code.newTmp(GP);
-    let tmp124 = code.newTmp(GP);
-    let tmp123 = code.newTmp(GP);
-    let tmp122 = code.newTmp(GP);
-    let tmp121 = code.newTmp(GP);
-    let tmp120 = code.newTmp(GP);
-    let tmp119 = code.newTmp(GP);
-    let tmp118 = code.newTmp(GP);
-    let tmp117 = code.newTmp(GP);
-    let tmp116 = code.newTmp(GP);
-    let tmp115 = code.newTmp(GP);
-    let tmp114 = code.newTmp(GP);
-    let tmp113 = code.newTmp(GP);
-    let tmp112 = code.newTmp(GP);
-    let tmp111 = code.newTmp(GP);
-    let tmp110 = code.newTmp(GP);
-    let tmp109 = code.newTmp(GP);
-    let tmp108 = code.newTmp(GP);
-    let tmp107 = code.newTmp(GP);
-    let tmp106 = code.newTmp(GP);
-    let tmp105 = code.newTmp(GP);
-    let tmp104 = code.newTmp(GP);
-    let tmp103 = code.newTmp(GP);
-    let tmp102 = code.newTmp(GP);
-    let tmp101 = code.newTmp(GP);
-    let tmp100 = code.newTmp(GP);
-    let tmp99 = code.newTmp(GP);
-    let tmp98 = code.newTmp(GP);
-    let tmp97 = code.newTmp(GP);
-    let tmp96 = code.newTmp(GP);
-    let tmp95 = code.newTmp(GP);
-    let tmp94 = code.newTmp(GP);
-    let tmp93 = code.newTmp(GP);
-    let tmp92 = code.newTmp(GP);
-    let tmp91 = code.newTmp(GP);
-    let tmp90 = code.newTmp(GP);
-    let tmp89 = code.newTmp(GP);
-    let tmp88 = code.newTmp(GP);
-    let tmp87 = code.newTmp(GP);
-    let tmp86 = code.newTmp(GP);
-    let tmp85 = code.newTmp(GP);
-    let tmp84 = code.newTmp(GP);
-    let tmp83 = code.newTmp(GP);
-    let tmp82 = code.newTmp(GP);
-    let tmp81 = code.newTmp(GP);
-    let tmp80 = code.newTmp(GP);
-    let tmp79 = code.newTmp(GP);
-    let tmp78 = code.newTmp(GP);
-    let tmp77 = code.newTmp(GP);
-    let tmp76 = code.newTmp(GP);
-    let tmp75 = code.newTmp(GP);
-    let tmp74 = code.newTmp(GP);
-    let tmp73 = code.newTmp(GP);
-    let tmp72 = code.newTmp(GP);
-    let tmp71 = code.newTmp(GP);
-    let tmp70 = code.newTmp(GP);
-    let tmp69 = code.newTmp(GP);
-    let tmp68 = code.newTmp(GP);
-    let tmp67 = code.newTmp(GP);
-    let tmp66 = code.newTmp(GP);
-    let tmp65 = code.newTmp(GP);
-    let tmp64 = code.newTmp(GP);
-    let tmp63 = code.newTmp(GP);
-    let tmp62 = code.newTmp(GP);
-    let tmp61 = code.newTmp(GP);
-    let tmp60 = code.newTmp(GP);
-    let tmp59 = code.newTmp(GP);
-    let tmp58 = code.newTmp(GP);
-    let tmp57 = code.newTmp(GP);
-    let tmp56 = code.newTmp(GP);
-    let tmp55 = code.newTmp(GP);
-    let tmp54 = code.newTmp(GP);
-    let tmp53 = code.newTmp(GP);
-    let tmp52 = code.newTmp(GP);
-    let tmp51 = code.newTmp(GP);
-    let tmp50 = code.newTmp(GP);
-    let tmp49 = code.newTmp(GP);
-    let tmp48 = code.newTmp(GP);
-    let tmp47 = code.newTmp(GP);
-    let tmp46 = code.newTmp(GP);
-    let tmp45 = code.newTmp(GP);
-    let tmp44 = code.newTmp(GP);
-    let tmp43 = code.newTmp(GP);
-    let tmp42 = code.newTmp(GP);
-    let tmp41 = code.newTmp(GP);
-    let tmp40 = code.newTmp(GP);
-    let tmp39 = code.newTmp(GP);
-    let tmp38 = code.newTmp(GP);
-    let tmp37 = code.newTmp(GP);
-    let tmp36 = code.newTmp(GP);
-    let tmp35 = code.newTmp(GP);
-    let tmp34 = code.newTmp(GP);
-    let tmp33 = code.newTmp(GP);
-    let tmp32 = code.newTmp(GP);
-    let tmp31 = code.newTmp(GP);
-    let tmp30 = code.newTmp(GP);
-    let tmp29 = code.newTmp(GP);
-    let tmp28 = code.newTmp(GP);
-    let tmp27 = code.newTmp(GP);
-    let tmp26 = code.newTmp(GP);
-    let tmp25 = code.newTmp(GP);
-    let tmp24 = code.newTmp(GP);
-    let tmp23 = code.newTmp(GP);
-    let tmp22 = code.newTmp(GP);
-    let tmp21 = code.newTmp(GP);
-    let tmp20 = code.newTmp(GP);
-    let tmp19 = code.newTmp(GP);
-    let tmp18 = code.newTmp(GP);
-    let tmp17 = code.newTmp(GP);
-    let tmp16 = code.newTmp(GP);
-    let tmp15 = code.newTmp(GP);
-    let tmp14 = code.newTmp(GP);
-    let tmp13 = code.newTmp(GP);
-    let tmp12 = code.newTmp(GP);
-    let tmp11 = code.newTmp(GP);
-    let tmp10 = code.newTmp(GP);
-    let tmp9 = code.newTmp(GP);
-    let tmp8 = code.newTmp(GP);
-    let tmp7 = code.newTmp(GP);
-    let tmp6 = code.newTmp(GP);
-    let tmp5 = code.newTmp(GP);
-    let tmp4 = code.newTmp(GP);
-    let tmp3 = code.newTmp(GP);
-    let tmp2 = code.newTmp(GP);
-    let tmp1 = code.newTmp(GP);
-    let tmp0 = code.newTmp(GP);
-    let ftmp7 = code.newTmp(FP);
-    let ftmp6 = code.newTmp(FP);
-    let ftmp5 = code.newTmp(FP);
-    let ftmp4 = code.newTmp(FP);
-    let ftmp3 = code.newTmp(FP);
-    let ftmp2 = code.newTmp(FP);
-    let ftmp1 = code.newTmp(FP);
-    let ftmp0 = code.newTmp(FP);
-    let inst;
-    let arg;
-    bb0.successors.push(new FrequentedBlock(bb2, Normal));
-    bb0.successors.push(new FrequentedBlock(bb1, Normal));
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286904960, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 16);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(2, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(21);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.rbx, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286506544, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot10, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286455168, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot4, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287131344, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot6, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot3, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286474592, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot2, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287209728, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot11, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287112728, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot8, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, 65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot9, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287112720, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286506192, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot7, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(862);
-    inst.args.push(arg);
-    bb0.append(inst);
-    bb1.successors.push(new FrequentedBlock(bb41, Normal));
-    bb1.successors.push(new FrequentedBlock(bb3, Normal));
-    bb1.predecessors.push(bb0);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(881);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb1.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb1.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb1.append(inst);
-    bb2.successors.push(new FrequentedBlock(bb41, Normal));
-    bb2.successors.push(new FrequentedBlock(bb3, Normal));
-    bb2.predecessors.push(bb0);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb2.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb2.append(inst);
-    bb3.successors.push(new FrequentedBlock(bb5, Normal));
-    bb3.successors.push(new FrequentedBlock(bb4, Normal));
-    bb3.predecessors.push(bb1);
-    bb3.predecessors.push(bb40);
-    bb3.predecessors.push(bb39);
-    bb3.predecessors.push(bb2);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb3.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1144);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb3.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    bb3.append(inst);
-    bb4.successors.push(new FrequentedBlock(bb6, Normal));
-    bb4.successors.push(new FrequentedBlock(bb7, Normal));
-    bb4.predecessors.push(bb3);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    bb4.append(inst);
-    bb5.successors.push(new FrequentedBlock(bb6, Normal));
-    bb5.predecessors.push(bb3);
-    inst = new Inst(Move);
-    arg = Arg.createImm(7);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 232);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 256);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 248);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(And32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(And32);
-    arg = Arg.createImm(31);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 240);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Jump);
-    bb5.append(inst);
-    bb6.successors.push(new FrequentedBlock(bb7, Normal));
-    bb6.predecessors.push(bb4);
-    bb6.predecessors.push(bb5);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1144);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Jump);
-    bb6.append(inst);
-    bb7.successors.push(new FrequentedBlock(bb8, Normal));
-    bb7.successors.push(new FrequentedBlock(bb9, Normal));
-    bb7.predecessors.push(bb4);
-    bb7.predecessors.push(bb6);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 240);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    bb7.append(inst);
-    bb8.successors.push(new FrequentedBlock(bb9, Normal));
-    bb8.predecessors.push(bb7);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286455168, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286455168, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb8.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb8.append(inst);
-    inst = new Inst(Jump);
-    bb8.append(inst);
-    bb9.successors.push(new FrequentedBlock(bb12, Normal));
-    bb9.successors.push(new FrequentedBlock(bb10, Normal));
-    bb9.predecessors.push(bb7);
-    bb9.predecessors.push(bb8);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 304);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 128);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r8, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(80);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb9.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r8, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb9.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.rax, Reg.rsi, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb9.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(23);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb9.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot7, 0);
-    inst.args.push(arg);
-    bb9.append(inst);
-    bb10.successors.push(new FrequentedBlock(bb11, Normal));
-    bb10.successors.push(new FrequentedBlock(bb13, Normal));
-    bb10.predecessors.push(bb9);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot10, 0);
-    inst.args.push(arg);
-    bb10.append(inst);
-    bb11.successors.push(new FrequentedBlock(bb14, Normal));
-    bb11.predecessors.push(bb10);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 0);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 344);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(502);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb11.append(inst);
-    inst = new Inst(Load8);
-    arg = Arg.createIndex(Reg.rsi, Reg.rax, 1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Jump);
-    bb11.append(inst);
-    bb12.successors.push(new FrequentedBlock(bb14, Normal));
-    bb12.predecessors.push(bb9);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 0);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 336);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 456);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb12.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(502);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb12.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb12.append(inst);
-    inst = new Inst(Load8);
-    arg = Arg.createIndex(Reg.rsi, Reg.rax, 1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Jump);
-    bb12.append(inst);
-    bb13.predecessors.push(bb10);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb13.append(inst);
-    inst = new Inst(Oops);
-    bb13.append(inst);
-    bb14.successors.push(new FrequentedBlock(bb15, Normal));
-    bb14.successors.push(new FrequentedBlock(bb16, Normal));
-    bb14.predecessors.push(bb11);
-    bb14.predecessors.push(bb12);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(ZeroExtend16To32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 128);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 216);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    bb14.append(inst);
-    bb15.predecessors.push(bb14);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb15.append(inst);
-    inst = new Inst(Oops);
-    bb15.append(inst);
-    bb16.successors.push(new FrequentedBlock(bb18, Normal));
-    bb16.successors.push(new FrequentedBlock(bb17, Normal));
-    bb16.predecessors.push(bb14);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, -1752);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdx, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Load8);
-    arg = Arg.createIndex(Reg.rax, Reg.rcx, 1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 272);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287112720, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(80);
-    inst.args.push(arg);
-    arg = Arg.createBigImm(287112720, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287112728, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.rax, Reg.rcx, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287112720, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, -1088);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 272);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 280);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Rshift32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb16.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdx, -1088);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, -88);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, -1176);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(80);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb16.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.rax, Reg.rdx, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(23);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 272);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 280);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Rshift32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1048);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb16.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1048);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1072);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb16.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb16.append(inst);
-    bb17.successors.push(new FrequentedBlock(bb19, Normal));
-    bb17.predecessors.push(bb16);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb17.append(inst);
-    inst = new Inst(Jump);
-    bb17.append(inst);
-    bb18.successors.push(new FrequentedBlock(bb19, Normal));
-    bb18.predecessors.push(bb16);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb18.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb18.append(inst);
-    inst = new Inst(Jump);
-    bb18.append(inst);
-    bb19.successors.push(new FrequentedBlock(bb20, Normal));
-    bb19.successors.push(new FrequentedBlock(bb32, Normal));
-    bb19.predecessors.push(bb17);
-    bb19.predecessors.push(bb18);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(AddDouble);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(MoveDoubleTo64);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, 65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1072);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1080);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb19.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1080);
-    inst.args.push(arg);
-    bb19.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1104);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    bb19.append(inst);
-    bb20.successors.push(new FrequentedBlock(bb21, Normal));
-    bb20.successors.push(new FrequentedBlock(bb32, Normal));
-    bb20.predecessors.push(bb19);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1096);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb20.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1096);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1112);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb20.append(inst);
-    bb21.successors.push(new FrequentedBlock(bb23, Normal));
-    bb21.predecessors.push(bb20);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 344);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r12, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(502);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb21.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r12, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.r12, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(BelowOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createImm(65286);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb21.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 232);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 256);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Jump);
-    bb21.append(inst);
-    bb22.successors.push(new FrequentedBlock(bb23, Normal));
-    bb22.predecessors.push(bb30);
-    bb22.predecessors.push(bb31);
-    bb22.predecessors.push(bb29);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb22.append(inst);
-    inst = new Inst(Jump);
-    bb22.append(inst);
-    bb23.successors.push(new FrequentedBlock(bb25, Normal));
-    bb23.successors.push(new FrequentedBlock(bb24, Normal));
-    bb23.predecessors.push(bb21);
-    bb23.predecessors.push(bb22);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb23.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rsi, -1096);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Load8);
-    arg = Arg.createAddr(Reg.rdi, 65285);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb23.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(BelowOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createImm(65285);
-    inst.args.push(arg);
-    bb23.append(inst);
-    bb24.successors.push(new FrequentedBlock(bb26, Normal));
-    bb24.successors.push(new FrequentedBlock(bb30, Normal));
-    bb24.predecessors.push(bb23);
-    inst = new Inst(Store8);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 65285);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createImm(256);
-    inst.args.push(arg);
-    bb24.append(inst);
-    bb25.successors.push(new FrequentedBlock(bb26, Normal));
-    bb25.successors.push(new FrequentedBlock(bb30, Normal));
-    bb25.predecessors.push(bb23);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createImm(256);
-    inst.args.push(arg);
-    bb25.append(inst);
-    bb26.successors.push(new FrequentedBlock(bb28, Normal));
-    bb26.successors.push(new FrequentedBlock(bb27, Normal));
-    bb26.predecessors.push(bb24);
-    bb26.predecessors.push(bb25);
-    inst = new Inst(Load8);
-    arg = Arg.createAddr(Reg.rdi, 65286);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb26.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(BelowOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createImm(65285);
-    inst.args.push(arg);
-    bb26.append(inst);
-    bb27.successors.push(new FrequentedBlock(bb28, Normal));
-    bb27.predecessors.push(bb26);
-    inst = new Inst(Store8);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 65285);
-    inst.args.push(arg);
-    bb27.append(inst);
-    inst = new Inst(Jump);
-    bb27.append(inst);
-    bb28.successors.push(new FrequentedBlock(bb29, Normal));
-    bb28.successors.push(new FrequentedBlock(bb31, Normal));
-    bb28.predecessors.push(bb26);
-    bb28.predecessors.push(bb27);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 248);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(Or32);
-    arg = Arg.createImm(4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 248);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb28.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb28.append(inst);
-    bb29.successors.push(new FrequentedBlock(bb22, Normal));
-    bb29.successors.push(new FrequentedBlock(bb32, Normal));
-    bb29.predecessors.push(bb28);
-    inst = new Inst(And32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb29.append(inst);
-    inst = new Inst(And32);
-    arg = Arg.createImm(31);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb29.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb29.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 240);
-    inst.args.push(arg);
-    bb29.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb29.append(inst);
-    bb30.successors.push(new FrequentedBlock(bb22, Normal));
-    bb30.successors.push(new FrequentedBlock(bb32, Normal));
-    bb30.predecessors.push(bb24);
-    bb30.predecessors.push(bb25);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb30.append(inst);
-    bb31.successors.push(new FrequentedBlock(bb22, Normal));
-    bb31.successors.push(new FrequentedBlock(bb32, Normal));
-    bb31.predecessors.push(bb28);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb31.append(inst);
-    bb32.successors.push(new FrequentedBlock(bb33, Normal));
-    bb32.successors.push(new FrequentedBlock(bb34, Normal));
-    bb32.predecessors.push(bb19);
-    bb32.predecessors.push(bb20);
-    bb32.predecessors.push(bb30);
-    bb32.predecessors.push(bb31);
-    bb32.predecessors.push(bb29);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rsi, -1120);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    bb32.append(inst);
-    bb33.predecessors.push(bb32);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb33.append(inst);
-    inst = new Inst(Oops);
-    bb33.append(inst);
-    bb34.successors.push(new FrequentedBlock(bb36, Normal));
-    bb34.successors.push(new FrequentedBlock(bb35, Normal));
-    bb34.predecessors.push(bb32);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 136);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb34.append(inst);
-    bb35.successors.push(new FrequentedBlock(bb37, Normal));
-    bb35.successors.push(new FrequentedBlock(bb38, Normal));
-    bb35.predecessors.push(bb34);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb35.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleGreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb35.append(inst);
-    bb36.successors.push(new FrequentedBlock(bb37, Normal));
-    bb36.successors.push(new FrequentedBlock(bb38, Normal));
-    bb36.predecessors.push(bb34);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb36.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb36.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleGreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb36.append(inst);
-    bb37.successors.push(new FrequentedBlock(bb38, Normal));
-    bb37.predecessors.push(bb35);
-    bb37.predecessors.push(bb36);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286474592, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb37.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286474592, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb37.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb37.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb37.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb37.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb37.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb37.append(inst);
-    inst = new Inst(Jump);
-    bb37.append(inst);
-    bb38.successors.push(new FrequentedBlock(bb39, Normal));
-    bb38.successors.push(new FrequentedBlock(bb40, Normal));
-    bb38.predecessors.push(bb35);
-    bb38.predecessors.push(bb37);
-    bb38.predecessors.push(bb36);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(881);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb38.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, -1824);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb38.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdx, -1824);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdx, -1832);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb38.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb38.append(inst);
-    bb39.successors.push(new FrequentedBlock(bb42, Normal));
-    bb39.successors.push(new FrequentedBlock(bb3, Normal));
-    bb39.predecessors.push(bb38);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286474592, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(286474592, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb39.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Or32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287131344, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287131344, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(287209728, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb39.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb39.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb39.append(inst);
-    bb40.successors.push(new FrequentedBlock(bb42, Normal));
-    bb40.successors.push(new FrequentedBlock(bb3, Normal));
-    bb40.predecessors.push(bb38);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 224);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb40.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb40.append(inst);
-    bb41.predecessors.push(bb1);
-    bb41.predecessors.push(bb2);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb41.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb41.append(inst);
-    bb42.predecessors.push(bb40);
-    bb42.predecessors.push(bb39);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb42.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb42.append(inst);
-    return code;
-}
diff --git a/ARES-6/Air/payload-imaging-gaussian-blur-gaussianBlur.js b/ARES-6/Air/payload-imaging-gaussian-blur-gaussianBlur.js
deleted file mode 100644
index 0f16fee..0000000
--- a/ARES-6/Air/payload-imaging-gaussian-blur-gaussianBlur.js
+++ /dev/null
@@ -1,3107 +0,0 @@
-"use strict";
-// Generated by Air::dumpAsJS from gaussianBlur#A8vcYg in Kraken/imaging-gaussian-blur
-function createPayloadImagingGaussianBlurGaussianBlur()
-{
-    let code = new Code();
-    let bb0 = code.addBlock();
-    let bb1 = code.addBlock();
-    let bb2 = code.addBlock();
-    let bb3 = code.addBlock();
-    let bb4 = code.addBlock();
-    let bb5 = code.addBlock();
-    let bb6 = code.addBlock();
-    let bb7 = code.addBlock();
-    let bb8 = code.addBlock();
-    let bb9 = code.addBlock();
-    let bb10 = code.addBlock();
-    let bb11 = code.addBlock();
-    let bb12 = code.addBlock();
-    let bb13 = code.addBlock();
-    let bb14 = code.addBlock();
-    let bb15 = code.addBlock();
-    let bb16 = code.addBlock();
-    let bb17 = code.addBlock();
-    let bb18 = code.addBlock();
-    let bb19 = code.addBlock();
-    let bb20 = code.addBlock();
-    let bb21 = code.addBlock();
-    let bb22 = code.addBlock();
-    let bb23 = code.addBlock();
-    let bb24 = code.addBlock();
-    let bb25 = code.addBlock();
-    let bb26 = code.addBlock();
-    let bb27 = code.addBlock();
-    let bb28 = code.addBlock();
-    let bb29 = code.addBlock();
-    let bb30 = code.addBlock();
-    let bb31 = code.addBlock();
-    let bb32 = code.addBlock();
-    let bb33 = code.addBlock();
-    let bb34 = code.addBlock();
-    let bb35 = code.addBlock();
-    let bb36 = code.addBlock();
-    let slot0 = code.addStackSlot(40, Locked);
-    let slot1 = code.addStackSlot(8, Spill);
-    let slot2 = code.addStackSlot(8, Spill);
-    let slot3 = code.addStackSlot(4, Spill);
-    let slot4 = code.addStackSlot(8, Spill);
-    let slot5 = code.addStackSlot(8, Spill);
-    let slot6 = code.addStackSlot(40, Locked);
-    slot6.setOffsetFromFP(-40);
-    let tmp141 = code.newTmp(GP);
-    let tmp140 = code.newTmp(GP);
-    let tmp139 = code.newTmp(GP);
-    let tmp138 = code.newTmp(GP);
-    let tmp137 = code.newTmp(GP);
-    let tmp136 = code.newTmp(GP);
-    let tmp135 = code.newTmp(GP);
-    let tmp134 = code.newTmp(GP);
-    let tmp133 = code.newTmp(GP);
-    let tmp132 = code.newTmp(GP);
-    let tmp131 = code.newTmp(GP);
-    let tmp130 = code.newTmp(GP);
-    let tmp129 = code.newTmp(GP);
-    let tmp128 = code.newTmp(GP);
-    let tmp127 = code.newTmp(GP);
-    let tmp126 = code.newTmp(GP);
-    let tmp125 = code.newTmp(GP);
-    let tmp124 = code.newTmp(GP);
-    let tmp123 = code.newTmp(GP);
-    let tmp122 = code.newTmp(GP);
-    let tmp121 = code.newTmp(GP);
-    let tmp120 = code.newTmp(GP);
-    let tmp119 = code.newTmp(GP);
-    let tmp118 = code.newTmp(GP);
-    let tmp117 = code.newTmp(GP);
-    let tmp116 = code.newTmp(GP);
-    let tmp115 = code.newTmp(GP);
-    let tmp114 = code.newTmp(GP);
-    let tmp113 = code.newTmp(GP);
-    let tmp112 = code.newTmp(GP);
-    let tmp111 = code.newTmp(GP);
-    let tmp110 = code.newTmp(GP);
-    let tmp109 = code.newTmp(GP);
-    let tmp108 = code.newTmp(GP);
-    let tmp107 = code.newTmp(GP);
-    let tmp106 = code.newTmp(GP);
-    let tmp105 = code.newTmp(GP);
-    let tmp104 = code.newTmp(GP);
-    let tmp103 = code.newTmp(GP);
-    let tmp102 = code.newTmp(GP);
-    let tmp101 = code.newTmp(GP);
-    let tmp100 = code.newTmp(GP);
-    let tmp99 = code.newTmp(GP);
-    let tmp98 = code.newTmp(GP);
-    let tmp97 = code.newTmp(GP);
-    let tmp96 = code.newTmp(GP);
-    let tmp95 = code.newTmp(GP);
-    let tmp94 = code.newTmp(GP);
-    let tmp93 = code.newTmp(GP);
-    let tmp92 = code.newTmp(GP);
-    let tmp91 = code.newTmp(GP);
-    let tmp90 = code.newTmp(GP);
-    let tmp89 = code.newTmp(GP);
-    let tmp88 = code.newTmp(GP);
-    let tmp87 = code.newTmp(GP);
-    let tmp86 = code.newTmp(GP);
-    let tmp85 = code.newTmp(GP);
-    let tmp84 = code.newTmp(GP);
-    let tmp83 = code.newTmp(GP);
-    let tmp82 = code.newTmp(GP);
-    let tmp81 = code.newTmp(GP);
-    let tmp80 = code.newTmp(GP);
-    let tmp79 = code.newTmp(GP);
-    let tmp78 = code.newTmp(GP);
-    let tmp77 = code.newTmp(GP);
-    let tmp76 = code.newTmp(GP);
-    let tmp75 = code.newTmp(GP);
-    let tmp74 = code.newTmp(GP);
-    let tmp73 = code.newTmp(GP);
-    let tmp72 = code.newTmp(GP);
-    let tmp71 = code.newTmp(GP);
-    let tmp70 = code.newTmp(GP);
-    let tmp69 = code.newTmp(GP);
-    let tmp68 = code.newTmp(GP);
-    let tmp67 = code.newTmp(GP);
-    let tmp66 = code.newTmp(GP);
-    let tmp65 = code.newTmp(GP);
-    let tmp64 = code.newTmp(GP);
-    let tmp63 = code.newTmp(GP);
-    let tmp62 = code.newTmp(GP);
-    let tmp61 = code.newTmp(GP);
-    let tmp60 = code.newTmp(GP);
-    let tmp59 = code.newTmp(GP);
-    let tmp58 = code.newTmp(GP);
-    let tmp57 = code.newTmp(GP);
-    let tmp56 = code.newTmp(GP);
-    let tmp55 = code.newTmp(GP);
-    let tmp54 = code.newTmp(GP);
-    let tmp53 = code.newTmp(GP);
-    let tmp52 = code.newTmp(GP);
-    let tmp51 = code.newTmp(GP);
-    let tmp50 = code.newTmp(GP);
-    let tmp49 = code.newTmp(GP);
-    let tmp48 = code.newTmp(GP);
-    let tmp47 = code.newTmp(GP);
-    let tmp46 = code.newTmp(GP);
-    let tmp45 = code.newTmp(GP);
-    let tmp44 = code.newTmp(GP);
-    let tmp43 = code.newTmp(GP);
-    let tmp42 = code.newTmp(GP);
-    let tmp41 = code.newTmp(GP);
-    let tmp40 = code.newTmp(GP);
-    let tmp39 = code.newTmp(GP);
-    let tmp38 = code.newTmp(GP);
-    let tmp37 = code.newTmp(GP);
-    let tmp36 = code.newTmp(GP);
-    let tmp35 = code.newTmp(GP);
-    let tmp34 = code.newTmp(GP);
-    let tmp33 = code.newTmp(GP);
-    let tmp32 = code.newTmp(GP);
-    let tmp31 = code.newTmp(GP);
-    let tmp30 = code.newTmp(GP);
-    let tmp29 = code.newTmp(GP);
-    let tmp28 = code.newTmp(GP);
-    let tmp27 = code.newTmp(GP);
-    let tmp26 = code.newTmp(GP);
-    let tmp25 = code.newTmp(GP);
-    let tmp24 = code.newTmp(GP);
-    let tmp23 = code.newTmp(GP);
-    let tmp22 = code.newTmp(GP);
-    let tmp21 = code.newTmp(GP);
-    let tmp20 = code.newTmp(GP);
-    let tmp19 = code.newTmp(GP);
-    let tmp18 = code.newTmp(GP);
-    let tmp17 = code.newTmp(GP);
-    let tmp16 = code.newTmp(GP);
-    let tmp15 = code.newTmp(GP);
-    let tmp14 = code.newTmp(GP);
-    let tmp13 = code.newTmp(GP);
-    let tmp12 = code.newTmp(GP);
-    let tmp11 = code.newTmp(GP);
-    let tmp10 = code.newTmp(GP);
-    let tmp9 = code.newTmp(GP);
-    let tmp8 = code.newTmp(GP);
-    let tmp7 = code.newTmp(GP);
-    let tmp6 = code.newTmp(GP);
-    let tmp5 = code.newTmp(GP);
-    let tmp4 = code.newTmp(GP);
-    let tmp3 = code.newTmp(GP);
-    let tmp2 = code.newTmp(GP);
-    let tmp1 = code.newTmp(GP);
-    let tmp0 = code.newTmp(GP);
-    let ftmp74 = code.newTmp(FP);
-    let ftmp73 = code.newTmp(FP);
-    let ftmp72 = code.newTmp(FP);
-    let ftmp71 = code.newTmp(FP);
-    let ftmp70 = code.newTmp(FP);
-    let ftmp69 = code.newTmp(FP);
-    let ftmp68 = code.newTmp(FP);
-    let ftmp67 = code.newTmp(FP);
-    let ftmp66 = code.newTmp(FP);
-    let ftmp65 = code.newTmp(FP);
-    let ftmp64 = code.newTmp(FP);
-    let ftmp63 = code.newTmp(FP);
-    let ftmp62 = code.newTmp(FP);
-    let ftmp61 = code.newTmp(FP);
-    let ftmp60 = code.newTmp(FP);
-    let ftmp59 = code.newTmp(FP);
-    let ftmp58 = code.newTmp(FP);
-    let ftmp57 = code.newTmp(FP);
-    let ftmp56 = code.newTmp(FP);
-    let ftmp55 = code.newTmp(FP);
-    let ftmp54 = code.newTmp(FP);
-    let ftmp53 = code.newTmp(FP);
-    let ftmp52 = code.newTmp(FP);
-    let ftmp51 = code.newTmp(FP);
-    let ftmp50 = code.newTmp(FP);
-    let ftmp49 = code.newTmp(FP);
-    let ftmp48 = code.newTmp(FP);
-    let ftmp47 = code.newTmp(FP);
-    let ftmp46 = code.newTmp(FP);
-    let ftmp45 = code.newTmp(FP);
-    let ftmp44 = code.newTmp(FP);
-    let ftmp43 = code.newTmp(FP);
-    let ftmp42 = code.newTmp(FP);
-    let ftmp41 = code.newTmp(FP);
-    let ftmp40 = code.newTmp(FP);
-    let ftmp39 = code.newTmp(FP);
-    let ftmp38 = code.newTmp(FP);
-    let ftmp37 = code.newTmp(FP);
-    let ftmp36 = code.newTmp(FP);
-    let ftmp35 = code.newTmp(FP);
-    let ftmp34 = code.newTmp(FP);
-    let ftmp33 = code.newTmp(FP);
-    let ftmp32 = code.newTmp(FP);
-    let ftmp31 = code.newTmp(FP);
-    let ftmp30 = code.newTmp(FP);
-    let ftmp29 = code.newTmp(FP);
-    let ftmp28 = code.newTmp(FP);
-    let ftmp27 = code.newTmp(FP);
-    let ftmp26 = code.newTmp(FP);
-    let ftmp25 = code.newTmp(FP);
-    let ftmp24 = code.newTmp(FP);
-    let ftmp23 = code.newTmp(FP);
-    let ftmp22 = code.newTmp(FP);
-    let ftmp21 = code.newTmp(FP);
-    let ftmp20 = code.newTmp(FP);
-    let ftmp19 = code.newTmp(FP);
-    let ftmp18 = code.newTmp(FP);
-    let ftmp17 = code.newTmp(FP);
-    let ftmp16 = code.newTmp(FP);
-    let ftmp15 = code.newTmp(FP);
-    let ftmp14 = code.newTmp(FP);
-    let ftmp13 = code.newTmp(FP);
-    let ftmp12 = code.newTmp(FP);
-    let ftmp11 = code.newTmp(FP);
-    let ftmp10 = code.newTmp(FP);
-    let ftmp9 = code.newTmp(FP);
-    let ftmp8 = code.newTmp(FP);
-    let ftmp7 = code.newTmp(FP);
-    let ftmp6 = code.newTmp(FP);
-    let ftmp5 = code.newTmp(FP);
-    let ftmp4 = code.newTmp(FP);
-    let ftmp3 = code.newTmp(FP);
-    let ftmp2 = code.newTmp(FP);
-    let ftmp1 = code.newTmp(FP);
-    let ftmp0 = code.newTmp(FP);
-    let inst;
-    let arg;
-    bb0.successors.push(new FrequentedBlock(bb2, Normal));
-    bb0.successors.push(new FrequentedBlock(bb1, Rare));
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(144305904, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 16);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547168, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547184, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547192, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547200, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547208, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547216, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547224, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547232, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(142547240, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb0.append(inst);
-    bb1.successors.push(new FrequentedBlock(bb2, Normal));
-    bb1.predecessors.push(bb0);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb1.append(inst);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb1.append(inst);
-    inst = new Inst(Jump);
-    bb1.append(inst);
-    bb2.successors.push(new FrequentedBlock(bb4, Normal));
-    bb2.successors.push(new FrequentedBlock(bb3, Rare));
-    bb2.predecessors.push(bb0);
-    bb2.predecessors.push(bb1);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb2.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb2.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb2.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb2.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb2.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb2.append(inst);
-    bb3.successors.push(new FrequentedBlock(bb4, Normal));
-    bb3.predecessors.push(bb2);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb3.append(inst);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb3.append(inst);
-    inst = new Inst(Jump);
-    bb3.append(inst);
-    bb4.successors.push(new FrequentedBlock(bb6, Normal));
-    bb4.successors.push(new FrequentedBlock(bb5, Rare));
-    bb4.predecessors.push(bb2);
-    bb4.predecessors.push(bb3);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb4.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb4.append(inst);
-    bb5.successors.push(new FrequentedBlock(bb6, Normal));
-    bb5.predecessors.push(bb4);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb5.append(inst);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Jump);
-    bb5.append(inst);
-    bb6.successors.push(new FrequentedBlock(bb8, Normal));
-    bb6.successors.push(new FrequentedBlock(bb7, Rare));
-    bb6.predecessors.push(bb4);
-    bb6.predecessors.push(bb5);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb6.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb6.append(inst);
-    bb7.successors.push(new FrequentedBlock(bb8, Normal));
-    bb7.predecessors.push(bb6);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb7.append(inst);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Jump);
-    bb7.append(inst);
-    bb8.successors.push(new FrequentedBlock(bb10, Normal));
-    bb8.successors.push(new FrequentedBlock(bb9, Rare));
-    bb8.predecessors.push(bb6);
-    bb8.predecessors.push(bb7);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(117076488, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Move64ToDouble);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(BranchDouble);
-    arg = Arg.createDoubleCond(DoubleEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    bb8.append(inst);
-    bb9.successors.push(new FrequentedBlock(bb10, Normal));
-    bb9.predecessors.push(bb8);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(Below);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb9.append(inst);
-    inst = new Inst(ConvertInt32ToDouble);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Jump);
-    bb9.append(inst);
-    bb10.successors.push(new FrequentedBlock(bb18, Normal));
-    bb10.predecessors.push(bb8);
-    bb10.predecessors.push(bb9);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(144506584, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.r9, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(144506544, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(80);
-    inst.args.push(arg);
-    arg = Arg.createBigImm(144506544, 1);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(144506552, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot2, 0);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.rdi, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot3, 0);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(MoveZeroToDouble);
-    arg = Arg.createTmp(Reg.xmm7);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot4, 0);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(2, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Jump);
-    bb10.append(inst);
-    bb11.successors.push(new FrequentedBlock(bb13, Normal));
-    bb11.predecessors.push(bb35);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Jump);
-    bb11.append(inst);
-    bb12.successors.push(new FrequentedBlock(bb13, Normal));
-    bb12.predecessors.push(bb34);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(Jump);
-    bb12.append(inst);
-    bb13.successors.push(new FrequentedBlock(bb15, Normal));
-    bb13.predecessors.push(bb11);
-    bb13.predecessors.push(bb12);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm7);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm7);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm7);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm7);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(Jump);
-    bb13.append(inst);
-    bb14.successors.push(new FrequentedBlock(bb15, Normal));
-    bb14.predecessors.push(bb31);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Jump);
-    bb14.append(inst);
-    bb15.successors.push(new FrequentedBlock(bb28, Normal));
-    bb15.successors.push(new FrequentedBlock(bb16, Normal));
-    bb15.predecessors.push(bb13);
-    bb15.predecessors.push(bb14);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb15.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    bb15.append(inst);
-    bb16.successors.push(new FrequentedBlock(bb29, Normal));
-    bb16.successors.push(new FrequentedBlock(bb17, Normal));
-    bb16.predecessors.push(bb15);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(267);
-    inst.args.push(arg);
-    bb16.append(inst);
-    bb17.successors.push(new FrequentedBlock(bb18, Normal));
-    bb17.predecessors.push(bb16);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb17.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb17.append(inst);
-    inst = new Inst(Jump);
-    bb17.append(inst);
-    bb18.successors.push(new FrequentedBlock(bb20, Normal));
-    bb18.successors.push(new FrequentedBlock(bb19, Rare));
-    bb18.predecessors.push(bb10);
-    bb18.predecessors.push(bb17);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    bb18.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb18.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(400);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb18.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb18.append(inst);
-    bb19.successors.push(new FrequentedBlock(bb20, Normal));
-    bb19.predecessors.push(bb18);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb19.append(inst);
-    inst = new Inst(Jump);
-    bb19.append(inst);
-    bb20.successors.push(new FrequentedBlock(bb22, Normal));
-    bb20.predecessors.push(bb18);
-    bb20.predecessors.push(bb19);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Rshift32);
-    arg = Arg.createImm(31);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Xor32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb20.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot3, 0);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot2, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.rsi, Reg.rdi, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb20.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rdi, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(79);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb20.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rdi, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.r12, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb20.append(inst);
-    inst = new Inst(Jump);
-    bb20.append(inst);
-    bb21.successors.push(new FrequentedBlock(bb22, Normal));
-    bb21.predecessors.push(bb27);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb21.append(inst);
-    inst = new Inst(Jump);
-    bb21.append(inst);
-    bb22.successors.push(new FrequentedBlock(bb25, Normal));
-    bb22.successors.push(new FrequentedBlock(bb23, Normal));
-    bb22.predecessors.push(bb20);
-    bb22.predecessors.push(bb21);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb22.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    bb22.append(inst);
-    bb23.successors.push(new FrequentedBlock(bb26, Normal));
-    bb23.successors.push(new FrequentedBlock(bb24, Normal));
-    bb23.predecessors.push(bb22);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(400);
-    inst.args.push(arg);
-    bb23.append(inst);
-    bb24.successors.push(new FrequentedBlock(bb27, Normal));
-    bb24.predecessors.push(bb23);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createImm(4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createIndex(Reg.r9, Reg.r15, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Rshift32);
-    arg = Arg.createImm(31);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Xor32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb24.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createIndex(Reg.r12, Reg.rbx, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(MulDouble);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(AddDouble);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(MulDouble);
-    arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(AddDouble);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(MulDouble);
-    arg = Arg.createIndex(Reg.r9, Reg.r15, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(AddDouble);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(MulDouble);
-    arg = Arg.createIndex(Reg.r9, Reg.r14, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(AddDouble);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb24.append(inst);
-    inst = new Inst(Jump);
-    bb24.append(inst);
-    bb25.successors.push(new FrequentedBlock(bb27, Normal));
-    bb25.predecessors.push(bb22);
-    inst = new Inst(Jump);
-    bb25.append(inst);
-    bb26.successors.push(new FrequentedBlock(bb27, Normal));
-    bb26.predecessors.push(bb23);
-    inst = new Inst(Jump);
-    bb26.append(inst);
-    bb27.successors.push(new FrequentedBlock(bb21, Normal));
-    bb27.successors.push(new FrequentedBlock(bb30, Normal));
-    bb27.predecessors.push(bb24);
-    bb27.predecessors.push(bb26);
-    bb27.predecessors.push(bb25);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb27.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb27.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(7);
-    inst.args.push(arg);
-    bb27.append(inst);
-    bb28.successors.push(new FrequentedBlock(bb31, Normal));
-    bb28.predecessors.push(bb15);
-    inst = new Inst(Jump);
-    bb28.append(inst);
-    bb29.successors.push(new FrequentedBlock(bb31, Normal));
-    bb29.predecessors.push(bb16);
-    inst = new Inst(Jump);
-    bb29.append(inst);
-    bb30.successors.push(new FrequentedBlock(bb31, Normal));
-    bb30.predecessors.push(bb27);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb30.append(inst);
-    inst = new Inst(Jump);
-    bb30.append(inst);
-    bb31.successors.push(new FrequentedBlock(bb14, Normal));
-    bb31.successors.push(new FrequentedBlock(bb32, Normal));
-    bb31.predecessors.push(bb30);
-    bb31.predecessors.push(bb29);
-    bb31.predecessors.push(bb28);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb31.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb31.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(7);
-    inst.args.push(arg);
-    bb31.append(inst);
-    bb32.successors.push(new FrequentedBlock(bb34, Normal));
-    bb32.successors.push(new FrequentedBlock(bb33, Rare));
-    bb32.predecessors.push(bb31);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createImm(400);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    bb32.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb32.append(inst);
-    bb33.successors.push(new FrequentedBlock(bb34, Normal));
-    bb33.predecessors.push(bb32);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createImm(0);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb33.append(inst);
-    inst = new Inst(Jump);
-    bb33.append(inst);
-    bb34.successors.push(new FrequentedBlock(bb12, Normal));
-    bb34.successors.push(new FrequentedBlock(bb35, Normal));
-    bb34.predecessors.push(bb32);
-    bb34.predecessors.push(bb33);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createImm(4);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb34.append(inst);
-    inst = new Inst(DivDouble);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm1);
-    inst.args.push(arg);
-    arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb34.append(inst);
-    inst = new Inst(DivDouble);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm2);
-    inst.args.push(arg);
-    arg = Arg.createIndex(Reg.r9, Reg.rdi, 8, 0);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Add32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(DivDouble);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm3);
-    inst.args.push(arg);
-    arg = Arg.createIndex(Reg.r9, Reg.rsi, 8, 0);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(DivDouble);
-    arg = Arg.createTmp(Reg.xmm6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createDoubleCond(DoubleNotEqualOrUnordered);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: FP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(MoveDouble);
-    arg = Arg.createTmp(Reg.xmm5);
-    inst.args.push(arg);
-    arg = Arg.createIndex(Reg.r9, Reg.rax, 8, 0);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb34.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(400);
-    inst.args.push(arg);
-    bb34.append(inst);
-    bb35.successors.push(new FrequentedBlock(bb11, Normal));
-    bb35.successors.push(new FrequentedBlock(bb36, Normal));
-    bb35.predecessors.push(bb34);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb35.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb35.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(267);
-    inst.args.push(arg);
-    bb35.append(inst);
-    bb36.predecessors.push(bb35);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(144506576, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb36.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb36.append(inst);
-    return code;
-}
diff --git a/ARES-6/Air/payload-typescript-scanIdentifier.js b/ARES-6/Air/payload-typescript-scanIdentifier.js
deleted file mode 100644
index 8c8becc..0000000
--- a/ARES-6/Air/payload-typescript-scanIdentifier.js
+++ /dev/null
@@ -1,1878 +0,0 @@
-"use strict";
-// Generated by Air::dumpAsJS from scanIdentifier#EPcFQe in Octane/typescript
-function createPayloadTypescriptScanIdentifier()
-{
-    let code = new Code();
-    let bb0 = code.addBlock();
-    let bb1 = code.addBlock();
-    let bb2 = code.addBlock();
-    let bb3 = code.addBlock();
-    let bb4 = code.addBlock();
-    let bb5 = code.addBlock();
-    let bb6 = code.addBlock();
-    let bb7 = code.addBlock();
-    let bb8 = code.addBlock();
-    let bb9 = code.addBlock();
-    let bb10 = code.addBlock();
-    let bb11 = code.addBlock();
-    let bb12 = code.addBlock();
-    let bb13 = code.addBlock();
-    let bb14 = code.addBlock();
-    let bb15 = code.addBlock();
-    let bb16 = code.addBlock();
-    let bb17 = code.addBlock();
-    let bb18 = code.addBlock();
-    let bb19 = code.addBlock();
-    let bb20 = code.addBlock();
-    let bb21 = code.addBlock();
-    let bb22 = code.addBlock();
-    let bb23 = code.addBlock();
-    let bb24 = code.addBlock();
-    let bb25 = code.addBlock();
-    let bb26 = code.addBlock();
-    let bb27 = code.addBlock();
-    let bb28 = code.addBlock();
-    let bb29 = code.addBlock();
-    let bb30 = code.addBlock();
-    let bb31 = code.addBlock();
-    let bb32 = code.addBlock();
-    let bb33 = code.addBlock();
-    let bb34 = code.addBlock();
-    let slot0 = code.addStackSlot(56, Locked);
-    let slot1 = code.addStackSlot(8, Spill);
-    let slot2 = code.addStackSlot(8, Spill);
-    let slot3 = code.addStackSlot(8, Spill);
-    let slot4 = code.addStackSlot(8, Spill);
-    let slot5 = code.addStackSlot(4, Spill);
-    let slot6 = code.addStackSlot(8, Spill);
-    let slot7 = code.addStackSlot(8, Spill);
-    let slot8 = code.addStackSlot(8, Spill);
-    let slot9 = code.addStackSlot(40, Locked);
-    slot9.setOffsetFromFP(-40);
-    let tmp98 = code.newTmp(GP);
-    let tmp97 = code.newTmp(GP);
-    let tmp96 = code.newTmp(GP);
-    let tmp95 = code.newTmp(GP);
-    let tmp94 = code.newTmp(GP);
-    let tmp93 = code.newTmp(GP);
-    let tmp92 = code.newTmp(GP);
-    let tmp91 = code.newTmp(GP);
-    let tmp90 = code.newTmp(GP);
-    let tmp89 = code.newTmp(GP);
-    let tmp88 = code.newTmp(GP);
-    let tmp87 = code.newTmp(GP);
-    let tmp86 = code.newTmp(GP);
-    let tmp85 = code.newTmp(GP);
-    let tmp84 = code.newTmp(GP);
-    let tmp83 = code.newTmp(GP);
-    let tmp82 = code.newTmp(GP);
-    let tmp81 = code.newTmp(GP);
-    let tmp80 = code.newTmp(GP);
-    let tmp79 = code.newTmp(GP);
-    let tmp78 = code.newTmp(GP);
-    let tmp77 = code.newTmp(GP);
-    let tmp76 = code.newTmp(GP);
-    let tmp75 = code.newTmp(GP);
-    let tmp74 = code.newTmp(GP);
-    let tmp73 = code.newTmp(GP);
-    let tmp72 = code.newTmp(GP);
-    let tmp71 = code.newTmp(GP);
-    let tmp70 = code.newTmp(GP);
-    let tmp69 = code.newTmp(GP);
-    let tmp68 = code.newTmp(GP);
-    let tmp67 = code.newTmp(GP);
-    let tmp66 = code.newTmp(GP);
-    let tmp65 = code.newTmp(GP);
-    let tmp64 = code.newTmp(GP);
-    let tmp63 = code.newTmp(GP);
-    let tmp62 = code.newTmp(GP);
-    let tmp61 = code.newTmp(GP);
-    let tmp60 = code.newTmp(GP);
-    let tmp59 = code.newTmp(GP);
-    let tmp58 = code.newTmp(GP);
-    let tmp57 = code.newTmp(GP);
-    let tmp56 = code.newTmp(GP);
-    let tmp55 = code.newTmp(GP);
-    let tmp54 = code.newTmp(GP);
-    let tmp53 = code.newTmp(GP);
-    let tmp52 = code.newTmp(GP);
-    let tmp51 = code.newTmp(GP);
-    let tmp50 = code.newTmp(GP);
-    let tmp49 = code.newTmp(GP);
-    let tmp48 = code.newTmp(GP);
-    let tmp47 = code.newTmp(GP);
-    let tmp46 = code.newTmp(GP);
-    let tmp45 = code.newTmp(GP);
-    let tmp44 = code.newTmp(GP);
-    let tmp43 = code.newTmp(GP);
-    let tmp42 = code.newTmp(GP);
-    let tmp41 = code.newTmp(GP);
-    let tmp40 = code.newTmp(GP);
-    let tmp39 = code.newTmp(GP);
-    let tmp38 = code.newTmp(GP);
-    let tmp37 = code.newTmp(GP);
-    let tmp36 = code.newTmp(GP);
-    let tmp35 = code.newTmp(GP);
-    let tmp34 = code.newTmp(GP);
-    let tmp33 = code.newTmp(GP);
-    let tmp32 = code.newTmp(GP);
-    let tmp31 = code.newTmp(GP);
-    let tmp30 = code.newTmp(GP);
-    let tmp29 = code.newTmp(GP);
-    let tmp28 = code.newTmp(GP);
-    let tmp27 = code.newTmp(GP);
-    let tmp26 = code.newTmp(GP);
-    let tmp25 = code.newTmp(GP);
-    let tmp24 = code.newTmp(GP);
-    let tmp23 = code.newTmp(GP);
-    let tmp22 = code.newTmp(GP);
-    let tmp21 = code.newTmp(GP);
-    let tmp20 = code.newTmp(GP);
-    let tmp19 = code.newTmp(GP);
-    let tmp18 = code.newTmp(GP);
-    let tmp17 = code.newTmp(GP);
-    let tmp16 = code.newTmp(GP);
-    let tmp15 = code.newTmp(GP);
-    let tmp14 = code.newTmp(GP);
-    let tmp13 = code.newTmp(GP);
-    let tmp12 = code.newTmp(GP);
-    let tmp11 = code.newTmp(GP);
-    let tmp10 = code.newTmp(GP);
-    let tmp9 = code.newTmp(GP);
-    let tmp8 = code.newTmp(GP);
-    let tmp7 = code.newTmp(GP);
-    let tmp6 = code.newTmp(GP);
-    let tmp5 = code.newTmp(GP);
-    let tmp4 = code.newTmp(GP);
-    let tmp3 = code.newTmp(GP);
-    let tmp2 = code.newTmp(GP);
-    let tmp1 = code.newTmp(GP);
-    let tmp0 = code.newTmp(GP);
-    let inst;
-    let arg;
-    bb0.successors.push(new FrequentedBlock(bb5, Normal));
-    bb0.successors.push(new FrequentedBlock(bb4, Normal));
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(177329888, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 16);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Scratch, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbp, 40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(2, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 5);
-    inst.args.push(arg);
-    arg = Arg.createImm(21);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 8});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(2540);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 72);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Compare32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(92);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(154991936, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(NotEqual);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(80);
-    inst.args.push(arg);
-    arg = Arg.createBigImm(154991936, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(154991944, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createAddr(Reg.r12, -8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb0.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.r12, Reg.rax, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Xor64);
-    arg = Arg.createImm(6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot2, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot1, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(129987312, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot4, 0);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(108418352, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(0, -65536);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb0.append(inst);
-    bb1.predecessors.push(bb6);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb1.append(inst);
-    inst = new Inst(Oops);
-    bb1.append(inst);
-    bb2.predecessors.push(bb23);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb2.append(inst);
-    inst = new Inst(Oops);
-    bb2.append(inst);
-    bb3.predecessors.push(bb32);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb3.append(inst);
-    inst = new Inst(Oops);
-    bb3.append(inst);
-    bb4.predecessors.push(bb0);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb4.append(inst);
-    inst = new Inst(Oops);
-    bb4.append(inst);
-    bb5.successors.push(new FrequentedBlock(bb8, Normal));
-    bb5.successors.push(new FrequentedBlock(bb6, Rare));
-    bb5.predecessors.push(bb0);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 56);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, -24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r10, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb5.append(inst);
-    bb6.successors.push(new FrequentedBlock(bb1, Rare));
-    bb6.successors.push(new FrequentedBlock(bb7, Normal));
-    bb6.predecessors.push(bb5);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 36);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot8, 0);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot7, 0);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot6, 0);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot7, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createStack(slot6, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(129987312, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb6.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    bb6.append(inst);
-    bb7.successors.push(new FrequentedBlock(bb11, Normal));
-    bb7.predecessors.push(bb6);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb7.append(inst);
-    inst = new Inst(Jump);
-    bb7.append(inst);
-    bb8.successors.push(new FrequentedBlock(bb11, Normal));
-    bb8.predecessors.push(bb5);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb8.append(inst);
-    inst = new Inst(Jump);
-    bb8.append(inst);
-    bb9.successors.push(new FrequentedBlock(bb11, Normal));
-    bb9.predecessors.push(bb15);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb9.append(inst);
-    inst = new Inst(Jump);
-    bb9.append(inst);
-    bb10.successors.push(new FrequentedBlock(bb11, Normal));
-    bb10.predecessors.push(bb18);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb10.append(inst);
-    inst = new Inst(Jump);
-    bb10.append(inst);
-    bb11.successors.push(new FrequentedBlock(bb12, Normal));
-    bb11.successors.push(new FrequentedBlock(bb16, Normal));
-    bb11.predecessors.push(bb7);
-    bb11.predecessors.push(bb10);
-    bb11.predecessors.push(bb9);
-    bb11.predecessors.push(bb8);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r9);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb11.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 40);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 32);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(Overflow);
-    inst.args.push(arg);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.UseZDef, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.LateColdUse, type: GP, width: 32});
-    bb11.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 32);
-    inst.args.push(arg);
-    bb11.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThan);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb11.append(inst);
-    bb12.successors.push(new FrequentedBlock(bb13, Normal));
-    bb12.successors.push(new FrequentedBlock(bb14, Normal));
-    bb12.predecessors.push(bb11);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.r10, 12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb12.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r10, 16);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb12.append(inst);
-    inst = new Inst(BranchTest32);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rax, 16);
-    inst.args.push(arg);
-    arg = Arg.createImm(8);
-    inst.args.push(arg);
-    bb12.append(inst);
-    bb13.successors.push(new FrequentedBlock(bb15, Normal));
-    bb13.predecessors.push(bb12);
-    inst = new Inst(Load8);
-    arg = Arg.createIndex(Reg.r9, Reg.rdx, 1, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb13.append(inst);
-    inst = new Inst(Jump);
-    bb13.append(inst);
-    bb14.successors.push(new FrequentedBlock(bb15, Normal));
-    bb14.predecessors.push(bb12);
-    inst = new Inst(Load16);
-    arg = Arg.createIndex(Reg.r9, Reg.rdx, 2, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb14.append(inst);
-    inst = new Inst(Jump);
-    bb14.append(inst);
-    bb15.successors.push(new FrequentedBlock(bb9, Normal));
-    bb15.successors.push(new FrequentedBlock(bb17, Normal));
-    bb15.predecessors.push(bb14);
-    bb15.predecessors.push(bb13);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Add64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbx, 72);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createRelCond(AboveOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r8);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb15.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createIndex(Reg.r12, Reg.rax, 8, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(MoveConditionallyTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Xor64);
-    arg = Arg.createImm(6);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(-2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb15.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb15.append(inst);
-    bb16.predecessors.push(bb11);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb16.append(inst);
-    inst = new Inst(Oops);
-    bb16.append(inst);
-    bb17.successors.push(new FrequentedBlock(bb18, Normal));
-    bb17.successors.push(new FrequentedBlock(bb19, Normal));
-    bb17.predecessors.push(bb15);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(48);
-    inst.args.push(arg);
-    bb17.append(inst);
-    bb18.successors.push(new FrequentedBlock(bb10, Normal));
-    bb18.successors.push(new FrequentedBlock(bb19, Normal));
-    bb18.predecessors.push(bb17);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(LessThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(57);
-    inst.args.push(arg);
-    bb18.append(inst);
-    bb19.successors.push(new FrequentedBlock(bb20, Normal));
-    bb19.successors.push(new FrequentedBlock(bb21, Normal));
-    bb19.predecessors.push(bb17);
-    bb19.predecessors.push(bb18);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(GreaterThanOrEqual);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(128);
-    inst.args.push(arg);
-    bb19.append(inst);
-    bb20.predecessors.push(bb19);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb20.append(inst);
-    inst = new Inst(Oops);
-    bb20.append(inst);
-    bb21.successors.push(new FrequentedBlock(bb22, Normal));
-    bb21.successors.push(new FrequentedBlock(bb23, Normal));
-    bb21.predecessors.push(bb19);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    bb21.append(inst);
-    inst = new Inst(Branch32);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createImm(92);
-    inst.args.push(arg);
-    bb21.append(inst);
-    bb22.predecessors.push(bb21);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot5, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb22.append(inst);
-    inst = new Inst(Oops);
-    bb22.append(inst);
-    bb23.successors.push(new FrequentedBlock(bb2, Rare));
-    bb23.successors.push(new FrequentedBlock(bb24, Normal));
-    bb23.predecessors.push(bb21);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rbx, 48);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(155021568, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(3);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r10);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r11);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(155041288, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, 0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.rax, -1336);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createAddr(Reg.r13, 24);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot0, 0);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 36);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(108356304, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createStack(slot3, 0);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb23.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(129987312, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb23.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    bb23.append(inst);
-    bb24.successors.push(new FrequentedBlock(bb25, Normal));
-    bb24.successors.push(new FrequentedBlock(bb26, Normal));
-    bb24.predecessors.push(bb23);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r13);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb24.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb24.append(inst);
-    bb25.successors.push(new FrequentedBlock(bb27, Normal));
-    bb25.successors.push(new FrequentedBlock(bb26, Normal));
-    bb25.predecessors.push(bb24);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb25.append(inst);
-    inst = new Inst(And64);
-    arg = Arg.createImm(-9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb25.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    bb25.append(inst);
-    bb26.successors.push(new FrequentedBlock(bb29, Normal));
-    bb26.successors.push(new FrequentedBlock(bb28, Normal));
-    bb26.predecessors.push(bb24);
-    bb26.predecessors.push(bb25);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    bb26.append(inst);
-    bb27.successors.push(new FrequentedBlock(bb30, Normal));
-    bb27.predecessors.push(bb25);
-    inst = new Inst(Move);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb27.append(inst);
-    inst = new Inst(Jump);
-    bb27.append(inst);
-    bb28.successors.push(new FrequentedBlock(bb32, Normal));
-    bb28.predecessors.push(bb26);
-    inst = new Inst(Jump);
-    bb28.append(inst);
-    bb29.successors.push(new FrequentedBlock(bb30, Normal));
-    bb29.predecessors.push(bb26);
-    inst = new Inst(Jump);
-    bb29.append(inst);
-    bb30.successors.push(new FrequentedBlock(bb34, Normal));
-    bb30.successors.push(new FrequentedBlock(bb31, Normal));
-    bb30.predecessors.push(bb29);
-    bb30.predecessors.push(bb27);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb30.append(inst);
-    inst = new Inst(And64);
-    arg = Arg.createImm(-9);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb30.append(inst);
-    inst = new Inst(Branch64);
-    arg = Arg.createRelCond(Equal);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createImm(2);
-    inst.args.push(arg);
-    bb30.append(inst);
-    bb31.successors.push(new FrequentedBlock(bb32, Normal));
-    bb31.predecessors.push(bb30);
-    inst = new Inst(Jump);
-    bb31.append(inst);
-    bb32.successors.push(new FrequentedBlock(bb3, Rare));
-    bb32.successors.push(new FrequentedBlock(bb33, Normal));
-    bb32.predecessors.push(bb28);
-    bb32.predecessors.push(bb31);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(3);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rbp, 36);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(154991632, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rbp);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createBigImm(108356304, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.xmm0);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rsi);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rdx);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: FP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb32.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(129987312, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rcx);
-    inst.args.push(arg);
-    bb32.append(inst);
-    inst = new Inst(BranchTest64);
-    arg = Arg.createResCond(NonZero);
-    inst.args.push(arg);
-    arg = Arg.createAddr(Reg.rcx, 0);
-    inst.args.push(arg);
-    arg = Arg.createImm(-1);
-    inst.args.push(arg);
-    bb32.append(inst);
-    bb33.predecessors.push(bb32);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb33.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb33.append(inst);
-    bb34.predecessors.push(bb30);
-    inst = new Inst(Move);
-    arg = Arg.createBigImm(153835296, 1);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move32);
-    arg = Arg.createImm(3);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createTmp(Reg.r12);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Move);
-    arg = Arg.createImm(6);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(8);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(16);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(24);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(32);
-    inst.args.push(arg);
-    arg = Arg.createCallArg(40);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r15);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.r14);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.extraEarlyClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.rcx);
-    inst.extraClobberedRegs.add(Reg.rdx);
-    inst.extraClobberedRegs.add(Reg.rsi);
-    inst.extraClobberedRegs.add(Reg.rdi);
-    inst.extraClobberedRegs.add(Reg.r8);
-    inst.extraClobberedRegs.add(Reg.r9);
-    inst.extraClobberedRegs.add(Reg.r10);
-    inst.extraClobberedRegs.add(Reg.r11);
-    inst.extraClobberedRegs.add(Reg.xmm0);
-    inst.extraClobberedRegs.add(Reg.xmm1);
-    inst.extraClobberedRegs.add(Reg.xmm2);
-    inst.extraClobberedRegs.add(Reg.xmm3);
-    inst.extraClobberedRegs.add(Reg.xmm4);
-    inst.extraClobberedRegs.add(Reg.xmm5);
-    inst.extraClobberedRegs.add(Reg.xmm6);
-    inst.extraClobberedRegs.add(Reg.xmm7);
-    inst.extraClobberedRegs.add(Reg.xmm8);
-    inst.extraClobberedRegs.add(Reg.xmm9);
-    inst.extraClobberedRegs.add(Reg.xmm10);
-    inst.extraClobberedRegs.add(Reg.xmm11);
-    inst.extraClobberedRegs.add(Reg.xmm12);
-    inst.extraClobberedRegs.add(Reg.xmm13);
-    inst.extraClobberedRegs.add(Reg.xmm14);
-    inst.extraClobberedRegs.add(Reg.xmm15);
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Def, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 32});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(Patch);
-    arg = Arg.createSpecial();
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rbx);
-    inst.args.push(arg);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    inst.patchHasNonArgEffects = true;
-    inst.extraEarlyClobberedRegs = new Set();
-    inst.extraClobberedRegs = new Set();
-    inst.patchArgData = [];
-    inst.patchArgData.push({role: Arg.Use, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    inst.patchArgData.push({role: Arg.ColdUse, type: GP, width: 64});
-    bb34.append(inst);
-    inst = new Inst(Ret64);
-    arg = Arg.createTmp(Reg.rax);
-    inst.args.push(arg);
-    bb34.append(inst);
-    return code;
-}
diff --git a/ARES-6/Air/reg.js b/ARES-6/Air/reg.js
deleted file mode 100644
index 502b564..0000000
--- a/ARES-6/Air/reg.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Reg extends TmpBase {
-    constructor(index, type, name, isCalleeSave)
-    {
-        super();
-        this._index = index;
-        this._type = type;
-        this._name = name;
-        this._isCalleeSave = !!isCalleeSave;
-    }
-    
-    static fromReg(reg)
-    {
-        return reg;
-    }
-    
-    get index() { return this._index; }
-    get type() { return this._type; }
-    get name() { return this._name; }
-    get isCalleeSave() { return this._isCalleeSave; }
-    
-    get isReg() { return true; }
-    
-    hash()
-    {
-        if (this.isGP)
-            return 1 + this._index;
-        return -1 - this._index;
-    }
-    
-    toString()
-    {
-        return `%${this._name}`;
-    }
-    
-    static extract(arg)
-    {
-        if (arg.isReg)
-            return arg.reg;
-        return null;
-    }
-    
-    static forEachFast(arg, func)
-    {
-        return arg.forEachTmpFast(tmp => {
-            if (!tmp.isReg)
-                return;
-            return func(tmp);
-        });
-    }
-    
-    static forEach(arg, argRole, argType, argWidth, func)
-    {
-        return arg.forEachTmp(
-            argRole, argType, argWidth,
-            (tmp, role, type, width) => {
-                if (!tmp.isReg)
-                    return;
-                return func(tmp, role, type, width);
-            });
-    }
-}
-
-{
-    Reg.regs = [];
-    function newReg(...args)
-    {
-        let result = new Reg(...args);
-        Reg.regs.push(result);
-        return result;
-    }
-
-    // Define X86_64 GPRs
-    {
-        let index = 0;
-        function newGPR(name, isCalleeSave) { return newReg(index++, GP, name, isCalleeSave); }
-        
-        Reg.rax = newGPR("rax");
-        Reg.rcx = newGPR("rcx");
-        Reg.rdx = newGPR("rdx");
-        Reg.rbx = newGPR("rbx", true);
-        Reg.rsp = newGPR("rsp");
-        Reg.rbp = newGPR("rbp", true);
-        Reg.rsi = newGPR("rsi");
-        Reg.rdi = newGPR("rdi");
-        for (let i = 8; i <= 15; ++i)
-            Reg[`r${i}`] = newGPR(`r${i}`, i >= 12);
-    }
-
-    // Define X86_64 FPRs.
-    for (let i = 0; i <= 15; ++i)
-        Reg[`xmm${i}`] = newReg(i, FP, `xmm${i}`);
-
-    Reg.gprs = []
-    Reg.fprs = []
-    Reg.calleeSaveGPRs = []
-    Reg.calleeSaveFPRs = []
-    Reg.calleeSaves = []
-    for (let reg of Reg.regs) {
-        if (reg.isGP) {
-            Reg.gprs.push(reg);
-            if (reg.isCalleeSave)
-                Reg.calleeSaveGPRs.push(reg);
-        } else {
-            Reg.fprs.push(reg);
-            if (reg.isCalleeSave)
-                Reg.calleeSaveFPRS.push(reg);
-        }
-        if (reg.isCalleeSave)
-            Reg.calleeSaves.push(reg);
-    }
-    
-    Reg.callFrameRegister = Reg.rbp;
-    Reg.stackPointerRegister = Reg.rsp;
-}
diff --git a/ARES-6/Air/stack_slot.js b/ARES-6/Air/stack_slot.js
deleted file mode 100644
index dafd87a..0000000
--- a/ARES-6/Air/stack_slot.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class StackSlot {
-    constructor(index, byteSize, kind)
-    {
-        this._index = index;
-        this._byteSize = byteSize;
-        this._kind = kind;
-    }
-    
-    get byteSize() { return this._byteSize; }
-    get kind() { return this._kind; }
-    
-    get isLocked() { return this._kind == Locked; }
-    get isSpill() { return this._kind == Spill; }
-    
-    get index() { return this._index; }
-
-    ensureSize(size)
-    {
-        if (this._offsetFromFP)
-            throw new Error("Stack slot already allocated");
-        this._byteSize = Math.max(this._byteSize, size);
-    }
-    
-    get alignment()
-    {
-        if (this._byteSize <= 1)
-            return 1;
-        if (this._byteSize <= 2)
-            return 2;
-        if (this._byteSize <= 4)
-            return 4;
-        return 8;
-    }
-    
-    get offsetFromFP() { return this._offsetFromFP; }
-    
-    setOffsetFromFP(value) { this._offsetFromFP = value; }
-    
-    hash()
-    {
-        return ((this._kind == Spill ? 1 : 0) + this._byteSize * 3 + (this._offsetFromFP ? this._offsetFromFP * 7 : 0)) >>> 0;
-    }
-    
-    toString()
-    {
-        return "" + (this.isSpill ? "spill" : "stack") + this._index + "<" + this._byteSize +
-            (this._offsetFromFP ? ", offset = " + this._offsetFromFP : "") + ">";
-    }
-    
-    static extract(arg)
-    {
-        if (arg.isStack)
-            return arg.stackSlot;
-        return null;
-    }
-    
-    static forEachFast(arg, func)
-    {
-        if (!arg.isStack)
-            return;
-        
-        let replacement;
-        if (replacement = func(arg.stackSlot))
-            return Arg.createStack(replacement, this._offset);
-    }
-    
-    static forEach(arg, role, type, width, func)
-    {
-        if (!arg.isStack)
-            return;
-        
-        let replacement;
-        if (replacement = func(arg.stackSlot, role, type, width))
-            return Arg.createStack(replacement, this._offset);
-    }
-}
diff --git a/ARES-6/Air/stress-test.js b/ARES-6/Air/stress-test.js
deleted file mode 100644
index b2cfa43..0000000
--- a/ARES-6/Air/stress-test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-load("all.js");
-load("payload-gbemu-executeIteration.js");
-load("payload-imaging-gaussian-blur-gaussianBlur.js");
-load("payload-airjs-ACLj8C.js");
-load("payload-typescript-scanIdentifier.js");
-load("benchmark.js");
-
-let benchmark = new AirBenchmark();
-let before = preciseTime();
-
-// Run for at least 10 iterations.
-for (let i = 0; i < 10; ++i) {
-    print("Running mandatory iteration #" + (i + 1) + ":");
-    benchmark.runIteration();
-}
-
-// Run until we have been running for two seconds.
-while (preciseTime() < before + 2) {
-    print("Running bonus iteration:");
-    benchmark.runIteration();
-}
-
-print("Success!");
-
-
-
diff --git a/ARES-6/Air/strip-hash.rb b/ARES-6/Air/strip-hash.rb
deleted file mode 100644
index b5c2393..0000000
--- a/ARES-6/Air/strip-hash.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# This is a useful hack for cleaning up the payloads generated by Air::dumpAsJS(). That will
-# generate code that computes the hash of insts and stack slots and checks it. This is useful for
-# debugging, but we probably don't want that overhead in the payloads we deploy. So, you can run
-# this script to remove all of the hashing code.
-
-ARGV.each {
-    | filename |
-    IO::write(filename, IO::read(filename).lines.reject{|v| v =~ /hash/i}.join())
-}
-
diff --git a/ARES-6/Air/symbols.js b/ARES-6/Air/symbols.js
deleted file mode 100644
index 4ef7c63..0000000
--- a/ARES-6/Air/symbols.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-// This file is for misc symbols.
-
-// B3 types
-const Void = Symbol("Void");
-const Int32 = Symbol("Int32");
-const Int64 = Symbol("Int64");
-const Float = Symbol("Float");
-const Double = Symbol("Double");
-
-// Arg type
-const GP = Symbol("GP");
-const FP = Symbol("FP");
-
-// Stack slot kind
-const Locked = Symbol("Locked");
-const Spill = Symbol("Spill");
-
-// Frequency class
-const Normal = Symbol("Normal");
-const Rare = Symbol("Rare");
-
-// Relational conditions
-const Equal = Symbol("Equal");
-const NotEqual = Symbol("NotEqual");
-const Above = Symbol("Above");
-const AboveOrEqual = Symbol("AboveOrEqual");
-const Below = Symbol("Below");
-const BelowOrEqual = Symbol("BelowOrEqual");
-const GreaterThan = Symbol("GreaterThan");
-const GreaterThanOrEqual = Symbol("GreaterThanOrEqual");
-const LessThan = Symbol("LessThan");
-const LessThanOrEqual = Symbol("LessThanOrEqual");
-
-function relCondCode(cond)
-{
-    switch (cond) {
-    case Equal:
-        return 4;
-    case NotEqual:
-        return 5;
-    case Above:
-        return 7;
-    case AboveOrEqual:
-        return 3;
-    case Below:
-        return 2;
-    case BelowOrEqual:
-        return 6;
-    case GreaterThan:
-        return 15;
-    case GreaterThanOrEqual:
-        return 13;
-    case LessThan:
-        return 12;
-    case LessThanOrEqual:
-        return 14;
-    default:
-        throw new Error("Bad rel cond");
-    }
-}
-
-// Result conditions
-const Overflow = Symbol("Overflow");
-const Signed = Symbol("Signed");
-const PositiveOrZero = Symbol("PositiveOrZero");
-const Zero = Symbol("Zero");
-const NonZero = Symbol("NonZero");
-
-function resCondCode(cond)
-{
-    switch (cond) {
-    case Overflow:
-        return 0;
-    case Signed:
-        return 8;
-    case PositiveOrZero:
-        return 9;
-    case Zero:
-        return 4;
-    case NonZero:
-        return 5;
-    default:
-        throw new Error("Bad res cond: " + cond.toString());
-    }
-}
-
-// Double conditions
-const DoubleEqual = Symbol("DoubleEqual");
-const DoubleNotEqual = Symbol("DoubleNotEqual");
-const DoubleGreaterThan = Symbol("DoubleGreaterThan");
-const DoubleGreaterThanOrEqual = Symbol("DoubleGreaterThanOrEqual");
-const DoubleLessThan = Symbol("DoubleLessThan");
-const DoubleLessThanOrEqual = Symbol("DoubleLessThanOrEqual");
-const DoubleEqualOrUnordered = Symbol("DoubleEqualOrUnordered");
-const DoubleNotEqualOrUnordered = Symbol("DoubleNotEqualOrUnordered");
-const DoubleGreaterThanOrUnordered = Symbol("DoubleGreaterThanOrUnordered");
-const DoubleGreaterThanOrEqualOrUnordered = Symbol("DoubleGreaterThanOrEqualOrUnordered");
-const DoubleLessThanOrUnordered = Symbol("DoubleLessThanOrUnordered");
-const DoubleLessThanOrEqualOrUnordered = Symbol("DoubleLessThanOrEqualOrUnordered");
-
-function doubleCondCode(cond)
-{
-    const bitInvert = 0x10;
-    const bitSpecial = 0x20;
-    switch (cond) {
-    case DoubleEqual:
-        return 4 | bitSpecial;
-    case DoubleNotEqual:
-        return 5;
-    case DoubleGreaterThan:
-        return 7;
-    case DoubleGreaterThanOrEqual:
-        return 3;
-    case DoubleLessThan:
-        return 7 | bitInvert;
-    case DoubleLessThanOrEqual:
-        return 3 | bitInvert;
-    case DoubleEqualOrUnordered:
-        return 4;
-    case DoubleNotEqualOrUnordered:
-        return 5 | bitSpecial;
-    case DoubleGreaterThanOrUnordered:
-        return 2 | bitInvert;
-    case DoubleGreaterThanOrEqualOrUnordered:
-        return 6 | bitInvert;
-    case DoubleLessThanOrUnordered:
-        return 2;
-    case DoubleLessThanOrEqualOrUnordered:
-        return 6;
-    default:
-        throw new Error("Bad cond");
-    }
-}
-
-// Define pointerType()
-const Ptr = 64;
diff --git a/ARES-6/Air/test.html b/ARES-6/Air/test.html
deleted file mode 100644
index 506ef3d..0000000
--- a/ARES-6/Air/test.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<html>
-<head>
-<title>Air.js</title>
-<script src="symbols.js"></script>
-<script src="tmp_base.js"></script>
-<script src="arg.js"></script>
-<script src="basic_block.js"></script>
-<script src="code.js"></script>
-<script src="frequented_block.js"></script>
-<script src="inst.js"></script>
-<script src="opcode.js"></script>
-<script src="reg.js"></script>
-<script src="stack_slot.js"></script>
-<script src="tmp.js"></script>
-<script src="util.js"></script>
-<script src="custom.js"></script>
-<script src="liveness.js"></script>
-<script src="insertion_set.js"></script>
-<script src="allocate_stack.js"></script>
-<script src="payload-gbemu-executeIteration.js"></script>
-<script src="payload-imaging-gaussian-blur-gaussianBlur.js"></script>
-<script src="payload-airjs-ACLj8C.js"></script>
-<script src="payload-typescript-scanIdentifier.js"></script>
-<script src="benchmark.js"></script>
-<script>
-    function runTest() {
-        try {
-            var result = runBenchmark();
-            document.getElementById("result-summary").innerHTML = "That took " + result + " ms.";
-        } catch (e) {
-            document.getElementById("result-summary").innerHTML = "Failed: " + e;
-        }
-    }
-</script>
-</head>
-<body>
-<h1>Air.js</h1>
-<p>
-  <div id="result-summary"></div>
-  <div><a href="javascript:runTest()">Start Test</a></div>
-</p>
-</body>
-</html>
-
-
diff --git a/ARES-6/Air/test.js b/ARES-6/Air/test.js
deleted file mode 100644
index 02c011a..0000000
--- a/ARES-6/Air/test.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-load("all.js");
-load("payload-gbemu-executeIteration.js");
-load("payload-imaging-gaussian-blur-gaussianBlur.js");
-load("payload-airjs-ACLj8C.js");
-load("payload-typescript-scanIdentifier.js");
-load("benchmark.js");
-
-let result = runBenchmark();
-print("That took " + result + " ms.");
diff --git a/ARES-6/Air/tmp.js b/ARES-6/Air/tmp.js
deleted file mode 100644
index 997219a..0000000
--- a/ARES-6/Air/tmp.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Tmp extends TmpBase {
-    constructor(index, type)
-    {
-        super();
-        this._index = index;
-        this._type = type;
-    }
-    
-    static fromReg(reg)
-    {
-        return reg;
-    }
-    
-    get index() { return this._index; }
-    get type() { return this._type; }
-    
-    get isReg() { return false; }
-    
-    hash()
-    {
-        if (isGP)
-            return Reg.gprs[Reg.gprs.length - 1].hash() + 1 + this._index;
-        return Reg.fprs[Reg.fprs.length - 1].hash() - 1 - this._index;
-    }
-
-    toString()
-    {
-        return "%" + (this.isGP ? "" : "f") + "tmp" + this._index;
-    }
-    
-    static extract(arg)
-    {
-        if (arg.isTmp)
-            return arg.tmp;
-        return null;
-    }
-
-    static forEachFast(arg, func) { return arg.forEachTmpFast(func); }
-    static forEach(arg, role, type, width, func) { return arg.forEachTmp(role, type, width, func); }
-}
diff --git a/ARES-6/Air/tmp_base.js b/ARES-6/Air/tmp_base.js
deleted file mode 100644
index a5ec75c..0000000
--- a/ARES-6/Air/tmp_base.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class TmpBase {
-    get isGP() { return this.type == GP; }
-    get isFP() { return this.type == FP; }
-    
-    get isGPR() { return this.isReg && this.isGP; }
-    get isFPR() { return this.isReg && this.isFP; }
-    
-    get reg()
-    {
-        if (!this.isReg)
-            throw new Error("Called .reg on non-Reg");
-        return this;
-    }
-
-    get gpr()
-    {
-        if (!this.isGPR)
-            throw new Error("Called .gpr on non-GPR");
-        return this;
-    }
-    
-    get fpr()
-    {
-        if (!this.isFPR)
-            throw new Error("Called .fpr on non-FPR");
-        return this;
-    }
-}
-
diff --git a/ARES-6/Air/util.js b/ARES-6/Air/util.js
deleted file mode 100644
index a2c7de9..0000000
--- a/ARES-6/Air/util.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-function isRepresentableAsInt32(value)
-{
-    return (value | 0) === value;
-}
-
-function addIndexed(list, cons, ...args)
-{
-    let result = new cons(list.length, ...args);
-    list.push(result);
-    return result;
-}
-
-const stackAlignmentBytes = 16;
-
-function roundUpToMultipleOf(amount, value)
-{
-    return Math.ceil(value / amount) * amount;
-}
-
-function symbolName(symbol)
-{
-    let fullString = symbol.toString();
-    return fullString.substring("Symbol(".length, fullString.length - ")".length);
-}
-
-function lowerSymbolName(symbol)
-{
-    return symbolName(symbol).toLowerCase();
-}
-
-function setToString(set)
-{
-    let result = "";
-    for (let value of set) {
-        if (result)
-            result += ", ";
-        result += value;
-    }
-    return result;
-}
-
-function mergeIntoSet(target, source)
-{
-    let didAdd = false;
-    for (let value of source) {
-        if (target.has(value))
-            continue;
-        target.add(value);
-        didAdd = true;
-    }
-    return didAdd;
-}
-
-function nonEmptyRangesOverlap(leftMin, leftMax, rightMin, rightMax)
-{
-    if (leftMin >= leftMax)
-        throw new Error("Bad left range");
-    if (rightMin >= rightMax)
-        throw new Error("Bad right range");
-    
-    if (leftMin <= rightMin && leftMax > rightMin)
-        return true;
-    if (rightMin <= leftMin && rightMax > leftMin)
-        return true;
-    return false;
-}
-
-function rangesOverlap(leftMin, leftMax, rightMin, rightMax)
-{
-    if (leftMin > leftMax)
-        throw new Error("Bad left range");
-    if (rightMin > rightMax)
-        throw new Error("Bad right range");
-    
-    if (leftMin == leftMax)
-        return false;
-    if (rightMin == rightMax)
-        return false;
-    
-    return nonEmptyRangesOverlap(leftMin, leftMax, rightMin, rightMax);
-}
-
-function removeAllMatching(array, func)
-{
-    let srcIndex = 0;
-    let dstIndex = 0;
-    while (srcIndex < array.length) {
-        let value = array[srcIndex++];
-        if (!func(value))
-            array[dstIndex++] = value;
-    }
-    array.length = dstIndex;
-}
-
-function bubbleSort(array, lessThan)
-{
-    function swap(i, j)
-    {
-        var tmp = array[i];
-        array[i] = array[j];
-        array[j] = tmp;
-    }
-    
-    let begin = 0;
-    let end = array.length;
-    for (;;) {
-        let changed = false;
-        
-        function bubble(i, j)
-        {
-            if (lessThan(array[i], array[j])) {
-                swap(i, j);
-                changed = true;
-            }
-        }
-    
-        if (end < begin)
-            throw new Error("Begin and end are messed up");
-        
-        let limit = end - begin;
-        for (let i = limit; i-- > 1;)
-            bubble(begin + i, begin + i - 1);
-        if (!changed)
-            return;
-        
-        // After one run, the first element in the list is guaranteed to be the smallest.
-        begin++;
-        
-        // Now go in the other direction. This eliminates most sorting pathologies.
-        changed = false;
-        
-        if (end < begin)
-            throw new Error("Begin and end are messed up");
-        
-        limit = end - begin;
-        for (let i = 1; i < limit; ++i)
-            bubble(begin + i, begin + i - 1);
-        if (!changed)
-            return;
-        
-        // Now the last element is guaranteed to be the largest.
-        end--;
-    }
-}
-
-let currentTime;
-if (this.performance && performance.now)
-    currentTime = function() { return performance.now() };
-else if (this.preciseTime)
-    currentTime = function() { return preciseTime() * 1000; };
-else
-    currentTime = function() { return +new Date(); };
-
diff --git a/ARES-6/Babylon/AUTHORS b/ARES-6/Babylon/AUTHORS
deleted file mode 100644
index 2f39def..0000000
--- a/ARES-6/Babylon/AUTHORS
+++ /dev/null
@@ -1,41 +0,0 @@
-List of Acorn contributors. Updated before every release.
-
-Adrian Rakovsky
-Alistair Braidwood
-Andres Suarez
-Aparajita Fishman
-Arian Stolwijk
-Artem Govorov
-Brandon Mills
-Charles Hughes
-Conrad Irwin
-David Bonnet
-Forbes Lindesay
-Gilad Peleg
-impinball
-Ingvar Stepanyan
-Jesse McCarthy
-Jiaxing Wang
-Joel Kemp
-Johannes Herr
-Jürg Lehni
-keeyipchan
-Kevin Kwok
-krator
-Marijn Haverbeke
-Martin Carlberg
-Mathias Bynens
-Mathieu 'p01' Henri
-Max Schaefer
-Max Zerzouri
-Mihai Bazon
-Mike Rennie
-Nick Fitzgerald
-Oskar Schöldström
-Paul Harper
-Peter Rust
-PlNG
-r-e-d
-Rich Harris
-Sebastian McKenzie
-zsjforcn
diff --git a/ARES-6/Babylon/air-blob.js b/ARES-6/Babylon/air-blob.js
deleted file mode 100644
index 2b8f125..0000000
--- a/ARES-6/Babylon/air-blob.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Reg extends TmpBase {
-    constructor(index, type, name, isCalleeSave)
-    {
-        super();
-        this._index = index;
-        this._type = type;
-        this._name = name;
-        this._isCalleeSave = !!isCalleeSave;
-    }
-    
-    static fromReg(reg)
-    {
-        return reg;
-    }
-    
-    get index() { return this._index; }
-    get type() { return this._type; }
-    get name() { return this._name; }
-    get isCalleeSave() { return this._isCalleeSave; }
-    
-    get isReg() { return true; }
-    
-    hash()
-    {
-        if (this.isGP)
-            return 1 + this._index;
-        return -1 - this._index;
-    }
-    
-    toString()
-    {
-        return `%${this._name}`;
-    }
-    
-    static extract(arg)
-    {
-        if (arg.isReg)
-            return arg.reg;
-        return null;
-    }
-    
-    static forEachFast(arg, func)
-    {
-        return arg.forEachTmpFast(tmp => {
-            if (!tmp.isReg)
-                return;
-            return func(tmp);
-        });
-    }
-    
-    static forEach(arg, argRole, argType, argWidth, func)
-    {
-        return arg.forEachTmp(
-            argRole, argType, argWidth,
-            (tmp, role, type, width) => {
-                if (!tmp.isReg)
-                    return;
-                return func(tmp, role, type, width);
-            });
-    }
-}
-
-{
-    Reg.regs = [];
-    function newReg(...args)
-    {
-        let result = new Reg(...args);
-        Reg.regs.push(result);
-        return result;
-    }
-
-    // Define X86_64 GPRs
-    {
-        let index = 0;
-        function newGPR(name, isCalleeSave) { return newReg(index++, GP, name, isCalleeSave); }
-        
-        Reg.rax = newGPR("rax");
-        Reg.rcx = newGPR("rcx");
-        Reg.rdx = newGPR("rdx");
-        Reg.rbx = newGPR("rbx", true);
-        Reg.rsp = newGPR("rsp");
-        Reg.rbp = newGPR("rbp", true);
-        Reg.rsi = newGPR("rsi");
-        Reg.rdi = newGPR("rdi");
-        for (let i = 8; i <= 15; ++i)
-            Reg[`r${i}`] = newGPR(`r${i}`, i >= 12);
-    }
-
-    // Define X86_64 FPRs.
-    for (let i = 0; i <= 15; ++i)
-        Reg[`xmm${i}`] = newReg(i, FP, `xmm${i}`);
-
-    Reg.gprs = []
-    Reg.fprs = []
-    Reg.calleeSaveGPRs = []
-    Reg.calleeSaveFPRs = []
-    Reg.calleeSaves = []
-    for (let reg of Reg.regs) {
-        if (reg.isGP) {
-            Reg.gprs.push(reg);
-            if (reg.isCalleeSave)
-                Reg.calleeSaveGPRs.push(reg);
-        } else {
-            Reg.fprs.push(reg);
-            if (reg.isCalleeSave)
-                Reg.calleeSaveFPRS.push(reg);
-        }
-        if (reg.isCalleeSave)
-            Reg.calleeSaves.push(reg);
-    }
-    
-    Reg.callFrameRegister = Reg.rbp;
-    Reg.stackPointerRegister = Reg.rsp;
-}
diff --git a/ARES-6/Babylon/babylon-blob.js b/ARES-6/Babylon/babylon-blob.js
deleted file mode 100644
index 38c4443..0000000
--- a/ARES-6/Babylon/babylon-blob.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2012-2014 by various contributors (see AUTHORS)
- *
- * 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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
-*/
-
-import { reservedWords } from "../util/identifier";
-import { getOptions } from "../options";
-import Tokenizer from "../tokenizer";
-
-export const plugins = {};
-
-export default class Parser extends Tokenizer {
-  constructor(options, input) {
-    options = getOptions(options);
-    super(options, input);
-
-    this.options = options;
-    this.inModule = this.options.sourceType === "module";
-    this.input = input;
-    this.plugins = this.loadPlugins(this.options.plugins);
-    this.filename = options.sourceFilename;
-
-    // If enabled, skip leading hashbang line.
-    if (this.state.pos === 0 && this.input[0] === "#" && this.input[1] === "!") {
-      this.skipLineComment(2);
-    }
-  }
-
-  isReservedWord(word) {
-    if (word === "await") {
-      return this.inModule;
-    } else {
-      return reservedWords[6](word);
-    }
-  }
-
-  hasPlugin(name) {
-    return !!this.plugins[name];
-  }
-
-  extend(name, f) {
-    this[name] = f(this[name]);
-  }
-
-  loadPlugins(pluginList) {
-    const pluginMap = {};
-
-    if (pluginList.indexOf("flow") >= 0) {
-      // ensure flow plugin loads last
-      pluginList = pluginList.filter((plugin) => plugin !== "flow");
-      pluginList.push("flow");
-    }
-
-    if (pluginList.indexOf("estree") >= 0) {
-      // ensure estree plugin loads first
-      pluginList = pluginList.filter((plugin) => plugin !== "estree");
-      pluginList.unshift("estree");
-    }
-
-    for (const name of pluginList) {
-      if (!pluginMap[name]) {
-        pluginMap[name] = true;
-
-        const plugin = plugins[name];
-        if (plugin) plugin(this);
-      }
-    }
-
-    return pluginMap;
-  }
-
-  parse() {
-    const file = this.startNode();
-    const program = this.startNode();
-    this.nextToken();
-    return this.parseTopLevel(file, program);
-  }
-}
diff --git a/ARES-6/Babylon/basic-blob.js b/ARES-6/Babylon/basic-blob.js
deleted file mode 100644
index bebd9f6..0000000
--- a/ARES-6/Babylon/basic-blob.js
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-const Basic = {};
-
-Basic.NumberApply = function(state)
-{
-    // I'd call this arguments but we're in strict mode.
-    let parameters = this.parameters.map(value => value.evaluate(state));
-    
-    return state.getValue(this.name, parameters.length).apply(state, parameters);
-};
-
-Basic.Variable = function(state)
-{
-    let parameters = this.parameters.map(value => value.evaluate(state));
-    
-    return state.getValue(this.name, parameters.length).leftApply(state, parameters);
-}
-
-Basic.Const = function(state)
-{
-    return this.value;
-}
-
-Basic.NumberPow = function(state)
-{
-    return Math.pow(this.left.evaluate(state), this.right.evaluate(state));
-}
-
-Basic.NumberMul = function(state)
-{
-    return this.left.evaluate(state) * this.right.evaluate(state);
-}
-
-Basic.NumberDiv = function(state)
-{
-    return this.left.evaluate(state) / this.right.evaluate(state);
-}
-
-Basic.NumberNeg = function(state)
-{
-    return -this.term.evaluate(state);
-}
-
-Basic.NumberAdd = function(state)
-{
-    return this.left.evaluate(state) + this.right.evaluate(state);
-}
-
-Basic.NumberSub = function(state)
-{
-    return this.left.evaluate(state) - this.right.evaluate(state);
-}
-
-Basic.StringVar = function(state)
-{
-    let value = state.stringValues.get(this.name);
-    if (value == null)
-        state.abort("Could not find string variable " + this.name);
-    return value;
-}
-
-Basic.Equals = function(state)
-{
-    return this.left.evaluate(state) == this.right.evaluate(state);
-}
-
-Basic.NotEquals = function(state)
-{
-    return this.left.evaluate(state) != this.right.evaluate(state);
-}
-
-Basic.LessThan = function(state)
-{
-    return this.left.evaluate(state) < this.right.evaluate(state);
-}
-
-Basic.GreaterThan = function(state)
-{
-    return this.left.evaluate(state) > this.right.evaluate(state);
-}
-
-Basic.LessEqual = function(state)
-{
-    return this.left.evaluate(state) <= this.right.evaluate(state);
-}
-
-Basic.GreaterEqual = function(state)
-{
-    return this.left.evaluate(state) >= this.right.evaluate(state);
-}
-
-Basic.GoTo = function*(state)
-{
-    state.nextLineNumber = this.target;
-}
-
-Basic.GoSub = function*(state)
-{
-    state.subStack.push(state.nextLineNumber);
-    state.nextLineNumber = this.target;
-}
-
-Basic.Def = function*(state)
-{
-    state.validate(!state.values.has(this.name), "Cannot redefine function");
-    state.values.set(this.name, new NumberFunction(this.parameters, this.expression));
-}
-
-Basic.Let = function*(state)
-{
-    this.variable.evaluate(state).assign(this.expression.evaluate(state));
-}
-
-Basic.If = function*(state)
-{
-    if (this.condition.evaluate(state))
-        state.nextLineNumber = this.target;
-}
-
-Basic.Return = function*(state)
-{
-    this.validate(state.subStack.length, "Not in a subroutine");
-    this.nextLineNumber = state.subStack.pop();
-}
-
-Basic.Stop = function*(state)
-{
-    state.nextLineNumber = null;
-}
-
-Basic.On = function*(state)
-{
-    let index = this.expression.evaluate(state);
-    if (!(index >= 1) || !(index <= this.targets.length))
-        state.abort("Index out of bounds: " + index);
-    this.nextLineNumber = this.targets[Math.floor(index)];
-}
-
-Basic.For = function*(state)
-{
-    let sideState = state.getSideState(this);
-    sideState.variable = state.getValue(this.variable, 0).leftApply(state, []);
-    sideState.initialValue = this.initial.evaluate(state);
-    sideState.limitValue = this.limit.evaluate(state);
-    sideState.stepValue = this.step.evaluate(state);
-    sideState.variable.assign(sideState.initialValue);
-    sideState.shouldStop = function() {
-        return (sideState.variable.value - sideState.limitValue) * Math.sign(sideState.stepValue) > 0;
-    };
-    if (sideState.shouldStop())
-        this.nextLineNumber = this.target.lineNumber + 1;
-}
-
-Basic.Next = function*(state)
-{
-    let sideState = state.getSideState(this.target);
-    sideState.variable.assign(sideState.variable.value + sideState.stepValue);
-    if (sideState.shouldStop())
-        return;
-    state.nextLineNumber = this.target.lineNumber + 1;
-}
-
-Basic.Next.isBlockEnd = true;
-
-Basic.Print = function*(state)
-{
-    let string = "";
-    for (let item of this.items) {
-        switch (item.kind) {
-        case "comma":
-            while (string.length % 14)
-                string += " ";
-            break;
-        case "tab": {
-            let value = item.value.evaluate(state);
-            value = Math.max(Math.round(value), 1);
-            while (string.length % value)
-                string += " ";
-            break;
-        }
-        case "string":
-        case "number":
-            string += item.value.evaluate(state);
-            break;
-        default:
-            throw new Error("Bad item kind: " + item.kind);
-        }
-    }
-    
-    yield {kind: "output", string};
-}
-
-Basic.Input = function*(state)
-{
-    let results = yield {kind: "input", numItems: this.items.length};
-    state.validate(results != null && results.length == this.items.length, "Input did not get the right number of items");
-    for (let i = 0; i < results.length; ++i)
-        this.items[i].evaluate(state).assign(results[i]);
-}
-
-Basic.Read = function*(state)
-{
-    for (let item of this.items) {
-        state.validate(state.dataIndex < state.program.data.length, "Attempting to read past the end of data");
-        item.assign(state.program.data[state.dataIndex++]);
-    }
-}
-
-Basic.Restore = function*(state)
-{
-    state.dataIndex = 0;
-}
-
-Basic.Dim = function*(state)
-{
-    for (let item of this.items) {
-        state.validate(!state.values.has(item.name), "Variable " + item.name + " already exists");
-        state.validate(item.bounds.length, "Dim statement is for arrays");
-        state.values.set(item.name, new NumberArray(item.bounds.map(bound => bound + 1)));
-    }
-}
-
-Basic.Randomize = function*(state)
-{
-    state.rng = createRNGWithRandomSeed();
-}
-
-Basic.End = function*(state)
-{
-    state.nextLineNumber = null;
-}
-
-Basic.End.isBlockEnd = true;
-
-Basic.Program = function* programGenerator(state)
-{
-    state.validate(state.program == this, "State must match program");
-    let maxLineNumber = Math.max(...this.statements.keys());
-    while (state.nextLineNumber != null) {
-        state.validate(state.nextLineNumber <= maxLineNumber, "Went out of bounds of the program");
-        let statement = this.statements.get(state.nextLineNumber++);
-        if (statement == null || statement.process == null)
-            continue;
-        state.statement = statement;
-        yield* statement.process(state);
-    }
-}
-
diff --git a/ARES-6/Babylon/benchmark.js b/ARES-6/Babylon/benchmark.js
deleted file mode 100644
index 7f11851..0000000
--- a/ARES-6/Babylon/benchmark.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-"use strict";
-
-class Benchmark {
-    constructor(verbose = 0)
-    {
-        let sources = [];
-
-        const files = [
-              [isInBrowser ? airBlob : "./ARES-6/Babylon/air-blob.js", {}]
-            , [isInBrowser ? basicBlob : "./ARES-6/Babylon/basic-blob.js", {}]
-            , [isInBrowser ? inspectorBlob : "./ARES-6/Babylon/inspector-blob.js", {}]
-            , [isInBrowser ? babylonBlob : "./ARES-6/Babylon/babylon-blob.js", {sourceType: "module"}]
-        ];
-
-        for (let [file, options] of files) {
-            function appendSource(s) {
-                sources.push([file, s, options]);
-            }
-
-            let s;
-            if (isInBrowser) {
-                let request = new XMLHttpRequest();
-                request.open('GET', file, false);
-                request.send(null);
-                if (!request.responseText.length)
-                    throw new Error("Expect non-empty sources");
-                appendSource(request.responseText);
-            } else {
-                appendSource(read(file));
-            }
-        }
-
-        this.sources = sources;
-    }
-
-    runIteration()
-    {
-        const Parser = parserIndexJS;
-        const { plugins } = parserIndexJS;
-        const { types : tokTypes } = tokenizerTypesJS;
-        const estreePlugin = pluginsEstreeJS;
-        const flowPlugin = pluginsFlowJS;
-        const jsxPlugin = pluginsJsxIndexJS;
-        plugins.estree = estreePlugin;
-        plugins.flow = flowPlugin;
-        plugins.jsx = jsxPlugin;
-
-        function parse(input, options) {
-            return new Parser(options, input).parse();
-        }
-
-        function parseExpression(input, options) {
-            const parser = new Parser(options, input);
-            if (parser.options.strictMode) {
-                parser.state.strict = true;
-            }
-            return parser.getExpression();
-        }
-
-        for (let [fileName, source, options] of this.sources) {
-            parse(source, options);
-        }
-    }
-}
diff --git a/ARES-6/Babylon/index.js b/ARES-6/Babylon/index.js
deleted file mode 100644
index 8bd1478..0000000
--- a/ARES-6/Babylon/index.js
+++ /dev/null
@@ -1,6942 +0,0 @@
-/*
- * Copyright (C) 2012-2014 by various contributors (see AUTHORS)
- * Copyright (C) 2017 Apple Inc. 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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
-*/
-
-"use strict";
-
-// util/identifier.js
-
-const utilIdentifierJS = { };
-{
-    /* eslint max-len: 0 */
-
-    // This is a trick taken from Esprima. It turns out that, on
-    // non-Chrome browsers, to check whether a string is in a set, a
-    // predicate containing a big ugly `switch` statement is faster than
-    // a regular expression, and on Chrome the two are about on par.
-    // This function uses `eval` (non-lexical) to produce such a
-    // predicate from a space-separated string of words.
-    //
-    // It starts by sorting the words by length.
-
-    function makePredicate(words) {
-      words = words.split(" ");
-      return function (str) {
-        return words.indexOf(str) >= 0;
-      };
-    }
-
-    // Reserved word lists for various dialects of the language
-
-    const reservedWords = {
-      6: makePredicate("enum await"),
-      strict: makePredicate("implements interface let package private protected public static yield"),
-      strictBind: makePredicate("eval arguments")
-    };
-    utilIdentifierJS.reservedWords = reservedWords;
-
-    // And the keywords
-
-    const isKeyword = makePredicate("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this let const class extends export import yield super");
-    utilIdentifierJS.isKeyword = isKeyword;
-
-    // ## Character categories
-
-    // Big ugly regular expressions that match characters in the
-    // whitespace, identifier, and identifier-start categories. These
-    // are only applied when a character is found to actually have a
-    // code point above 128.
-    // Generated by `bin/generate-identifier-regex.js`.
-
-    let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
-    let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
-
-    const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
-    const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
-
-    nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
-
-    // These are a run-length and offset encoded representation of the
-    // >0xffff code points that are a valid part of identifiers. The
-    // offset starts at 0x10000, and each pair of numbers represents an
-    // offset to the next range, and then a size of the range. They were
-    // generated by `bin/generate-identifier-regex.js`.
-    // eslint-disable-next-line comma-spacing
-    const astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541];
-    // eslint-disable-next-line comma-spacing
-    const astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239];
-
-    // This has a complexity linear to the value of the code. The
-    // assumption is that looking up astral identifier characters is
-    // rare.
-    function isInAstralSet(code, set) {
-      let pos = 0x10000;
-      for (let i = 0; i < set.length; i += 2) {
-        pos += set[i];
-        if (pos > code) return false;
-
-        pos += set[i + 1];
-        if (pos >= code) return true;
-      }
-    }
-
-    // Test whether a given character code starts an identifier.
-
-    function isIdentifierStart(code) {
-      if (code < 65) return code === 36;
-      if (code < 91) return true;
-      if (code < 97) return code === 95;
-      if (code < 123) return true;
-      if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
-      return isInAstralSet(code, astralIdentifierStartCodes);
-    }
-    utilIdentifierJS.isIdentifierStart = isIdentifierStart;
-
-    // Test whether a given character is part of an identifier.
-
-    function isIdentifierChar(code) {
-      if (code < 48) return code === 36;
-      if (code < 58) return true;
-      if (code < 65) return false;
-      if (code < 91) return true;
-      if (code < 97) return code === 95;
-      if (code < 123) return true;
-      if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
-      return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
-    }
-    utilIdentifierJS.isIdentifierChar = isIdentifierChar;
-}
-
-// util/whitespace.js
-const utilWhitespaceJS = {};
-{
-    const lineBreak = /\r\n?|\n|\u2028|\u2029/;
-    utilWhitespaceJS.lineBreak = lineBreak;
-    const lineBreakG = new RegExp(lineBreak.source, "g");
-    utilWhitespaceJS.lineBreakG = lineBreakG;
-
-    function isNewLine(code){
-      return code === 10 || code === 13 || code === 0x2028 || code === 0x2029;
-    }
-    utilWhitespaceJS.isNewLine = isNewLine;
-
-    const nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/;
-    utilWhitespaceJS.nonASCIIwhitespace = nonASCIIwhitespace;
-}
-
-// util/location.js
-const utilLocationJS = {};
-{
-    const lineBreakG = utilWhitespaceJS.lineBreakG;
-
-    // These are used when `options.locations` is on, for the
-    // `startLoc` and `endLoc` properties.
-
-    class Position {
-      constructor(line, col) {
-        this.line = line;
-        this.column = col;
-      }
-    }
-    utilLocationJS.Position = Position;
-
-    class SourceLocation {
-      constructor(start, end) {
-        this.start = start;
-        this.end = end;
-      }
-    }
-    utilLocationJS.SourceLocation = SourceLocation;
-
-    // The `getLineInfo` function is mostly useful when the
-    // `locations` option is off (for performance reasons) and you
-    // want to find the line/column position for a given character
-    // offset. `input` should be the code string that the offset refers
-    // into.
-
-    function getLineInfo(input, offset) {
-      for (let line = 1, cur = 0; ;) {
-        lineBreakG.lastIndex = cur;
-        const match = lineBreakG.exec(input);
-        if (match && match.index < offset) {
-          ++line;
-          cur = match.index + match[0].length;
-        } else {
-          return new Position(line, offset - cur);
-        }
-      }
-    }
-    utilLocationJS.getLineInfo = getLineInfo;
-}
-
-
-// tokenizer/types.js
-const tokenizerTypesJS = {};
-{
-    // ## Token types
-
-    // The assignment of fine-grained, information-carrying type objects
-    // allows the tokenizer to store the information it has about a
-    // token in a way that is very cheap for the parser to look up.
-
-    // All token type variables start with an underscore, to make them
-    // easy to recognize.
-
-    // The `beforeExpr` property is used to disambiguate between regular
-    // expressions and divisions. It is set on all token types that can
-    // be followed by an expression (thus, a slash after them would be a
-    // regular expression).
-    //
-    // `isLoop` marks a keyword as starting a loop, which is important
-    // to know when parsing a label, in order to allow or disallow
-    // continue jumps to that label.
-
-    const beforeExpr = true;
-    const startsExpr = true;
-    const isLoop = true;
-    const isAssign = true;
-    const prefix = true;
-    const postfix = true;
-
-    class TokenType {
-      constructor(label, conf = {}) {
-        this.label = label;
-        this.keyword = conf.keyword;
-        this.beforeExpr = !!conf.beforeExpr;
-        this.startsExpr = !!conf.startsExpr;
-        this.rightAssociative = !!conf.rightAssociative;
-        this.isLoop = !!conf.isLoop;
-        this.isAssign = !!conf.isAssign;
-        this.prefix = !!conf.prefix;
-        this.postfix = !!conf.postfix;
-        this.binop = conf.binop || null;
-        this.updateContext = null;
-      }
-    }
-    tokenizerTypesJS.TokenType = TokenType;
-
-    class KeywordTokenType extends TokenType {
-      constructor(name, options = {}) {
-        options.keyword = name;
-
-        super(name, options);
-      }
-    }
-
-    class BinopTokenType extends TokenType {
-      constructor(name, prec) {
-        super(name, { beforeExpr, binop: prec });
-      }
-    }
-    tokenizerTypesJS.BinopTokenType = BinopTokenType;
-
-    const types = {
-      num: new TokenType("num", { startsExpr }),
-      regexp: new TokenType("regexp", { startsExpr }),
-      string: new TokenType("string", { startsExpr }),
-      name: new TokenType("name", { startsExpr }),
-      eof: new TokenType("eof"),
-
-      // Punctuation token types.
-      bracketL: new TokenType("[", { beforeExpr, startsExpr }),
-      bracketR: new TokenType("]"),
-      braceL: new TokenType("{", { beforeExpr, startsExpr }),
-      braceBarL: new TokenType("{|", { beforeExpr, startsExpr }),
-      braceR: new TokenType("}"),
-      braceBarR: new TokenType("|}"),
-      parenL: new TokenType("(", { beforeExpr, startsExpr }),
-      parenR: new TokenType(")"),
-      comma: new TokenType(",", { beforeExpr }),
-      semi: new TokenType(";", { beforeExpr }),
-      colon: new TokenType(":", { beforeExpr }),
-      doubleColon: new TokenType("::", { beforeExpr }),
-      dot: new TokenType("."),
-      question: new TokenType("?", { beforeExpr }),
-      arrow: new TokenType("=>", { beforeExpr }),
-      template: new TokenType("template"),
-      ellipsis: new TokenType("...", { beforeExpr }),
-      backQuote: new TokenType("`", { startsExpr }),
-      dollarBraceL: new TokenType("${", { beforeExpr, startsExpr }),
-      at: new TokenType("@"),
-
-      // Operators. These carry several kinds of properties to help the
-      // parser use them properly (the presence of these properties is
-      // what categorizes them as operators).
-      //
-      // `binop`, when present, specifies that this operator is a binary
-      // operator, and will refer to its precedence.
-      //
-      // `prefix` and `postfix` mark the operator as a prefix or postfix
-      // unary operator.
-      //
-      // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as
-      // binary operators with a very low precedence, that should result
-      // in AssignmentExpression nodes.
-
-      eq: new TokenType("=", { beforeExpr, isAssign }),
-      assign: new TokenType("_=", { beforeExpr, isAssign }),
-      incDec: new TokenType("++/--", { prefix, postfix, startsExpr }),
-      prefix: new TokenType("prefix", { beforeExpr, prefix, startsExpr }),
-      logicalOR: new BinopTokenType("||", 1),
-      logicalAND: new BinopTokenType("&&", 2),
-      bitwiseOR: new BinopTokenType("|", 3),
-      bitwiseXOR: new BinopTokenType("^", 4),
-      bitwiseAND: new BinopTokenType("&", 5),
-      equality: new BinopTokenType("==/!=", 6),
-      relational: new BinopTokenType("</>", 7),
-      bitShift: new BinopTokenType("<</>>", 8),
-      plusMin: new TokenType("+/-", { beforeExpr, binop: 9, prefix, startsExpr }),
-      modulo: new BinopTokenType("%", 10),
-      star: new BinopTokenType("*", 10),
-      slash: new BinopTokenType("/", 10),
-      exponent: new TokenType("**", { beforeExpr, binop: 11, rightAssociative: true })
-    };
-    tokenizerTypesJS.types = types;
-
-    const keywords = {
-      "break": new KeywordTokenType("break"),
-      "case": new KeywordTokenType("case", { beforeExpr }),
-      "catch": new KeywordTokenType("catch"),
-      "continue": new KeywordTokenType("continue"),
-      "debugger": new KeywordTokenType("debugger"),
-      "default": new KeywordTokenType("default", { beforeExpr }),
-      "do": new KeywordTokenType("do", { isLoop, beforeExpr }),
-      "else": new KeywordTokenType("else", { beforeExpr }),
-      "finally": new KeywordTokenType("finally"),
-      "for": new KeywordTokenType("for", { isLoop }),
-      "function": new KeywordTokenType("function", { startsExpr }),
-      "if": new KeywordTokenType("if"),
-      "return": new KeywordTokenType("return", { beforeExpr }),
-      "switch": new KeywordTokenType("switch"),
-      "throw": new KeywordTokenType("throw", { beforeExpr }),
-      "try": new KeywordTokenType("try"),
-      "var": new KeywordTokenType("var"),
-      "let": new KeywordTokenType("let"),
-      "const": new KeywordTokenType("const"),
-      "while": new KeywordTokenType("while", { isLoop }),
-      "with": new KeywordTokenType("with"),
-      "new": new KeywordTokenType("new", { beforeExpr, startsExpr }),
-      "this": new KeywordTokenType("this", { startsExpr }),
-      "super": new KeywordTokenType("super", { startsExpr }),
-      "class": new KeywordTokenType("class"),
-      "extends": new KeywordTokenType("extends", { beforeExpr }),
-      "export": new KeywordTokenType("export"),
-      "import": new KeywordTokenType("import", { startsExpr }),
-      "yield": new KeywordTokenType("yield", { beforeExpr, startsExpr }),
-      "null": new KeywordTokenType("null", { startsExpr }),
-      "true": new KeywordTokenType("true", { startsExpr }),
-      "false": new KeywordTokenType("false", { startsExpr }),
-      "in": new KeywordTokenType("in", { beforeExpr, binop: 7 }),
-      "instanceof": new KeywordTokenType("instanceof", { beforeExpr, binop: 7 }),
-      "typeof": new KeywordTokenType("typeof", { beforeExpr, prefix, startsExpr }),
-      "void": new KeywordTokenType("void", { beforeExpr, prefix, startsExpr }),
-      "delete": new KeywordTokenType("delete", { beforeExpr, prefix, startsExpr })
-    };
-    tokenizerTypesJS.keywords = keywords;
-
-    // Map keyword names to token types.
-    Object.keys(keywords).forEach((name) => {
-      types["_" + name] = keywords[name];
-    });
-}
-
-// tokenizer/context.js
-const tokenizerContextJS = {};
-{
-    // The algorithm used to determine whether a regexp can appear at a
-    // given point in the program is loosely based on sweet.js' approach.
-    // See https://github.com/mozilla/sweet.js/wiki/design
-
-    const tt = tokenizerTypesJS.types;
-    const lineBreak = utilWhitespaceJS.lineBreak;
-
-    class TokContext {
-      constructor(
-        token,
-        isExpr,
-        preserveSpace,
-        override,
-      ) {
-        this.token = token;
-        this.isExpr = !!isExpr;
-        this.preserveSpace = !!preserveSpace;
-        this.override = override;
-      }
-
-      //token: string;
-      //isExpr: boolean;
-      //preserveSpace: boolean;
-      //override: ?Function;
-    }
-    tokenizerContextJS.TokContext = TokContext;
-
-    const types = {
-      braceStatement: new TokContext("{", false),
-      braceExpression: new TokContext("{", true),
-      templateQuasi: new TokContext("${", true),
-      parenStatement: new TokContext("(", false),
-      parenExpression: new TokContext("(", true),
-      template: new TokContext("`", true, true, (p) => p.readTmplToken()),
-      functionExpression: new TokContext("function", true)
-    };
-    tokenizerContextJS.types = types;
-
-    // Token-specific context update code
-
-    tt.parenR.updateContext = tt.braceR.updateContext = function () {
-      if (this.state.context.length === 1) {
-        this.state.exprAllowed = true;
-        return;
-      }
-
-      const out = this.state.context.pop();
-      if (out === types.braceStatement && this.curContext() === types.functionExpression) {
-        this.state.context.pop();
-        this.state.exprAllowed = false;
-      } else if (out === types.templateQuasi) {
-        this.state.exprAllowed = true;
-      } else {
-        this.state.exprAllowed = !out.isExpr;
-      }
-    };
-
-    tt.name.updateContext = function (prevType) {
-      this.state.exprAllowed = false;
-
-      if (prevType === tt._let || prevType === tt._const || prevType === tt._var) {
-        if (lineBreak.test(this.input.slice(this.state.end))) {
-          this.state.exprAllowed = true;
-        }
-      }
-    };
-
-    tt.braceL.updateContext = function (prevType) {
-      this.state.context.push(this.braceIsBlock(prevType) ? types.braceStatement : types.braceExpression);
-      this.state.exprAllowed = true;
-    };
-
-    tt.dollarBraceL.updateContext = function () {
-      this.state.context.push(types.templateQuasi);
-      this.state.exprAllowed = true;
-    };
-
-    tt.parenL.updateContext = function (prevType) {
-      const statementParens = prevType === tt._if || prevType === tt._for ||
-                            prevType === tt._with || prevType === tt._while;
-      this.state.context.push(statementParens ? types.parenStatement : types.parenExpression);
-      this.state.exprAllowed = true;
-    };
-
-    tt.incDec.updateContext = function () {
-      // tokExprAllowed stays unchanged
-    };
-
-    tt._function.updateContext = function () {
-      if (this.curContext() !== types.braceStatement) {
-        this.state.context.push(types.functionExpression);
-      }
-
-      this.state.exprAllowed = false;
-    };
-
-    tt.backQuote.updateContext = function () {
-      if (this.curContext() === types.template) {
-        this.state.context.pop();
-      } else {
-        this.state.context.push(types.template);
-      }
-      this.state.exprAllowed = false;
-    };
-}
-
-// tokenizer/state.js
-let tokenizerStateJS = {};
-{
-    const TokContext = tokenizerContextJS.TokContext;
-    const TokenType = tokenizerTypesJS.TokenType;
-    const Position = utilLocationJS.Position;
-    const ct = tokenizerContextJS.types;
-    const tt = tokenizerTypesJS.types;
-
-    //export default class State {
-    class State {
-      init(options, input) {
-        this.strict = options.strictMode === false ? false : options.sourceType === "module";
-
-        this.input = input;
-
-        this.potentialArrowAt = -1;
-
-        this.inMethod =
-          this.inFunction =
-          this.inGenerator =
-          this.inAsync =
-          this.inPropertyName =
-          this.inType =
-          this.noAnonFunctionType =
-            false;
-
-        this.labels = [];
-
-        this.decorators = [];
-
-        this.tokens = [];
-
-        this.comments = [];
-
-        this.trailingComments = [];
-        this.leadingComments  = [];
-        this.commentStack     = [];
-
-        this.pos = this.lineStart = 0;
-        this.curLine = options.startLine;
-
-        this.type = tt.eof;
-        this.value = null;
-        this.start = this.end = this.pos;
-        this.startLoc = this.endLoc = this.curPosition();
-
-        this.lastTokEndLoc = this.lastTokStartLoc = null;
-        this.lastTokStart = this.lastTokEnd = this.pos;
-
-        this.context = [ct.braceStatement];
-        this.exprAllowed = true;
-
-        this.containsEsc = this.containsOctal = false;
-        this.octalPosition = null;
-
-        this.invalidTemplateEscapePosition = null;
-
-        this.exportedIdentifiers = [];
-
-        return this;
-      }
-
-      //// TODO
-      //strict: boolean;
-
-      //// TODO
-      //input: string;
-
-      //// Used to signify the start of a potential arrow function
-      //potentialArrowAt: number;
-
-      //// Flags to track whether we are in a function, a generator.
-      //inFunction: boolean;
-      //inGenerator: boolean;
-      //inMethod: boolean;
-      //inAsync: boolean;
-      //inType: boolean;
-      //inPropertyName: boolean;
-
-      //// Labels in scope.
-      //labels: Array<Object>;
-
-      //// Leading decorators.
-      //decorators: Array<Object>;
-
-      //// Token store.
-      //tokens: Array<Object>;
-
-      //// Comment store.
-      //comments: Array<Object>;
-
-      //// Comment attachment store
-      //trailingComments: Array<Object>;
-      //leadingComments: Array<Object>;
-      //commentStack: Array<Object>;
-
-      //// The current position of the tokenizer in the input.
-      //pos: number;
-      //lineStart: number;
-      //curLine: number;
-
-      //// Properties of the current token:
-      //// Its type
-      //type: TokenType;
-
-      //// For tokens that include more information than their type, the value
-      //value: any;
-
-      //// Its start and end offset
-      //start: number;
-      //end: number;
-
-      //// And, if locations are used, the {line, column} object
-      //// corresponding to those offsets
-      //startLoc: Position;
-      //endLoc: Position;
-
-      //// Position information for the previous token
-      //lastTokEndLoc: ?Position;
-      //lastTokStartLoc: ?Position;
-      //lastTokStart: number;
-      //lastTokEnd: number;
-
-      //// The context stack is used to superficially track syntactic
-      //// context to predict whether a regular expression is allowed in a
-      //// given position.
-      //context: Array<TokContext>;
-      //exprAllowed: boolean;
-
-      //// Used to signal to callers of `readWord1` whether the word
-      //// contained any escape sequences. This is needed because words with
-      //// escape sequences must not be interpreted as keywords.
-      //containsEsc: boolean;
-
-      //// TODO
-      //containsOctal: boolean;
-      //octalPosition: ?number;
-
-      //// Names of exports store. `default` is stored as a name for both
-      //// `export default foo;` and `export { foo as default };`.
-      //exportedIdentifiers: Array<string>;
-
-      curPosition() {
-        return new Position(this.curLine, this.pos - this.lineStart);
-      }
-
-      clone(skipArrays) {
-        const state = new State;
-        for (const key in this) {
-          let val = this[key];
-
-          if ((!skipArrays || key === "context") && Array.isArray(val)) {
-            val = val.slice();
-          }
-
-          state[key] = val;
-        }
-        return state;
-      }
-    }
-    tokenizerStateJS = State;
-}
-
-// tokenizer/index.js
-let tokenizerIndexJS = {};
-{
-    /* eslint max-len: 0 */
-
-    const TokenType = tokenizerTypesJS.TokenType;
-    const {isIdentifierStart, isIdentifierChar, isKeyword} = utilIdentifierJS;
-
-    const { types: tt , keywords: keywordTypes } = tokenizerTypesJS;
-    const { types: ct } = tokenizerContextJS;
-    const { SourceLocation } = utilLocationJS;
-    const { lineBreak, lineBreakG, isNewLine, nonASCIIwhitespace } = utilWhitespaceJS;
-    const State = tokenizerStateJS;
-
-    // Object type used to represent tokens. Note that normally, tokens
-    // simply exist as properties on the parser object. This is only
-    // used for the onToken callback and the external tokenizer.
-
-    //export class Token {
-    class Token {
-      constructor(state) {
-        this.type = state.type;
-        this.value = state.value;
-        this.start = state.start;
-        this.end = state.end;
-        this.loc = new SourceLocation(state.startLoc, state.endLoc);
-      }
-    }
-
-    // ## Tokenizer
-
-    function codePointToString(code) {
-      // UTF-16 Decoding
-      if (code <= 0xFFFF) {
-        return String.fromCharCode(code);
-      } else {
-        return String.fromCharCode(((code - 0x10000) >> 10) + 0xD800, ((code - 0x10000) & 1023) + 0xDC00);
-      }
-    }
-
-    class Tokenizer {
-      constructor(options, input) {
-        this.state = new State;
-        this.state.init(options, input);
-      }
-
-      // Move to the next token
-
-      next() {
-        if (!this.isLookahead) {
-          this.state.tokens.push(new Token(this.state));
-        }
-
-        this.state.lastTokEnd = this.state.end;
-        this.state.lastTokStart = this.state.start;
-        this.state.lastTokEndLoc = this.state.endLoc;
-        this.state.lastTokStartLoc = this.state.startLoc;
-        this.nextToken();
-      }
-
-      // TODO
-
-      eat(type) {
-        if (this.match(type)) {
-          this.next();
-          return true;
-        } else {
-          return false;
-        }
-      }
-
-      // TODO
-
-      match(type) {
-        return this.state.type === type;
-      }
-
-      // TODO
-
-      isKeyword(word) {
-        return isKeyword(word);
-      }
-
-      // TODO
-
-      lookahead() {
-        const old = this.state;
-        this.state = old.clone(true);
-
-        this.isLookahead = true;
-        this.next();
-        this.isLookahead = false;
-
-        const curr = this.state.clone(true);
-        this.state = old;
-        return curr;
-      }
-
-      // Toggle strict mode. Re-reads the next number or string to please
-      // pedantic tests (`"use strict"; 010;` should fail).
-
-      setStrict(strict) {
-        this.state.strict = strict;
-        if (!this.match(tt.num) && !this.match(tt.string)) return;
-        this.state.pos = this.state.start;
-        while (this.state.pos < this.state.lineStart) {
-          this.state.lineStart = this.input.lastIndexOf("\n", this.state.lineStart - 2) + 1;
-          --this.state.curLine;
-        }
-        this.nextToken();
-      }
-
-      curContext() {
-        return this.state.context[this.state.context.length - 1];
-      }
-
-      // Read a single token, updating the parser object's token-related
-      // properties.
-
-      nextToken() {
-        const curContext = this.curContext();
-        if (!curContext || !curContext.preserveSpace) this.skipSpace();
-
-        this.state.containsOctal = false;
-        this.state.octalPosition = null;
-        this.state.start = this.state.pos;
-        this.state.startLoc = this.state.curPosition();
-        if (this.state.pos >= this.input.length) return this.finishToken(tt.eof);
-
-        if (curContext.override) {
-          return curContext.override(this);
-        } else {
-          return this.readToken(this.fullCharCodeAtPos());
-        }
-      }
-
-      readToken(code) {
-        // Identifier or keyword. '\uXXXX' sequences are allowed in
-        // identifiers, so '\' also dispatches to that.
-        if (isIdentifierStart(code) || code === 92 /* '\' */) {
-          return this.readWord();
-        } else {
-          return this.getTokenFromCode(code);
-        }
-      }
-
-      fullCharCodeAtPos() {
-        const code = this.input.charCodeAt(this.state.pos);
-        if (code <= 0xd7ff || code >= 0xe000) return code;
-
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        return (code << 10) + next - 0x35fdc00;
-      }
-
-      pushComment(block, text, start, end, startLoc, endLoc) {
-        const comment = {
-          type: block ? "CommentBlock" : "CommentLine",
-          value: text,
-          start: start,
-          end: end,
-          loc: new SourceLocation(startLoc, endLoc)
-        };
-
-        if (!this.isLookahead) {
-          this.state.tokens.push(comment);
-          this.state.comments.push(comment);
-          this.addComment(comment);
-        }
-      }
-
-      skipBlockComment() {
-        const startLoc = this.state.curPosition();
-        const start = this.state.pos;
-        const end = this.input.indexOf("*/", this.state.pos += 2);
-        if (end === -1) this.raise(this.state.pos - 2, "Unterminated comment");
-
-        this.state.pos = end + 2;
-        lineBreakG.lastIndex = start;
-        let match;
-        while ((match = lineBreakG.exec(this.input)) && match.index < this.state.pos) {
-          ++this.state.curLine;
-          this.state.lineStart = match.index + match[0].length;
-        }
-
-        this.pushComment(true, this.input.slice(start + 2, end), start, this.state.pos, startLoc, this.state.curPosition());
-      }
-
-      skipLineComment(startSkip) {
-        const start = this.state.pos;
-        const startLoc = this.state.curPosition();
-        let ch = this.input.charCodeAt(this.state.pos += startSkip);
-        while (this.state.pos < this.input.length && ch !== 10 && ch !== 13 && ch !== 8232 && ch !== 8233) {
-          ++this.state.pos;
-          ch = this.input.charCodeAt(this.state.pos);
-        }
-
-        this.pushComment(false, this.input.slice(start + startSkip, this.state.pos), start, this.state.pos, startLoc, this.state.curPosition());
-      }
-
-      // Called at the start of the parse and after every token. Skips
-      // whitespace and comments, and.
-
-      skipSpace() {
-        loop: while (this.state.pos < this.input.length) {
-          const ch = this.input.charCodeAt(this.state.pos);
-          switch (ch) {
-            case 32: case 160: // ' '
-              ++this.state.pos;
-              break;
-
-            case 13:
-              if (this.input.charCodeAt(this.state.pos + 1) === 10) {
-                ++this.state.pos;
-              }
-
-            case 10: case 8232: case 8233:
-              ++this.state.pos;
-              ++this.state.curLine;
-              this.state.lineStart = this.state.pos;
-              break;
-
-            case 47: // '/'
-              switch (this.input.charCodeAt(this.state.pos + 1)) {
-                case 42: // '*'
-                  this.skipBlockComment();
-                  break;
-
-                case 47:
-                  this.skipLineComment(2);
-                  break;
-
-                default:
-                  break loop;
-              }
-              break;
-
-            default:
-              if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {
-                ++this.state.pos;
-              } else {
-                break loop;
-              }
-          }
-        }
-      }
-
-      // Called at the end of every token. Sets `end`, `val`, and
-      // maintains `context` and `exprAllowed`, and skips the space after
-      // the token, so that the next one's `start` will point at the
-      // right position.
-
-      finishToken(type, val) {
-        this.state.end = this.state.pos;
-        this.state.endLoc = this.state.curPosition();
-        const prevType = this.state.type;
-        this.state.type = type;
-        this.state.value = val;
-
-        this.updateContext(prevType);
-      }
-
-      // ### Token reading
-
-      // This is the function that is called to fetch the next token. It
-      // is somewhat obscure, because it works in character codes rather
-      // than characters, and because operator parsing has been inlined
-      // into it.
-      //
-      // All in the name of speed.
-      //
-      readToken_dot() {
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        if (next >= 48 && next <= 57) {
-          return this.readNumber(true);
-        }
-
-        const next2 = this.input.charCodeAt(this.state.pos + 2);
-        if (next === 46 && next2 === 46) { // 46 = dot '.'
-          this.state.pos += 3;
-          return this.finishToken(tt.ellipsis);
-        } else {
-          ++this.state.pos;
-          return this.finishToken(tt.dot);
-        }
-      }
-
-      readToken_slash() { // '/'
-        if (this.state.exprAllowed) {
-          ++this.state.pos;
-          return this.readRegexp();
-        }
-
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        if (next === 61) {
-          return this.finishOp(tt.assign, 2);
-        } else {
-          return this.finishOp(tt.slash, 1);
-        }
-      }
-
-      readToken_mult_modulo(code) { // '%*'
-        let type = code === 42 ? tt.star : tt.modulo;
-        let width = 1;
-        let next = this.input.charCodeAt(this.state.pos + 1);
-
-        if (next === 42) { // '*'
-          width++;
-          next = this.input.charCodeAt(this.state.pos + 2);
-          type = tt.exponent;
-        }
-
-        if (next === 61) {
-          width++;
-          type = tt.assign;
-        }
-
-        return this.finishOp(type, width);
-      }
-
-      readToken_pipe_amp(code) { // '|&'
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        if (next === code) return this.finishOp(code === 124 ? tt.logicalOR : tt.logicalAND, 2);
-        if (next === 61) return this.finishOp(tt.assign, 2);
-        if (code === 124 && next === 125 && this.hasPlugin("flow")) return this.finishOp(tt.braceBarR, 2);
-        return this.finishOp(code === 124 ? tt.bitwiseOR : tt.bitwiseAND, 1);
-      }
-
-      readToken_caret() { // '^'
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        if (next === 61) {
-          return this.finishOp(tt.assign, 2);
-        } else {
-          return this.finishOp(tt.bitwiseXOR, 1);
-        }
-      }
-
-      readToken_plus_min(code) { // '+-'
-        const next = this.input.charCodeAt(this.state.pos + 1);
-
-        if (next === code) {
-          if (next === 45 && this.input.charCodeAt(this.state.pos + 2) === 62 && lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.pos))) {
-            // A `-->` line comment
-            this.skipLineComment(3);
-            this.skipSpace();
-            return this.nextToken();
-          }
-          return this.finishOp(tt.incDec, 2);
-        }
-
-        if (next === 61) {
-          return this.finishOp(tt.assign, 2);
-        } else {
-          return this.finishOp(tt.plusMin, 1);
-        }
-      }
-
-      readToken_lt_gt(code) { // '<>'
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        let size = 1;
-
-        if (next === code) {
-          size = code === 62 && this.input.charCodeAt(this.state.pos + 2) === 62 ? 3 : 2;
-          if (this.input.charCodeAt(this.state.pos + size) === 61) return this.finishOp(tt.assign, size + 1);
-          return this.finishOp(tt.bitShift, size);
-        }
-
-        if (next === 33 && code === 60 && this.input.charCodeAt(this.state.pos + 2) === 45 && this.input.charCodeAt(this.state.pos + 3) === 45) {
-          if (this.inModule) this.unexpected();
-          // `<!--`, an XML-style comment that should be interpreted as a line comment
-          this.skipLineComment(4);
-          this.skipSpace();
-          return this.nextToken();
-        }
-
-        if (next === 61) {
-          // <= | >=
-          size = 2;
-        }
-
-        return this.finishOp(tt.relational, size);
-      }
-
-      readToken_eq_excl(code) { // '=!'
-        const next = this.input.charCodeAt(this.state.pos + 1);
-        if (next === 61) return this.finishOp(tt.equality, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2);
-        if (code === 61 && next === 62) { // '=>'
-          this.state.pos += 2;
-          return this.finishToken(tt.arrow);
-        }
-        return this.finishOp(code === 61 ? tt.eq : tt.prefix, 1);
-      }
-
-      getTokenFromCode(code) {
-        switch (code) {
-          // The interpretation of a dot depends on whether it is followed
-          // by a digit or another two dots.
-          case 46: // '.'
-            return this.readToken_dot();
-
-          // Punctuation tokens.
-          case 40: ++this.state.pos; return this.finishToken(tt.parenL);
-          case 41: ++this.state.pos; return this.finishToken(tt.parenR);
-          case 59: ++this.state.pos; return this.finishToken(tt.semi);
-          case 44: ++this.state.pos; return this.finishToken(tt.comma);
-          case 91: ++this.state.pos; return this.finishToken(tt.bracketL);
-          case 93: ++this.state.pos; return this.finishToken(tt.bracketR);
-
-          case 123:
-            if (this.hasPlugin("flow") && this.input.charCodeAt(this.state.pos + 1) === 124) {
-              return this.finishOp(tt.braceBarL, 2);
-            } else {
-              ++this.state.pos;
-              return this.finishToken(tt.braceL);
-            }
-
-          case 125:
-            ++this.state.pos; return this.finishToken(tt.braceR);
-
-          case 58:
-            if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) {
-              return this.finishOp(tt.doubleColon, 2);
-            } else {
-              ++this.state.pos;
-              return this.finishToken(tt.colon);
-            }
-
-          case 63: ++this.state.pos; return this.finishToken(tt.question);
-          case 64: ++this.state.pos; return this.finishToken(tt.at);
-
-          case 96: // '`'
-            ++this.state.pos;
-            return this.finishToken(tt.backQuote);
-
-          case 48: // '0'
-            const next = this.input.charCodeAt(this.state.pos + 1);
-            if (next === 120 || next === 88) return this.readRadixNumber(16); // '0x', '0X' - hex number
-            if (next === 111 || next === 79) return this.readRadixNumber(8); // '0o', '0O' - octal number
-            if (next === 98 || next === 66) return this.readRadixNumber(2); // '0b', '0B' - binary number
-            // Anything else beginning with a digit is an integer, octal
-            // number, or float.
-          case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9
-            return this.readNumber(false);
-
-            // Quotes produce strings.
-          case 34: case 39: // '"', "'"
-            return this.readString(code);
-
-          // Operators are parsed inline in tiny state machines. '=' (61) is
-          // often referred to. `finishOp` simply skips the amount of
-          // characters it is given as second argument, and returns a token
-          // of the type given by its first argument.
-
-          case 47: // '/'
-            return this.readToken_slash();
-
-          case 37: case 42: // '%*'
-            return this.readToken_mult_modulo(code);
-
-          case 124: case 38: // '|&'
-            return this.readToken_pipe_amp(code);
-
-          case 94: // '^'
-            return this.readToken_caret();
-
-          case 43: case 45: // '+-'
-            return this.readToken_plus_min(code);
-
-          case 60: case 62: // '<>'
-            return this.readToken_lt_gt(code);
-
-          case 61: case 33: // '=!'
-            return this.readToken_eq_excl(code);
-
-          case 126: // '~'
-            return this.finishOp(tt.prefix, 1);
-        }
-
-        this.raise(this.state.pos, `Unexpected character '${codePointToString(code)}'`);
-      }
-
-      finishOp(type, size) {
-        const str = this.input.slice(this.state.pos, this.state.pos + size);
-        this.state.pos += size;
-        return this.finishToken(type, str);
-      }
-
-      readRegexp() {
-        const start = this.state.pos;
-        let escaped, inClass;
-        for (;;) {
-          if (this.state.pos >= this.input.length) this.raise(start, "Unterminated regular expression");
-          const ch = this.input.charAt(this.state.pos);
-          if (lineBreak.test(ch)) {
-            this.raise(start, "Unterminated regular expression");
-          }
-          if (escaped) {
-            escaped = false;
-          } else {
-            if (ch === "[") {
-              inClass = true;
-            } else if (ch === "]" && inClass) {
-              inClass = false;
-            } else if (ch === "/" && !inClass) {
-              break;
-            }
-            escaped = ch === "\\";
-          }
-          ++this.state.pos;
-        }
-        const content = this.input.slice(start, this.state.pos);
-        ++this.state.pos;
-        // Need to use `readWord1` because '\uXXXX' sequences are allowed
-        // here (don't ask).
-        const mods = this.readWord1();
-        if (mods) {
-          const validFlags = /^[gmsiyu]*$/;
-          if (!validFlags.test(mods)) this.raise(start, "Invalid regular expression flag");
-        }
-        return this.finishToken(tt.regexp, {
-          pattern: content,
-          flags: mods
-        });
-      }
-
-      // Read an integer in the given radix. Return null if zero digits
-      // were read, the integer value otherwise. When `len` is given, this
-      // will return `null` unless the integer has exactly `len` digits.
-
-      readInt(radix, len) {
-        const start = this.state.pos;
-        let total = 0;
-
-        for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {
-          const code = this.input.charCodeAt(this.state.pos);
-          let val;
-          if (code >= 97) {
-            val = code - 97 + 10; // a
-          } else if (code >= 65) {
-            val = code - 65 + 10; // A
-          } else if (code >= 48 && code <= 57) {
-            val = code - 48; // 0-9
-          } else  {
-            val = Infinity;
-          }
-          if (val >= radix) break;
-          ++this.state.pos;
-          total = total * radix + val;
-        }
-        if (this.state.pos === start || len != null && this.state.pos - start !== len) return null;
-
-        return total;
-      }
-
-      readRadixNumber(radix) {
-        this.state.pos += 2; // 0x
-        const val = this.readInt(radix);
-        if (val == null) this.raise(this.state.start + 2, "Expected number in radix " + radix);
-        if (isIdentifierStart(this.fullCharCodeAtPos())) this.raise(this.state.pos, "Identifier directly after number");
-        return this.finishToken(tt.num, val);
-      }
-
-      // Read an integer, octal integer, or floating-point number.
-
-      readNumber(startsWithDot) {
-        const start = this.state.pos;
-        const octal = this.input.charCodeAt(this.state.pos) === 48;
-        let isFloat = false;
-
-        if (!startsWithDot && this.readInt(10) === null) this.raise(start, "Invalid number");
-        let next = this.input.charCodeAt(this.state.pos);
-        if (next === 46) { // '.'
-          ++this.state.pos;
-          this.readInt(10);
-          isFloat = true;
-          next = this.input.charCodeAt(this.state.pos);
-        }
-        if (next === 69 || next === 101) { // 'eE'
-          next = this.input.charCodeAt(++this.state.pos);
-          if (next === 43 || next === 45) ++this.state.pos; // '+-'
-          if (this.readInt(10) === null) this.raise(start, "Invalid number");
-          isFloat = true;
-        }
-        if (isIdentifierStart(this.fullCharCodeAtPos())) this.raise(this.state.pos, "Identifier directly after number");
-
-        const str = this.input.slice(start, this.state.pos);
-        let val;
-        if (isFloat) {
-          val = parseFloat(str);
-        } else if (!octal || str.length === 1) {
-          val = parseInt(str, 10);
-        } else if (/[89]/.test(str) || this.state.strict) {
-          this.raise(start, "Invalid number");
-        } else {
-          val = parseInt(str, 8);
-        }
-        return this.finishToken(tt.num, val);
-      }
-
-      // Read a string value, interpreting backslash-escapes.
-
-      readCodePoint(throwOnInvalid) {
-        const ch = this.input.charCodeAt(this.state.pos);
-        let code;
-
-        if (ch === 123) { // '{'
-          const codePos = ++this.state.pos;
-          code = this.readHexChar(this.input.indexOf("}", this.state.pos) - this.state.pos, throwOnInvalid);
-          ++this.state.pos;
-          if (code === null) {
-            --this.state.invalidTemplateEscapePosition; // to point to the '\'' instead of the 'u'
-          } else if (code > 0x10FFFF) {
-            if (throwOnInvalid) {
-              this.raise(codePos, "Code point out of bounds");
-            } else {
-              this.state.invalidTemplateEscapePosition = codePos - 2;
-              return null;
-            }
-          }
-        } else {
-          code = this.readHexChar(4, throwOnInvalid);
-        }
-        return code;
-      }
-
-      readString(quote) {
-        let out = "", chunkStart = ++this.state.pos;
-        for (;;) {
-          if (this.state.pos >= this.input.length) this.raise(this.state.start, "Unterminated string constant");
-          const ch = this.input.charCodeAt(this.state.pos);
-          if (ch === quote) break;
-          if (ch === 92) { // '\'
-            out += this.input.slice(chunkStart, this.state.pos);
-            out += this.readEscapedChar(false);
-            chunkStart = this.state.pos;
-          } else {
-            if (isNewLine(ch)) this.raise(this.state.start, "Unterminated string constant");
-            ++this.state.pos;
-          }
-        }
-        out += this.input.slice(chunkStart, this.state.pos++);
-        return this.finishToken(tt.string, out);
-      }
-
-      // Reads template string tokens.
-
-      readTmplToken() {
-        let out = "", chunkStart = this.state.pos, containsInvalid = false;
-        for (;;) {
-          if (this.state.pos >= this.input.length) this.raise(this.state.start, "Unterminated template");
-          const ch = this.input.charCodeAt(this.state.pos);
-          if (ch === 96 || ch === 36 && this.input.charCodeAt(this.state.pos + 1) === 123) { // '`', '${'
-            if (this.state.pos === this.state.start && this.match(tt.template)) {
-              if (ch === 36) {
-                this.state.pos += 2;
-                return this.finishToken(tt.dollarBraceL);
-              } else {
-                ++this.state.pos;
-                return this.finishToken(tt.backQuote);
-              }
-            }
-            out += this.input.slice(chunkStart, this.state.pos);
-            return this.finishToken(tt.template, containsInvalid ? null : out);
-          }
-          if (ch === 92) { // '\'
-            out += this.input.slice(chunkStart, this.state.pos);
-            const escaped = this.readEscapedChar(true);
-            if (escaped === null) {
-              containsInvalid = true;
-            } else {
-              out += escaped;
-            }
-            chunkStart = this.state.pos;
-          } else if (isNewLine(ch)) {
-            out += this.input.slice(chunkStart, this.state.pos);
-            ++this.state.pos;
-            switch (ch) {
-              case 13:
-                if (this.input.charCodeAt(this.state.pos) === 10) ++this.state.pos;
-              case 10:
-                out += "\n";
-                break;
-              default:
-                out += String.fromCharCode(ch);
-                break;
-            }
-            ++this.state.curLine;
-            this.state.lineStart = this.state.pos;
-            chunkStart = this.state.pos;
-          } else {
-            ++this.state.pos;
-          }
-        }
-      }
-
-      // Used to read escaped characters
-
-      readEscapedChar(inTemplate) {
-        const throwOnInvalid = !inTemplate;
-        const ch = this.input.charCodeAt(++this.state.pos);
-        ++this.state.pos;
-        switch (ch) {
-          case 110: return "\n"; // 'n' -> '\n'
-          case 114: return "\r"; // 'r' -> '\r'
-          case 120: { // 'x'
-            const code = this.readHexChar(2, throwOnInvalid);
-            return code === null ? null : String.fromCharCode(code);
-          }
-          case 117: { // 'u'
-            const code = this.readCodePoint(throwOnInvalid);
-            return code === null ? null : codePointToString(code);
-          }
-          case 116: return "\t"; // 't' -> '\t'
-          case 98: return "\b"; // 'b' -> '\b'
-          case 118: return "\u000b"; // 'v' -> '\u000b'
-          case 102: return "\f"; // 'f' -> '\f'
-          case 13: if (this.input.charCodeAt(this.state.pos) === 10) ++this.state.pos; // '\r\n'
-          case 10: // ' \n'
-            this.state.lineStart = this.state.pos;
-            ++this.state.curLine;
-            return "";
-          default:
-            if (ch >= 48 && ch <= 55) {
-              const codePos = this.state.pos - 1;
-              let octalStr = this.input.substr(this.state.pos - 1, 3).match(/^[0-7]+/)[0];
-              let octal = parseInt(octalStr, 8);
-              if (octal > 255) {
-                octalStr = octalStr.slice(0, -1);
-                octal = parseInt(octalStr, 8);
-              }
-              if (octal > 0) {
-                if (inTemplate) {
-                  this.state.invalidTemplateEscapePosition = codePos;
-                  return null;
-                } else if (this.state.strict) {
-                  this.raise(codePos, "Octal literal in strict mode");
-                } else if (!this.state.containsOctal) {
-                  // These properties are only used to throw an error for an octal which occurs
-                  // in a directive which occurs prior to a "use strict" directive.
-                  this.state.containsOctal = true;
-                  this.state.octalPosition = codePos;
-                }
-              }
-              this.state.pos += octalStr.length - 1;
-              return String.fromCharCode(octal);
-            }
-            return String.fromCharCode(ch);
-        }
-      }
-
-      // Used to read character escape sequences ('\x', '\u').
-
-      readHexChar(len, throwOnInvalid) {
-        const codePos = this.state.pos;
-        const n = this.readInt(16, len);
-        if (n === null) {
-          if (throwOnInvalid) {
-            this.raise(codePos, "Bad character escape sequence");
-          } else {
-            this.state.pos = codePos - 1;
-            this.state.invalidTemplateEscapePosition = codePos - 1;
-          }
-        }
-        return n;
-      }
-
-      // Read an identifier, and return it as a string. Sets `this.state.containsEsc`
-      // to whether the word contained a '\u' escape.
-      //
-      // Incrementally adds only escaped chars, adding other chunks as-is
-      // as a micro-optimization.
-
-      readWord1() {
-        this.state.containsEsc = false;
-        let word = "", first = true, chunkStart = this.state.pos;
-        while (this.state.pos < this.input.length) {
-          const ch = this.fullCharCodeAtPos();
-          if (isIdentifierChar(ch)) {
-            this.state.pos += ch <= 0xffff ? 1 : 2;
-          } else if (ch === 92) { // "\"
-            this.state.containsEsc = true;
-
-            word += this.input.slice(chunkStart, this.state.pos);
-            const escStart = this.state.pos;
-
-            if (this.input.charCodeAt(++this.state.pos) !== 117) { // "u"
-              this.raise(this.state.pos, "Expecting Unicode escape sequence \\uXXXX");
-            }
-
-            ++this.state.pos;
-            const esc = this.readCodePoint(true);
-            if (!(first ? isIdentifierStart : isIdentifierChar)(esc, true)) {
-              this.raise(escStart, "Invalid Unicode escape");
-            }
-
-            word += codePointToString(esc);
-            chunkStart = this.state.pos;
-          } else {
-            break;
-          }
-          first = false;
-        }
-        return word + this.input.slice(chunkStart, this.state.pos);
-      }
-
-      // Read an identifier or keyword token. Will check for reserved
-      // words when necessary.
-
-      readWord() {
-        const word = this.readWord1();
-        let type = tt.name;
-        if (!this.state.containsEsc && this.isKeyword(word)) {
-          type = keywordTypes[word];
-        }
-        return this.finishToken(type, word);
-      }
-
-      braceIsBlock(prevType) {
-        if (prevType === tt.colon) {
-          const parent = this.curContext();
-          if (parent === ct.braceStatement || parent === ct.braceExpression) {
-            return !parent.isExpr;
-          }
-        }
-
-        if (prevType === tt._return) {
-          return lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start));
-        }
-
-        if (prevType === tt._else || prevType === tt.semi || prevType === tt.eof || prevType === tt.parenR) {
-          return true;
-        }
-
-        if (prevType === tt.braceL) {
-          return this.curContext() === ct.braceStatement;
-        }
-
-        return !this.state.exprAllowed;
-      }
-
-      updateContext(prevType) {
-        const type = this.state.type;
-        let update;
-
-        if (type.keyword && prevType === tt.dot) {
-          this.state.exprAllowed = false;
-        } else if (update = type.updateContext) {
-          update.call(this, prevType);
-        } else {
-          this.state.exprAllowed = type.beforeExpr;
-        }
-      }
-    }
-    
-    tokenizerIndexJS = Tokenizer;
-    tokenizerIndexJS.Token = Token;
-}
-
-
-// options.js
-const optionsJS = {};
-{
-    // A second optional argument can be given to further configure
-    // the parser process. These options are recognized:
-
-    const defaultOptions = {
-      // Source type ("script" or "module") for different semantics
-      sourceType: "script",
-      // Source filename.
-      sourceFilename: undefined,
-      // Line from which to start counting source. Useful for
-      // integration with other tools.
-      startLine: 1,
-      // When enabled, a return at the top level is not considered an
-      // error.
-      allowReturnOutsideFunction: false,
-      // When enabled, import/export statements are not constrained to
-      // appearing at the top of the program.
-      allowImportExportEverywhere: false,
-      // TODO
-      allowSuperOutsideMethod: false,
-      // An array of plugins to enable
-      plugins: [],
-      // TODO
-      strictMode: null,
-      // Nodes have their start and end characters offsets recorded in
-      // `start` and `end` properties (directly on the node, rather than
-      // the `loc` object, which holds line/column data. To also add a
-      // [semi-standardized][range] `range` property holding a `[start,
-      // end]` array with the same numbers, set the `ranges` option to
-      // `true`.
-      //
-      // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678
-      ranges: false,
-    };
-    optionsJS.defaultOptions = defaultOptions;
-
-    // Interpret and default an options object
-
-    function getOptions(opts) {
-      const options = {};
-      for (const key in defaultOptions) {
-        options[key] = opts && key in opts ? opts[key] : defaultOptions[key];
-      }
-      return options;
-    }
-    optionsJS.getOptions = getOptions;
-}
-
-
-// parser/index.js
-let parserIndexJS = {};
-{
-    const { reservedWords } = utilIdentifierJS;
-    const { getOptions } = optionsJS;
-    const Tokenizer = tokenizerIndexJS;
-
-    const plugins = {};
-
-    class Parser extends Tokenizer {
-      constructor(options, input) {
-        options = getOptions(options);
-        super(options, input);
-
-        this.options = options;
-        this.inModule = this.options.sourceType === "module";
-        this.input = input;
-        this.plugins = this.loadPlugins(this.options.plugins);
-        this.filename = options.sourceFilename;
-
-        // If enabled, skip leading hashbang line.
-        if (this.state.pos === 0 && this.input[0] === "#" && this.input[1] === "!") {
-          this.skipLineComment(2);
-        }
-      }
-
-      isReservedWord(word) {
-        if (word === "await") {
-          return this.inModule;
-        } else {
-          return reservedWords[6](word);
-        }
-      }
-
-      hasPlugin(name) {
-        return !!this.plugins[name];
-      }
-
-      extend(name, f) {
-        this[name] = f(this[name]);
-      }
-
-      loadPlugins(pluginList)  {
-        const pluginMap = {};
-
-        if (pluginList.indexOf("flow") >= 0) {
-          // ensure flow plugin loads last
-          pluginList = pluginList.filter((plugin) => plugin !== "flow");
-          pluginList.push("flow");
-        }
-
-        if (pluginList.indexOf("estree") >= 0) {
-          // ensure estree plugin loads first
-          pluginList = pluginList.filter((plugin) => plugin !== "estree");
-          pluginList.unshift("estree");
-        }
-
-        for (const name of pluginList) {
-          if (!pluginMap[name]) {
-            pluginMap[name] = true;
-
-            const plugin = plugins[name];
-            if (plugin) plugin(this);
-          }
-        }
-
-        return pluginMap;
-      }
-
-      parse() {
-        const file = this.startNode();
-        const program = this.startNode();
-        this.nextToken();
-        return this.parseTopLevel(file, program);
-      }
-    }
-
-    parserIndexJS = Parser;
-    parserIndexJS.plugins = plugins;
-}
-
-// parser/comments.js
-const parserCommentsJS = {};
-{
-    /* eslint max-len: 0 */
-
-    /**
-     * Based on the comment attachment algorithm used in espree and estraverse.
-     *
-     * Redistribution and use in source and binary forms, with or without
-     * modification, are permitted provided that the following conditions are met:
-     *
-     * * Redistributions of source code must retain the above copyright
-     *   notice, this list of conditions and the following disclaimer.
-     * * Redistributions in binary form must reproduce the above copyright
-     *   notice, this list of conditions and the following disclaimer in the
-     *   documentation and/or other materials provided with the distribution.
-     *
-     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-     * ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
-     * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-     * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-     * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-     * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-     */
-
-
-    {
-        const Parser = parserIndexJS;
-
-        function last(stack) {
-          return stack[stack.length - 1];
-        }
-
-        const pp = Parser.prototype;
-
-        pp.addComment = function (comment) {
-          if (this.filename) comment.loc.filename = this.filename;
-          this.state.trailingComments.push(comment);
-          this.state.leadingComments.push(comment);
-        };
-
-        pp.processComment = function (node) {
-          if (node.type === "Program" && node.body.length > 0) return;
-
-          const stack = this.state.commentStack;
-
-          let lastChild, trailingComments, i, j;
-
-          if (this.state.trailingComments.length > 0) {
-            // If the first comment in trailingComments comes after the
-            // current node, then we're good - all comments in the array will
-            // come after the node and so it's safe to add them as official
-            // trailingComments.
-            if (this.state.trailingComments[0].start >= node.end) {
-              trailingComments = this.state.trailingComments;
-              this.state.trailingComments = [];
-            } else {
-              // Otherwise, if the first comment doesn't come after the
-              // current node, that means we have a mix of leading and trailing
-              // comments in the array and that leadingComments contains the
-              // same items as trailingComments. Reset trailingComments to
-              // zero items and we'll handle this by evaluating leadingComments
-              // later.
-              this.state.trailingComments.length = 0;
-            }
-          } else {
-            const lastInStack = last(stack);
-            if (stack.length > 0 && lastInStack.trailingComments && lastInStack.trailingComments[0].start >= node.end) {
-              trailingComments = lastInStack.trailingComments;
-              lastInStack.trailingComments = null;
-            }
-          }
-
-          // Eating the stack.
-          while (stack.length > 0 && last(stack).start >= node.start) {
-            lastChild = stack.pop();
-          }
-
-          if (lastChild) {
-            if (lastChild.leadingComments) {
-              if (lastChild !== node && last(lastChild.leadingComments).end <= node.start) {
-                node.leadingComments = lastChild.leadingComments;
-                lastChild.leadingComments = null;
-              } else {
-                // A leading comment for an anonymous class had been stolen by its first ClassMethod,
-                // so this takes back the leading comment.
-                // See also: https://github.com/eslint/espree/issues/158
-                for (i = lastChild.leadingComments.length - 2; i >= 0; --i) {
-                  if (lastChild.leadingComments[i].end <= node.start) {
-                    node.leadingComments = lastChild.leadingComments.splice(0, i + 1);
-                    break;
-                  }
-                }
-              }
-            }
-          } else if (this.state.leadingComments.length > 0) {
-            if (last(this.state.leadingComments).end <= node.start) {
-              if (this.state.commentPreviousNode) {
-                for (j = 0; j < this.state.leadingComments.length; j++) {
-                  if (this.state.leadingComments[j].end < this.state.commentPreviousNode.end) {
-                    this.state.leadingComments.splice(j, 1);
-                    j--;
-                  }
-                }
-              }
-              if (this.state.leadingComments.length > 0) {
-                node.leadingComments = this.state.leadingComments;
-                this.state.leadingComments = [];
-              }
-            } else {
-              // https://github.com/eslint/espree/issues/2
-              //
-              // In special cases, such as return (without a value) and
-              // debugger, all comments will end up as leadingComments and
-              // will otherwise be eliminated. This step runs when the
-              // commentStack is empty and there are comments left
-              // in leadingComments.
-              //
-              // This loop figures out the stopping point between the actual
-              // leading and trailing comments by finding the location of the
-              // first comment that comes after the given node.
-              for (i = 0; i < this.state.leadingComments.length; i++) {
-                if (this.state.leadingComments[i].end > node.start) {
-                  break;
-                }
-              }
-
-              // Split the array based on the location of the first comment
-              // that comes after the node. Keep in mind that this could
-              // result in an empty array, and if so, the array must be
-              // deleted.
-              node.leadingComments = this.state.leadingComments.slice(0, i);
-              if ((node.leadingComments).length === 0) {
-                node.leadingComments = null;
-              }
-
-              // Similarly, trailing comments are attached later. The variable
-              // must be reset to null if there are no trailing comments.
-              trailingComments = this.state.leadingComments.slice(i);
-              if (trailingComments.length === 0) {
-                trailingComments = null;
-              }
-            }
-          }
-
-          this.state.commentPreviousNode = node;
-
-          if (trailingComments) {
-            if (trailingComments.length && trailingComments[0].start >= node.start && last(trailingComments).end <= node.end) {
-              node.innerComments = trailingComments;
-            } else {
-              node.trailingComments = trailingComments;
-            }
-          }
-
-          stack.push(node);
-        };
-    }
-
-}
-
-// parser/expression.js
-const parserExpressionJS = {};
-{
-    /* eslint max-len: 0 */
-
-    // A recursive descent parser operates by defining functions for all
-    // syntactic elements, and recursively calling those, each function
-    // advancing the input stream and returning an AST node. Precedence
-    // of constructs (for example, the fact that `!x[1]` means `!(x[1])`
-    // instead of `(!x)[1]` is handled by the fact that the parser
-    // function that parses unary prefix operators is called first, and
-    // in turn calls the function that parses `[]` subscripts — that
-    // way, it'll receive the node for `x[1]` already parsed, and wraps
-    // *that* in the unary operator node.
-    //
-    // Acorn uses an [operator precedence parser][opp] to handle binary
-    // operator precedence, because it is much more compact than using
-    // the technique outlined above, which uses different, nesting
-    // functions to specify precedence, for all of the ten binary
-    // precedence levels that JavaScript defines.
-    //
-    // [opp]: http://en.wikipedia.org/wiki/Operator-precedence_parser
-
-    const { types: tt } = tokenizerTypesJS;
-    const Parser = parserIndexJS;
-    const { reservedWords } = utilIdentifierJS;
-
-    const pp = Parser.prototype;
-
-    // Check if property name clashes with already added.
-    // Object/class getters and setters are not allowed to clash —
-    // either with each other or with an init property — and in
-    // strict mode, init properties are also not allowed to be repeated.
-
-    pp.checkPropClash = function (prop, propHash) {
-      if (prop.computed || prop.kind) return;
-
-      const key = prop.key;
-      // It is either an Identifier or a String/NumericLiteral
-      const name = key.type === "Identifier" ? key.name : String(key.value);
-
-      if (name === "__proto__") {
-        if (propHash.proto) this.raise(key.start, "Redefinition of __proto__ property");
-        propHash.proto = true;
-      }
-    };
-
-    // Convenience method to parse an Expression only
-    pp.getExpression = function() {
-      this.nextToken();
-      const expr = this.parseExpression();
-      if (!this.match(tt.eof)) {
-        this.unexpected();
-      }
-      return expr;
-    };
-
-    // ### Expression parsing
-
-    // These nest, from the most general expression type at the top to
-    // 'atomic', nondivisible expression types at the bottom. Most of
-    // the functions will simply let the function (s) below them parse,
-    // and, *if* the syntactic construct they handle is present, wrap
-    // the AST node that the inner parser gave them in another node.
-
-    // Parse a full expression. The optional arguments are used to
-    // forbid the `in` operator (in for loops initialization expressions)
-    // and provide reference for storing '=' operator inside shorthand
-    // property assignment in contexts where both object expression
-    // and object pattern might appear (so it's possible to raise
-    // delayed syntax error at correct position).
-
-    pp.parseExpression = function (noIn, refShorthandDefaultPos) {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const expr = this.parseMaybeAssign(noIn, refShorthandDefaultPos);
-      if (this.match(tt.comma)) {
-        const node = this.startNodeAt(startPos, startLoc);
-        node.expressions = [expr];
-        while (this.eat(tt.comma)) {
-          node.expressions.push(this.parseMaybeAssign(noIn, refShorthandDefaultPos));
-        }
-        this.toReferencedList(node.expressions);
-        return this.finishNode(node, "SequenceExpression");
-      }
-      return expr;
-    };
-
-    // Parse an assignment expression. This includes applications of
-    // operators like `+=`.
-
-    pp.parseMaybeAssign = function (noIn, refShorthandDefaultPos, afterLeftParse, refNeedsArrowPos) {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-
-      if (this.match(tt._yield) && this.state.inGenerator) {
-        let left = this.parseYield();
-        if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc);
-        return left;
-      }
-
-      let failOnShorthandAssign;
-      if (refShorthandDefaultPos) {
-        failOnShorthandAssign = false;
-      } else {
-        refShorthandDefaultPos = { start: 0 };
-        failOnShorthandAssign = true;
-      }
-
-      if (this.match(tt.parenL) || this.match(tt.name)) {
-        this.state.potentialArrowAt = this.state.start;
-      }
-
-      let left = this.parseMaybeConditional(noIn, refShorthandDefaultPos, refNeedsArrowPos);
-      if (afterLeftParse) left = afterLeftParse.call(this, left, startPos, startLoc);
-      if (this.state.type.isAssign) {
-        const node = this.startNodeAt(startPos, startLoc);
-        node.operator = this.state.value;
-        node.left = this.match(tt.eq) ? this.toAssignable(left, undefined, "assignment expression") : left;
-        refShorthandDefaultPos.start = 0; // reset because shorthand default was used correctly
-
-        this.checkLVal(left, undefined, undefined, "assignment expression");
-
-        if (left.extra && left.extra.parenthesized) {
-          let errorMsg;
-          if (left.type === "ObjectPattern") {
-            errorMsg = "`({a}) = 0` use `({a} = 0)`";
-          } else if (left.type === "ArrayPattern") {
-            errorMsg = "`([a]) = 0` use `([a] = 0)`";
-          }
-          if (errorMsg) {
-            this.raise(left.start, `You're trying to assign to a parenthesized expression, eg. instead of ${errorMsg}`);
-          }
-        }
-
-        this.next();
-        node.right = this.parseMaybeAssign(noIn);
-        return this.finishNode(node, "AssignmentExpression");
-      } else if (failOnShorthandAssign && refShorthandDefaultPos.start) {
-        this.unexpected(refShorthandDefaultPos.start);
-      }
-
-      return left;
-    };
-
-    // Parse a ternary conditional (`?:`) operator.
-
-    pp.parseMaybeConditional = function (noIn, refShorthandDefaultPos, refNeedsArrowPos) {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const expr = this.parseExprOps(noIn, refShorthandDefaultPos);
-      if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr;
-
-      return this.parseConditional(expr, noIn, startPos, startLoc, refNeedsArrowPos);
-    };
-
-    pp.parseConditional = function (expr, noIn, startPos, startLoc) {
-      if (this.eat(tt.question)) {
-        const node = this.startNodeAt(startPos, startLoc);
-        node.test = expr;
-        node.consequent = this.parseMaybeAssign();
-        this.expect(tt.colon);
-        node.alternate = this.parseMaybeAssign(noIn);
-        return this.finishNode(node, "ConditionalExpression");
-      }
-      return expr;
-    };
-
-    // Start the precedence parser.
-
-    pp.parseExprOps = function (noIn, refShorthandDefaultPos) {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const expr = this.parseMaybeUnary(refShorthandDefaultPos);
-      if (refShorthandDefaultPos && refShorthandDefaultPos.start) {
-        return expr;
-      } else {
-        return this.parseExprOp(expr, startPos, startLoc, -1, noIn);
-      }
-    };
-
-    // Parse binary operators with the operator precedence parsing
-    // algorithm. `left` is the left-hand side of the operator.
-    // `minPrec` provides context that allows the function to stop and
-    // defer further parser to one of its callers when it encounters an
-    // operator that has a lower precedence than the set it is parsing.
-
-    pp.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) {
-      const prec = this.state.type.binop;
-      if (prec != null && (!noIn || !this.match(tt._in))) {
-        if (prec > minPrec) {
-          const node = this.startNodeAt(leftStartPos, leftStartLoc);
-          node.left = left;
-          node.operator = this.state.value;
-
-          if (
-            node.operator === "**" &&
-            left.type === "UnaryExpression" &&
-            left.extra &&
-            !left.extra.parenthesizedArgument &&
-            !left.extra.parenthesized
-          ) {
-            this.raise(left.argument.start, "Illegal expression. Wrap left hand side or entire exponentiation in parentheses.");
-          }
-
-          const op = this.state.type;
-          this.next();
-
-          const startPos = this.state.start;
-          const startLoc = this.state.startLoc;
-          node.right = this.parseExprOp(this.parseMaybeUnary(), startPos, startLoc, op.rightAssociative ? prec - 1 : prec, noIn);
-
-          this.finishNode(node, (op === tt.logicalOR || op === tt.logicalAND) ? "LogicalExpression" : "BinaryExpression");
-          return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn);
-        }
-      }
-      return left;
-    };
-
-    // Parse unary operators, both prefix and postfix.
-
-    pp.parseMaybeUnary = function (refShorthandDefaultPos) {
-      if (this.state.type.prefix) {
-        const node = this.startNode();
-        const update = this.match(tt.incDec);
-        node.operator = this.state.value;
-        node.prefix = true;
-        this.next();
-
-        const argType = this.state.type;
-        node.argument = this.parseMaybeUnary();
-
-        this.addExtra(node, "parenthesizedArgument", argType === tt.parenL && (!node.argument.extra || !node.argument.extra.parenthesized));
-
-        if (refShorthandDefaultPos && refShorthandDefaultPos.start) {
-          this.unexpected(refShorthandDefaultPos.start);
-        }
-
-        if (update) {
-          this.checkLVal(node.argument, undefined, undefined, "prefix operation");
-        } else if (this.state.strict && node.operator === "delete" && node.argument.type === "Identifier") {
-          this.raise(node.start, "Deleting local variable in strict mode");
-        }
-
-        return this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression");
-      }
-
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      let expr = this.parseExprSubscripts(refShorthandDefaultPos);
-      if (refShorthandDefaultPos && refShorthandDefaultPos.start) return expr;
-      while (this.state.type.postfix && !this.canInsertSemicolon()) {
-        const node = this.startNodeAt(startPos, startLoc);
-        node.operator = this.state.value;
-        node.prefix = false;
-        node.argument = expr;
-        this.checkLVal(expr, undefined, undefined, "postfix operation");
-        this.next();
-        expr = this.finishNode(node, "UpdateExpression");
-      }
-      return expr;
-    };
-
-    // Parse call, dot, and `[]`-subscript expressions.
-
-    pp.parseExprSubscripts = function (refShorthandDefaultPos) {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const potentialArrowAt = this.state.potentialArrowAt;
-      const expr = this.parseExprAtom(refShorthandDefaultPos);
-
-      if (expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt) {
-        return expr;
-      }
-
-      if (refShorthandDefaultPos && refShorthandDefaultPos.start) {
-        return expr;
-      }
-
-      return this.parseSubscripts(expr, startPos, startLoc);
-    };
-
-    pp.parseSubscripts = function (base, startPos, startLoc, noCalls) {
-      for (;;) {
-        if (!noCalls && this.eat(tt.doubleColon)) {
-          const node = this.startNodeAt(startPos, startLoc);
-          node.object = base;
-          node.callee = this.parseNoCallExpr();
-          return this.parseSubscripts(this.finishNode(node, "BindExpression"), startPos, startLoc, noCalls);
-        } else if (this.eat(tt.dot)) {
-          const node = this.startNodeAt(startPos, startLoc);
-          node.object = base;
-          node.property = this.parseIdentifier(true);
-          node.computed = false;
-          base = this.finishNode(node, "MemberExpression");
-        } else if (this.eat(tt.bracketL)) {
-          const node = this.startNodeAt(startPos, startLoc);
-          node.object = base;
-          node.property = this.parseExpression();
-          node.computed = true;
-          this.expect(tt.bracketR);
-          base = this.finishNode(node, "MemberExpression");
-        } else if (!noCalls && this.match(tt.parenL)) {
-          const possibleAsync = this.state.potentialArrowAt === base.start && base.type === "Identifier" && base.name === "async" && !this.canInsertSemicolon();
-          this.next();
-
-          const node = this.startNodeAt(startPos, startLoc);
-          node.callee = base;
-          node.arguments = this.parseCallExpressionArguments(tt.parenR, possibleAsync);
-          if (node.callee.type === "Import" && node.arguments.length !== 1) {
-            this.raise(node.start, "import() requires exactly one argument");
-          }
-          base = this.finishNode(node, "CallExpression");
-
-          if (possibleAsync && this.shouldParseAsyncArrow()) {
-            return this.parseAsyncArrowFromCallExpression(this.startNodeAt(startPos, startLoc), node);
-          } else {
-            this.toReferencedList(node.arguments);
-          }
-        } else if (this.match(tt.backQuote)) {
-          const node = this.startNodeAt(startPos, startLoc);
-          node.tag = base;
-          node.quasi = this.parseTemplate(true);
-          base = this.finishNode(node, "TaggedTemplateExpression");
-        } else {
-          return base;
-        }
-      }
-    };
-
-    pp.parseCallExpressionArguments = function (close, possibleAsyncArrow) {
-      const elts = [];
-      let innerParenStart;
-      let first = true;
-
-      while (!this.eat(close)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma);
-          if (this.eat(close)) break;
-        }
-
-        // we need to make sure that if this is an async arrow functions, that we don't allow inner parens inside the params
-        if (this.match(tt.parenL) && !innerParenStart) {
-          innerParenStart = this.state.start;
-        }
-
-        elts.push(this.parseExprListItem(false, possibleAsyncArrow ? { start: 0 } : undefined, possibleAsyncArrow ? { start: 0 } : undefined));
-      }
-
-      // we found an async arrow function so let's not allow any inner parens
-      if (possibleAsyncArrow && innerParenStart && this.shouldParseAsyncArrow()) {
-        this.unexpected();
-      }
-
-      return elts;
-    };
-
-    pp.shouldParseAsyncArrow = function () {
-      return this.match(tt.arrow);
-    };
-
-    pp.parseAsyncArrowFromCallExpression = function (node, call) {
-      this.expect(tt.arrow);
-      return this.parseArrowExpression(node, call.arguments, true);
-    };
-
-    // Parse a no-call expression (like argument of `new` or `::` operators).
-
-    pp.parseNoCallExpr = function () {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      return this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true);
-    };
-
-    // Parse an atomic expression — either a single token that is an
-    // expression, an expression started by a keyword like `function` or
-    // `new`, or an expression wrapped in punctuation like `()`, `[]`,
-    // or `{}`.
-
-    pp.parseExprAtom = function (refShorthandDefaultPos) {
-      const canBeArrow = this.state.potentialArrowAt === this.state.start;
-      let node;
-
-      switch (this.state.type) {
-        case tt._super:
-          if (!this.state.inMethod && !this.options.allowSuperOutsideMethod) {
-            this.raise(this.state.start, "'super' outside of function or class");
-          }
-
-          node = this.startNode();
-          this.next();
-          if (!this.match(tt.parenL) && !this.match(tt.bracketL) && !this.match(tt.dot)) {
-            this.unexpected();
-          }
-          if (this.match(tt.parenL) && this.state.inMethod !== "constructor" && !this.options.allowSuperOutsideMethod) {
-            this.raise(node.start, "super() is only valid inside a class constructor. Make sure the method name is spelled exactly as 'constructor'.");
-          }
-          return this.finishNode(node, "Super");
-
-        case tt._import:
-          if (!this.hasPlugin("dynamicImport")) this.unexpected();
-
-          node = this.startNode();
-          this.next();
-          if (!this.match(tt.parenL)) {
-            this.unexpected(null, tt.parenL);
-          }
-          return this.finishNode(node, "Import");
-
-        case tt._this:
-          node = this.startNode();
-          this.next();
-          return this.finishNode(node, "ThisExpression");
-
-        case tt._yield:
-          if (this.state.inGenerator) this.unexpected();
-
-        case tt.name:
-          node = this.startNode();
-          const allowAwait = this.state.value === "await" && this.state.inAsync;
-          const allowYield = this.shouldAllowYieldIdentifier();
-          const id = this.parseIdentifier(allowAwait || allowYield);
-
-          if (id.name === "await") {
-            if (this.state.inAsync || this.inModule) {
-              return this.parseAwait(node);
-            }
-          } else if (id.name === "async" && this.match(tt._function) && !this.canInsertSemicolon()) {
-            this.next();
-            return this.parseFunction(node, false, false, true);
-          } else if (canBeArrow && id.name === "async" && this.match(tt.name)) {
-            const params = [this.parseIdentifier()];
-            this.expect(tt.arrow);
-            // let foo = bar => {};
-            return this.parseArrowExpression(node, params, true);
-          }
-
-          if (canBeArrow && !this.canInsertSemicolon() && this.eat(tt.arrow)) {
-            return this.parseArrowExpression(node, [id]);
-          }
-
-          return id;
-
-        case tt._do:
-          if (this.hasPlugin("doExpressions")) {
-            const node = this.startNode();
-            this.next();
-            const oldInFunction = this.state.inFunction;
-            const oldLabels = this.state.labels;
-            this.state.labels = [];
-            this.state.inFunction = false;
-            node.body = this.parseBlock(false, true);
-            this.state.inFunction = oldInFunction;
-            this.state.labels = oldLabels;
-            return this.finishNode(node, "DoExpression");
-          }
-
-        case tt.regexp:
-          const value = this.state.value;
-          node = this.parseLiteral(value.value, "RegExpLiteral");
-          node.pattern = value.pattern;
-          node.flags = value.flags;
-          return node;
-
-        case tt.num:
-          return this.parseLiteral(this.state.value, "NumericLiteral");
-
-        case tt.string:
-          return this.parseLiteral(this.state.value, "StringLiteral");
-
-        case tt._null:
-          node = this.startNode();
-          this.next();
-          return this.finishNode(node, "NullLiteral");
-
-        case tt._true: case tt._false:
-          node = this.startNode();
-          node.value = this.match(tt._true);
-          this.next();
-          return this.finishNode(node, "BooleanLiteral");
-
-        case tt.parenL:
-          return this.parseParenAndDistinguishExpression(null, null, canBeArrow);
-
-        case tt.bracketL:
-          node = this.startNode();
-          this.next();
-          node.elements = this.parseExprList(tt.bracketR, true, refShorthandDefaultPos);
-          this.toReferencedList(node.elements);
-          return this.finishNode(node, "ArrayExpression");
-
-        case tt.braceL:
-          return this.parseObj(false, refShorthandDefaultPos);
-
-        case tt._function:
-          return this.parseFunctionExpression();
-
-        case tt.at:
-          this.parseDecorators();
-
-        case tt._class:
-          node = this.startNode();
-          this.takeDecorators(node);
-          return this.parseClass(node, false);
-
-        case tt._new:
-          return this.parseNew();
-
-        case tt.backQuote:
-          return this.parseTemplate(false);
-
-        case tt.doubleColon:
-          node = this.startNode();
-          this.next();
-          node.object = null;
-          const callee = node.callee = this.parseNoCallExpr();
-          if (callee.type === "MemberExpression") {
-            return this.finishNode(node, "BindExpression");
-          } else {
-            this.raise(callee.start, "Binding should be performed on object property.");
-          }
-
-        default:
-          this.unexpected();
-      }
-    };
-
-    pp.parseFunctionExpression = function () {
-      const node = this.startNode();
-      const meta = this.parseIdentifier(true);
-      if (this.state.inGenerator && this.eat(tt.dot) && this.hasPlugin("functionSent")) {
-        return this.parseMetaProperty(node, meta, "sent");
-      } else {
-        return this.parseFunction(node, false);
-      }
-    };
-
-    pp.parseMetaProperty = function (node, meta, propertyName) {
-      node.meta = meta;
-      node.property = this.parseIdentifier(true);
-
-      if (node.property.name !== propertyName) {
-        this.raise(node.property.start, `The only valid meta property for new is ${meta.name}.${propertyName}`);
-      }
-
-      return this.finishNode(node, "MetaProperty");
-    };
-
-    pp.parseLiteral = function (value, type, startPos, startLoc) {
-      startPos = startPos || this.state.start;
-      startLoc = startLoc || this.state.startLoc;
-
-      const node = this.startNodeAt(startPos, startLoc);
-      this.addExtra(node, "rawValue", value);
-      this.addExtra(node, "raw", this.input.slice(startPos, this.state.end));
-      node.value = value;
-      this.next();
-      return this.finishNode(node, type);
-    };
-
-    pp.parseParenExpression = function () {
-      this.expect(tt.parenL);
-      const val = this.parseExpression();
-      this.expect(tt.parenR);
-      return val;
-    };
-
-    pp.parseParenAndDistinguishExpression = function (startPos, startLoc, canBeArrow) {
-      startPos = startPos || this.state.start;
-      startLoc = startLoc || this.state.startLoc;
-
-      let val;
-      this.expect(tt.parenL);
-
-      const innerStartPos = this.state.start;
-      const innerStartLoc = this.state.startLoc;
-      const exprList = [];
-      const refShorthandDefaultPos = { start: 0 };
-      const refNeedsArrowPos = { start: 0 };
-      let first = true;
-      let spreadStart;
-      let optionalCommaStart;
-
-      while (!this.match(tt.parenR)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma, refNeedsArrowPos.start || null);
-          if (this.match(tt.parenR)) {
-            optionalCommaStart = this.state.start;
-            break;
-          }
-        }
-
-        if (this.match(tt.ellipsis)) {
-          const spreadNodeStartPos = this.state.start;
-          const spreadNodeStartLoc = this.state.startLoc;
-          spreadStart = this.state.start;
-          exprList.push(this.parseParenItem(this.parseRest(), spreadNodeStartPos, spreadNodeStartLoc));
-          break;
-        } else {
-          exprList.push(this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem, refNeedsArrowPos));
-        }
-      }
-
-      const innerEndPos = this.state.start;
-      const innerEndLoc = this.state.startLoc;
-      this.expect(tt.parenR);
-
-      let arrowNode = this.startNodeAt(startPos, startLoc);
-      if (canBeArrow && this.shouldParseArrow() && (arrowNode = this.parseArrow(arrowNode))) {
-        for (const param of exprList) {
-          if (param.extra && param.extra.parenthesized) this.unexpected(param.extra.parenStart);
-        }
-
-        return this.parseArrowExpression(arrowNode, exprList);
-      }
-
-      if (!exprList.length) {
-        this.unexpected(this.state.lastTokStart);
-      }
-      if (optionalCommaStart) this.unexpected(optionalCommaStart);
-      if (spreadStart) this.unexpected(spreadStart);
-      if (refShorthandDefaultPos.start) this.unexpected(refShorthandDefaultPos.start);
-      if (refNeedsArrowPos.start) this.unexpected(refNeedsArrowPos.start);
-
-      if (exprList.length > 1) {
-        val = this.startNodeAt(innerStartPos, innerStartLoc);
-        val.expressions = exprList;
-        this.toReferencedList(val.expressions);
-        this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc);
-      } else {
-        val = exprList[0];
-      }
-
-
-      this.addExtra(val, "parenthesized", true);
-      this.addExtra(val, "parenStart", startPos);
-
-      return val;
-    };
-
-    pp.shouldParseArrow = function () {
-      return !this.canInsertSemicolon();
-    };
-
-    pp.parseArrow = function (node) {
-      if (this.eat(tt.arrow)) {
-        return node;
-      }
-    };
-
-    pp.parseParenItem = function (node) {
-      return node;
-    };
-
-    // New's precedence is slightly tricky. It must allow its argument
-    // to be a `[]` or dot subscript expression, but not a call — at
-    // least, not without wrapping it in parentheses. Thus, it uses the
-
-    pp.parseNew = function () {
-      const node = this.startNode();
-      const meta = this.parseIdentifier(true);
-
-      if (this.eat(tt.dot)) {
-        const metaProp = this.parseMetaProperty(node, meta, "target");
-
-        if (!this.state.inFunction) {
-          this.raise(metaProp.property.start, "new.target can only be used in functions");
-        }
-
-        return metaProp;
-      }
-
-      node.callee = this.parseNoCallExpr();
-
-      if (this.eat(tt.parenL)) {
-        node.arguments = this.parseExprList(tt.parenR);
-        this.toReferencedList(node.arguments);
-      } else {
-        node.arguments = [];
-      }
-
-      return this.finishNode(node, "NewExpression");
-    };
-
-    // Parse template expression.
-
-    pp.parseTemplateElement = function (isTagged) {
-      const elem = this.startNode();
-      if (this.state.value === null) {
-        if (!isTagged) {
-          this.raise(this.state.invalidTemplateEscapePosition, "Invalid escape sequence in template");
-        } else {
-          this.state.invalidTemplateEscapePosition = null;
-        }
-      }
-      elem.value = {
-        raw: this.input.slice(this.state.start, this.state.end).replace(/\r\n?/g, "\n"),
-        cooked: this.state.value
-      };
-      this.next();
-      elem.tail = this.match(tt.backQuote);
-      return this.finishNode(elem, "TemplateElement");
-    };
-
-    pp.parseTemplate = function (isTagged) {
-      const node = this.startNode();
-      this.next();
-      node.expressions = [];
-      let curElt = this.parseTemplateElement(isTagged);
-      node.quasis = [curElt];
-      while (!curElt.tail) {
-        this.expect(tt.dollarBraceL);
-        node.expressions.push(this.parseExpression());
-        this.expect(tt.braceR);
-        node.quasis.push(curElt = this.parseTemplateElement(isTagged));
-      }
-      this.next();
-      return this.finishNode(node, "TemplateLiteral");
-    };
-
-    // Parse an object literal or binding pattern.
-
-    pp.parseObj = function (isPattern, refShorthandDefaultPos) {
-      let decorators = [];
-      const propHash = Object.create(null);
-      let first = true;
-      const node = this.startNode();
-
-      node.properties = [];
-      this.next();
-
-      let firstRestLocation = null;
-
-      while (!this.eat(tt.braceR)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma);
-          if (this.eat(tt.braceR)) break;
-        }
-
-        while (this.match(tt.at)) {
-          decorators.push(this.parseDecorator());
-        }
-
-        let prop = this.startNode(), isGenerator = false, isAsync = false, startPos, startLoc;
-        if (decorators.length) {
-          prop.decorators = decorators;
-          decorators = [];
-        }
-
-        if (this.hasPlugin("objectRestSpread") && this.match(tt.ellipsis)) {
-          prop = this.parseSpread(isPattern ? { start: 0 } : undefined);
-          prop.type = isPattern ? "RestElement" : "SpreadElement";
-          if (isPattern) this.toAssignable(prop.argument, true, "object pattern");
-          node.properties.push(prop);
-          if (isPattern) {
-            const position = this.state.start;
-            if (firstRestLocation !== null) {
-              this.unexpected(firstRestLocation, "Cannot have multiple rest elements when destructuring");
-            } else if (this.eat(tt.braceR)) {
-              break;
-            } else if (this.match(tt.comma) && this.lookahead().type === tt.braceR) {
-              this.unexpected(position, "A trailing comma is not permitted after the rest element");
-            } else {
-              firstRestLocation = position;
-              continue;
-            }
-          } else {
-            continue;
-          }
-        }
-
-        prop.method = false;
-        prop.shorthand = false;
-
-        if (isPattern || refShorthandDefaultPos) {
-          startPos = this.state.start;
-          startLoc = this.state.startLoc;
-        }
-
-        if (!isPattern) {
-          isGenerator = this.eat(tt.star);
-        }
-
-        if (!isPattern && this.isContextual("async")) {
-          if (isGenerator) this.unexpected();
-
-          const asyncId = this.parseIdentifier();
-          if (this.match(tt.colon) || this.match(tt.parenL) || this.match(tt.braceR) || this.match(tt.eq) || this.match(tt.comma)) {
-            prop.key = asyncId;
-            prop.computed = false;
-          } else {
-            isAsync = true;
-            if (this.hasPlugin("asyncGenerators")) isGenerator = this.eat(tt.star);
-            this.parsePropertyName(prop);
-          }
-        } else {
-          this.parsePropertyName(prop);
-        }
-
-        this.parseObjPropValue(prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos);
-        this.checkPropClash(prop, propHash);
-
-        if (prop.shorthand) {
-          this.addExtra(prop, "shorthand", true);
-        }
-
-        node.properties.push(prop);
-      }
-
-      if (firstRestLocation !== null) {
-        this.unexpected(firstRestLocation, "The rest element has to be the last element when destructuring");
-      }
-
-      if (decorators.length) {
-        this.raise(this.state.start, "You have trailing decorators with no property");
-      }
-
-      return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression");
-    };
-
-    pp.isGetterOrSetterMethod = function (prop, isPattern) {
-      return !isPattern &&
-        !prop.computed &&
-        prop.key.type === "Identifier" &&
-        (prop.key.name === "get" || prop.key.name === "set") &&
-        (
-          this.match(tt.string) || // get "string"() {}
-          this.match(tt.num) || // get 1() {}
-          this.match(tt.bracketL) || // get ["string"]() {}
-          this.match(tt.name) || // get foo() {}
-          this.state.type.keyword // get debugger() {}
-        );
-    };
-
-    // get methods aren't allowed to have any parameters
-    // set methods must have exactly 1 parameter
-    pp.checkGetterSetterParamCount = function (method) {
-      const paramCount = method.kind === "get" ? 0 : 1;
-      if (method.params.length !== paramCount) {
-        const start = method.start;
-        if (method.kind === "get") {
-          this.raise(start, "getter should have no params");
-        } else {
-          this.raise(start, "setter should have exactly one param");
-        }
-      }
-    };
-
-    pp.parseObjectMethod = function (prop, isGenerator, isAsync, isPattern) {
-      if (isAsync || isGenerator || this.match(tt.parenL)) {
-        if (isPattern) this.unexpected();
-        prop.kind = "method";
-        prop.method = true;
-        this.parseMethod(prop, isGenerator, isAsync);
-
-        return this.finishNode(prop, "ObjectMethod");
-      }
-
-      if (this.isGetterOrSetterMethod(prop, isPattern)) {
-        if (isGenerator || isAsync) this.unexpected();
-        prop.kind = prop.key.name;
-        this.parsePropertyName(prop);
-        this.parseMethod(prop);
-        this.checkGetterSetterParamCount(prop);
-
-        return this.finishNode(prop, "ObjectMethod");
-      }
-    };
-
-    pp.parseObjectProperty = function (prop, startPos, startLoc, isPattern, refShorthandDefaultPos) {
-      if (this.eat(tt.colon)) {
-        prop.value = isPattern ? this.parseMaybeDefault(this.state.start, this.state.startLoc) : this.parseMaybeAssign(false, refShorthandDefaultPos);
-
-        return this.finishNode(prop, "ObjectProperty");
-      }
-
-      if (!prop.computed && prop.key.type === "Identifier") {
-        if (isPattern) {
-          this.checkReservedWord(prop.key.name, prop.key.start, true, true);
-          prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone());
-        } else if (this.match(tt.eq) && refShorthandDefaultPos) {
-          if (!refShorthandDefaultPos.start) {
-            refShorthandDefaultPos.start = this.state.start;
-          }
-          prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key.__clone());
-        } else {
-          prop.value = prop.key.__clone();
-        }
-        prop.shorthand = true;
-
-        return this.finishNode(prop, "ObjectProperty");
-      }
-    };
-
-    pp.parseObjPropValue = function (prop, startPos, startLoc, isGenerator, isAsync, isPattern, refShorthandDefaultPos) {
-      const node =
-        this.parseObjectMethod(prop, isGenerator, isAsync, isPattern) ||
-        this.parseObjectProperty(prop, startPos, startLoc, isPattern, refShorthandDefaultPos);
-
-      if (!node) this.unexpected();
-
-      return node;
-    };
-
-    pp.parsePropertyName = function (prop) {
-      if (this.eat(tt.bracketL)) {
-        prop.computed = true;
-        prop.key = this.parseMaybeAssign();
-        this.expect(tt.bracketR);
-      } else {
-        prop.computed = false;
-        const oldInPropertyName = this.state.inPropertyName;
-        this.state.inPropertyName = true;
-        prop.key = (this.match(tt.num) || this.match(tt.string)) ? this.parseExprAtom() : this.parseIdentifier(true);
-        this.state.inPropertyName = oldInPropertyName;
-      }
-      return prop.key;
-    };
-
-    // Initialize empty function node.
-
-    pp.initFunction = function (node, isAsync) {
-      node.id = null;
-      node.generator = false;
-      node.expression = false;
-      node.async = !!isAsync;
-    };
-
-    // Parse object or class method.
-
-    pp.parseMethod = function (node, isGenerator, isAsync) {
-      const oldInMethod = this.state.inMethod;
-      this.state.inMethod = node.kind || true;
-      this.initFunction(node, isAsync);
-      this.expect(tt.parenL);
-      node.params = this.parseBindingList(tt.parenR);
-      node.generator = !!isGenerator;
-      this.parseFunctionBody(node);
-      this.state.inMethod = oldInMethod;
-      return node;
-    };
-
-    // Parse arrow function expression with given parameters.
-
-    pp.parseArrowExpression = function (node, params, isAsync) {
-      this.initFunction(node, isAsync);
-      node.params = this.toAssignableList(params, true, "arrow function parameters");
-      this.parseFunctionBody(node, true);
-      return this.finishNode(node, "ArrowFunctionExpression");
-    };
-
-    pp.isStrictBody = function (node, isExpression) {
-      if (!isExpression && node.body.directives.length) {
-        for (const directive of (node.body.directives)) {
-          if (directive.value.value === "use strict") {
-            return true;
-          }
-        }
-      }
-
-      return false;
-    };
-
-    // Parse function body and check parameters.
-    pp.parseFunctionBody = function (node, allowExpression) {
-      const isExpression = allowExpression && !this.match(tt.braceL);
-
-      const oldInAsync = this.state.inAsync;
-      this.state.inAsync = node.async;
-      if (isExpression) {
-        node.body = this.parseMaybeAssign();
-        node.expression = true;
-      } else {
-        // Start a new scope with regard to labels and the `inFunction`
-        // flag (restore them to their old value afterwards).
-        const oldInFunc = this.state.inFunction;
-        const oldInGen = this.state.inGenerator;
-        const oldLabels = this.state.labels;
-        this.state.inFunction = true; this.state.inGenerator = node.generator; this.state.labels = [];
-        node.body = this.parseBlock(true);
-        node.expression = false;
-        this.state.inFunction = oldInFunc; this.state.inGenerator = oldInGen; this.state.labels = oldLabels;
-      }
-      this.state.inAsync = oldInAsync;
-
-      // If this is a strict mode function, verify that argument names
-      // are not repeated, and it does not try to bind the words `eval`
-      // or `arguments`.
-      const isStrict = this.isStrictBody(node, isExpression);
-      // Also check when allowExpression === true for arrow functions
-      const checkLVal = this.state.strict || allowExpression || isStrict;
-
-      if (isStrict && node.id && node.id.type === "Identifier" && node.id.name === "yield") {
-        this.raise(node.id.start, "Binding yield in strict mode");
-      }
-
-      if (checkLVal) {
-        const nameHash = Object.create(null);
-        const oldStrict = this.state.strict;
-        if (isStrict) this.state.strict = true;
-        if (node.id) {
-          this.checkLVal(node.id, true, undefined, "function name");
-        }
-        for (const param of (node.params)) {
-          if (isStrict && param.type !== "Identifier") {
-            this.raise(param.start, "Non-simple parameter in strict mode");
-          }
-          this.checkLVal(param, true, nameHash, "function parameter list");
-        }
-        this.state.strict = oldStrict;
-      }
-    };
-
-    // Parses a comma-separated list of expressions, and returns them as
-    // an array. `close` is the token type that ends the list, and
-    // `allowEmpty` can be turned on to allow subsequent commas with
-    // nothing in between them to be parsed as `null` (which is needed
-    // for array literals).
-
-    pp.parseExprList = function (close, allowEmpty, refShorthandDefaultPos) {
-      const elts = [];
-      let first = true;
-
-      while (!this.eat(close)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma);
-          if (this.eat(close)) break;
-        }
-
-        elts.push(this.parseExprListItem(allowEmpty, refShorthandDefaultPos));
-      }
-      return elts;
-    };
-
-    pp.parseExprListItem = function (allowEmpty, refShorthandDefaultPos, refNeedsArrowPos) {
-      let elt;
-      if (allowEmpty && this.match(tt.comma)) {
-        elt = null;
-      } else if (this.match(tt.ellipsis)) {
-        elt = this.parseSpread(refShorthandDefaultPos);
-      } else {
-        elt = this.parseMaybeAssign(false, refShorthandDefaultPos, this.parseParenItem, refNeedsArrowPos);
-      }
-      return elt;
-    };
-
-    // Parse the next token as an identifier. If `liberal` is true (used
-    // when parsing properties), it will also convert keywords into
-    // identifiers.
-
-    pp.parseIdentifier = function (liberal) {
-      const node = this.startNode();
-      if (!liberal) {
-        this.checkReservedWord(this.state.value, this.state.start, !!this.state.type.keyword, false);
-      }
-
-      if (this.match(tt.name)) {
-        node.name = this.state.value;
-      } else if (this.state.type.keyword) {
-        node.name = this.state.type.keyword;
-      } else {
-        this.unexpected();
-      }
-
-      if (!liberal && node.name === "await" && this.state.inAsync) {
-        this.raise(node.start, "invalid use of await inside of an async function");
-      }
-
-      node.loc.identifierName = node.name;
-
-      this.next();
-      return this.finishNode(node, "Identifier");
-    };
-
-    pp.checkReservedWord = function (word, startLoc, checkKeywords, isBinding) {
-      if (this.isReservedWord(word) || (checkKeywords && this.isKeyword(word))) {
-        this.raise(startLoc, word + " is a reserved word");
-      }
-
-      if (this.state.strict && (reservedWords.strict(word) || (isBinding && reservedWords.strictBind(word)))) {
-        this.raise(startLoc, word + " is a reserved word in strict mode");
-      }
-    };
-
-    // Parses await expression inside async function.
-
-    pp.parseAwait = function (node) {
-      // istanbul ignore next: this condition is checked at the call site so won't be hit here
-      if (!this.state.inAsync) {
-        this.unexpected();
-      }
-      if (this.match(tt.star)) {
-        this.raise(node.start, "await* has been removed from the async functions proposal. Use Promise.all() instead.");
-      }
-      node.argument = this.parseMaybeUnary();
-      return this.finishNode(node, "AwaitExpression");
-    };
-
-    // Parses yield expression inside generator.
-
-    pp.parseYield = function () {
-      const node = this.startNode();
-      this.next();
-      if (
-        this.match(tt.semi) ||
-        this.canInsertSemicolon() ||
-        (!this.match(tt.star) && !this.state.type.startsExpr)
-      ) {
-        node.delegate = false;
-        node.argument = null;
-      } else {
-        node.delegate = this.eat(tt.star);
-        node.argument = this.parseMaybeAssign();
-      }
-      return this.finishNode(node, "YieldExpression");
-    };
-
-}
-
-// parser/location.js
-const parserLocationJS = {};
-{
-    const { getLineInfo } = utilLocationJS;
-    const Parser = parserIndexJS;
-
-    const pp = Parser.prototype;
-
-    // This function is used to raise exceptions on parse errors. It
-    // takes an offset integer (into the current `input`) to indicate
-    // the location of the error, attaches the position to the end
-    // of the error message, and then raises a `SyntaxError` with that
-    // message.
-
-    pp.raise = function (pos, message) {
-      const loc = getLineInfo(this.input, pos);
-      message += ` (${loc.line}:${loc.column})`;
-      const err = new SyntaxError(message);
-      err.pos = pos;
-      err.loc = loc;
-      throw err;
-    };
-}
-
-// parser/lval.js
-const parserLvalJS = {};
-{
-    const { types: tt } = tokenizerTypesJS;
-    const Parser = parserIndexJS;
-
-    const pp = Parser.prototype;
-
-    // Convert existing expression atom to assignable pattern
-    // if possible.
-
-    pp.toAssignable = function (node, isBinding, contextDescription) {
-      if (node) {
-        switch (node.type) {
-          case "Identifier":
-          case "ObjectPattern":
-          case "ArrayPattern":
-          case "AssignmentPattern":
-            break;
-
-          case "ObjectExpression":
-            node.type = "ObjectPattern";
-            for (const prop of (node.properties)) {
-              if (prop.type === "ObjectMethod") {
-                if (prop.kind === "get" || prop.kind === "set") {
-                  this.raise(prop.key.start, "Object pattern can't contain getter or setter");
-                } else {
-                  this.raise(prop.key.start, "Object pattern can't contain methods");
-                }
-              } else {
-                this.toAssignable(prop, isBinding, "object destructuring pattern");
-              }
-            }
-            break;
-
-          case "ObjectProperty":
-            this.toAssignable(node.value, isBinding, contextDescription);
-            break;
-
-          case "SpreadElement":
-            node.type = "RestElement";
-            break;
-
-          case "ArrayExpression":
-            node.type = "ArrayPattern";
-            this.toAssignableList(node.elements, isBinding, contextDescription);
-            break;
-
-          case "AssignmentExpression":
-            if (node.operator === "=") {
-              node.type = "AssignmentPattern";
-              delete node.operator;
-            } else {
-              this.raise(node.left.end, "Only '=' operator can be used for specifying default value.");
-            }
-            break;
-
-          case "MemberExpression":
-            if (!isBinding) break;
-
-          default: {
-            const message = "Invalid left-hand side" +
-              (contextDescription ? " in " + contextDescription : /* istanbul ignore next */ "expression");
-            this.raise(node.start, message);
-          }
-        }
-      }
-      return node;
-    };
-
-    // Convert list of expression atoms to binding list.
-
-    pp.toAssignableList = function (exprList, isBinding, contextDescription) {
-      let end = exprList.length;
-      if (end) {
-        const last = exprList[end - 1];
-        if (last && last.type === "RestElement") {
-          --end;
-        } else if (last && last.type === "SpreadElement") {
-          last.type = "RestElement";
-          const arg = last.argument;
-          this.toAssignable(arg, isBinding, contextDescription);
-          if (arg.type !== "Identifier" && arg.type !== "MemberExpression" && arg.type !== "ArrayPattern") {
-            this.unexpected(arg.start);
-          }
-          --end;
-        }
-      }
-      for (let i = 0; i < end; i++) {
-        const elt = exprList[i];
-        if (elt && elt.type === "SpreadElement")
-          this.raise(elt.start, "The rest element has to be the last element when destructuring");
-        if (elt) this.toAssignable(elt, isBinding, contextDescription);
-      }
-      return exprList;
-    };
-
-    // Convert list of expression atoms to a list of
-
-    pp.toReferencedList = function (exprList) {
-      return exprList;
-    };
-
-    // Parses spread element.
-
-    pp.parseSpread = function (refShorthandDefaultPos) {
-      const node = this.startNode();
-      this.next();
-      node.argument = this.parseMaybeAssign(false, refShorthandDefaultPos);
-      return this.finishNode(node, "SpreadElement");
-    };
-
-    pp.parseRest = function () {
-      const node = this.startNode();
-      this.next();
-      node.argument = this.parseBindingIdentifier();
-      return this.finishNode(node, "RestElement");
-    };
-
-    pp.shouldAllowYieldIdentifier = function () {
-      return this.match(tt._yield) && !this.state.strict && !this.state.inGenerator;
-    };
-
-    pp.parseBindingIdentifier = function () {
-      return this.parseIdentifier(this.shouldAllowYieldIdentifier());
-    };
-
-    // Parses lvalue (assignable) atom.
-
-    pp.parseBindingAtom = function () {
-      switch (this.state.type) {
-        case tt._yield:
-          if (this.state.strict || this.state.inGenerator) this.unexpected();
-          // fall-through
-        case tt.name:
-          return this.parseIdentifier(true);
-
-        case tt.bracketL:
-          const node = this.startNode();
-          this.next();
-          node.elements = this.parseBindingList(tt.bracketR, true);
-          return this.finishNode(node, "ArrayPattern");
-
-        case tt.braceL:
-          return this.parseObj(true);
-
-        default:
-          this.unexpected();
-      }
-    };
-
-    pp.parseBindingList = function (close, allowEmpty) {
-      const elts = [];
-      let first = true;
-      while (!this.eat(close)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma);
-        }
-        if (allowEmpty && this.match(tt.comma)) {
-          elts.push(null);
-        } else if (this.eat(close)) {
-          break;
-        } else if (this.match(tt.ellipsis)) {
-          elts.push(this.parseAssignableListItemTypes(this.parseRest()));
-          this.expect(close);
-          break;
-        } else {
-          const decorators = [];
-          while (this.match(tt.at)) {
-            decorators.push(this.parseDecorator());
-          }
-          const left = this.parseMaybeDefault();
-          if (decorators.length) {
-            left.decorators = decorators;
-          }
-          this.parseAssignableListItemTypes(left);
-          elts.push(this.parseMaybeDefault(left.start, left.loc.start, left));
-        }
-      }
-      return elts;
-    };
-
-    pp.parseAssignableListItemTypes = function (param) {
-      return param;
-    };
-
-    // Parses assignment pattern around given atom if possible.
-
-    pp.parseMaybeDefault = function (startPos, startLoc, left) {
-      startLoc = startLoc || this.state.startLoc;
-      startPos = startPos || this.state.start;
-      left = left || this.parseBindingAtom();
-      if (!this.eat(tt.eq)) return left;
-
-      const node = this.startNodeAt(startPos, startLoc);
-      node.left = left;
-      node.right = this.parseMaybeAssign();
-      return this.finishNode(node, "AssignmentPattern");
-    };
-
-    // Verify that a node is an lval — something that can be assigned
-    // to.
-
-    pp.checkLVal = function (expr, isBinding, checkClashes, contextDescription) {
-      switch (expr.type) {
-        case "Identifier":
-          this.checkReservedWord(expr.name, expr.start, false, true);
-
-          if (checkClashes) {
-            // we need to prefix this with an underscore for the cases where we have a key of
-            // `__proto__`. there's a bug in old V8 where the following wouldn't work:
-            //
-            //   > var obj = Object.create(null);
-            //   undefined
-            //   > obj.__proto__
-            //   null
-            //   > obj.__proto__ = true;
-            //   true
-            //   > obj.__proto__
-            //   null
-            const key = `_${expr.name}`;
-
-            if (checkClashes[key]) {
-              this.raise(expr.start, "Argument name clash in strict mode");
-            } else {
-              checkClashes[key] = true;
-            }
-          }
-          break;
-
-        case "MemberExpression":
-          if (isBinding) this.raise(expr.start, (isBinding ? "Binding" : "Assigning to") + " member expression");
-          break;
-
-        case "ObjectPattern":
-          for (let prop of (expr.properties)) {
-            if (prop.type === "ObjectProperty") prop = prop.value;
-            this.checkLVal(prop, isBinding, checkClashes, "object destructuring pattern");
-          }
-          break;
-
-        case "ArrayPattern":
-          for (const elem of (expr.elements)) {
-            if (elem) this.checkLVal(elem, isBinding, checkClashes, "array destructuring pattern");
-          }
-          break;
-
-        case "AssignmentPattern":
-          this.checkLVal(expr.left, isBinding, checkClashes, "assignment pattern");
-          break;
-
-        case "RestElement":
-          this.checkLVal(expr.argument, isBinding, checkClashes, "rest element");
-          break;
-
-        default: {
-          const message = (isBinding ? /* istanbul ignore next */ "Binding invalid" : "Invalid") +
-            " left-hand side" +
-            (contextDescription ? " in " + contextDescription : /* istanbul ignore next */ "expression");
-          this.raise(expr.start, message);
-        }
-      }
-    };
-
-}
-
-
-// parser/node.js
-const parserNodeJS = {};
-{
-    const Parser = parserIndexJS;
-    const { SourceLocation, Position } = utilLocationJS;
-
-    // Start an AST node, attaching a start offset.
-
-    const pp = Parser.prototype;
-    const commentKeys = ["leadingComments", "trailingComments", "innerComments"];
-
-    class Node {
-      constructor(parser, pos, loc) {
-        this.type = "";
-        this.start = pos;
-        this.end = 0;
-        this.loc = new SourceLocation(loc);
-        if (parser && parser.options.ranges) this.range = [pos, 0];
-        if (parser && parser.filename) this.loc.filename = parser.filename;
-      }
-
-      //type: string;
-      //start: ?number;
-      //end: number;
-      //loc: SourceLocation;
-
-      __clone(){
-        const node2 = new Node;
-        for (const key in this) {
-          // Do not clone comments that are already attached to the node
-          if (commentKeys.indexOf(key) < 0) {
-            node2[key] = this[key];
-          }
-        }
-
-        return node2;
-      }
-    }
-
-    pp.startNode = function () {
-      return new Node(this, this.state.start, this.state.startLoc);
-    };
-
-    pp.startNodeAt = function (pos, loc) {
-      return new Node(this, pos, loc);
-    };
-
-    function finishNodeAt(node, type, pos, loc) {
-      node.type = type;
-      node.end = pos;
-      node.loc.end = loc;
-      if (this.options.ranges) node.range[1] = pos;
-      this.processComment(node);
-      return node;
-    }
-
-    // Finish an AST node, adding `type` and `end` properties.
-
-    pp.finishNode = function (node, type) {
-      return finishNodeAt.call(this, node, type, this.state.lastTokEnd, this.state.lastTokEndLoc);
-    };
-
-    // Finish node at given position
-
-    pp.finishNodeAt = function (node, type, pos, loc) {
-      return finishNodeAt.call(this, node, type, pos, loc);
-    };
-
-
-    /**
-     * Reset the start location of node to the start location of locationNode
-     */
-    pp.resetStartLocationFromNode = function (node, locationNode) {
-      node.start = locationNode.start;
-      node.loc.start = locationNode.loc.start;
-      if (this.options.ranges) node.range[0] = locationNode.range[0];
-
-      return node;
-    };
-}
-
-// parser/statement.js
-const parserStatementJS = {};
-{
-    /* eslint max-len: 0 */
-
-    const { types: tt } = tokenizerTypesJS;
-    const Parser = parserIndexJS;
-    const { lineBreak } = utilWhitespaceJS;
-
-    const pp = Parser.prototype;
-
-    // ### Statement parsing
-
-    // Parse a program. Initializes the parser, reads any number of
-    // statements, and wraps them in a Program node.  Optionally takes a
-    // `program` argument.  If present, the statements will be appended
-    // to its body instead of creating a new node.
-
-    pp.parseTopLevel = function (file, program) {
-      program.sourceType = this.options.sourceType;
-
-      this.parseBlockBody(program, true, true, tt.eof);
-
-      file.program  = this.finishNode(program, "Program");
-      file.comments = this.state.comments;
-      file.tokens   = this.state.tokens;
-
-      return this.finishNode(file, "File");
-    };
-
-    const loopLabel = { kind: "loop" }, switchLabel = { kind: "switch" };
-
-    // TODO
-
-    pp.stmtToDirective = function (stmt) {
-      const expr = stmt.expression;
-
-      const directiveLiteral = this.startNodeAt(expr.start, expr.loc.start);
-      const directive        = this.startNodeAt(stmt.start, stmt.loc.start);
-
-      const raw = this.input.slice(expr.start, expr.end);
-      const val = directiveLiteral.value = raw.slice(1, -1); // remove quotes
-
-      this.addExtra(directiveLiteral, "raw", raw);
-      this.addExtra(directiveLiteral, "rawValue", val);
-
-      directive.value = this.finishNodeAt(directiveLiteral, "DirectiveLiteral", expr.end, expr.loc.end);
-
-      return this.finishNodeAt(directive, "Directive", stmt.end, stmt.loc.end);
-    };
-
-    // Parse a single statement.
-    //
-    // If expecting a statement and finding a slash operator, parse a
-    // regular expression literal. This is to handle cases like
-    // `if (foo) /blah/.exec(foo)`, where looking at the previous token
-    // does not help.
-
-    pp.parseStatement = function (declaration, topLevel) {
-      if (this.match(tt.at)) {
-        this.parseDecorators(true);
-      }
-
-      const starttype = this.state.type;
-      const node = this.startNode();
-
-      // Most types of statements are recognized by the keyword they
-      // start with. Many are trivial to parse, some require a bit of
-      // complexity.
-
-      switch (starttype) {
-        case tt._break: case tt._continue: return this.parseBreakContinueStatement(node, starttype.keyword);
-        case tt._debugger: return this.parseDebuggerStatement(node);
-        case tt._do: return this.parseDoStatement(node);
-        case tt._for: return this.parseForStatement(node);
-        case tt._function:
-          if (!declaration) this.unexpected();
-          return this.parseFunctionStatement(node);
-
-        case tt._class:
-          if (!declaration) this.unexpected();
-          return this.parseClass(node, true);
-
-        case tt._if: return this.parseIfStatement(node);
-        case tt._return: return this.parseReturnStatement(node);
-        case tt._switch: return this.parseSwitchStatement(node);
-        case tt._throw: return this.parseThrowStatement(node);
-        case tt._try: return this.parseTryStatement(node);
-
-        case tt._let:
-        case tt._const:
-          if (!declaration) this.unexpected(); // NOTE: falls through to _var
-
-        case tt._var:
-          return this.parseVarStatement(node, starttype);
-
-        case tt._while: return this.parseWhileStatement(node);
-        case tt._with: return this.parseWithStatement(node);
-        case tt.braceL: return this.parseBlock();
-        case tt.semi: return this.parseEmptyStatement(node);
-        case tt._export:
-        case tt._import:
-          if (this.hasPlugin("dynamicImport") && this.lookahead().type === tt.parenL) break;
-
-          if (!this.options.allowImportExportEverywhere) {
-            if (!topLevel) {
-              this.raise(this.state.start, "'import' and 'export' may only appear at the top level");
-            }
-
-            if (!this.inModule) {
-              this.raise(this.state.start, "'import' and 'export' may appear only with 'sourceType: module'");
-            }
-          }
-          return starttype === tt._import ? this.parseImport(node) : this.parseExport(node);
-
-        case tt.name:
-          if (this.state.value === "async") {
-            // peek ahead and see if next token is a function
-            const state = this.state.clone();
-            this.next();
-            if (this.match(tt._function) && !this.canInsertSemicolon()) {
-              this.expect(tt._function);
-              return this.parseFunction(node, true, false, true);
-            } else {
-              this.state = state;
-            }
-          }
-      }
-
-      // If the statement does not start with a statement keyword or a
-      // brace, it's an ExpressionStatement or LabeledStatement. We
-      // simply start parsing an expression, and afterwards, if the
-      // next token is a colon and the expression was a simple
-      // Identifier node, we switch to interpreting it as a label.
-      const maybeName = this.state.value;
-      const expr = this.parseExpression();
-
-      if (starttype === tt.name && expr.type === "Identifier" && this.eat(tt.colon)) {
-        return this.parseLabeledStatement(node, maybeName, expr);
-      } else {
-        return this.parseExpressionStatement(node, expr);
-      }
-    };
-
-    pp.takeDecorators = function (node) {
-      if (this.state.decorators.length) {
-        node.decorators = this.state.decorators;
-        this.state.decorators = [];
-      }
-    };
-
-    pp.parseDecorators = function (allowExport) {
-      while (this.match(tt.at)) {
-        const decorator = this.parseDecorator();
-        this.state.decorators.push(decorator);
-      }
-
-      if (allowExport && this.match(tt._export)) {
-        return;
-      }
-
-      if (!this.match(tt._class)) {
-        this.raise(this.state.start, "Leading decorators must be attached to a class declaration");
-      }
-    };
-
-    pp.parseDecorator = function () {
-      if (!this.hasPlugin("decorators")) {
-        this.unexpected();
-      }
-      const node = this.startNode();
-      this.next();
-      node.expression = this.parseMaybeAssign();
-      return this.finishNode(node, "Decorator");
-    };
-
-    pp.parseBreakContinueStatement = function (node, keyword) {
-      const isBreak = keyword === "break";
-      this.next();
-
-      if (this.isLineTerminator()) {
-        node.label = null;
-      } else if (!this.match(tt.name)) {
-        this.unexpected();
-      } else {
-        node.label = this.parseIdentifier();
-        this.semicolon();
-      }
-
-      // Verify that there is an actual destination to break or
-      // continue to.
-      let i;
-      for (i = 0; i < this.state.labels.length; ++i) {
-        const lab = this.state.labels[i];
-        if (node.label == null || lab.name === node.label.name) {
-          if (lab.kind != null && (isBreak || lab.kind === "loop")) break;
-          if (node.label && isBreak) break;
-        }
-      }
-      if (i === this.state.labels.length) this.raise(node.start, "Unsyntactic " + keyword);
-      return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement");
-    };
-
-    pp.parseDebuggerStatement = function (node) {
-      this.next();
-      this.semicolon();
-      return this.finishNode(node, "DebuggerStatement");
-    };
-
-    pp.parseDoStatement = function (node) {
-      this.next();
-      this.state.labels.push(loopLabel);
-      node.body = this.parseStatement(false);
-      this.state.labels.pop();
-      this.expect(tt._while);
-      node.test = this.parseParenExpression();
-      this.eat(tt.semi);
-      return this.finishNode(node, "DoWhileStatement");
-    };
-
-    // Disambiguating between a `for` and a `for`/`in` or `for`/`of`
-    // loop is non-trivial. Basically, we have to parse the init `var`
-    // statement or expression, disallowing the `in` operator (see
-    // the second parameter to `parseExpression`), and then check
-    // whether the next token is `in` or `of`. When there is no init
-    // part (semicolon immediately after the opening parenthesis), it
-    // is a regular `for` loop.
-
-    pp.parseForStatement = function (node) {
-      this.next();
-      this.state.labels.push(loopLabel);
-
-      let forAwait = false;
-      if (this.hasPlugin("asyncGenerators") && this.state.inAsync && this.isContextual("await")) {
-        forAwait = true;
-        this.next();
-      }
-      this.expect(tt.parenL);
-
-      if (this.match(tt.semi)) {
-        if (forAwait) {
-          this.unexpected();
-        }
-        return this.parseFor(node, null);
-      }
-
-      if (this.match(tt._var) || this.match(tt._let) || this.match(tt._const)) {
-        const init = this.startNode();
-        const varKind = this.state.type;
-        this.next();
-        this.parseVar(init, true, varKind);
-        this.finishNode(init, "VariableDeclaration");
-
-        if (this.match(tt._in) || this.isContextual("of")) {
-          if (init.declarations.length === 1 && !init.declarations[0].init) {
-            return this.parseForIn(node, init, forAwait);
-          }
-        }
-        if (forAwait) {
-          this.unexpected();
-        }
-        return this.parseFor(node, init);
-      }
-
-      const refShorthandDefaultPos = { start: 0 };
-      const init = this.parseExpression(true, refShorthandDefaultPos);
-      if (this.match(tt._in) || this.isContextual("of")) {
-        const description = this.isContextual("of") ? "for-of statement" : "for-in statement";
-        this.toAssignable(init, undefined, description);
-        this.checkLVal(init, undefined, undefined, description);
-        return this.parseForIn(node, init, forAwait);
-      } else if (refShorthandDefaultPos.start) {
-        this.unexpected(refShorthandDefaultPos.start);
-      }
-      if (forAwait) {
-        this.unexpected();
-      }
-      return this.parseFor(node, init);
-    };
-
-    pp.parseFunctionStatement = function (node) {
-      this.next();
-      return this.parseFunction(node, true);
-    };
-
-    pp.parseIfStatement = function (node) {
-      this.next();
-      node.test = this.parseParenExpression();
-      node.consequent = this.parseStatement(false);
-      node.alternate = this.eat(tt._else) ? this.parseStatement(false) : null;
-      return this.finishNode(node, "IfStatement");
-    };
-
-    pp.parseReturnStatement = function (node) {
-      if (!this.state.inFunction && !this.options.allowReturnOutsideFunction) {
-        this.raise(this.state.start, "'return' outside of function");
-      }
-
-      this.next();
-
-      // In `return` (and `break`/`continue`), the keywords with
-      // optional arguments, we eagerly look for a semicolon or the
-      // possibility to insert one.
-
-      if (this.isLineTerminator()) {
-        node.argument = null;
-      } else {
-        node.argument = this.parseExpression();
-        this.semicolon();
-      }
-
-      return this.finishNode(node, "ReturnStatement");
-    };
-
-    pp.parseSwitchStatement = function (node) {
-      this.next();
-      node.discriminant = this.parseParenExpression();
-      node.cases = [];
-      this.expect(tt.braceL);
-      this.state.labels.push(switchLabel);
-
-      // Statements under must be grouped (by label) in SwitchCase
-      // nodes. `cur` is used to keep the node that we are currently
-      // adding statements to.
-
-      let cur;
-      for (let sawDefault; !this.match(tt.braceR); ) {
-        if (this.match(tt._case) || this.match(tt._default)) {
-          const isCase = this.match(tt._case);
-          if (cur) this.finishNode(cur, "SwitchCase");
-          node.cases.push(cur = this.startNode());
-          cur.consequent = [];
-          this.next();
-          if (isCase) {
-            cur.test = this.parseExpression();
-          } else {
-            if (sawDefault) this.raise(this.state.lastTokStart, "Multiple default clauses");
-            sawDefault = true;
-            cur.test = null;
-          }
-          this.expect(tt.colon);
-        } else {
-          if (cur) {
-            cur.consequent.push(this.parseStatement(true));
-          } else {
-            this.unexpected();
-          }
-        }
-      }
-      if (cur) this.finishNode(cur, "SwitchCase");
-      this.next(); // Closing brace
-      this.state.labels.pop();
-      return this.finishNode(node, "SwitchStatement");
-    };
-
-    pp.parseThrowStatement = function (node) {
-      this.next();
-      if (lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start)))
-        this.raise(this.state.lastTokEnd, "Illegal newline after throw");
-      node.argument = this.parseExpression();
-      this.semicolon();
-      return this.finishNode(node, "ThrowStatement");
-    };
-
-    // Reused empty array added for node fields that are always empty.
-
-    const empty = [];
-
-    pp.parseTryStatement = function (node) {
-      this.next();
-
-      node.block = this.parseBlock();
-      node.handler = null;
-
-      if (this.match(tt._catch)) {
-        const clause = this.startNode();
-        this.next();
-
-        this.expect(tt.parenL);
-        clause.param = this.parseBindingAtom();
-        this.checkLVal(clause.param, true, Object.create(null), "catch clause");
-        this.expect(tt.parenR);
-
-        clause.body = this.parseBlock();
-        node.handler = this.finishNode(clause, "CatchClause");
-      }
-
-      node.guardedHandlers = empty;
-      node.finalizer = this.eat(tt._finally) ? this.parseBlock() : null;
-
-      if (!node.handler && !node.finalizer) {
-        this.raise(node.start, "Missing catch or finally clause");
-      }
-
-      return this.finishNode(node, "TryStatement");
-    };
-
-    pp.parseVarStatement = function (node, kind) {
-      this.next();
-      this.parseVar(node, false, kind);
-      this.semicolon();
-      return this.finishNode(node, "VariableDeclaration");
-    };
-
-    pp.parseWhileStatement = function (node) {
-      this.next();
-      node.test = this.parseParenExpression();
-      this.state.labels.push(loopLabel);
-      node.body = this.parseStatement(false);
-      this.state.labels.pop();
-      return this.finishNode(node, "WhileStatement");
-    };
-
-    pp.parseWithStatement = function (node) {
-      if (this.state.strict) this.raise(this.state.start, "'with' in strict mode");
-      this.next();
-      node.object = this.parseParenExpression();
-      node.body = this.parseStatement(false);
-      return this.finishNode(node, "WithStatement");
-    };
-
-    pp.parseEmptyStatement = function (node) {
-      this.next();
-      return this.finishNode(node, "EmptyStatement");
-    };
-
-    pp.parseLabeledStatement = function (node, maybeName, expr) {
-      for (const label of (this.state.labels)) {
-        if (label.name === maybeName) {
-          this.raise(expr.start, `Label '${maybeName}' is already declared`);
-        }
-      }
-
-      const kind = this.state.type.isLoop ? "loop" : this.match(tt._switch) ? "switch" : null;
-      for (let i = this.state.labels.length - 1; i >= 0; i--) {
-        const label = this.state.labels[i];
-        if (label.statementStart === node.start) {
-          label.statementStart = this.state.start;
-          label.kind = kind;
-        } else {
-          break;
-        }
-      }
-
-      this.state.labels.push({ name: maybeName, kind: kind, statementStart: this.state.start });
-      node.body = this.parseStatement(true);
-      this.state.labels.pop();
-      node.label = expr;
-      return this.finishNode(node, "LabeledStatement");
-    };
-
-    pp.parseExpressionStatement = function (node, expr) {
-      node.expression = expr;
-      this.semicolon();
-      return this.finishNode(node, "ExpressionStatement");
-    };
-
-    // Parse a semicolon-enclosed block of statements, handling `"use
-    // strict"` declarations when `allowStrict` is true (used for
-    // function bodies).
-
-    pp.parseBlock = function (allowDirectives) {
-      const node = this.startNode();
-      this.expect(tt.braceL);
-      this.parseBlockBody(node, allowDirectives, false, tt.braceR);
-      return this.finishNode(node, "BlockStatement");
-    };
-
-    pp.isValidDirective = function (stmt) {
-      return stmt.type === "ExpressionStatement" &&
-        stmt.expression.type === "StringLiteral" &&
-        !stmt.expression.extra.parenthesized;
-    };
-
-    pp.parseBlockBody = function (node, allowDirectives, topLevel, end) {
-      node.body = [];
-      node.directives = [];
-
-      let parsedNonDirective = false;
-      let oldStrict;
-      let octalPosition;
-
-      while (!this.eat(end)) {
-        if (!parsedNonDirective && this.state.containsOctal && !octalPosition) {
-          octalPosition = this.state.octalPosition;
-        }
-
-        const stmt = this.parseStatement(true, topLevel);
-
-        if (allowDirectives && !parsedNonDirective && this.isValidDirective(stmt)) {
-          const directive = this.stmtToDirective(stmt);
-          node.directives.push(directive);
-
-          if (oldStrict === undefined && directive.value.value === "use strict") {
-            oldStrict = this.state.strict;
-            this.setStrict(true);
-
-            if (octalPosition) {
-              this.raise(octalPosition, "Octal literal in strict mode");
-            }
-          }
-
-          continue;
-        }
-
-        parsedNonDirective = true;
-        node.body.push(stmt);
-      }
-
-      if (oldStrict === false) {
-        this.setStrict(false);
-      }
-    };
-
-    // Parse a regular `for` loop. The disambiguation code in
-    // `parseStatement` will already have parsed the init statement or
-    // expression.
-
-    pp.parseFor = function (node, init) {
-      node.init = init;
-      this.expect(tt.semi);
-      node.test = this.match(tt.semi) ? null : this.parseExpression();
-      this.expect(tt.semi);
-      node.update = this.match(tt.parenR) ? null : this.parseExpression();
-      this.expect(tt.parenR);
-      node.body = this.parseStatement(false);
-      this.state.labels.pop();
-      return this.finishNode(node, "ForStatement");
-    };
-
-    // Parse a `for`/`in` and `for`/`of` loop, which are almost
-    // same from parser's perspective.
-
-    pp.parseForIn = function (node, init, forAwait) {
-      const type = this.match(tt._in) ? "ForInStatement" : "ForOfStatement";
-      if (forAwait) {
-        this.eatContextual("of");
-      } else {
-        this.next();
-      }
-      node.await = !!forAwait;
-      node.left = init;
-      node.right = this.parseExpression();
-      this.expect(tt.parenR);
-      node.body = this.parseStatement(false);
-      this.state.labels.pop();
-      return this.finishNode(node, type);
-    };
-
-    // Parse a list of variable declarations.
-
-    pp.parseVar = function (node, isFor, kind) {
-      node.declarations = [];
-      node.kind = kind.keyword;
-      for (;;) {
-        const decl = this.startNode();
-        this.parseVarHead(decl);
-        if (this.eat(tt.eq)) {
-          decl.init = this.parseMaybeAssign(isFor);
-        } else if (kind === tt._const && !(this.match(tt._in) || this.isContextual("of"))) {
-          this.unexpected();
-        } else if (decl.id.type !== "Identifier" && !(isFor && (this.match(tt._in) || this.isContextual("of")))) {
-          this.raise(this.state.lastTokEnd, "Complex binding patterns require an initialization value");
-        } else {
-          decl.init = null;
-        }
-        node.declarations.push(this.finishNode(decl, "VariableDeclarator"));
-        if (!this.eat(tt.comma)) break;
-      }
-      return node;
-    };
-
-    pp.parseVarHead = function (decl) {
-      decl.id = this.parseBindingAtom();
-      this.checkLVal(decl.id, true, undefined, "variable declaration");
-    };
-
-    // Parse a function declaration or literal (depending on the
-    // `isStatement` parameter).
-
-    pp.parseFunction = function (node, isStatement, allowExpressionBody, isAsync, optionalId) {
-      const oldInMethod = this.state.inMethod;
-      this.state.inMethod = false;
-
-      this.initFunction(node, isAsync);
-
-      if (this.match(tt.star)) {
-        if (node.async && !this.hasPlugin("asyncGenerators")) {
-          this.unexpected();
-        } else {
-          node.generator = true;
-          this.next();
-        }
-      }
-
-      if (isStatement && !optionalId && !this.match(tt.name) && !this.match(tt._yield)) {
-        this.unexpected();
-      }
-
-      if (this.match(tt.name) || this.match(tt._yield)) {
-        node.id = this.parseBindingIdentifier();
-      }
-
-      this.parseFunctionParams(node);
-      this.parseFunctionBody(node, allowExpressionBody);
-
-      this.state.inMethod = oldInMethod;
-
-      return this.finishNode(node, isStatement ? "FunctionDeclaration" : "FunctionExpression");
-    };
-
-    pp.parseFunctionParams = function (node) {
-      this.expect(tt.parenL);
-      node.params = this.parseBindingList(tt.parenR);
-    };
-
-    // Parse a class declaration or literal (depending on the
-    // `isStatement` parameter).
-
-    pp.parseClass = function (node, isStatement, optionalId) {
-      this.next();
-      this.takeDecorators(node);
-      this.parseClassId(node, isStatement, optionalId);
-      this.parseClassSuper(node);
-      this.parseClassBody(node);
-      return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression");
-    };
-
-    pp.isClassProperty = function () {
-      return this.match(tt.eq) || this.match(tt.semi) || this.match(tt.braceR);
-    };
-
-    pp.isClassMethod = function () {
-      return this.match(tt.parenL);
-    };
-
-    pp.isNonstaticConstructor = function (method) {
-      return !method.computed && !method.static && (
-        (method.key.name === "constructor") || // Identifier
-        (method.key.value === "constructor")   // Literal
-      );
-    };
-
-    pp.parseClassBody = function (node) {
-      // class bodies are implicitly strict
-      const oldStrict = this.state.strict;
-      this.state.strict = true;
-
-      let hadConstructor = false;
-      let decorators = [];
-      const classBody = this.startNode();
-
-      classBody.body = [];
-
-      this.expect(tt.braceL);
-
-      while (!this.eat(tt.braceR)) {
-        if (this.eat(tt.semi)) {
-          if (decorators.length > 0) {
-            this.raise(this.state.lastTokEnd, "Decorators must not be followed by a semicolon");
-          }
-          continue;
-        }
-
-        if (this.match(tt.at)) {
-          decorators.push(this.parseDecorator());
-          continue;
-        }
-
-        const method = this.startNode();
-
-        // steal the decorators if there are any
-        if (decorators.length) {
-          method.decorators = decorators;
-          decorators = [];
-        }
-
-        method.static = false;
-        if (this.match(tt.name) && this.state.value === "static") {
-          const key = this.parseIdentifier(true); // eats 'static'
-          if (this.isClassMethod()) {
-            // a method named 'static'
-            method.kind = "method";
-            method.computed = false;
-            method.key = key;
-            this.parseClassMethod(classBody, method, false, false);
-            continue;
-          } else if (this.isClassProperty()) {
-            // a property named 'static'
-            method.computed = false;
-            method.key = key;
-            classBody.body.push(this.parseClassProperty(method));
-            continue;
-          }
-          // otherwise something static
-          method.static = true;
-        }
-
-        if (this.eat(tt.star)) {
-          // a generator
-          method.kind = "method";
-          this.parsePropertyName(method);
-          if (this.isNonstaticConstructor(method)) {
-            this.raise(method.key.start, "Constructor can't be a generator");
-          }
-          if (!method.computed && method.static && (method.key.name === "prototype" || method.key.value === "prototype")) {
-            this.raise(method.key.start, "Classes may not have static property named prototype");
-          }
-          this.parseClassMethod(classBody, method, true, false);
-        } else {
-          const isSimple = this.match(tt.name);
-          const key = this.parsePropertyName(method);
-          if (!method.computed && method.static && (method.key.name === "prototype" || method.key.value === "prototype")) {
-            this.raise(method.key.start, "Classes may not have static property named prototype");
-          }
-          if (this.isClassMethod()) {
-            // a normal method
-            if (this.isNonstaticConstructor(method)) {
-              if (hadConstructor) {
-                this.raise(key.start, "Duplicate constructor in the same class");
-              } else if (method.decorators) {
-                this.raise(method.start, "You can't attach decorators to a class constructor");
-              }
-              hadConstructor = true;
-              method.kind = "constructor";
-            } else {
-              method.kind = "method";
-            }
-            this.parseClassMethod(classBody, method, false, false);
-          } else if (this.isClassProperty()) {
-            // a normal property
-            if (this.isNonstaticConstructor(method)) {
-              this.raise(method.key.start, "Classes may not have a non-static field named 'constructor'");
-            }
-            classBody.body.push(this.parseClassProperty(method));
-          } else if (isSimple && key.name === "async" && !this.isLineTerminator()) {
-            // an async method
-            const isGenerator = this.hasPlugin("asyncGenerators") && this.eat(tt.star);
-            method.kind = "method";
-            this.parsePropertyName(method);
-            if (this.isNonstaticConstructor(method)) {
-              this.raise(method.key.start, "Constructor can't be an async function");
-            }
-            this.parseClassMethod(classBody, method, isGenerator, true);
-          } else if (isSimple && (key.name === "get" || key.name === "set") && !(this.isLineTerminator() && this.match(tt.star))) { // `get\n*` is an uninitialized property named 'get' followed by a generator.
-            // a getter or setter
-            method.kind = key.name;
-            this.parsePropertyName(method);
-            if (this.isNonstaticConstructor(method)) {
-              this.raise(method.key.start, "Constructor can't have get/set modifier");
-            }
-            this.parseClassMethod(classBody, method, false, false);
-            this.checkGetterSetterParamCount(method);
-          } else if (this.isLineTerminator()) {
-            // an uninitialized class property (due to ASI, since we don't otherwise recognize the next token)
-            if (this.isNonstaticConstructor(method)) {
-              this.raise(method.key.start, "Classes may not have a non-static field named 'constructor'");
-            }
-            classBody.body.push(this.parseClassProperty(method));
-          } else {
-            this.unexpected();
-          }
-        }
-      }
-
-      if (decorators.length) {
-        this.raise(this.state.start, "You have trailing decorators with no method");
-      }
-
-      node.body = this.finishNode(classBody, "ClassBody");
-
-      this.state.strict = oldStrict;
-    };
-
-    pp.parseClassProperty = function (node) {
-      const noPluginMsg = "You can only use Class Properties when the 'classProperties' plugin is enabled.";
-      if (!node.typeAnnotation && !this.hasPlugin("classProperties")) {
-        this.raise(node.start, noPluginMsg);
-      }
-
-      if (this.match(tt.eq)) {
-        if (!this.hasPlugin("classProperties")) this.raise(this.state.start, noPluginMsg);
-        this.next();
-        node.value = this.parseMaybeAssign();
-      } else {
-        node.value = null;
-      }
-      this.semicolon();
-      return this.finishNode(node, "ClassProperty");
-    };
-
-    pp.parseClassMethod = function (classBody, method, isGenerator, isAsync) {
-      this.parseMethod(method, isGenerator, isAsync);
-      classBody.body.push(this.finishNode(method, "ClassMethod"));
-    };
-
-    pp.parseClassId = function (node, isStatement, optionalId) {
-      if (this.match(tt.name)) {
-        node.id = this.parseIdentifier();
-      } else {
-        if (optionalId || !isStatement) {
-          node.id = null;
-        } else {
-          this.unexpected();
-        }
-      }
-    };
-
-    pp.parseClassSuper = function (node) {
-      node.superClass = this.eat(tt._extends) ? this.parseExprSubscripts() : null;
-    };
-
-    // Parses module export declaration.
-
-    pp.parseExport = function (node) {
-      this.next();
-      // export * from '...'
-      if (this.match(tt.star)) {
-        const specifier = this.startNode();
-        this.next();
-        if (this.hasPlugin("exportExtensions") && this.eatContextual("as")) {
-          specifier.exported = this.parseIdentifier();
-          node.specifiers = [this.finishNode(specifier, "ExportNamespaceSpecifier")];
-          this.parseExportSpecifiersMaybe(node);
-          this.parseExportFrom(node, true);
-        } else {
-          this.parseExportFrom(node, true);
-          return this.finishNode(node, "ExportAllDeclaration");
-        }
-      } else if (this.hasPlugin("exportExtensions") && this.isExportDefaultSpecifier()) {
-        const specifier = this.startNode();
-        specifier.exported = this.parseIdentifier(true);
-        node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
-        if (this.match(tt.comma) && this.lookahead().type === tt.star) {
-          this.expect(tt.comma);
-          const specifier = this.startNode();
-          this.expect(tt.star);
-          this.expectContextual("as");
-          specifier.exported = this.parseIdentifier();
-          node.specifiers.push(this.finishNode(specifier, "ExportNamespaceSpecifier"));
-        } else {
-          this.parseExportSpecifiersMaybe(node);
-        }
-        this.parseExportFrom(node, true);
-      } else if (this.eat(tt._default)) { // export default ...
-        let expr = this.startNode();
-        let needsSemi = false;
-        if (this.eat(tt._function)) {
-          expr = this.parseFunction(expr, true, false, false, true);
-        } else if (
-          this.isContextual("async") &&
-          this.lookahead().type === tt._function
-        ) { // async function declaration
-          this.eatContextual("async");
-          this.eat(tt._function);
-          expr = this.parseFunction(expr, true, false, true, true);
-        } else if (this.match(tt._class)) {
-          expr = this.parseClass(expr, true, true);
-        } else {
-          needsSemi = true;
-          expr = this.parseMaybeAssign();
-        }
-        node.declaration = expr;
-        if (needsSemi) this.semicolon();
-        this.checkExport(node, true, true);
-        return this.finishNode(node, "ExportDefaultDeclaration");
-      } else if (this.shouldParseExportDeclaration()) {
-        node.specifiers = [];
-        node.source = null;
-        node.declaration = this.parseExportDeclaration(node);
-      } else { // export { x, y as z } [from '...']
-        node.declaration = null;
-        node.specifiers = this.parseExportSpecifiers();
-        this.parseExportFrom(node);
-      }
-      this.checkExport(node, true);
-      return this.finishNode(node, "ExportNamedDeclaration");
-    };
-
-    pp.parseExportDeclaration = function () {
-      return this.parseStatement(true);
-    };
-
-    pp.isExportDefaultSpecifier = function () {
-      if (this.match(tt.name)) {
-        return this.state.value !== "type"
-            && this.state.value !== "async"
-            && this.state.value !== "interface";
-      }
-
-      if (!this.match(tt._default)) {
-        return false;
-      }
-
-      const lookahead = this.lookahead();
-      return lookahead.type === tt.comma || (lookahead.type === tt.name && lookahead.value === "from");
-    };
-
-    pp.parseExportSpecifiersMaybe = function (node) {
-      if (this.eat(tt.comma)) {
-        node.specifiers = node.specifiers.concat(this.parseExportSpecifiers());
-      }
-    };
-
-    pp.parseExportFrom = function (node, expect) {
-      if (this.eatContextual("from")) {
-        node.source = this.match(tt.string) ? this.parseExprAtom() : this.unexpected();
-        this.checkExport(node);
-      } else {
-        if (expect) {
-          this.unexpected();
-        } else {
-          node.source = null;
-        }
-      }
-
-      this.semicolon();
-    };
-
-    pp.shouldParseExportDeclaration = function () {
-      return this.state.type.keyword === "var"
-        || this.state.type.keyword === "const"
-        || this.state.type.keyword === "let"
-        || this.state.type.keyword === "function"
-        || this.state.type.keyword === "class"
-        || this.isContextual("async");
-    };
-
-    pp.checkExport = function (node, checkNames, isDefault) {
-      if (checkNames) {
-        // Check for duplicate exports
-        if (isDefault) {
-          // Default exports
-          this.checkDuplicateExports(node, "default");
-        } else if (node.specifiers && node.specifiers.length) {
-          // Named exports
-          for (const specifier of node.specifiers) {
-            this.checkDuplicateExports(specifier, specifier.exported.name);
-          }
-        } else if (node.declaration) {
-          // Exported declarations
-          if (node.declaration.type === "FunctionDeclaration" || node.declaration.type === "ClassDeclaration") {
-            this.checkDuplicateExports(node, node.declaration.id.name);
-          } else if (node.declaration.type === "VariableDeclaration") {
-            for (const declaration of node.declaration.declarations) {
-              this.checkDeclaration(declaration.id);
-            }
-          }
-        }
-      }
-
-      if (this.state.decorators.length) {
-        const isClass = node.declaration && (node.declaration.type === "ClassDeclaration" || node.declaration.type === "ClassExpression");
-        if (!node.declaration || !isClass) {
-          this.raise(node.start, "You can only use decorators on an export when exporting a class");
-        }
-        this.takeDecorators(node.declaration);
-      }
-    };
-
-    pp.checkDeclaration = function(node) {
-      if (node.type === "ObjectPattern") {
-        for (const prop of node.properties) {
-          this.checkDeclaration(prop);
-        }
-      } else if (node.type === "ArrayPattern") {
-        for (const elem of node.elements) {
-          if (elem) {
-            this.checkDeclaration(elem);
-          }
-        }
-      } else if (node.type === "ObjectProperty") {
-        this.checkDeclaration(node.value);
-      } else if (node.type === "RestElement") {
-        this.checkDeclaration(node.argument);
-      } else if (node.type === "Identifier") {
-        this.checkDuplicateExports(node, node.name);
-      }
-    };
-
-    pp.checkDuplicateExports = function(node, name) {
-      if (this.state.exportedIdentifiers.indexOf(name) > -1) {
-        this.raiseDuplicateExportError(node, name);
-      }
-      this.state.exportedIdentifiers.push(name);
-    };
-
-    pp.raiseDuplicateExportError = function(node, name) {
-      this.raise(node.start, name === "default" ?
-        "Only one default export allowed per module." :
-        `\`${name}\` has already been exported. Exported identifiers must be unique.`
-      );
-    };
-
-    // Parses a comma-separated list of module exports.
-
-    pp.parseExportSpecifiers = function () {
-      const nodes = [];
-      let first = true;
-      let needsFrom;
-
-      // export { x, y as z } [from '...']
-      this.expect(tt.braceL);
-
-      while (!this.eat(tt.braceR)) {
-        if (first) {
-          first = false;
-        } else {
-          this.expect(tt.comma);
-          if (this.eat(tt.braceR)) break;
-        }
-
-        const isDefault = this.match(tt._default);
-        if (isDefault && !needsFrom) needsFrom = true;
-
-        const node = this.startNode();
-        node.local = this.parseIdentifier(isDefault);
-        node.exported = this.eatContextual("as") ? this.parseIdentifier(true) : node.local.__clone();
-        nodes.push(this.finishNode(node, "ExportSpecifier"));
-      }
-
-      // https://github.com/ember-cli/ember-cli/pull/3739
-      if (needsFrom && !this.isContextual("from")) {
-        this.unexpected();
-      }
-
-      return nodes;
-    };
-
-    // Parses import declaration.
-
-    pp.parseImport = function (node) {
-      this.eat(tt._import);
-
-      // import '...'
-      if (this.match(tt.string)) {
-        node.specifiers = [];
-        node.source = this.parseExprAtom();
-      } else {
-        node.specifiers = [];
-        this.parseImportSpecifiers(node);
-        this.expectContextual("from");
-        node.source = this.match(tt.string) ? this.parseExprAtom() : this.unexpected();
-      }
-      this.semicolon();
-      return this.finishNode(node, "ImportDeclaration");
-    };
-
-    // Parses a comma-separated list of module imports.
-
-    pp.parseImportSpecifiers = function (node) {
-      let first = true;
-      if (this.match(tt.name)) {
-        // import defaultObj, { x, y as z } from '...'
-        const startPos = this.state.start;
-        const startLoc = this.state.startLoc;
-        node.specifiers.push(this.parseImportSpecifierDefault(this.parseIdentifier(), startPos, startLoc));
-        if (!this.eat(tt.comma)) return;
-      }
-
-      if (this.match(tt.star)) {
-        const specifier = this.startNode();
-        this.next();
-        this.expectContextual("as");
-        specifier.local = this.parseIdentifier();
-        this.checkLVal(specifier.local, true, undefined, "import namespace specifier");
-        node.specifiers.push(this.finishNode(specifier, "ImportNamespaceSpecifier"));
-        return;
-      }
-
-      this.expect(tt.braceL);
-      while (!this.eat(tt.braceR)) {
-        if (first) {
-          first = false;
-        } else {
-          // Detect an attempt to deep destructure
-          if (this.eat(tt.colon)) {
-            this.unexpected(null, "ES2015 named imports do not destructure. Use another statement for destructuring after the import.");
-          }
-
-          this.expect(tt.comma);
-          if (this.eat(tt.braceR)) break;
-        }
-
-        this.parseImportSpecifier(node);
-      }
-    };
-
-    pp.parseImportSpecifier = function (node) {
-      const specifier = this.startNode();
-      specifier.imported = this.parseIdentifier(true);
-      if (this.eatContextual("as")) {
-        specifier.local = this.parseIdentifier();
-      } else {
-        this.checkReservedWord(specifier.imported.name, specifier.start, true, true);
-        specifier.local = specifier.imported.__clone();
-      }
-      this.checkLVal(specifier.local, true, undefined, "import specifier");
-      node.specifiers.push(this.finishNode(specifier, "ImportSpecifier"));
-    };
-
-    pp.parseImportSpecifierDefault = function (id, startPos, startLoc) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.local = id;
-      this.checkLVal(node.local, true, undefined, "default import specifier");
-      return this.finishNode(node, "ImportDefaultSpecifier");
-    };
-}
-
-// parser/util.js
-const parserUtilJS = {};
-{
-    const { types : tt } = tokenizerTypesJS;
-    const Parser = parserIndexJS;
-    const { lineBreak } = utilWhitespaceJS;
-
-    const pp = Parser.prototype;
-
-    // ## Parser utilities
-
-    // TODO
-
-    pp.addExtra = function (node, key, val) {
-      if (!node) return;
-
-      const extra = node.extra = node.extra || {};
-      extra[key] = val;
-    };
-
-    // TODO
-
-    pp.isRelational = function (op) {
-      return this.match(tt.relational) && this.state.value === op;
-    };
-
-    // TODO
-
-    pp.expectRelational = function (op) {
-      if (this.isRelational(op)) {
-        this.next();
-      } else {
-        this.unexpected(null, tt.relational);
-      }
-    };
-
-    // Tests whether parsed token is a contextual keyword.
-
-    pp.isContextual = function (name) {
-      return this.match(tt.name) && this.state.value === name;
-    };
-
-    // Consumes contextual keyword if possible.
-
-    pp.eatContextual = function (name) {
-      return this.state.value === name && this.eat(tt.name);
-    };
-
-    // Asserts that following token is given contextual keyword.
-
-    pp.expectContextual = function (name, message) {
-      if (!this.eatContextual(name)) this.unexpected(null, message);
-    };
-
-    // Test whether a semicolon can be inserted at the current position.
-
-    pp.canInsertSemicolon = function () {
-      return this.match(tt.eof) ||
-        this.match(tt.braceR) ||
-        lineBreak.test(this.input.slice(this.state.lastTokEnd, this.state.start));
-    };
-
-    // TODO
-
-    pp.isLineTerminator = function () {
-      return this.eat(tt.semi) || this.canInsertSemicolon();
-    };
-
-    // Consume a semicolon, or, failing that, see if we are allowed to
-    // pretend that there is a semicolon at this position.
-
-    pp.semicolon = function () {
-      if (!this.isLineTerminator()) this.unexpected(null, tt.semi);
-    };
-
-    // Expect a token of a given type. If found, consume it, otherwise,
-    // raise an unexpected token error at given pos.
-
-    pp.expect = function (type, pos) {
-      return this.eat(type) || this.unexpected(pos, type);
-    };
-
-    // Raise an unexpected token error. Can take the expected token type
-    // instead of a message string.
-
-    pp.unexpected = function (pos, messageOrType = "Unexpected token") {
-      if (messageOrType && typeof messageOrType === "object" && messageOrType.label) {
-        messageOrType = `Unexpected token, expected ${messageOrType.label}`;
-      }
-      this.raise(pos != null ? pos : this.state.start, messageOrType);
-    };
-}
-
-
-// plugins/estree.js
-let pluginsEstreeJS = {};
-{
-    const { types : tt } = tokenizerTypesJS;
-    const Parser = parserIndexJS;
-
-    const pp = Parser.prototype;
-
-    pp.estreeParseRegExpLiteral = function ({ pattern, flags }) {
-      let regex = null;
-      try {
-        regex = new RegExp(pattern, flags);
-      } catch (e) {
-        // In environments that don't support these flags value will
-        // be null as the regex can't be represented natively.
-      }
-      const node = this.estreeParseLiteral(regex);
-      node.regex = { pattern, flags };
-
-      return node;
-    };
-
-    pp.estreeParseLiteral = function (value) {
-      return this.parseLiteral(value, "Literal");
-    };
-
-    pp.directiveToStmt = function (directive) {
-      const directiveLiteral = directive.value;
-
-      const stmt = this.startNodeAt(directive.start, directive.loc.start);
-      const expression = this.startNodeAt(directiveLiteral.start, directiveLiteral.loc.start);
-
-      expression.value = directiveLiteral.value;
-      expression.raw = directiveLiteral.extra.raw;
-
-      stmt.expression = this.finishNodeAt(expression, "Literal", directiveLiteral.end, directiveLiteral.loc.end);
-      stmt.directive = directiveLiteral.extra.raw.slice(1, -1);
-
-      return this.finishNodeAt(stmt, "ExpressionStatement", directive.end, directive.loc.end);
-    };
-
-    function isSimpleProperty(node) {
-      return node &&
-        node.type === "Property" &&
-        node.kind === "init" &&
-        node.method === false;
-    }
-
-    //export default function (instance) {
-
-    pluginsEstreeJS = function (instance) {
-      instance.extend("checkDeclaration", function(inner) {
-        return function (node) {
-          if (isSimpleProperty(node)) {
-            this.checkDeclaration(node.value);
-          } else {
-            inner.call(this, node);
-          }
-        };
-      });
-
-      instance.extend("checkGetterSetterParamCount", function() {
-        return function (prop) {
-          const paramCount = prop.kind === "get" ? 0 : 1;
-          if (prop.value.params.length !== paramCount) {
-            const start = prop.start;
-            if (prop.kind === "get") {
-              this.raise(start, "getter should have no params");
-            } else {
-              this.raise(start, "setter should have exactly one param");
-            }
-          }
-        };
-      });
-
-      instance.extend("checkLVal", function(inner) {
-        return function (expr, isBinding, checkClashes, ...args) {
-          switch (expr.type) {
-            case "ObjectPattern":
-              expr.properties.forEach((prop) => {
-                this.checkLVal(
-                  prop.type === "Property" ? prop.value : prop,
-                  isBinding,
-                  checkClashes,
-                  "object destructuring pattern"
-                );
-              });
-              break;
-            default:
-              inner.call(this, expr, isBinding, checkClashes, ...args);
-          }
-        };
-      });
-
-      instance.extend("checkPropClash", function () {
-        return function (prop, propHash) {
-          if (prop.computed || !isSimpleProperty(prop)) return;
-
-          const key = prop.key;
-          // It is either an Identifier or a String/NumericLiteral
-          const name = key.type === "Identifier" ? key.name : String(key.value);
-
-          if (name === "__proto__") {
-            if (propHash.proto) this.raise(key.start, "Redefinition of __proto__ property");
-            propHash.proto = true;
-          }
-        };
-      });
-
-      instance.extend("isStrictBody", function () {
-        return function (node, isExpression) {
-          if (!isExpression && node.body.body.length > 0) {
-            for (const directive of (node.body.body)) {
-              if (directive.type === "ExpressionStatement" && directive.expression.type === "Literal") {
-                if (directive.expression.value === "use strict") return true;
-              } else {
-                // Break for the first non literal expression
-                break;
-              }
-            }
-          }
-
-          return false;
-        };
-      });
-
-      instance.extend("isValidDirective", function () {
-        return function (stmt) {
-          return stmt.type === "ExpressionStatement" &&
-            stmt.expression.type === "Literal" &&
-            typeof stmt.expression.value === "string" &&
-            (!stmt.expression.extra || !stmt.expression.extra.parenthesized);
-        };
-      });
-
-      instance.extend("parseBlockBody", function (inner) {
-        return function (node, ...args) {
-          inner.call(this, node, ...args);
-
-          node.directives.reverse().forEach((directive) => {
-            node.body.unshift(this.directiveToStmt(directive));
-          });
-          delete node.directives;
-        };
-      });
-
-      instance.extend("parseClassMethod", function (inner) {
-        return function (classBody, ...args) {
-          inner.call(this, classBody, ...args);
-
-          const body = classBody.body;
-          body[body.length - 1].type = "MethodDefinition";
-        };
-      });
-
-      instance.extend("parseExprAtom", function(inner) {
-        return function (...args) {
-          switch (this.state.type) {
-            case tt.regexp:
-              return this.estreeParseRegExpLiteral(this.state.value);
-
-            case tt.num:
-            case tt.string:
-              return this.estreeParseLiteral(this.state.value);
-
-            case tt._null:
-              return this.estreeParseLiteral(null);
-
-            case tt._true:
-              return this.estreeParseLiteral(true);
-
-            case tt._false:
-              return this.estreeParseLiteral(false);
-
-            default:
-              return inner.call(this, ...args);
-          }
-        };
-      });
-
-      instance.extend("parseLiteral", function(inner) {
-        return function (...args) {
-          const node = inner.call(this, ...args);
-          node.raw = node.extra.raw;
-          delete node.extra;
-
-          return node;
-        };
-      });
-
-      instance.extend("parseMethod", function(inner) {
-        return function (node, ...args) {
-          let funcNode = this.startNode();
-          funcNode.kind = node.kind; // provide kind, so inner method correctly sets state
-          funcNode = inner.call(this, funcNode, ...args);
-          delete funcNode.kind;
-          node.value = this.finishNode(funcNode, "FunctionExpression");
-
-          return node;
-        };
-      });
-
-      instance.extend("parseObjectMethod", function(inner) {
-        return function (...args) {
-          const node = inner.call(this, ...args);
-
-          if (node) {
-            if (node.kind === "method") node.kind = "init";
-            node.type = "Property";
-          }
-
-          return node;
-        };
-      });
-
-      instance.extend("parseObjectProperty", function(inner) {
-        return function (...args) {
-          const node = inner.call(this, ...args);
-
-          if (node) {
-            node.kind = "init";
-            node.type = "Property";
-          }
-
-          return node;
-        };
-      });
-
-      instance.extend("toAssignable", function(inner) {
-        return function (node, isBinding, ...args) {
-          if (isSimpleProperty(node)) {
-            this.toAssignable(node.value, isBinding, ...args);
-
-            return node;
-          } else if (node.type === "ObjectExpression") {
-            node.type = "ObjectPattern";
-            for (const prop of (node.properties)) {
-              if (prop.kind === "get" || prop.kind === "set") {
-                this.raise(prop.key.start, "Object pattern can't contain getter or setter");
-              } else if (prop.method) {
-                this.raise(prop.key.start, "Object pattern can't contain methods");
-              } else {
-                this.toAssignable(prop, isBinding, "object destructuring pattern");
-              }
-            }
-
-            return node;
-          }
-
-          return inner.call(this, node, isBinding, ...args);
-        };
-      });
-    }
-}
-
-
-// plugins/flow.js
-let pluginsFlowJS = {};
-{
-
-    /* eslint max-len: 0 */
-
-    const { types : tt } = tokenizerTypesJS;
-    const { types : ct } = tokenizerContextJS;
-    const Parser = parserIndexJS;
-
-    const primitiveTypes = [
-      "any",
-      "mixed",
-      "empty",
-      "bool",
-      "boolean",
-      "number",
-      "string",
-      "void",
-      "null"
-    ];
-
-    const pp = Parser.prototype;
-
-    pp.flowParseTypeInitialiser = function (tok) {
-      const oldInType = this.state.inType;
-      this.state.inType = true;
-      this.expect(tok || tt.colon);
-
-      const type = this.flowParseType();
-      this.state.inType = oldInType;
-      return type;
-    };
-
-    pp.flowParsePredicate = function() {
-      const node = this.startNode();
-      const moduloLoc = this.state.startLoc;
-      const moduloPos = this.state.start;
-      this.expect(tt.modulo);
-      const checksLoc = this.state.startLoc;
-      this.expectContextual("checks");
-      // Force '%' and 'checks' to be adjacent
-      if (moduloLoc.line !== checksLoc.line || moduloLoc.column !== checksLoc.column - 1) {
-        this.raise(moduloPos, "Spaces between ´%´ and ´checks´ are not allowed here.");
-      }
-      if (this.eat(tt.parenL)) {
-        node.expression = this.parseExpression();
-        this.expect(tt.parenR);
-        return this.finishNode(node, "DeclaredPredicate");
-      } else {
-        return this.finishNode(node, "InferredPredicate");
-      }
-    };
-
-    pp.flowParseTypeAndPredicateInitialiser = function () {
-      const oldInType = this.state.inType;
-      this.state.inType = true;
-      this.expect(tt.colon);
-      let type = null;
-      let predicate = null;
-      if (this.match(tt.modulo)) {
-        this.state.inType = oldInType;
-        predicate = this.flowParsePredicate();
-      } else {
-        type = this.flowParseType();
-        this.state.inType = oldInType;
-        if (this.match(tt.modulo)) {
-          predicate = this.flowParsePredicate();
-        }
-      }
-      return [type, predicate];
-    };
-
-    pp.flowParseDeclareClass = function (node) {
-      this.next();
-      this.flowParseInterfaceish(node, true);
-      return this.finishNode(node, "DeclareClass");
-    };
-
-    pp.flowParseDeclareFunction = function (node) {
-      this.next();
-
-      const id = node.id = this.parseIdentifier();
-
-      const typeNode = this.startNode();
-      const typeContainer = this.startNode();
-
-      if (this.isRelational("<")) {
-        typeNode.typeParameters = this.flowParseTypeParameterDeclaration();
-      } else {
-        typeNode.typeParameters = null;
-      }
-
-      this.expect(tt.parenL);
-      const tmp = this.flowParseFunctionTypeParams();
-      typeNode.params = tmp.params;
-      typeNode.rest = tmp.rest;
-      this.expect(tt.parenR);
-      let predicate = null;
-      [typeNode.returnType, predicate] = this.flowParseTypeAndPredicateInitialiser();
-      typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation");
-      typeContainer.predicate = predicate;
-      id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation");
-
-      this.finishNode(id, id.type);
-
-      this.semicolon();
-
-      return this.finishNode(node, "DeclareFunction");
-    };
-
-    pp.flowParseDeclare = function (node) {
-      if (this.match(tt._class)) {
-        return this.flowParseDeclareClass(node);
-      } else if (this.match(tt._function)) {
-        return this.flowParseDeclareFunction(node);
-      } else if (this.match(tt._var)) {
-        return this.flowParseDeclareVariable(node);
-      } else if (this.isContextual("module")) {
-        if (this.lookahead().type === tt.dot) {
-          return this.flowParseDeclareModuleExports(node);
-        } else {
-          return this.flowParseDeclareModule(node);
-        }
-      } else if (this.isContextual("type")) {
-        return this.flowParseDeclareTypeAlias(node);
-      } else if (this.isContextual("interface")) {
-        return this.flowParseDeclareInterface(node);
-      } else {
-        this.unexpected();
-      }
-    };
-
-    pp.flowParseDeclareVariable = function (node) {
-      this.next();
-      node.id = this.flowParseTypeAnnotatableIdentifier();
-      this.semicolon();
-      return this.finishNode(node, "DeclareVariable");
-    };
-
-    pp.flowParseDeclareModule = function (node) {
-      this.next();
-
-      if (this.match(tt.string)) {
-        node.id = this.parseExprAtom();
-      } else {
-        node.id = this.parseIdentifier();
-      }
-
-      const bodyNode = node.body = this.startNode();
-      const body = bodyNode.body = [];
-      this.expect(tt.braceL);
-      while (!this.match(tt.braceR)) {
-        let bodyNode = this.startNode();
-
-        if (this.match(tt._import)) {
-          const lookahead = this.lookahead();
-          if (lookahead.value !== "type" && lookahead.value !== "typeof") {
-            this.unexpected(null, "Imports within a `declare module` body must always be `import type` or `import typeof`");
-          }
-
-          this.parseImport(bodyNode);
-        } else {
-          this.expectContextual("declare", "Only declares and type imports are allowed inside declare module");
-
-          bodyNode = this.flowParseDeclare(bodyNode, true);
-        }
-
-        body.push(bodyNode);
-      }
-      this.expect(tt.braceR);
-
-      this.finishNode(bodyNode, "BlockStatement");
-      return this.finishNode(node, "DeclareModule");
-    };
-
-    pp.flowParseDeclareModuleExports = function (node) {
-      this.expectContextual("module");
-      this.expect(tt.dot);
-      this.expectContextual("exports");
-      node.typeAnnotation = this.flowParseTypeAnnotation();
-      this.semicolon();
-
-      return this.finishNode(node, "DeclareModuleExports");
-    };
-
-    pp.flowParseDeclareTypeAlias = function (node) {
-      this.next();
-      this.flowParseTypeAlias(node);
-      return this.finishNode(node, "DeclareTypeAlias");
-    };
-
-    pp.flowParseDeclareInterface = function (node) {
-      this.next();
-      this.flowParseInterfaceish(node);
-      return this.finishNode(node, "DeclareInterface");
-    };
-
-    // Interfaces
-
-    pp.flowParseInterfaceish = function (node, allowStatic) {
-      node.id = this.parseIdentifier();
-
-      if (this.isRelational("<")) {
-        node.typeParameters = this.flowParseTypeParameterDeclaration();
-      } else {
-        node.typeParameters = null;
-      }
-
-      node.extends = [];
-      node.mixins = [];
-
-      if (this.eat(tt._extends)) {
-        do {
-          node.extends.push(this.flowParseInterfaceExtends());
-        } while (this.eat(tt.comma));
-      }
-
-      if (this.isContextual("mixins")) {
-        this.next();
-        do {
-          node.mixins.push(this.flowParseInterfaceExtends());
-        } while (this.eat(tt.comma));
-      }
-
-      node.body = this.flowParseObjectType(allowStatic);
-    };
-
-    pp.flowParseInterfaceExtends = function () {
-      const node = this.startNode();
-
-      node.id = this.flowParseQualifiedTypeIdentifier();
-      if (this.isRelational("<")) {
-        node.typeParameters = this.flowParseTypeParameterInstantiation();
-      } else {
-        node.typeParameters = null;
-      }
-
-      return this.finishNode(node, "InterfaceExtends");
-    };
-
-    pp.flowParseInterface = function (node) {
-      this.flowParseInterfaceish(node, false);
-      return this.finishNode(node, "InterfaceDeclaration");
-    };
-
-    pp.flowParseRestrictedIdentifier = function(liberal) {
-      if (primitiveTypes.indexOf(this.state.value) > -1) {
-        this.raise(this.state.start, `Cannot overwrite primitive type ${this.state.value}`);
-      }
-
-      return this.parseIdentifier(liberal);
-    };
-
-    // Type aliases
-
-    pp.flowParseTypeAlias = function (node) {
-      node.id = this.flowParseRestrictedIdentifier();
-
-      if (this.isRelational("<")) {
-        node.typeParameters = this.flowParseTypeParameterDeclaration();
-      } else {
-        node.typeParameters = null;
-      }
-
-      node.right = this.flowParseTypeInitialiser(tt.eq);
-      this.semicolon();
-
-      return this.finishNode(node, "TypeAlias");
-    };
-
-    // Type annotations
-
-    pp.flowParseTypeParameter = function () {
-      const node = this.startNode();
-
-      const variance = this.flowParseVariance();
-
-      const ident = this.flowParseTypeAnnotatableIdentifier();
-      node.name = ident.name;
-      node.variance = variance;
-      node.bound = ident.typeAnnotation;
-
-      if (this.match(tt.eq)) {
-        this.eat(tt.eq);
-        node.default = this.flowParseType();
-      }
-
-      return this.finishNode(node, "TypeParameter");
-    };
-
-    pp.flowParseTypeParameterDeclaration = function () {
-      const oldInType = this.state.inType;
-      const node = this.startNode();
-      node.params = [];
-
-      this.state.inType = true;
-
-      // istanbul ignore else: this condition is already checked at all call sites
-      if (this.isRelational("<") || this.match(tt.jsxTagStart)) {
-        this.next();
-      } else {
-        this.unexpected();
-      }
-
-      do {
-        node.params.push(this.flowParseTypeParameter());
-        if (!this.isRelational(">")) {
-          this.expect(tt.comma);
-        }
-      } while (!this.isRelational(">"));
-      this.expectRelational(">");
-
-      this.state.inType = oldInType;
-
-      return this.finishNode(node, "TypeParameterDeclaration");
-    };
-
-    pp.flowParseTypeParameterInstantiation = function () {
-      const node = this.startNode();
-      const oldInType = this.state.inType;
-      node.params = [];
-
-      this.state.inType = true;
-
-      this.expectRelational("<");
-      while (!this.isRelational(">")) {
-        node.params.push(this.flowParseType());
-        if (!this.isRelational(">")) {
-          this.expect(tt.comma);
-        }
-      }
-      this.expectRelational(">");
-
-      this.state.inType = oldInType;
-
-      return this.finishNode(node, "TypeParameterInstantiation");
-    };
-
-    pp.flowParseObjectPropertyKey = function () {
-      return (this.match(tt.num) || this.match(tt.string)) ? this.parseExprAtom() : this.parseIdentifier(true);
-    };
-
-    pp.flowParseObjectTypeIndexer = function (node, isStatic, variance) {
-      node.static = isStatic;
-
-      this.expect(tt.bracketL);
-      if (this.lookahead().type === tt.colon) {
-        node.id = this.flowParseObjectPropertyKey();
-        node.key = this.flowParseTypeInitialiser();
-      } else {
-        node.id = null;
-        node.key = this.flowParseType();
-      }
-      this.expect(tt.bracketR);
-      node.value = this.flowParseTypeInitialiser();
-      node.variance = variance;
-
-      // Finish node first to not include a possible semicolon in the locations
-      const indexer = this.finishNode(node, "ObjectTypeIndexer");
-      this.flowObjectTypeSemicolon();
-
-      return indexer;
-    };
-
-    pp.flowParseObjectTypeMethodish = function (node) {
-      node.params = [];
-      node.rest = null;
-      node.typeParameters = null;
-
-      if (this.isRelational("<")) {
-        node.typeParameters = this.flowParseTypeParameterDeclaration();
-      }
-
-      this.expect(tt.parenL);
-      while (this.match(tt.name)) {
-        node.params.push(this.flowParseFunctionTypeParam());
-        if (!this.match(tt.parenR)) {
-          this.expect(tt.comma);
-        }
-      }
-
-      if (this.eat(tt.ellipsis)) {
-        node.rest = this.flowParseFunctionTypeParam();
-      }
-      this.expect(tt.parenR);
-      node.returnType = this.flowParseTypeInitialiser();
-
-      return this.finishNode(node, "FunctionTypeAnnotation");
-    };
-
-    pp.flowParseObjectTypeMethod = function (startPos, startLoc, isStatic, key) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(startPos, startLoc));
-      node.static = isStatic;
-      node.key = key;
-      node.optional = false;
-      this.flowObjectTypeSemicolon();
-      return this.finishNode(node, "ObjectTypeProperty");
-    };
-
-    pp.flowParseObjectTypeCallProperty = function (node, isStatic) {
-      const valueNode = this.startNode();
-      node.static = isStatic;
-      node.value = this.flowParseObjectTypeMethodish(valueNode);
-      this.flowObjectTypeSemicolon();
-      return this.finishNode(node, "ObjectTypeCallProperty");
-    };
-
-    pp.flowParseObjectType = function (allowStatic, allowExact) {
-      const oldInType = this.state.inType;
-      this.state.inType = true;
-
-      const nodeStart = this.startNode();
-      let node;
-      let propertyKey;
-      let isStatic = false;
-
-      nodeStart.callProperties = [];
-      nodeStart.properties = [];
-      nodeStart.indexers = [];
-
-      let endDelim;
-      let exact;
-      if (allowExact && this.match(tt.braceBarL)) {
-        this.expect(tt.braceBarL);
-        endDelim = tt.braceBarR;
-        exact = true;
-      } else {
-        this.expect(tt.braceL);
-        endDelim = tt.braceR;
-        exact = false;
-      }
-
-      nodeStart.exact = exact;
-
-      while (!this.match(endDelim)) {
-        let optional = false;
-        const startPos = this.state.start;
-        const startLoc = this.state.startLoc;
-        node = this.startNode();
-        if (allowStatic && this.isContextual("static") && this.lookahead().type !== tt.colon) {
-          this.next();
-          isStatic = true;
-        }
-
-        const variance = this.flowParseVariance();
-
-        if (this.match(tt.bracketL)) {
-          nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance));
-        } else if (this.match(tt.parenL) || this.isRelational("<")) {
-          if (variance) {
-            this.unexpected(variance.start);
-          }
-          nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic));
-        } else {
-          propertyKey = this.flowParseObjectPropertyKey();
-          if (this.isRelational("<") || this.match(tt.parenL)) {
-            // This is a method property
-            if (variance) {
-              this.unexpected(variance.start);
-            }
-            nodeStart.properties.push(this.flowParseObjectTypeMethod(startPos, startLoc, isStatic, propertyKey));
-          } else {
-            if (this.eat(tt.question)) {
-              optional = true;
-            }
-            node.key = propertyKey;
-            node.value = this.flowParseTypeInitialiser();
-            node.optional = optional;
-            node.static = isStatic;
-            node.variance = variance;
-            this.flowObjectTypeSemicolon();
-            nodeStart.properties.push(this.finishNode(node, "ObjectTypeProperty"));
-          }
-        }
-
-        isStatic = false;
-      }
-
-      this.expect(endDelim);
-
-      const out = this.finishNode(nodeStart, "ObjectTypeAnnotation");
-
-      this.state.inType = oldInType;
-
-      return out;
-    };
-
-    pp.flowObjectTypeSemicolon = function () {
-      if (!this.eat(tt.semi) && !this.eat(tt.comma) &&
-          !this.match(tt.braceR) && !this.match(tt.braceBarR)) {
-        this.unexpected();
-      }
-    };
-
-    pp.flowParseQualifiedTypeIdentifier = function (startPos, startLoc, id) {
-      startPos = startPos || this.state.start;
-      startLoc = startLoc || this.state.startLoc;
-      let node = id || this.parseIdentifier();
-
-      while (this.eat(tt.dot)) {
-        const node2 = this.startNodeAt(startPos, startLoc);
-        node2.qualification = node;
-        node2.id = this.parseIdentifier();
-        node = this.finishNode(node2, "QualifiedTypeIdentifier");
-      }
-
-      return node;
-    };
-
-    pp.flowParseGenericType = function (startPos, startLoc, id) {
-      const node = this.startNodeAt(startPos, startLoc);
-
-      node.typeParameters = null;
-      node.id = this.flowParseQualifiedTypeIdentifier(startPos, startLoc, id);
-
-      if (this.isRelational("<")) {
-        node.typeParameters = this.flowParseTypeParameterInstantiation();
-      }
-
-      return this.finishNode(node, "GenericTypeAnnotation");
-    };
-
-    pp.flowParseTypeofType = function () {
-      const node = this.startNode();
-      this.expect(tt._typeof);
-      node.argument = this.flowParsePrimaryType();
-      return this.finishNode(node, "TypeofTypeAnnotation");
-    };
-
-    pp.flowParseTupleType = function () {
-      const node = this.startNode();
-      node.types = [];
-      this.expect(tt.bracketL);
-      // We allow trailing commas
-      while (this.state.pos < this.input.length && !this.match(tt.bracketR)) {
-        node.types.push(this.flowParseType());
-        if (this.match(tt.bracketR)) break;
-        this.expect(tt.comma);
-      }
-      this.expect(tt.bracketR);
-      return this.finishNode(node, "TupleTypeAnnotation");
-    };
-
-    pp.flowParseFunctionTypeParam = function () {
-      let name = null;
-      let optional = false;
-      let typeAnnotation = null;
-      const node = this.startNode();
-      const lh = this.lookahead();
-      if (lh.type === tt.colon ||
-          lh.type === tt.question) {
-        name = this.parseIdentifier();
-        if (this.eat(tt.question)) {
-          optional = true;
-        }
-        typeAnnotation = this.flowParseTypeInitialiser();
-      } else {
-        typeAnnotation = this.flowParseType();
-      }
-      node.name = name;
-      node.optional = optional;
-      node.typeAnnotation = typeAnnotation;
-      return this.finishNode(node, "FunctionTypeParam");
-    };
-
-    pp.reinterpretTypeAsFunctionTypeParam = function (type) {
-      const node = this.startNodeAt(type.start, type.loc);
-      node.name = null;
-      node.optional = false;
-      node.typeAnnotation = type;
-      return this.finishNode(node, "FunctionTypeParam");
-    };
-
-    pp.flowParseFunctionTypeParams = function (params = []) {
-      const ret = { params, rest: null };
-      while (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {
-        ret.params.push(this.flowParseFunctionTypeParam());
-        if (!this.match(tt.parenR)) {
-          this.expect(tt.comma);
-        }
-      }
-      if (this.eat(tt.ellipsis)) {
-        ret.rest = this.flowParseFunctionTypeParam();
-      }
-      return ret;
-    };
-
-    pp.flowIdentToTypeAnnotation = function (startPos, startLoc, node, id) {
-      switch (id.name) {
-        case "any":
-          return this.finishNode(node, "AnyTypeAnnotation");
-
-        case "void":
-          return this.finishNode(node, "VoidTypeAnnotation");
-
-        case "bool":
-        case "boolean":
-          return this.finishNode(node, "BooleanTypeAnnotation");
-
-        case "mixed":
-          return this.finishNode(node, "MixedTypeAnnotation");
-
-        case "empty":
-          return this.finishNode(node, "EmptyTypeAnnotation");
-
-        case "number":
-          return this.finishNode(node, "NumberTypeAnnotation");
-
-        case "string":
-          return this.finishNode(node, "StringTypeAnnotation");
-
-        default:
-          return this.flowParseGenericType(startPos, startLoc, id);
-      }
-    };
-
-    // The parsing of types roughly parallels the parsing of expressions, and
-    // primary types are kind of like primary expressions...they're the
-    // primitives with which other types are constructed.
-    pp.flowParsePrimaryType = function () {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const node = this.startNode();
-      let tmp;
-      let type;
-      let isGroupedType = false;
-      const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-
-      switch (this.state.type) {
-        case tt.name:
-          return this.flowIdentToTypeAnnotation(startPos, startLoc, node, this.parseIdentifier());
-
-        case tt.braceL:
-          return this.flowParseObjectType(false, false);
-
-        case tt.braceBarL:
-          return this.flowParseObjectType(false, true);
-
-        case tt.bracketL:
-          return this.flowParseTupleType();
-
-        case tt.relational:
-          if (this.state.value === "<") {
-            node.typeParameters = this.flowParseTypeParameterDeclaration();
-            this.expect(tt.parenL);
-            tmp = this.flowParseFunctionTypeParams();
-            node.params = tmp.params;
-            node.rest = tmp.rest;
-            this.expect(tt.parenR);
-
-            this.expect(tt.arrow);
-
-            node.returnType = this.flowParseType();
-
-            return this.finishNode(node, "FunctionTypeAnnotation");
-          }
-          break;
-
-        case tt.parenL:
-          this.next();
-
-          // Check to see if this is actually a grouped type
-          if (!this.match(tt.parenR) && !this.match(tt.ellipsis)) {
-            if (this.match(tt.name)) {
-              const token = this.lookahead().type;
-              isGroupedType = token !== tt.question && token !== tt.colon;
-            } else {
-              isGroupedType = true;
-            }
-          }
-
-          if (isGroupedType) {
-            this.state.noAnonFunctionType = false;
-            type = this.flowParseType();
-            this.state.noAnonFunctionType = oldNoAnonFunctionType;
-
-            // A `,` or a `) =>` means this is an anonymous function type
-            if (this.state.noAnonFunctionType ||
-                !(this.match(tt.comma) ||
-                 (this.match(tt.parenR) && this.lookahead().type === tt.arrow))) {
-              this.expect(tt.parenR);
-              return type;
-            } else {
-              // Eat a comma if there is one
-              this.eat(tt.comma);
-            }
-          }
-
-          if (type) {
-            tmp = this.flowParseFunctionTypeParams(
-              [this.reinterpretTypeAsFunctionTypeParam(type)],
-            );
-          } else {
-            tmp = this.flowParseFunctionTypeParams();
-          }
-
-          node.params = tmp.params;
-          node.rest = tmp.rest;
-
-          this.expect(tt.parenR);
-
-          this.expect(tt.arrow);
-
-          node.returnType = this.flowParseType();
-
-          node.typeParameters = null;
-
-          return this.finishNode(node, "FunctionTypeAnnotation");
-
-        case tt.string:
-          return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation");
-
-        case tt._true: case tt._false:
-          node.value = this.match(tt._true);
-          this.next();
-          return this.finishNode(node, "BooleanLiteralTypeAnnotation");
-
-        case tt.plusMin:
-          if (this.state.value === "-") {
-            this.next();
-            if (!this.match(tt.num)) this.unexpected(null, "Unexpected token, expected number");
-
-            return this.parseLiteral(-this.state.value, "NumberLiteralTypeAnnotation", node.start, node.loc.start);
-          }
-
-          this.unexpected();
-        case tt.num:
-          return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation");
-
-        case tt._null:
-          node.value = this.match(tt._null);
-          this.next();
-          return this.finishNode(node, "NullLiteralTypeAnnotation");
-
-        case tt._this:
-          node.value = this.match(tt._this);
-          this.next();
-          return this.finishNode(node, "ThisTypeAnnotation");
-
-        case tt.star:
-          this.next();
-          return this.finishNode(node, "ExistsTypeAnnotation");
-
-        default:
-          if (this.state.type.keyword === "typeof") {
-            return this.flowParseTypeofType();
-          }
-      }
-
-      this.unexpected();
-    };
-
-    pp.flowParsePostfixType = function () {
-      const startPos = this.state.start, startLoc = this.state.startLoc;
-      let type = this.flowParsePrimaryType();
-      while (!this.canInsertSemicolon() && this.match(tt.bracketL)) {
-        const node = this.startNodeAt(startPos, startLoc);
-        node.elementType = type;
-        this.expect(tt.bracketL);
-        this.expect(tt.bracketR);
-        type = this.finishNode(node, "ArrayTypeAnnotation");
-      }
-      return type;
-    };
-
-    pp.flowParsePrefixType = function () {
-      const node = this.startNode();
-      if (this.eat(tt.question)) {
-        node.typeAnnotation = this.flowParsePrefixType();
-        return this.finishNode(node, "NullableTypeAnnotation");
-      } else {
-        return this.flowParsePostfixType();
-      }
-    };
-
-    pp.flowParseAnonFunctionWithoutParens = function () {
-      const param = this.flowParsePrefixType();
-      if (!this.state.noAnonFunctionType && this.eat(tt.arrow)) {
-        const node  = this.startNodeAt(param.start, param.loc);
-        node.params = [this.reinterpretTypeAsFunctionTypeParam(param)];
-        node.rest = null;
-        node.returnType = this.flowParseType();
-        node.typeParameters = null;
-        return this.finishNode(node, "FunctionTypeAnnotation");
-      }
-      return param;
-    };
-
-    pp.flowParseIntersectionType = function () {
-      const node = this.startNode();
-      this.eat(tt.bitwiseAND);
-      const type = this.flowParseAnonFunctionWithoutParens();
-      node.types = [type];
-      while (this.eat(tt.bitwiseAND)) {
-        node.types.push(this.flowParseAnonFunctionWithoutParens());
-      }
-      return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation");
-    };
-
-    pp.flowParseUnionType = function () {
-      const node = this.startNode();
-      this.eat(tt.bitwiseOR);
-      const type = this.flowParseIntersectionType();
-      node.types = [type];
-      while (this.eat(tt.bitwiseOR)) {
-        node.types.push(this.flowParseIntersectionType());
-      }
-      return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation");
-    };
-
-    pp.flowParseType = function () {
-      const oldInType = this.state.inType;
-      this.state.inType = true;
-      const type = this.flowParseUnionType();
-      this.state.inType = oldInType;
-      return type;
-    };
-
-    pp.flowParseTypeAnnotation = function () {
-      const node = this.startNode();
-      node.typeAnnotation = this.flowParseTypeInitialiser();
-      return this.finishNode(node, "TypeAnnotation");
-    };
-
-    pp.flowParseTypeAndPredicateAnnotation = function () {
-      const node = this.startNode();
-      [node.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
-      return this.finishNode(node, "TypeAnnotation");
-    };
-
-    pp.flowParseTypeAnnotatableIdentifier = function () {
-      const ident = this.flowParseRestrictedIdentifier();
-      if (this.match(tt.colon)) {
-        ident.typeAnnotation = this.flowParseTypeAnnotation();
-        this.finishNode(ident, ident.type);
-      }
-      return ident;
-    };
-
-    pp.typeCastToParameter = function (node) {
-      node.expression.typeAnnotation = node.typeAnnotation;
-
-      return this.finishNodeAt(
-        node.expression,
-        node.expression.type,
-        node.typeAnnotation.end,
-        node.typeAnnotation.loc.end
-      );
-    };
-
-    pp.flowParseVariance = function() {
-      let variance = null;
-      if (this.match(tt.plusMin)) {
-        variance = this.startNode();
-        if (this.state.value === "+") {
-          variance.kind = "plus";
-        } else {
-          variance.kind = "minus";
-        }
-        this.next();
-        this.finishNode(variance, "Variance");
-      }
-      return variance;
-    };
-
-    //export default function (instance) {
-    pluginsFlowJS = function (instance) {
-      // plain function return types: function name(): string {}
-      instance.extend("parseFunctionBody", function (inner) {
-        return function (node, allowExpression) {
-          if (this.match(tt.colon) && !allowExpression) {
-            // if allowExpression is true then we're parsing an arrow function and if
-            // there's a return type then it's been handled elsewhere
-            node.returnType = this.flowParseTypeAndPredicateAnnotation();
-          }
-
-          return inner.call(this, node, allowExpression);
-        };
-      });
-
-      // interfaces
-      instance.extend("parseStatement", function (inner) {
-        return function (declaration, topLevel) {
-          // strict mode handling of `interface` since it's a reserved word
-          if (this.state.strict && this.match(tt.name) && this.state.value === "interface") {
-            const node = this.startNode();
-            this.next();
-            return this.flowParseInterface(node);
-          } else {
-            return inner.call(this, declaration, topLevel);
-          }
-        };
-      });
-
-      // declares, interfaces and type aliases
-      instance.extend("parseExpressionStatement", function (inner) {
-        return function (node, expr) {
-          if (expr.type === "Identifier") {
-            if (expr.name === "declare") {
-              if (this.match(tt._class) || this.match(tt.name) || this.match(tt._function) || this.match(tt._var)) {
-                return this.flowParseDeclare(node);
-              }
-            } else if (this.match(tt.name)) {
-              if (expr.name === "interface") {
-                return this.flowParseInterface(node);
-              } else if (expr.name === "type") {
-                return this.flowParseTypeAlias(node);
-              }
-            }
-          }
-
-          return inner.call(this, node, expr);
-        };
-      });
-
-      // export type
-      instance.extend("shouldParseExportDeclaration", function (inner) {
-        return function () {
-          return this.isContextual("type")
-              || this.isContextual("interface")
-              || inner.call(this);
-        };
-      });
-
-      instance.extend("parseConditional", function (inner) {
-        return function (expr, noIn, startPos, startLoc, refNeedsArrowPos) {
-          // only do the expensive clone if there is a question mark
-          // and if we come from inside parens
-          if (refNeedsArrowPos && this.match(tt.question)) {
-            const state = this.state.clone();
-            try {
-              return inner.call(this, expr, noIn, startPos, startLoc);
-            } catch (err) {
-              if (err instanceof SyntaxError) {
-                this.state = state;
-                refNeedsArrowPos.start = err.pos || this.state.start;
-                return expr;
-              } else {
-                // istanbul ignore next: no such error is expected
-                throw err;
-              }
-            }
-          }
-
-          return inner.call(this, expr, noIn, startPos, startLoc);
-        };
-      });
-
-      instance.extend("parseParenItem", function (inner) {
-        return function (node, startPos, startLoc) {
-          node = inner.call(this, node, startPos, startLoc);
-          if (this.eat(tt.question)) {
-            node.optional = true;
-          }
-
-          if (this.match(tt.colon)) {
-            const typeCastNode = this.startNodeAt(startPos, startLoc);
-            typeCastNode.expression = node;
-            typeCastNode.typeAnnotation = this.flowParseTypeAnnotation();
-
-            return this.finishNode(typeCastNode, "TypeCastExpression");
-          }
-
-          return node;
-        };
-      });
-
-      instance.extend("parseExport", function (inner) {
-        return function (node) {
-          node = inner.call(this, node);
-          if (node.type === "ExportNamedDeclaration") {
-            node.exportKind = node.exportKind || "value";
-          }
-          return node;
-        };
-      });
-
-      instance.extend("parseExportDeclaration", function (inner) {
-        return function (node) {
-          if (this.isContextual("type")) {
-            node.exportKind = "type";
-
-            const declarationNode = this.startNode();
-            this.next();
-
-            if (this.match(tt.braceL)) {
-              // export type { foo, bar };
-              node.specifiers = this.parseExportSpecifiers();
-              this.parseExportFrom(node);
-              return null;
-            } else {
-              // export type Foo = Bar;
-              return this.flowParseTypeAlias(declarationNode);
-            }
-          } else if (this.isContextual("interface")) {
-            node.exportKind = "type";
-            const declarationNode = this.startNode();
-            this.next();
-            return this.flowParseInterface(declarationNode);
-          } else {
-            return inner.call(this, node);
-          }
-        };
-      });
-
-      instance.extend("parseClassId", function (inner) {
-        return function (node) {
-          inner.apply(this, arguments);
-          if (this.isRelational("<")) {
-            node.typeParameters = this.flowParseTypeParameterDeclaration();
-          }
-        };
-      });
-
-      // don't consider `void` to be a keyword as then it'll use the void token type
-      // and set startExpr
-      instance.extend("isKeyword", function (inner) {
-        return function (name) {
-          if (this.state.inType && name === "void") {
-            return false;
-          } else {
-            return inner.call(this, name);
-          }
-        };
-      });
-
-      // ensure that inside flow types, we bypass the jsx parser plugin
-      instance.extend("readToken", function (inner) {
-        return function (code) {
-          if (this.state.inType && (code === 62 || code === 60)) {
-            return this.finishOp(tt.relational, 1);
-          } else {
-            return inner.call(this, code);
-          }
-        };
-      });
-
-      // don't lex any token as a jsx one inside a flow type
-      instance.extend("jsx_readToken", function (inner) {
-        return function () {
-          if (!this.state.inType) return inner.call(this);
-        };
-      });
-
-      instance.extend("toAssignable", function (inner) {
-        return function (node, isBinding, contextDescription) {
-          if (node.type === "TypeCastExpression") {
-            return inner.call(this, this.typeCastToParameter(node), isBinding, contextDescription);
-          } else {
-            return inner.call(this, node, isBinding, contextDescription);
-          }
-        };
-      });
-
-      // turn type casts that we found in function parameter head into type annotated params
-      instance.extend("toAssignableList", function (inner) {
-        return function (exprList, isBinding, contextDescription) {
-          for (let i = 0; i < exprList.length; i++) {
-            const expr = exprList[i];
-            if (expr && expr.type === "TypeCastExpression") {
-              exprList[i] = this.typeCastToParameter(expr);
-            }
-          }
-          return inner.call(this, exprList, isBinding, contextDescription);
-        };
-      });
-
-      // this is a list of nodes, from something like a call expression, we need to filter the
-      // type casts that we've found that are illegal in this context
-      instance.extend("toReferencedList", function () {
-        return function (exprList) {
-          for (let i = 0; i < exprList.length; i++) {
-            const expr = exprList[i];
-            if (expr && expr._exprListItem && expr.type === "TypeCastExpression") {
-              this.raise(expr.start, "Unexpected type cast");
-            }
-          }
-
-          return exprList;
-        };
-      });
-
-      // parse an item inside a expression list eg. `(NODE, NODE)` where NODE represents
-      // the position where this function is called
-      instance.extend("parseExprListItem", function (inner) {
-        return function (...args) {
-          const container = this.startNode();
-          const node = inner.call(this, ...args);
-          if (this.match(tt.colon)) {
-            container._exprListItem = true;
-            container.expression = node;
-            container.typeAnnotation = this.flowParseTypeAnnotation();
-            return this.finishNode(container, "TypeCastExpression");
-          } else {
-            return node;
-          }
-        };
-      });
-
-      instance.extend("checkLVal", function (inner) {
-        return function (node) {
-          if (node.type !== "TypeCastExpression") {
-            return inner.apply(this, arguments);
-          }
-        };
-      });
-
-      // parse class property type annotations
-      instance.extend("parseClassProperty", function (inner) {
-        return function (node) {
-          if (this.match(tt.colon)) {
-            node.typeAnnotation = this.flowParseTypeAnnotation();
-          }
-          return inner.call(this, node);
-        };
-      });
-
-      // determine whether or not we're currently in the position where a class method would appear
-      instance.extend("isClassMethod", function (inner) {
-        return function () {
-          return this.isRelational("<") || inner.call(this);
-        };
-      });
-
-      // determine whether or not we're currently in the position where a class property would appear
-      instance.extend("isClassProperty", function (inner) {
-        return function () {
-          return this.match(tt.colon) || inner.call(this);
-        };
-      });
-
-      // parse type parameters for class methods
-      instance.extend("parseClassMethod", function (inner) {
-        return function (classBody, method, ...args) {
-          if (method.variance) {
-            this.unexpected(method.variance.start);
-          }
-          delete method.variance;
-          if (this.isRelational("<")) {
-            method.typeParameters = this.flowParseTypeParameterDeclaration();
-          }
-
-          inner.call(this, classBody, method, ...args);
-        };
-      });
-
-      // parse a the super class type parameters and implements
-      instance.extend("parseClassSuper", function (inner) {
-        return function (node, isStatement) {
-          inner.call(this, node, isStatement);
-          if (node.superClass && this.isRelational("<")) {
-            node.superTypeParameters = this.flowParseTypeParameterInstantiation();
-          }
-          if (this.isContextual("implements")) {
-            this.next();
-            const implemented = node.implements = [];
-            do {
-              const node = this.startNode();
-              node.id = this.parseIdentifier();
-              if (this.isRelational("<")) {
-                node.typeParameters = this.flowParseTypeParameterInstantiation();
-              } else {
-                node.typeParameters = null;
-              }
-              implemented.push(this.finishNode(node, "ClassImplements"));
-            } while (this.eat(tt.comma));
-          }
-        };
-      });
-
-      instance.extend("parsePropertyName", function (inner) {
-        return function (node) {
-          const variance = this.flowParseVariance();
-          const key = inner.call(this, node);
-          node.variance = variance;
-          return key;
-        };
-      });
-
-      // parse type parameters for object method shorthand
-      instance.extend("parseObjPropValue", function (inner) {
-        return function (prop) {
-          if (prop.variance) {
-            this.unexpected(prop.variance.start);
-          }
-          delete prop.variance;
-
-          let typeParameters;
-
-          // method shorthand
-          if (this.isRelational("<")) {
-            typeParameters = this.flowParseTypeParameterDeclaration();
-            if (!this.match(tt.parenL)) this.unexpected();
-          }
-
-          inner.apply(this, arguments);
-
-          // add typeParameters if we found them
-          if (typeParameters) {
-            (prop.value || prop).typeParameters = typeParameters;
-          }
-        };
-      });
-
-      instance.extend("parseAssignableListItemTypes", function () {
-        return function (param) {
-          if (this.eat(tt.question)) {
-            param.optional = true;
-          }
-          if (this.match(tt.colon)) {
-            param.typeAnnotation = this.flowParseTypeAnnotation();
-          }
-          this.finishNode(param, param.type);
-          return param;
-        };
-      });
-
-      instance.extend("parseMaybeDefault", function (inner) {
-        return function (...args) {
-          const node = inner.apply(this, args);
-
-          if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) {
-            this.raise(node.typeAnnotation.start, "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`");
-          }
-
-          return node;
-        };
-      });
-
-
-      // parse typeof and type imports
-      instance.extend("parseImportSpecifiers", function (inner) {
-        return function (node) {
-          node.importKind = "value";
-
-          let kind = null;
-          if (this.match(tt._typeof)) {
-            kind = "typeof";
-          } else if (this.isContextual("type")) {
-            kind = "type";
-          }
-          if (kind) {
-            const lh = this.lookahead();
-            if ((lh.type === tt.name && lh.value !== "from") || lh.type === tt.braceL || lh.type === tt.star) {
-              this.next();
-              node.importKind = kind;
-            }
-          }
-
-          inner.call(this, node);
-        };
-      });
-
-      // parse import-type/typeof shorthand
-      instance.extend("parseImportSpecifier", function () {
-        return function (node) {
-          const specifier = this.startNode();
-          const firstIdentLoc = this.state.start;
-          const firstIdent = this.parseIdentifier(true);
-
-          let specifierTypeKind = null;
-          if (firstIdent.name === "type") {
-            specifierTypeKind = "type";
-          } else if (firstIdent.name === "typeof") {
-            specifierTypeKind = "typeof";
-          }
-
-          let isBinding = false;
-          if (this.isContextual("as")) {
-            const as_ident = this.parseIdentifier(true);
-            if (specifierTypeKind !== null && !this.match(tt.name) && !this.state.type.keyword) {
-              // `import {type as ,` or `import {type as }`
-              specifier.imported = as_ident;
-              specifier.importKind = specifierTypeKind;
-              specifier.local = as_ident.__clone();
-            } else {
-              // `import {type as foo`
-              specifier.imported = firstIdent;
-              specifier.importKind = null;
-              specifier.local = this.parseIdentifier();
-            }
-          } else if (specifierTypeKind !== null && (this.match(tt.name) || this.state.type.keyword)) {
-            // `import {type foo`
-            specifier.imported = this.parseIdentifier(true);
-            specifier.importKind = specifierTypeKind;
-            if (this.eatContextual("as")) {
-              specifier.local = this.parseIdentifier();
-            } else {
-              isBinding = true;
-              specifier.local = specifier.imported.__clone();
-            }
-          } else {
-            isBinding = true;
-            specifier.imported = firstIdent;
-            specifier.importKind = null;
-            specifier.local = specifier.imported.__clone();
-          }
-
-          if (
-            (node.importKind === "type" || node.importKind === "typeof") &&
-            (specifier.importKind === "type" || specifier.importKind === "typeof")
-          ) {
-            this.raise(firstIdentLoc, "`The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements`");
-          }
-
-          if (isBinding) this.checkReservedWord(specifier.local.name, specifier.start, true, true);
-
-          this.checkLVal(specifier.local, true, undefined, "import specifier");
-          node.specifiers.push(this.finishNode(specifier, "ImportSpecifier"));
-        };
-      });
-
-      // parse function type parameters - function foo<T>() {}
-      instance.extend("parseFunctionParams", function (inner) {
-        return function (node) {
-          if (this.isRelational("<")) {
-            node.typeParameters = this.flowParseTypeParameterDeclaration();
-          }
-          inner.call(this, node);
-        };
-      });
-
-      // parse flow type annotations on variable declarator heads - let foo: string = bar
-      instance.extend("parseVarHead", function (inner) {
-        return function (decl) {
-          inner.call(this, decl);
-          if (this.match(tt.colon)) {
-            decl.id.typeAnnotation = this.flowParseTypeAnnotation();
-            this.finishNode(decl.id, decl.id.type);
-          }
-        };
-      });
-
-      // parse the return type of an async arrow function - let foo = (async (): number => {});
-      instance.extend("parseAsyncArrowFromCallExpression", function (inner) {
-        return function (node, call) {
-          if (this.match(tt.colon)) {
-            const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-            this.state.noAnonFunctionType = true;
-            node.returnType = this.flowParseTypeAnnotation();
-            this.state.noAnonFunctionType = oldNoAnonFunctionType;
-          }
-
-          return inner.call(this, node, call);
-        };
-      });
-
-      // todo description
-      instance.extend("shouldParseAsyncArrow", function (inner) {
-        return function () {
-          return this.match(tt.colon) || inner.call(this);
-        };
-      });
-
-      // We need to support type parameter declarations for arrow functions. This
-      // is tricky. There are three situations we need to handle
-      //
-      // 1. This is either JSX or an arrow function. We'll try JSX first. If that
-      //    fails, we'll try an arrow function. If that fails, we'll throw the JSX
-      //    error.
-      // 2. This is an arrow function. We'll parse the type parameter declaration,
-      //    parse the rest, make sure the rest is an arrow function, and go from
-      //    there
-      // 3. This is neither. Just call the inner function
-      instance.extend("parseMaybeAssign", function (inner) {
-        return function (...args) {
-          let jsxError = null;
-          if (tt.jsxTagStart && this.match(tt.jsxTagStart)) {
-            const state = this.state.clone();
-            try {
-              return inner.apply(this, args);
-            } catch (err) {
-              if (err instanceof SyntaxError) {
-                this.state = state;
-                jsxError = err;
-              } else {
-                // istanbul ignore next: no such error is expected
-                throw err;
-              }
-            }
-          }
-
-          if (jsxError != null || this.isRelational("<")) {
-            // Need to push something onto the context to stop
-            // the JSX plugin from messing with the tokens
-            this.state.context.push(ct.parenExpression);
-            let arrowExpression;
-            let typeParameters;
-            try {
-              typeParameters = this.flowParseTypeParameterDeclaration();
-
-              arrowExpression = inner.apply(this, args);
-              arrowExpression.typeParameters = typeParameters;
-              this.resetStartLocationFromNode(arrowExpression, typeParameters);
-            } catch (err) {
-              this.state.context.pop();
-
-              throw jsxError || err;
-            }
-
-            this.state.context.pop();
-
-            if (arrowExpression.type === "ArrowFunctionExpression") {
-              return arrowExpression;
-            } else if (jsxError != null) {
-              throw jsxError;
-            } else {
-              this.raise(
-                typeParameters.start,
-                "Expected an arrow function after this type parameter declaration",
-              );
-            }
-          }
-
-          return inner.apply(this, args);
-        };
-      });
-
-      // handle return types for arrow functions
-      instance.extend("parseArrow", function (inner) {
-        return function (node) {
-          if (this.match(tt.colon)) {
-            const state = this.state.clone();
-            try {
-              const oldNoAnonFunctionType = this.state.noAnonFunctionType;
-              this.state.noAnonFunctionType = true;
-              const returnType = this.flowParseTypeAndPredicateAnnotation();
-              this.state.noAnonFunctionType = oldNoAnonFunctionType;
-
-              if (this.canInsertSemicolon()) this.unexpected();
-              if (!this.match(tt.arrow)) this.unexpected();
-              // assign after it is clear it is an arrow
-              node.returnType = returnType;
-            } catch (err) {
-              if (err instanceof SyntaxError) {
-                this.state = state;
-              } else {
-                // istanbul ignore next: no such error is expected
-                throw err;
-              }
-            }
-          }
-
-          return inner.call(this, node);
-        };
-      });
-
-      instance.extend("shouldParseArrow", function (inner) {
-        return function () {
-          return this.match(tt.colon) || inner.call(this);
-        };
-      });
-    }
-}
-
-// plugins/jsx/xhtml.js
-let pluginsJsxXhtmlJS = {};
-{
-     pluginsJsxXhtmlJS = {
-      quot: "\u0022",
-      amp: "&",
-      apos: "\u0027",
-      lt: "<",
-      gt: ">",
-      nbsp: "\u00A0",
-      iexcl: "\u00A1",
-      cent: "\u00A2",
-      pound: "\u00A3",
-      curren: "\u00A4",
-      yen: "\u00A5",
-      brvbar: "\u00A6",
-      sect: "\u00A7",
-      uml: "\u00A8",
-      copy: "\u00A9",
-      ordf: "\u00AA",
-      laquo: "\u00AB",
-      not: "\u00AC",
-      shy: "\u00AD",
-      reg: "\u00AE",
-      macr: "\u00AF",
-      deg: "\u00B0",
-      plusmn: "\u00B1",
-      sup2: "\u00B2",
-      sup3: "\u00B3",
-      acute: "\u00B4",
-      micro: "\u00B5",
-      para: "\u00B6",
-      middot: "\u00B7",
-      cedil: "\u00B8",
-      sup1: "\u00B9",
-      ordm: "\u00BA",
-      raquo: "\u00BB",
-      frac14: "\u00BC",
-      frac12: "\u00BD",
-      frac34: "\u00BE",
-      iquest: "\u00BF",
-      Agrave: "\u00C0",
-      Aacute: "\u00C1",
-      Acirc: "\u00C2",
-      Atilde: "\u00C3",
-      Auml: "\u00C4",
-      Aring: "\u00C5",
-      AElig: "\u00C6",
-      Ccedil: "\u00C7",
-      Egrave: "\u00C8",
-      Eacute: "\u00C9",
-      Ecirc: "\u00CA",
-      Euml: "\u00CB",
-      Igrave: "\u00CC",
-      Iacute: "\u00CD",
-      Icirc: "\u00CE",
-      Iuml: "\u00CF",
-      ETH: "\u00D0",
-      Ntilde: "\u00D1",
-      Ograve: "\u00D2",
-      Oacute: "\u00D3",
-      Ocirc: "\u00D4",
-      Otilde: "\u00D5",
-      Ouml: "\u00D6",
-      times: "\u00D7",
-      Oslash: "\u00D8",
-      Ugrave: "\u00D9",
-      Uacute: "\u00DA",
-      Ucirc: "\u00DB",
-      Uuml: "\u00DC",
-      Yacute: "\u00DD",
-      THORN: "\u00DE",
-      szlig: "\u00DF",
-      agrave: "\u00E0",
-      aacute: "\u00E1",
-      acirc: "\u00E2",
-      atilde: "\u00E3",
-      auml: "\u00E4",
-      aring: "\u00E5",
-      aelig: "\u00E6",
-      ccedil: "\u00E7",
-      egrave: "\u00E8",
-      eacute: "\u00E9",
-      ecirc: "\u00EA",
-      euml: "\u00EB",
-      igrave: "\u00EC",
-      iacute: "\u00ED",
-      icirc: "\u00EE",
-      iuml: "\u00EF",
-      eth: "\u00F0",
-      ntilde: "\u00F1",
-      ograve: "\u00F2",
-      oacute: "\u00F3",
-      ocirc: "\u00F4",
-      otilde: "\u00F5",
-      ouml: "\u00F6",
-      divide: "\u00F7",
-      oslash: "\u00F8",
-      ugrave: "\u00F9",
-      uacute: "\u00FA",
-      ucirc: "\u00FB",
-      uuml: "\u00FC",
-      yacute: "\u00FD",
-      thorn: "\u00FE",
-      yuml: "\u00FF",
-      OElig: "\u0152",
-      oelig: "\u0153",
-      Scaron: "\u0160",
-      scaron: "\u0161",
-      Yuml: "\u0178",
-      fnof: "\u0192",
-      circ: "\u02C6",
-      tilde: "\u02DC",
-      Alpha: "\u0391",
-      Beta: "\u0392",
-      Gamma: "\u0393",
-      Delta: "\u0394",
-      Epsilon: "\u0395",
-      Zeta: "\u0396",
-      Eta: "\u0397",
-      Theta: "\u0398",
-      Iota: "\u0399",
-      Kappa: "\u039A",
-      Lambda: "\u039B",
-      Mu: "\u039C",
-      Nu: "\u039D",
-      Xi: "\u039E",
-      Omicron: "\u039F",
-      Pi: "\u03A0",
-      Rho: "\u03A1",
-      Sigma: "\u03A3",
-      Tau: "\u03A4",
-      Upsilon: "\u03A5",
-      Phi: "\u03A6",
-      Chi: "\u03A7",
-      Psi: "\u03A8",
-      Omega: "\u03A9",
-      alpha: "\u03B1",
-      beta: "\u03B2",
-      gamma: "\u03B3",
-      delta: "\u03B4",
-      epsilon: "\u03B5",
-      zeta: "\u03B6",
-      eta: "\u03B7",
-      theta: "\u03B8",
-      iota: "\u03B9",
-      kappa: "\u03BA",
-      lambda: "\u03BB",
-      mu: "\u03BC",
-      nu: "\u03BD",
-      xi: "\u03BE",
-      omicron: "\u03BF",
-      pi: "\u03C0",
-      rho: "\u03C1",
-      sigmaf: "\u03C2",
-      sigma: "\u03C3",
-      tau: "\u03C4",
-      upsilon: "\u03C5",
-      phi: "\u03C6",
-      chi: "\u03C7",
-      psi: "\u03C8",
-      omega: "\u03C9",
-      thetasym: "\u03D1",
-      upsih: "\u03D2",
-      piv: "\u03D6",
-      ensp: "\u2002",
-      emsp: "\u2003",
-      thinsp: "\u2009",
-      zwnj: "\u200C",
-      zwj: "\u200D",
-      lrm: "\u200E",
-      rlm: "\u200F",
-      ndash: "\u2013",
-      mdash: "\u2014",
-      lsquo: "\u2018",
-      rsquo: "\u2019",
-      sbquo: "\u201A",
-      ldquo: "\u201C",
-      rdquo: "\u201D",
-      bdquo: "\u201E",
-      dagger: "\u2020",
-      Dagger: "\u2021",
-      bull: "\u2022",
-      hellip: "\u2026",
-      permil: "\u2030",
-      prime: "\u2032",
-      Prime: "\u2033",
-      lsaquo: "\u2039",
-      rsaquo: "\u203A",
-      oline: "\u203E",
-      frasl: "\u2044",
-      euro: "\u20AC",
-      image: "\u2111",
-      weierp: "\u2118",
-      real: "\u211C",
-      trade: "\u2122",
-      alefsym: "\u2135",
-      larr: "\u2190",
-      uarr: "\u2191",
-      rarr: "\u2192",
-      darr: "\u2193",
-      harr: "\u2194",
-      crarr: "\u21B5",
-      lArr: "\u21D0",
-      uArr: "\u21D1",
-      rArr: "\u21D2",
-      dArr: "\u21D3",
-      hArr: "\u21D4",
-      forall: "\u2200",
-      part: "\u2202",
-      exist: "\u2203",
-      empty: "\u2205",
-      nabla: "\u2207",
-      isin: "\u2208",
-      notin: "\u2209",
-      ni: "\u220B",
-      prod: "\u220F",
-      sum: "\u2211",
-      minus: "\u2212",
-      lowast: "\u2217",
-      radic: "\u221A",
-      prop: "\u221D",
-      infin: "\u221E",
-      ang: "\u2220",
-      and: "\u2227",
-      or: "\u2228",
-      cap: "\u2229",
-      cup: "\u222A",
-      "int": "\u222B",
-      there4: "\u2234",
-      sim: "\u223C",
-      cong: "\u2245",
-      asymp: "\u2248",
-      ne: "\u2260",
-      equiv: "\u2261",
-      le: "\u2264",
-      ge: "\u2265",
-      sub: "\u2282",
-      sup: "\u2283",
-      nsub: "\u2284",
-      sube: "\u2286",
-      supe: "\u2287",
-      oplus: "\u2295",
-      otimes: "\u2297",
-      perp: "\u22A5",
-      sdot: "\u22C5",
-      lceil: "\u2308",
-      rceil: "\u2309",
-      lfloor: "\u230A",
-      rfloor: "\u230B",
-      lang: "\u2329",
-      rang: "\u232A",
-      loz: "\u25CA",
-      spades: "\u2660",
-      clubs: "\u2663",
-      hearts: "\u2665",
-      diams: "\u2666"
-    };
-}
-
-// plugins/jsx/index.js
-let pluginsJsxIndexJS = {};
-{
-    const XHTMLEntities = pluginsJsxXhtmlJS;
-    const { TokenType, types : tt } = tokenizerTypesJS;
-    const { TokContext, types : tc } = tokenizerContextJS;
-    const Parser = parserIndexJS;
-    const { isIdentifierChar, isIdentifierStart } = utilIdentifierJS;
-    const { isNewLine } = utilWhitespaceJS;
-
-    const HEX_NUMBER = /^[\da-fA-F]+$/;
-    const DECIMAL_NUMBER = /^\d+$/;
-
-    tc.j_oTag = new TokContext("<tag", false);
-    tc.j_cTag = new TokContext("</tag", false);
-    tc.j_expr = new TokContext("<tag>...</tag>", true, true);
-
-    tt.jsxName = new TokenType("jsxName");
-    tt.jsxText = new TokenType("jsxText", { beforeExpr: true });
-    tt.jsxTagStart = new TokenType("jsxTagStart", { startsExpr: true });
-    tt.jsxTagEnd = new TokenType("jsxTagEnd");
-
-    tt.jsxTagStart.updateContext = function() {
-      this.state.context.push(tc.j_expr); // treat as beginning of JSX expression
-      this.state.context.push(tc.j_oTag); // start opening tag context
-      this.state.exprAllowed = false;
-    };
-
-    tt.jsxTagEnd.updateContext = function(prevType) {
-      const out = this.state.context.pop();
-      if (out === tc.j_oTag && prevType === tt.slash || out === tc.j_cTag) {
-        this.state.context.pop();
-        this.state.exprAllowed = this.curContext() === tc.j_expr;
-      } else {
-        this.state.exprAllowed = true;
-      }
-    };
-
-    const pp = Parser.prototype;
-
-    // Reads inline JSX contents token.
-
-    pp.jsxReadToken = function() {
-      let out = "";
-      let chunkStart = this.state.pos;
-      for (;;) {
-        if (this.state.pos >= this.input.length) {
-          this.raise(this.state.start, "Unterminated JSX contents");
-        }
-
-        const ch = this.input.charCodeAt(this.state.pos);
-
-        switch (ch) {
-          case 60: // "<"
-          case 123: // "{"
-            if (this.state.pos === this.state.start) {
-              if (ch === 60 && this.state.exprAllowed) {
-                ++this.state.pos;
-                return this.finishToken(tt.jsxTagStart);
-              }
-              return this.getTokenFromCode(ch);
-            }
-            out += this.input.slice(chunkStart, this.state.pos);
-            return this.finishToken(tt.jsxText, out);
-
-          case 38: // "&"
-            out += this.input.slice(chunkStart, this.state.pos);
-            out += this.jsxReadEntity();
-            chunkStart = this.state.pos;
-            break;
-
-          default:
-            if (isNewLine(ch)) {
-              out += this.input.slice(chunkStart, this.state.pos);
-              out += this.jsxReadNewLine(true);
-              chunkStart = this.state.pos;
-            } else {
-              ++this.state.pos;
-            }
-        }
-      }
-    };
-
-    pp.jsxReadNewLine = function(normalizeCRLF) {
-      const ch = this.input.charCodeAt(this.state.pos);
-      let out;
-      ++this.state.pos;
-      if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) {
-        ++this.state.pos;
-        out = normalizeCRLF ? "\n" : "\r\n";
-      } else {
-        out = String.fromCharCode(ch);
-      }
-      ++this.state.curLine;
-      this.state.lineStart = this.state.pos;
-
-      return out;
-    };
-
-    pp.jsxReadString = function(quote) {
-      let out = "";
-      let chunkStart = ++this.state.pos;
-      for (;;) {
-        if (this.state.pos >= this.input.length) {
-          this.raise(this.state.start, "Unterminated string constant");
-        }
-
-        const ch = this.input.charCodeAt(this.state.pos);
-        if (ch === quote) break;
-        if (ch === 38) { // "&"
-          out += this.input.slice(chunkStart, this.state.pos);
-          out += this.jsxReadEntity();
-          chunkStart = this.state.pos;
-        } else if (isNewLine(ch)) {
-          out += this.input.slice(chunkStart, this.state.pos);
-          out += this.jsxReadNewLine(false);
-          chunkStart = this.state.pos;
-        } else {
-          ++this.state.pos;
-        }
-      }
-      out += this.input.slice(chunkStart, this.state.pos++);
-      return this.finishToken(tt.string, out);
-    };
-
-    pp.jsxReadEntity = function() {
-      let str = "";
-      let count = 0;
-      let entity;
-      let ch = this.input[this.state.pos];
-
-      const startPos = ++this.state.pos;
-      while (this.state.pos < this.input.length && count++ < 10) {
-        ch = this.input[this.state.pos++];
-        if (ch === ";") {
-          if (str[0] === "#") {
-            if (str[1] === "x") {
-              str = str.substr(2);
-              if (HEX_NUMBER.test(str))
-                entity = String.fromCodePoint(parseInt(str, 16));
-            } else {
-              str = str.substr(1);
-              if (DECIMAL_NUMBER.test(str))
-                entity = String.fromCodePoint(parseInt(str, 10));
-            }
-          } else {
-            entity = XHTMLEntities[str];
-          }
-          break;
-        }
-        str += ch;
-      }
-      if (!entity) {
-        this.state.pos = startPos;
-        return "&";
-      }
-      return entity;
-    };
-
-
-    // Read a JSX identifier (valid tag or attribute name).
-    //
-    // Optimized version since JSX identifiers can"t contain
-    // escape characters and so can be read as single slice.
-    // Also assumes that first character was already checked
-    // by isIdentifierStart in readToken.
-
-    pp.jsxReadWord = function() {
-      let ch;
-      const start = this.state.pos;
-      do {
-        ch = this.input.charCodeAt(++this.state.pos);
-      } while (isIdentifierChar(ch) || ch === 45); // "-"
-      return this.finishToken(tt.jsxName, this.input.slice(start, this.state.pos));
-    };
-
-    // Transforms JSX element name to string.
-
-    function getQualifiedJSXName(object) {
-      if (object.type === "JSXIdentifier") {
-        return object.name;
-      }
-
-      if (object.type === "JSXNamespacedName") {
-        return object.namespace.name + ":" + object.name.name;
-      }
-
-      if (object.type === "JSXMemberExpression") {
-        return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property);
-      }
-    }
-
-    // Parse next token as JSX identifier
-
-    pp.jsxParseIdentifier = function() {
-      const node = this.startNode();
-      if (this.match(tt.jsxName)) {
-        node.name = this.state.value;
-      } else if (this.state.type.keyword) {
-        node.name = this.state.type.keyword;
-      } else {
-        this.unexpected();
-      }
-      this.next();
-      return this.finishNode(node, "JSXIdentifier");
-    };
-
-    // Parse namespaced identifier.
-
-    pp.jsxParseNamespacedName = function() {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      const name = this.jsxParseIdentifier();
-      if (!this.eat(tt.colon)) return name;
-
-      const node = this.startNodeAt(startPos, startLoc);
-      node.namespace = name;
-      node.name = this.jsxParseIdentifier();
-      return this.finishNode(node, "JSXNamespacedName");
-    };
-
-    // Parses element name in any form - namespaced, member
-    // or single identifier.
-
-    pp.jsxParseElementName = function() {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      let node = this.jsxParseNamespacedName();
-      while (this.eat(tt.dot)) {
-        const newNode = this.startNodeAt(startPos, startLoc);
-        newNode.object = node;
-        newNode.property = this.jsxParseIdentifier();
-        node = this.finishNode(newNode, "JSXMemberExpression");
-      }
-      return node;
-    };
-
-    // Parses any type of JSX attribute value.
-
-    pp.jsxParseAttributeValue = function() {
-      let node;
-      switch (this.state.type) {
-        case tt.braceL:
-          node = this.jsxParseExpressionContainer();
-          if (node.expression.type === "JSXEmptyExpression") {
-            this.raise(node.start, "JSX attributes must only be assigned a non-empty expression");
-          } else {
-            return node;
-          }
-
-        case tt.jsxTagStart:
-        case tt.string:
-          node = this.parseExprAtom();
-          node.extra = null;
-          return node;
-
-        default:
-          this.raise(this.state.start, "JSX value should be either an expression or a quoted JSX text");
-      }
-    };
-
-    // JSXEmptyExpression is unique type since it doesn't actually parse anything,
-    // and so it should start at the end of last read token (left brace) and finish
-    // at the beginning of the next one (right brace).
-
-    pp.jsxParseEmptyExpression = function() {
-      const node = this.startNodeAt(this.state.lastTokEnd, this.state.lastTokEndLoc);
-      return this.finishNodeAt(node, "JSXEmptyExpression", this.state.start, this.state.startLoc);
-    };
-
-    // Parse JSX spread child
-
-    pp.jsxParseSpreadChild = function() {
-      const node = this.startNode();
-      this.expect(tt.braceL);
-      this.expect(tt.ellipsis);
-      node.expression = this.parseExpression();
-      this.expect(tt.braceR);
-
-      return this.finishNode(node, "JSXSpreadChild");
-    };
-
-    // Parses JSX expression enclosed into curly brackets.
-
-
-    pp.jsxParseExpressionContainer = function() {
-      const node = this.startNode();
-      this.next();
-      if (this.match(tt.braceR)) {
-        node.expression = this.jsxParseEmptyExpression();
-      } else {
-        node.expression = this.parseExpression();
-      }
-      this.expect(tt.braceR);
-      return this.finishNode(node, "JSXExpressionContainer");
-    };
-
-    // Parses following JSX attribute name-value pair.
-
-    pp.jsxParseAttribute = function() {
-      const node = this.startNode();
-      if (this.eat(tt.braceL)) {
-        this.expect(tt.ellipsis);
-        node.argument = this.parseMaybeAssign();
-        this.expect(tt.braceR);
-        return this.finishNode(node, "JSXSpreadAttribute");
-      }
-      node.name = this.jsxParseNamespacedName();
-      node.value = this.eat(tt.eq) ? this.jsxParseAttributeValue() : null;
-      return this.finishNode(node, "JSXAttribute");
-    };
-
-    // Parses JSX opening tag starting after "<".
-
-    pp.jsxParseOpeningElementAt = function(startPos, startLoc) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.attributes = [];
-      node.name = this.jsxParseElementName();
-      while (!this.match(tt.slash) && !this.match(tt.jsxTagEnd)) {
-        node.attributes.push(this.jsxParseAttribute());
-      }
-      node.selfClosing = this.eat(tt.slash);
-      this.expect(tt.jsxTagEnd);
-      return this.finishNode(node, "JSXOpeningElement");
-    };
-
-    // Parses JSX closing tag starting after "</".
-
-    pp.jsxParseClosingElementAt = function(startPos, startLoc) {
-      const node = this.startNodeAt(startPos, startLoc);
-      node.name = this.jsxParseElementName();
-      this.expect(tt.jsxTagEnd);
-      return this.finishNode(node, "JSXClosingElement");
-    };
-
-    // Parses entire JSX element, including it"s opening tag
-    // (starting after "<"), attributes, contents and closing tag.
-
-    pp.jsxParseElementAt = function(startPos, startLoc) {
-      const node = this.startNodeAt(startPos, startLoc);
-      const children = [];
-      const openingElement = this.jsxParseOpeningElementAt(startPos, startLoc);
-      let closingElement = null;
-
-      if (!openingElement.selfClosing) {
-        contents: for (;;) {
-          switch (this.state.type) {
-            case tt.jsxTagStart:
-              startPos = this.state.start; startLoc = this.state.startLoc;
-              this.next();
-              if (this.eat(tt.slash)) {
-                closingElement = this.jsxParseClosingElementAt(startPos, startLoc);
-                break contents;
-              }
-              children.push(this.jsxParseElementAt(startPos, startLoc));
-              break;
-
-            case tt.jsxText:
-              children.push(this.parseExprAtom());
-              break;
-
-            case tt.braceL:
-              if (this.lookahead().type === tt.ellipsis) {
-                children.push(this.jsxParseSpreadChild());
-              } else {
-                children.push(this.jsxParseExpressionContainer());
-              }
-
-              break;
-
-            // istanbul ignore next - should never happen
-            default:
-              this.unexpected();
-          }
-        }
-
-        if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) {
-          this.raise(
-            closingElement.start,
-            "Expected corresponding JSX closing tag for <" + getQualifiedJSXName(openingElement.name) + ">"
-          );
-        }
-      }
-
-      node.openingElement = openingElement;
-      node.closingElement = closingElement;
-      node.children = children;
-      if (this.match(tt.relational) && this.state.value === "<") {
-        this.raise(this.state.start, "Adjacent JSX elements must be wrapped in an enclosing tag");
-      }
-      return this.finishNode(node, "JSXElement");
-    };
-
-    // Parses entire JSX element from current position.
-
-    pp.jsxParseElement = function() {
-      const startPos = this.state.start;
-      const startLoc = this.state.startLoc;
-      this.next();
-      return this.jsxParseElementAt(startPos, startLoc);
-    };
-
-    //export default function(instance) {
-    pluginsJsxIndexJS = function(instance) {
-      instance.extend("parseExprAtom", function(inner) {
-        return function(refShortHandDefaultPos) {
-          if (this.match(tt.jsxText)) {
-            const node = this.parseLiteral(this.state.value, "JSXText");
-            // https://github.com/babel/babel/issues/2078
-            node.extra = null;
-            return node;
-          } else if (this.match(tt.jsxTagStart)) {
-            return this.jsxParseElement();
-          } else {
-            return inner.call(this, refShortHandDefaultPos);
-          }
-        };
-      });
-
-      instance.extend("readToken", function(inner) {
-        return function(code) {
-          if (this.state.inPropertyName) return inner.call(this, code);
-
-          const context = this.curContext();
-
-          if (context === tc.j_expr) {
-            return this.jsxReadToken();
-          }
-
-          if (context === tc.j_oTag || context === tc.j_cTag) {
-            if (isIdentifierStart(code)) {
-              return this.jsxReadWord();
-            }
-
-            if (code === 62) {
-              ++this.state.pos;
-              return this.finishToken(tt.jsxTagEnd);
-            }
-
-            if ((code === 34 || code === 39) && context === tc.j_oTag) {
-              return this.jsxReadString(code);
-            }
-          }
-
-          if (code === 60 && this.state.exprAllowed) {
-            ++this.state.pos;
-            return this.finishToken(tt.jsxTagStart);
-          }
-
-          return inner.call(this, code);
-        };
-      });
-
-      instance.extend("updateContext", function(inner) {
-        return function(prevType) {
-          if (this.match(tt.braceL)) {
-            const curContext = this.curContext();
-            if (curContext === tc.j_oTag) {
-              this.state.context.push(tc.braceExpression);
-            } else if (curContext === tc.j_expr) {
-              this.state.context.push(tc.templateQuasi);
-            } else {
-              inner.call(this, prevType);
-            }
-            this.state.exprAllowed = true;
-          } else if (this.match(tt.slash) && prevType === tt.jsxTagStart) {
-            this.state.context.length -= 2; // do not consider JSX expr -> JSX open tag -> ... anymore
-            this.state.context.push(tc.j_cTag); // reconsider as closing tag context
-            this.state.exprAllowed = false;
-          } else {
-            return inner.call(this, prevType);
-          }
-        };
-      });
-    }
-}
diff --git a/ARES-6/Babylon/inspector-blob.js b/ARES-6/Babylon/inspector-blob.js
deleted file mode 100644
index 7dcfbcf..0000000
--- a/ARES-6/Babylon/inspector-blob.js
+++ /dev/null
@@ -1,1146 +0,0 @@
-/*
- * Copyright (C) 2014-2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.ScriptSyntaxTree = class ScriptSyntaxTree extends WebInspector.Object
-{
-    constructor(sourceText, script)
-    {
-        super();
-
-        console.assert(script && script instanceof WebInspector.Script, script);
-
-        this._script = script;
-
-        try {
-            let sourceType = this._script.sourceType === WebInspector.Script.SourceType.Module ? "module" : "script";
-            let esprimaSyntaxTree = esprima.parse(sourceText, {range: true, sourceType});
-            this._syntaxTree = this._createInternalSyntaxTree(esprimaSyntaxTree);
-            this._parsedSuccessfully = true;
-        } catch (error) {
-            this._parsedSuccessfully = false;
-            this._syntaxTree = null;
-            console.error("Couldn't parse JavaScript File: " + script.url, error);
-        }
-    }
-
-    // Public
-
-    get parsedSuccessfully()
-    {
-        return this._parsedSuccessfully;
-    }
-
-    forEachNode(callback)
-    {
-        console.assert(this._parsedSuccessfully);
-        if (!this._parsedSuccessfully)
-            return;
-
-        this._recurse(this._syntaxTree, callback, this._defaultParserState());
-    }
-
-    filter(predicate, startNode)
-    {
-        console.assert(startNode && this._parsedSuccessfully);
-        if (!this._parsedSuccessfully)
-            return [];
-
-        var nodes = [];
-        function filter(node, state)
-        {
-            if (predicate(node))
-                nodes.push(node);
-            else
-                state.skipChildNodes = true;
-        }
-
-        this._recurse(startNode, filter, this._defaultParserState());
-
-        return nodes;
-    }
-
-    containersOfOffset(offset)
-    {
-        console.assert(this._parsedSuccessfully);
-        if (!this._parsedSuccessfully)
-            return [];
-
-        let allNodes = [];
-        const start = 0;
-        const end = 1;
-
-        this.forEachNode((node, state) => {
-            if (node.range[end] < offset)
-                state.skipChildNodes = true;
-            if (node.range[start] > offset)
-                state.shouldStopEarly = true;
-            if (node.range[start] <= offset && node.range[end] >= offset)
-                allNodes.push(node);
-        });
-
-        return allNodes;
-    }
-
-    filterByRange(startOffset, endOffset)
-    {
-        console.assert(this._parsedSuccessfully);
-        if (!this._parsedSuccessfully)
-            return [];
-
-        var allNodes = [];
-        var start = 0;
-        var end = 1;
-        function filterForNodesInRange(node, state)
-        {
-            // program start        range            program end
-            // [                 [         ]               ]
-            //            [ ]  [   [        ] ]  [ ]
-
-            // If a node's range ends before the range we're interested in starts, we don't need to search any of its
-            // enclosing ranges, because, by definition, those enclosing ranges are contained within this node's range.
-            if (node.range[end] < startOffset)
-                state.skipChildNodes = true;
-
-            // We are only interested in nodes whose start position is within our range.
-            if (startOffset <= node.range[start] && node.range[start] <= endOffset)
-                allNodes.push(node);
-
-            // Once we see nodes that start beyond our range, we can quit traversing the AST. We can do this safely
-            // because we know the AST is traversed using depth first search, so it will traverse into enclosing ranges
-            // before it traverses into adjacent ranges.
-            if (node.range[start] > endOffset)
-                state.shouldStopEarly = true;
-        }
-
-        this.forEachNode(filterForNodesInRange);
-
-        return allNodes;
-    }
-
-    containsNonEmptyReturnStatement(startNode)
-    {
-        console.assert(startNode && this._parsedSuccessfully);
-        if (!this._parsedSuccessfully)
-            return false;
-
-        if (startNode.attachments._hasNonEmptyReturnStatement !== undefined)
-            return startNode.attachments._hasNonEmptyReturnStatement;
-
-        function removeFunctionsFilter(node)
-        {
-            return node.type !== WebInspector.ScriptSyntaxTree.NodeType.FunctionExpression
-                && node.type !== WebInspector.ScriptSyntaxTree.NodeType.FunctionDeclaration
-                && node.type !== WebInspector.ScriptSyntaxTree.NodeType.ArrowFunctionExpression;
-        }
-
-        var nodes = this.filter(removeFunctionsFilter, startNode);
-        var hasNonEmptyReturnStatement = false;
-        var returnStatementType = WebInspector.ScriptSyntaxTree.NodeType.ReturnStatement;
-        for (var node of nodes) {
-            if (node.type === returnStatementType && node.argument) {
-                hasNonEmptyReturnStatement = true;
-                break;
-            }
-        }
-
-        startNode.attachments._hasNonEmptyReturnStatement = hasNonEmptyReturnStatement;
-
-        return hasNonEmptyReturnStatement;
-    }
-
-    static functionReturnDivot(node)
-    {
-        console.assert(node.type === WebInspector.ScriptSyntaxTree.NodeType.FunctionDeclaration || node.type === WebInspector.ScriptSyntaxTree.NodeType.FunctionExpression || node.type === WebInspector.ScriptSyntaxTree.NodeType.MethodDefinition || node.type === WebInspector.ScriptSyntaxTree.NodeType.ArrowFunctionExpression);
-
-        // COMPATIBILITY (iOS 9): Legacy Backends view the return type as being the opening "{" of the function body.
-        // After iOS 9, this is to move to the start of the function statement/expression. See below:
-        // FIXME: Need a better way to determine backend versions. Using DOM.pseudoElement because that was added after iOS 9.
-        if (!DOMAgent.hasEvent("pseudoElementAdded"))
-            return node.body.range[0];
-
-        // "f" in "function". "s" in "set". "g" in "get". First letter in any method name for classes and object literals.
-        // The "[" for computed methods in classes and object literals.
-        return node.typeProfilingReturnDivot;
-    }
-
-    updateTypes(nodesToUpdate, callback)
-    {
-        console.assert(RuntimeAgent.getRuntimeTypesForVariablesAtOffsets);
-        console.assert(Array.isArray(nodesToUpdate) && this._parsedSuccessfully);
-
-        if (!this._parsedSuccessfully)
-            return;
-
-        var allRequests = [];
-        var allRequestNodes = [];
-        var sourceID = this._script.id;
-
-        for (var node of nodesToUpdate) {
-            switch (node.type) {
-            case WebInspector.ScriptSyntaxTree.NodeType.FunctionDeclaration:
-            case WebInspector.ScriptSyntaxTree.NodeType.FunctionExpression:
-            case WebInspector.ScriptSyntaxTree.NodeType.ArrowFunctionExpression:
-                for (var param of node.params) {
-                    for (var identifier of this._gatherIdentifiersInDeclaration(param)) {
-                        allRequests.push({
-                            typeInformationDescriptor: WebInspector.ScriptSyntaxTree.TypeProfilerSearchDescriptor.NormalExpression,
-                            sourceID,
-                            divot: identifier.range[0]
-                        });
-                        allRequestNodes.push(identifier);
-                    }
-                }
-
-                allRequests.push({
-                    typeInformationDescriptor: WebInspector.ScriptSyntaxTree.TypeProfilerSearchDescriptor.FunctionReturn,
-                    sourceID,
-                    divot: WebInspector.ScriptSyntaxTree.functionReturnDivot(node)
-                });
-                allRequestNodes.push(node);
-                break;
-            case WebInspector.ScriptSyntaxTree.NodeType.VariableDeclarator:
-                for (var identifier of this._gatherIdentifiersInDeclaration(node.id)) {
-                    allRequests.push({
-                        typeInformationDescriptor: WebInspector.ScriptSyntaxTree.TypeProfilerSearchDescriptor.NormalExpression,
-                        sourceID,
-                        divot: identifier.range[0]
-                    });
-                    allRequestNodes.push(identifier);
-                }
-                break;
-            }
-        }
-
-        console.assert(allRequests.length === allRequestNodes.length);
-
-        function handleTypes(error, typeInformationArray)
-        {
-            if (error)
-                return;
-
-            console.assert(typeInformationArray.length === allRequests.length);
-
-            for (var i = 0; i < typeInformationArray.length; i++) {
-                var node = allRequestNodes[i];
-                var typeInformation = WebInspector.TypeDescription.fromPayload(typeInformationArray[i]);
-                if (allRequests[i].typeInformationDescriptor === WebInspector.ScriptSyntaxTree.TypeProfilerSearchDescriptor.FunctionReturn)
-                    node.attachments.returnTypes = typeInformation;
-                else
-                    node.attachments.types = typeInformation;
-            }
-
-            callback(allRequestNodes);
-        }
-
-        this._script.target.RuntimeAgent.getRuntimeTypesForVariablesAtOffsets(allRequests, handleTypes);
-    }
-
-    // Private
-
-    _gatherIdentifiersInDeclaration(node)
-    {
-        function gatherIdentifiers(node)
-        {
-            switch (node.type) {
-                case WebInspector.ScriptSyntaxTree.NodeType.Identifier:
-                    return [node];
-                case WebInspector.ScriptSyntaxTree.NodeType.Property:
-                    return gatherIdentifiers(node.value);
-                case WebInspector.ScriptSyntaxTree.NodeType.ObjectPattern:
-                    var identifiers = [];
-                    for (var property of node.properties) {
-                        for (var identifier of gatherIdentifiers(property))
-                            identifiers.push(identifier);
-                    }
-                    return identifiers;
-                case WebInspector.ScriptSyntaxTree.NodeType.ArrayPattern:
-                    var identifiers = [];
-                    for (var element of node.elements) {
-                        for (var identifier of gatherIdentifiers(element))
-                            identifiers.push(identifier);
-                    }
-                    return identifiers;
-                case WebInspector.ScriptSyntaxTree.NodeType.AssignmentPattern:
-                    return gatherIdentifiers(node.left);
-                case WebInspector.ScriptSyntaxTree.NodeType.RestElement:
-                case WebInspector.ScriptSyntaxTree.NodeType.RestProperty:
-                    return gatherIdentifiers(node.argument);
-                default:
-                    console.assert(false, "Unexpected node type in variable declarator: " + node.type);
-                    return [];
-            }
-        }
-
-        console.assert(node.type === WebInspector.ScriptSyntaxTree.NodeType.Identifier || node.type === WebInspector.ScriptSyntaxTree.NodeType.ObjectPattern || node.type === WebInspector.ScriptSyntaxTree.NodeType.ArrayPattern || node.type === WebInspector.ScriptSyntaxTree.NodeType.RestElement || node.type === WebInspector.ScriptSyntaxTree.NodeType.RestProperty);
-
-        return gatherIdentifiers(node);
-    }
-
-    _defaultParserState()
-    {
-        return {
-            shouldStopEarly: false,
-            skipChildNodes: false
-        };
-    }
-
-    _recurse(node, callback, state)
-    {
-        if (!node)
-            return;
-
-        if (state.shouldStopEarly || state.skipChildNodes)
-            return;
-
-        callback(node, state);
-
-        switch (node.type) {
-        case WebInspector.ScriptSyntaxTree.NodeType.AssignmentExpression:
-            this._recurse(node.left, callback, state);
-            this._recurse(node.right, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ArrayExpression:
-        case WebInspector.ScriptSyntaxTree.NodeType.ArrayPattern:
-            this._recurseArray(node.elements, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.AssignmentPattern:
-            this._recurse(node.left, callback, state);
-            this._recurse(node.right, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.AwaitExpression:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.BlockStatement:
-            this._recurseArray(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.BinaryExpression:
-            this._recurse(node.left, callback, state);
-            this._recurse(node.right, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.BreakStatement:
-            this._recurse(node.label, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.CatchClause:
-            this._recurse(node.param, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.CallExpression:
-            this._recurse(node.callee, callback, state);
-            this._recurseArray(node.arguments, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ClassBody:
-            this._recurseArray(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ClassDeclaration:
-        case WebInspector.ScriptSyntaxTree.NodeType.ClassExpression:
-            this._recurse(node.id, callback, state);
-            this._recurse(node.superClass, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ContinueStatement:
-            this._recurse(node.label, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.DoWhileStatement:
-            this._recurse(node.body, callback, state);
-            this._recurse(node.test, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ExpressionStatement:
-            this._recurse(node.expression, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ForStatement:
-            this._recurse(node.init, callback, state);
-            this._recurse(node.test, callback, state);
-            this._recurse(node.update, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ForInStatement:
-        case WebInspector.ScriptSyntaxTree.NodeType.ForOfStatement:
-            this._recurse(node.left, callback, state);
-            this._recurse(node.right, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.FunctionDeclaration:
-        case WebInspector.ScriptSyntaxTree.NodeType.FunctionExpression:
-        case WebInspector.ScriptSyntaxTree.NodeType.ArrowFunctionExpression:
-            this._recurse(node.id, callback, state);
-            this._recurseArray(node.params, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.IfStatement:
-            this._recurse(node.test, callback, state);
-            this._recurse(node.consequent, callback, state);
-            this._recurse(node.alternate, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.LabeledStatement:
-            this._recurse(node.label, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.LogicalExpression:
-            this._recurse(node.left, callback, state);
-            this._recurse(node.right, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.MemberExpression:
-            this._recurse(node.object, callback, state);
-            this._recurse(node.property, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.MethodDefinition:
-            this._recurse(node.key, callback, state);
-            this._recurse(node.value, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.NewExpression:
-            this._recurse(node.callee, callback, state);
-            this._recurseArray(node.arguments, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ObjectExpression:
-        case WebInspector.ScriptSyntaxTree.NodeType.ObjectPattern:
-            this._recurseArray(node.properties, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.Program:
-            this._recurseArray(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.Property:
-            this._recurse(node.key, callback, state);
-            this._recurse(node.value, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.RestElement:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.RestProperty:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ReturnStatement:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.SequenceExpression:
-            this._recurseArray(node.expressions, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.SpreadElement:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.SpreadProperty:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.SwitchStatement:
-            this._recurse(node.discriminant, callback, state);
-            this._recurseArray(node.cases, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.SwitchCase:
-            this._recurse(node.test, callback, state);
-            this._recurseArray(node.consequent, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ConditionalExpression:
-            this._recurse(node.test, callback, state);
-            this._recurse(node.consequent, callback, state);
-            this._recurse(node.alternate, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.TaggedTemplateExpression:
-            this._recurse(node.tag, callback, state);
-            this._recurse(node.quasi, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.TemplateLiteral:
-            this._recurseArray(node.quasis, callback, state);
-            this._recurseArray(node.expressions, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ThrowStatement:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.TryStatement:
-            this._recurse(node.block, callback, state);
-            this._recurse(node.handler, callback, state);
-            this._recurse(node.finalizer, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.UnaryExpression:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.UpdateExpression:
-            this._recurse(node.argument, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.VariableDeclaration:
-            this._recurseArray(node.declarations, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.VariableDeclarator:
-            this._recurse(node.id, callback, state);
-            this._recurse(node.init, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.WhileStatement:
-            this._recurse(node.test, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.WithStatement:
-            this._recurse(node.object, callback, state);
-            this._recurse(node.body, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.YieldExpression:
-            this._recurse(node.argument, callback, state);
-            break;
-
-        // Modules.
-
-        case WebInspector.ScriptSyntaxTree.NodeType.ExportAllDeclaration:
-            this._recurse(node.source, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ExportNamedDeclaration:
-            this._recurse(node.declaration, callback, state);
-            this._recurseArray(node.specifiers, callback, state);
-            this._recurse(node.source, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ExportDefaultDeclaration:
-            this._recurse(node.declaration, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ExportSpecifier:
-            this._recurse(node.local, callback, state);
-            this._recurse(node.exported, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ImportDeclaration:
-            this._recurseArray(node.specifiers, callback, state);
-            this._recurse(node.source, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ImportDefaultSpecifier:
-            this._recurse(node.local, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ImportNamespaceSpecifier:
-            this._recurse(node.local, callback, state);
-            break;
-        case WebInspector.ScriptSyntaxTree.NodeType.ImportSpecifier:
-            this._recurse(node.imported, callback, state);
-            this._recurse(node.local, callback, state);
-            break;
-
-        // All the leaf nodes go here.
-        case WebInspector.ScriptSyntaxTree.NodeType.DebuggerStatement:
-        case WebInspector.ScriptSyntaxTree.NodeType.EmptyStatement:
-        case WebInspector.ScriptSyntaxTree.NodeType.Identifier:
-        case WebInspector.ScriptSyntaxTree.NodeType.Import:
-        case WebInspector.ScriptSyntaxTree.NodeType.Literal:
-        case WebInspector.ScriptSyntaxTree.NodeType.MetaProperty:
-        case WebInspector.ScriptSyntaxTree.NodeType.Super:
-        case WebInspector.ScriptSyntaxTree.NodeType.ThisExpression:
-        case WebInspector.ScriptSyntaxTree.NodeType.TemplateElement:
-            break;
-        }
-
-        state.skipChildNodes = false;
-    }
-
-    _recurseArray(array, callback, state)
-    {
-        for (var node of array)
-            this._recurse(node, callback, state);
-    }
-
-    // This function translates from esprima's Abstract Syntax Tree to ours.
-    // Mostly, this is just the identity function. We've added an extra typeProfilingReturnDivot property for functions/methods.
-    // Our AST complies with the Mozilla parser API:
-    // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API
-    _createInternalSyntaxTree(node)
-    {
-        if (!node)
-            return null;
-
-        var result = null;
-        switch (node.type) {
-        case "ArrayExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ArrayExpression,
-                elements: node.elements.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ArrayPattern":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ArrayPattern,
-                elements: node.elements.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ArrowFunctionExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ArrowFunctionExpression,
-                id: this._createInternalSyntaxTree(node.id),
-                params: node.params.map(this._createInternalSyntaxTree, this),
-                body: this._createInternalSyntaxTree(node.body),
-                generator: node.generator,
-                expression: node.expression, // Boolean indicating if the body a single expression or a block statement.
-                async: node.async,
-                typeProfilingReturnDivot: node.range[0]
-            };
-            break;
-        case "AssignmentExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.AssignmentExpression,
-                operator: node.operator,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right)
-            };
-            break;
-        case "AssignmentPattern":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.AssignmentPattern,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right),
-            };
-            break;
-        case "AwaitExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.AwaitExpression,
-                argument: this._createInternalSyntaxTree(node.argument),
-            };
-            break;
-        case "BlockStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.BlockStatement,
-                body: node.body.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "BinaryExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.BinaryExpression,
-                operator: node.operator,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right)
-            };
-            break;
-        case "BreakStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.BreakStatement,
-                label: this._createInternalSyntaxTree(node.label)
-            };
-            break;
-        case "CallExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.CallExpression,
-                callee: this._createInternalSyntaxTree(node.callee),
-                arguments: node.arguments.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "CatchClause":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.CatchClause,
-                param: this._createInternalSyntaxTree(node.param),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "ClassBody":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ClassBody,
-                body: node.body.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ClassDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ClassDeclaration,
-                id: this._createInternalSyntaxTree(node.id),
-                superClass: this._createInternalSyntaxTree(node.superClass),
-                body: this._createInternalSyntaxTree(node.body),
-            };
-            break;
-        case "ClassExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ClassExpression,
-                id: this._createInternalSyntaxTree(node.id),
-                superClass: this._createInternalSyntaxTree(node.superClass),
-                body: this._createInternalSyntaxTree(node.body),
-            };
-            break;
-        case "ConditionalExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ConditionalExpression,
-                test: this._createInternalSyntaxTree(node.test),
-                consequent: this._createInternalSyntaxTree(node.consequent),
-                alternate: this._createInternalSyntaxTree(node.alternate)
-            };
-            break;
-        case "ContinueStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ContinueStatement,
-                label: this._createInternalSyntaxTree(node.label)
-            };
-            break;
-        case "DoWhileStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.DoWhileStatement,
-                body: this._createInternalSyntaxTree(node.body),
-                test: this._createInternalSyntaxTree(node.test)
-            };
-            break;
-        case "DebuggerStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.DebuggerStatement
-            };
-            break;
-        case "EmptyStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.EmptyStatement
-            };
-            break;
-        case "ExpressionStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ExpressionStatement,
-                expression: this._createInternalSyntaxTree(node.expression)
-            };
-            break;
-        case "ForStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ForStatement,
-                init: this._createInternalSyntaxTree(node.init),
-                test: this._createInternalSyntaxTree(node.test),
-                update: this._createInternalSyntaxTree(node.update),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "ForInStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ForInStatement,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "ForOfStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ForOfStatement,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "FunctionDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.FunctionDeclaration,
-                id: this._createInternalSyntaxTree(node.id),
-                params: node.params.map(this._createInternalSyntaxTree, this),
-                body: this._createInternalSyntaxTree(node.body),
-                generator: node.generator,
-                async: node.async,
-                typeProfilingReturnDivot: node.range[0]
-            };
-            break;
-        case "FunctionExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.FunctionExpression,
-                id: this._createInternalSyntaxTree(node.id),
-                params: node.params.map(this._createInternalSyntaxTree, this),
-                body: this._createInternalSyntaxTree(node.body),
-                generator: node.generator,
-                async: node.async,
-                typeProfilingReturnDivot: node.range[0] // This may be overridden in the Property AST node.
-            };
-            break;
-        case "Identifier":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Identifier,
-                name: node.name
-            };
-            break;
-        case "IfStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.IfStatement,
-                test: this._createInternalSyntaxTree(node.test),
-                consequent: this._createInternalSyntaxTree(node.consequent),
-                alternate: this._createInternalSyntaxTree(node.alternate)
-            };
-            break;
-        case "Literal":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Literal,
-                value: node.value,
-                raw: node.raw
-            };
-            break;
-        case "LabeledStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.LabeledStatement,
-                label: this._createInternalSyntaxTree(node.label),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "LogicalExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.LogicalExpression,
-                left: this._createInternalSyntaxTree(node.left),
-                right: this._createInternalSyntaxTree(node.right),
-                operator: node.operator
-            };
-            break;
-        case "MemberExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.MemberExpression,
-                object: this._createInternalSyntaxTree(node.object),
-                property: this._createInternalSyntaxTree(node.property),
-                computed: node.computed
-            };
-            break;
-        case "MetaProperty":
-            // i.e: new.target produces {meta: "new", property: "target"}
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.MetaProperty,
-                meta: this._createInternalSyntaxTree(node.meta),
-                property: this._createInternalSyntaxTree(node.property),
-            };
-            break;
-        case "MethodDefinition":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.MethodDefinition,
-                key: this._createInternalSyntaxTree(node.key),
-                value: this._createInternalSyntaxTree(node.value),
-                computed: node.computed,
-                kind: node.kind,
-                static: node.static
-            };
-            result.value.typeProfilingReturnDivot = node.range[0]; // "g" in "get" or "s" in "set" or "[" in "['computed']" or "m" in "methodName".
-            break;
-        case "NewExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.NewExpression,
-                callee: this._createInternalSyntaxTree(node.callee),
-                arguments: node.arguments.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ObjectExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ObjectExpression,
-                properties: node.properties.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ObjectPattern":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ObjectPattern,
-                properties: node.properties.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "Program":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Program,
-                sourceType: node.sourceType,
-                body: node.body.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "Property":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Property,
-                key: this._createInternalSyntaxTree(node.key),
-                value: this._createInternalSyntaxTree(node.value),
-                kind: node.kind,
-                method: node.method,
-                computed: node.computed
-            };
-            if (result.kind === "get" || result.kind === "set" || result.method)
-                result.value.typeProfilingReturnDivot = node.range[0];  // "g" in "get" or "s" in "set" or "[" in "['computed']" method or "m" in "methodName".
-            break;
-        case "RestElement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.RestElement,
-                argument: this._createInternalSyntaxTree(node.argument)
-            };
-            break;
-        case "RestProperty":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.RestProperty,
-                argument: this._createInternalSyntaxTree(node.argument),
-            };
-            break;
-        case "ReturnStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ReturnStatement,
-                argument: this._createInternalSyntaxTree(node.argument)
-            };
-            break;
-        case "SequenceExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.SequenceExpression,
-                expressions: node.expressions.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "SpreadElement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.SpreadElement,
-                argument: this._createInternalSyntaxTree(node.argument),
-            };
-            break;
-        case "SpreadProperty":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.SpreadProperty,
-                argument: this._createInternalSyntaxTree(node.argument),
-            };
-            break;
-        case "Super":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Super
-            };
-            break;
-        case "SwitchStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.SwitchStatement,
-                discriminant: this._createInternalSyntaxTree(node.discriminant),
-                cases: node.cases.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "SwitchCase":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.SwitchCase,
-                test: this._createInternalSyntaxTree(node.test),
-                consequent: node.consequent.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "TaggedTemplateExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.TaggedTemplateExpression,
-                tag: this._createInternalSyntaxTree(node.tag),
-                quasi: this._createInternalSyntaxTree(node.quasi)
-            };
-            break;
-        case "TemplateElement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.TemplateElement,
-                value: node.value,
-                tail: node.tail
-            };
-            break;
-        case "TemplateLiteral":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.TemplateLiteral,
-                quasis: node.quasis.map(this._createInternalSyntaxTree, this),
-                expressions: node.expressions.map(this._createInternalSyntaxTree, this)
-            };
-            break;
-        case "ThisExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ThisExpression
-            };
-            break;
-        case "ThrowStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ThrowStatement,
-                argument: this._createInternalSyntaxTree(node.argument)
-            };
-            break;
-        case "TryStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.TryStatement,
-                block: this._createInternalSyntaxTree(node.block),
-                handler: this._createInternalSyntaxTree(node.handler),
-                finalizer: this._createInternalSyntaxTree(node.finalizer)
-            };
-            break;
-        case "UnaryExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.UnaryExpression,
-                operator: node.operator,
-                argument: this._createInternalSyntaxTree(node.argument)
-            };
-            break;
-        case "UpdateExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.UpdateExpression,
-                operator: node.operator,
-                prefix: node.prefix,
-                argument: this._createInternalSyntaxTree(node.argument)
-            };
-            break;
-        case "VariableDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.VariableDeclaration,
-                declarations: node.declarations.map(this._createInternalSyntaxTree, this),
-                kind: node.kind
-            };
-            break;
-        case "VariableDeclarator":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.VariableDeclarator,
-                id: this._createInternalSyntaxTree(node.id),
-                init: this._createInternalSyntaxTree(node.init)
-            };
-            break;
-        case "WhileStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.WhileStatement,
-                test: this._createInternalSyntaxTree(node.test),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "WithStatement":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.WithStatement,
-                object: this._createInternalSyntaxTree(node.object),
-                body: this._createInternalSyntaxTree(node.body)
-            };
-            break;
-        case "YieldExpression":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.YieldExpression,
-                argument: this._createInternalSyntaxTree(node.argument),
-                delegate: node.delegate
-            };
-            break;
-
-        // Modules.
-
-        case "ExportAllDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ExportAllDeclaration,
-                source: this._createInternalSyntaxTree(node.source),
-            };
-            break;
-        case "ExportNamedDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ExportNamedDeclaration,
-                declaration: this._createInternalSyntaxTree(node.declaration),
-                specifiers: node.specifiers.map(this._createInternalSyntaxTree, this),
-                source: this._createInternalSyntaxTree(node.source),
-            };
-            break;
-        case "ExportDefaultDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ExportDefaultDeclaration,
-                declaration: this._createInternalSyntaxTree(node.declaration),
-            };
-            break;
-        case "ExportSpecifier":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ExportSpecifier,
-                local: this._createInternalSyntaxTree(node.local),
-                exported: this._createInternalSyntaxTree(node.exported),
-            };
-            break;
-        case "Import":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.Import,
-            };
-            break;
-        case "ImportDeclaration":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ImportDeclaration,
-                specifiers: node.specifiers.map(this._createInternalSyntaxTree, this),
-                source: this._createInternalSyntaxTree(node.source),
-            };
-            break;
-        case "ImportDefaultSpecifier":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ImportDefaultSpecifier,
-                local: this._createInternalSyntaxTree(node.local),
-            };
-            break;
-        case "ImportNamespaceSpecifier":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ImportNamespaceSpecifier,
-                local: this._createInternalSyntaxTree(node.local),
-            };
-            break;
-        case "ImportSpecifier":
-            result = {
-                type: WebInspector.ScriptSyntaxTree.NodeType.ImportSpecifier,
-                imported: this._createInternalSyntaxTree(node.imported),
-                local: this._createInternalSyntaxTree(node.local),
-            };
-            break;
-
-        default:
-            console.error("Unsupported Syntax Tree Node: " + node.type, node);
-            return null;
-        }
-
-        result.range = node.range;
-        // This is an object for which you can add fields to an AST node without worrying about polluting the syntax-related fields of the node.
-        result.attachments = {};
-
-        return result;
-    }
-};
-
-// This should be kept in sync with an enum in JavaSciptCore/runtime/TypeProfiler.h
-WebInspector.ScriptSyntaxTree.TypeProfilerSearchDescriptor = {
-    NormalExpression: 1,
-    FunctionReturn: 2
-};
-
-WebInspector.ScriptSyntaxTree.NodeType = {
-    ArrayExpression: Symbol("array-expression"),
-    ArrayPattern: Symbol("array-pattern"),
-    ArrowFunctionExpression: Symbol("arrow-function-expression"),
-    AssignmentExpression: Symbol("assignment-expression"),
-    AssignmentPattern: Symbol("assignment-pattern"),
-    AwaitExpression: Symbol("await-expression"),
-    BinaryExpression: Symbol("binary-expression"),
-    BlockStatement: Symbol("block-statement"),
-    BreakStatement: Symbol("break-statement"),
-    CallExpression: Symbol("call-expression"),
-    CatchClause: Symbol("catch-clause"),
-    ClassBody: Symbol("class-body"),
-    ClassDeclaration: Symbol("class-declaration"),
-    ClassExpression: Symbol("class-expression"),
-    ConditionalExpression: Symbol("conditional-expression"),
-    ContinueStatement: Symbol("continue-statement"),
-    DebuggerStatement: Symbol("debugger-statement"),
-    DoWhileStatement: Symbol("do-while-statement"),
-    EmptyStatement: Symbol("empty-statement"),
-    ExportAllDeclaration: Symbol("export-all-declaration"),
-    ExportDefaultDeclaration: Symbol("export-default-declaration"),
-    ExportNamedDeclaration: Symbol("export-named-declaration"),
-    ExportSpecifier: Symbol("export-specifier"),
-    ExpressionStatement: Symbol("expression-statement"),
-    ForInStatement: Symbol("for-in-statement"),
-    ForOfStatement: Symbol("for-of-statement"),
-    ForStatement: Symbol("for-statement"),
-    FunctionDeclaration: Symbol("function-declaration"),
-    FunctionExpression: Symbol("function-expression"),
-    Identifier: Symbol("identifier"),
-    IfStatement: Symbol("if-statement"),
-    Import: Symbol("import"),
-    ImportDeclaration: Symbol("import-declaration"),
-    ImportDefaultSpecifier: Symbol("import-default-specifier"),
-    ImportNamespaceSpecifier: Symbol("import-namespace-specifier"),
-    ImportSpecifier: Symbol("import-specifier"),
-    LabeledStatement: Symbol("labeled-statement"),
-    Literal: Symbol("literal"),
-    LogicalExpression: Symbol("logical-expression"),
-    MemberExpression: Symbol("member-expression"),
-    MetaProperty: Symbol("meta-property"),
-    MethodDefinition: Symbol("method-definition"),
-    NewExpression: Symbol("new-expression"),
-    ObjectExpression: Symbol("object-expression"),
-    ObjectPattern: Symbol("object-pattern"),
-    Program: Symbol("program"),
-    Property: Symbol("property"),
-    RestElement: Symbol("rest-element"),
-    RestProperty: Symbol("rest-property"),
-    ReturnStatement: Symbol("return-statement"),
-    SequenceExpression: Symbol("sequence-expression"),
-    SpreadElement: Symbol("spread-element"),
-    SpreadProperty: Symbol("spread-property"),
-    Super: Symbol("super"),
-    SwitchCase: Symbol("switch-case"),
-    SwitchStatement: Symbol("switch-statement"),
-    TaggedTemplateExpression: Symbol("tagged-template-expression"),
-    TemplateElement: Symbol("template-element"),
-    TemplateLiteral: Symbol("template-literal"),
-    ThisExpression: Symbol("this-expression"),
-    ThrowStatement: Symbol("throw-statement"),
-    TryStatement: Symbol("try-statement"),
-    UnaryExpression: Symbol("unary-expression"),
-    UpdateExpression: Symbol("update-expression"),
-    VariableDeclaration: Symbol("variable-declaration"),
-    VariableDeclarator: Symbol("variable-declarator"),
-    WhileStatement: Symbol("while-statement"),
-    WithStatement: Symbol("with-statement"),
-    YieldExpression: Symbol("yield-expression"),
-};
diff --git a/ARES-6/Basic/ast.js b/ARES-6/Basic/ast.js
deleted file mode 100644
index 56558a7..0000000
--- a/ARES-6/Basic/ast.js
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-const Basic = {};
-
-Basic.NumberApply = function(state)
-{
-    // I'd call this arguments but we're in strict mode.
-    let parameters = this.parameters.map(value => value.evaluate(state));
-    
-    return state.getValue(this.name, parameters.length).apply(state, parameters);
-};
-
-Basic.Variable = function(state)
-{
-    let parameters = this.parameters.map(value => value.evaluate(state));
-    
-    return state.getValue(this.name, parameters.length).leftApply(state, parameters);
-}
-
-Basic.Const = function(state)
-{
-    return this.value;
-}
-
-Basic.NumberPow = function(state)
-{
-    return Math.pow(this.left.evaluate(state), this.right.evaluate(state));
-}
-
-Basic.NumberMul = function(state)
-{
-    return this.left.evaluate(state) * this.right.evaluate(state);
-}
-
-Basic.NumberDiv = function(state)
-{
-    return this.left.evaluate(state) / this.right.evaluate(state);
-}
-
-Basic.NumberNeg = function(state)
-{
-    return -this.term.evaluate(state);
-}
-
-Basic.NumberAdd = function(state)
-{
-    return this.left.evaluate(state) + this.right.evaluate(state);
-}
-
-Basic.NumberSub = function(state)
-{
-    return this.left.evaluate(state) - this.right.evaluate(state);
-}
-
-Basic.StringVar = function(state)
-{
-    let value = state.stringValues.get(this.name);
-    if (value == null)
-        state.abort("Could not find string variable " + this.name);
-    return value;
-}
-
-Basic.Equals = function(state)
-{
-    return this.left.evaluate(state) == this.right.evaluate(state);
-}
-
-Basic.NotEquals = function(state)
-{
-    return this.left.evaluate(state) != this.right.evaluate(state);
-}
-
-Basic.LessThan = function(state)
-{
-    return this.left.evaluate(state) < this.right.evaluate(state);
-}
-
-Basic.GreaterThan = function(state)
-{
-    return this.left.evaluate(state) > this.right.evaluate(state);
-}
-
-Basic.LessEqual = function(state)
-{
-    return this.left.evaluate(state) <= this.right.evaluate(state);
-}
-
-Basic.GreaterEqual = function(state)
-{
-    return this.left.evaluate(state) >= this.right.evaluate(state);
-}
-
-Basic.GoTo = function*(state)
-{
-    state.nextLineNumber = this.target;
-}
-
-Basic.GoSub = function*(state)
-{
-    state.subStack.push(state.nextLineNumber);
-    state.nextLineNumber = this.target;
-}
-
-Basic.Def = function*(state)
-{
-    state.validate(!state.values.has(this.name), "Cannot redefine function");
-    state.values.set(this.name, new NumberFunction(this.parameters, this.expression));
-}
-
-Basic.Let = function*(state)
-{
-    this.variable.evaluate(state).assign(this.expression.evaluate(state));
-}
-
-Basic.If = function*(state)
-{
-    if (this.condition.evaluate(state))
-        state.nextLineNumber = this.target;
-}
-
-Basic.Return = function*(state)
-{
-    this.validate(state.subStack.length, "Not in a subroutine");
-    this.nextLineNumber = state.subStack.pop();
-}
-
-Basic.Stop = function*(state)
-{
-    state.nextLineNumber = null;
-}
-
-Basic.On = function*(state)
-{
-    let index = this.expression.evaluate(state);
-    if (!(index >= 1) || !(index <= this.targets.length))
-        state.abort("Index out of bounds: " + index);
-    this.nextLineNumber = this.targets[Math.floor(index)];
-}
-
-Basic.For = function*(state)
-{
-    let sideState = state.getSideState(this);
-    sideState.variable = state.getValue(this.variable, 0).leftApply(state, []);
-    sideState.initialValue = this.initial.evaluate(state);
-    sideState.limitValue = this.limit.evaluate(state);
-    sideState.stepValue = this.step.evaluate(state);
-    sideState.variable.assign(sideState.initialValue);
-    sideState.shouldStop = function() {
-        return (sideState.variable.value - sideState.limitValue) * Math.sign(sideState.stepValue) > 0;
-    };
-    if (sideState.shouldStop())
-        this.nextLineNumber = this.target.lineNumber + 1;
-}
-
-Basic.Next = function*(state)
-{
-    let sideState = state.getSideState(this.target);
-    sideState.variable.assign(sideState.variable.value + sideState.stepValue);
-    if (sideState.shouldStop())
-        return;
-    state.nextLineNumber = this.target.lineNumber + 1;
-}
-
-Basic.Next.isBlockEnd = true;
-
-Basic.Print = function*(state)
-{
-    let string = "";
-    for (let item of this.items) {
-        switch (item.kind) {
-        case "comma":
-            while (string.length % 14)
-                string += " ";
-            break;
-        case "tab": {
-            let value = item.value.evaluate(state);
-            value = Math.max(Math.round(value), 1);
-            while (string.length % value)
-                string += " ";
-            break;
-        }
-        case "string":
-        case "number":
-            string += item.value.evaluate(state);
-            break;
-        default:
-            throw new Error("Bad item kind: " + item.kind);
-        }
-    }
-    
-    yield {kind: "output", string};
-}
-
-Basic.Input = function*(state)
-{
-    let results = yield {kind: "input", numItems: this.items.length};
-    state.validate(results != null && results.length == this.items.length, "Input did not get the right number of items");
-    for (let i = 0; i < results.length; ++i)
-        this.items[i].evaluate(state).assign(results[i]);
-}
-
-Basic.Read = function*(state)
-{
-    for (let item of this.items) {
-        state.validate(state.dataIndex < state.program.data.length, "Attempting to read past the end of data");
-        item.assign(state.program.data[state.dataIndex++]);
-    }
-}
-
-Basic.Restore = function*(state)
-{
-    state.dataIndex = 0;
-}
-
-Basic.Dim = function*(state)
-{
-    for (let item of this.items) {
-        state.validate(!state.values.has(item.name), "Variable " + item.name + " already exists");
-        state.validate(item.bounds.length, "Dim statement is for arrays");
-        state.values.set(item.name, new NumberArray(item.bounds.map(bound => bound + 1)));
-    }
-}
-
-Basic.Randomize = function*(state)
-{
-    state.rng = createRNGWithRandomSeed();
-}
-
-Basic.End = function*(state)
-{
-    state.nextLineNumber = null;
-}
-
-Basic.End.isBlockEnd = true;
-
-Basic.Program = function* programGenerator(state)
-{
-    state.validate(state.program == this, "State must match program");
-    let maxLineNumber = Math.max(...this.statements.keys());
-    while (state.nextLineNumber != null) {
-        state.validate(state.nextLineNumber <= maxLineNumber, "Went out of bounds of the program");
-        let statement = this.statements.get(state.nextLineNumber++);
-        if (statement == null || statement.process == null)
-            continue;
-        state.statement = statement;
-        yield* statement.process(state);
-    }
-}
-
diff --git a/ARES-6/Basic/basic-tests.yaml b/ARES-6/Basic/basic-tests.yaml
deleted file mode 100644
index 6d55fbe..0000000
--- a/ARES-6/Basic/basic-tests.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (C) 2016 Apple Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1.  Redistributions of source code must retain the above copyright
-#     notice, this list of conditions and the following disclaimer. 
-# 2.  Redistributions in binary form must reproduce the above copyright
-#     notice, this list of conditions and the following disclaimer in the
-#     documentation and/or other materials provided with the distribution. 
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
-# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
-# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-- path: .
-  tests:
-    - stress-test.js
-  cmd: defaultRunNoisyTest unless parseRunCommands
-
diff --git a/ARES-6/Basic/basic.js b/ARES-6/Basic/basic.js
deleted file mode 100644
index 88288d1..0000000
--- a/ARES-6/Basic/basic.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-function prepare(string)
-{
-    let program = parse(lex(string)).program();
-    return program.process(new State(program));
-}
-
-function simulate(program, inputs = [])
-{
-    let result = "";
-    let args = [];
-    for (;;) {
-        let next = program.next(...args);
-        args = [];
-        if (next.done)
-            break;
-        if (next.value.kind == "output") {
-            result += next.value.string + "\n";
-            continue;
-        }
-        if (next.value.kind == "input") {
-            args = inputs.splice(0, next.value.numItems);
-            continue;
-        }
-    }
-    return result;
-}
-
diff --git a/ARES-6/Basic/benchmark.js b/ARES-6/Basic/benchmark.js
deleted file mode 100644
index d47351d..0000000
--- a/ARES-6/Basic/benchmark.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class Benchmark {
-    constructor()
-    {
-        this._verbose = false;
-    }
-    
-    runIteration()
-    {
-        function expect(program, expected, ...inputs)
-        {
-            let result = simulate(prepare(program, inputs));
-            if (result != expected)
-                throw new Error("Program " + JSON.stringify(program) + " with inputs " + JSON.stringify(inputs) + " produced " + JSON.stringify(result) + " but we expected " + JSON.stringify(expected));
-        }
-        
-        expect("10 print \"hello, world!\"\n20 end", "hello, world!\n");
-        expect("10 let x = 0\n20 let x = x + 1\n30 print x\n40 if x < 10 then 20\n50 end", "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n");
-        expect("10 print int(rnd * 100)\n20 end\n", "98\n");
-        expect("10 let value = int(rnd * 2000)\n20 print value\n30 if value <> 100 then 10\n40 end", "1974\n697\n1126\n1998\n1658\n264\n1650\n1677\n226\n117\n492\n861\n877\n1969\n38\n1039\n197\n1261\n1102\n1522\n916\n1683\n1943\n1835\n476\n1898\n939\n176\n966\n908\n474\n614\n1326\n564\n1916\n728\n524\n162\n1303\n758\n832\n1279\n1856\n1876\n982\n6\n1613\n1781\n681\n1238\n494\n1583\n1953\n788\n1026\n347\n1116\n1465\n514\n583\n463\n1970\n1573\n412\n1256\n1453\n838\n1538\n1984\n1598\n209\n411\n1700\n546\n861\n91\n132\n884\n378\n693\n11\n433\n1719\n860\n164\n472\n231\n1786\n806\n811\n106\n1697\n118\n980\n890\n1199\n227\n1667\n1933\n1903\n1390\n1595\n923\n1746\n39\n1361\n117\n1297\n923\n901\n1180\n818\n1444\n269\n933\n327\n1744\n1082\n1527\n1260\n622\n528\n318\n856\n296\n1796\n1574\n585\n1871\n111\n827\n1725\n1320\n1868\n1695\n1914\n216\n63\n1847\n156\n671\n893\n127\n1867\n811\n279\n913\n310\n814\n907\n1363\n1624\n1670\n478\n714\n436\n355\n1484\n1628\n1208\n800\n611\n917\n829\n830\n273\n1791\n340\n214\n992\n1444\n442\n1555\n144\n1194\n282\n180\n1228\n1251\n1883\n678\n1555\n347\n72\n1661\n1828\n1090\n1183\n957\n1685\n930\n475\n103\n759\n1725\n1902\n1662\n1587\n61\n614\n863\n1418\n321\n1050\n505\n1622\n1425\n803\n589\n1511\n1098\n1051\n1554\n1898\n27\n747\n813\n1544\n332\n728\n1363\n771\n759\n1145\n1098\n1991\n385\n230\n520\n1369\n1840\n1285\n1562\n1845\n102\n760\n1874\n748\n361\n575\n277\n1661\n1764\n1117\n332\n757\n1766\n1722\n143\n474\n1507\n1294\n1180\n1578\n904\n845\n321\n496\n1911\n1784\n1116\n938\n1591\n1403\n1374\n533\n1085\n452\n708\n1096\n1634\n522\n564\n1397\n1357\n980\n978\n1760\n1088\n1361\n1184\n314\n1242\n217\n133\n1187\n1723\n646\n605\n591\n46\n135\n1420\n1821\n1147\n1211\n61\n244\n1307\n1551\n449\n1122\n1336\n140\n880\n22\n1155\n1326\n590\n1499\n1376\n112\n1771\n1897\n1071\n938\n1685\n1963\n1203\n1296\n804\n1275\n453\n1387\n482\n1262\n1883\n1381\n418\n1417\n1222\n1208\n1263\n632\n450\n1422\n1285\n1408\n644\n665\n275\n363\n1012\n165\n354\n80\n609\n291\n1661\n1724\n117\n407\n59\n906\n1224\n136\n855\n1275\n1468\n482\n1537\n1283\n1784\n1568\n1832\n452\n867\n1546\n1467\n800\n45\n1225\n1890\n465\n1372\n47\n1608\n193\n1345\n1847\n1059\n1788\n518\n52\n1052\n1003\n1210\n1135\n1433\n519\n1558\n39\n1249\n1017\n39\n1713\n1449\n1245\n1354\n82\n1140\n916\n1595\n838\n607\n389\n1270\n821\n247\n1692\n1305\n1211\n1960\n429\n1703\n1635\n575\n1618\n1490\n1495\n682\n1256\n964\n420\n1520\n1429\n1997\n396\n382\n856\n1182\n296\n1295\n298\n1892\n990\n711\n934\n1939\n1339\n682\n1631\n1533\n742\n1520\n1281\n1332\n1042\n656\n1576\n1253\n1608\n375\n169\n14\n414\n1586\n1562\n1508\n1245\n303\n715\n1053\n340\n915\n160\n1796\n111\n925\n1872\n735\n350\n107\n1913\n1653\n987\n825\n1893\n1601\n460\n1228\n1526\n1613\n1359\n1854\n1352\n542\n665\n109\n1874\n467\n533\n1188\n1629\n851\n630\n1060\n1530\n1853\n743\n765\n126\n1540\n1411\n858\n1741\n284\n299\n577\n1848\n1495\n283\n1886\n284\n129\n1077\n1245\n1364\n1505\n176\n1012\n1663\n1306\n1586\n410\n315\n660\n256\n1102\n1289\n1292\n939\n762\n601\n1140\n574\n1851\n44\n560\n1948\n1142\n1787\n947\n948\n280\n1210\n1139\n1072\n1033\n92\n1244\n1589\n1079\n22\n1514\n163\n157\n1742\n1058\n514\n196\n1858\n565\n354\n1413\n792\n183\n526\n1724\n1007\n158\n1229\n1802\n99\n1514\n708\n1276\n1802\n1564\n1387\n1235\n1132\n715\n1584\n617\n1664\n1559\n1625\n1037\n601\n1175\n1713\n107\n88\n384\n1634\n904\n1835\n1472\n212\n1145\n443\n1617\n866\n1963\n937\n1917\n855\n1215\n1867\n520\n892\n1483\n1898\n1747\n1441\n289\n1609\n328\n566\n271\n458\n1616\n843\n1107\n507\n1090\n854\n1094\n806\n166\n408\n661\n334\n230\n1917\n1323\n927\n1912\n673\n311\n952\n1783\n1549\n1714\n1500\n450\n1498\n530\n442\n607\n609\n1226\n370\n1769\n1815\n788\n536\n293\n115\n947\n290\n1764\n243\n1219\n1851\n289\n599\n1528\n150\n1859\n297\n279\n1542\n1719\n1910\n551\n401\n952\n1764\n946\n1835\n647\n1309\n271\n275\n70\n129\n1518\n972\n1164\n816\n1125\n575\n588\n1456\n1154\n290\n1681\n1133\n561\n343\n1360\n1035\n1158\n1365\n744\n781\n58\n531\n271\n1612\n1774\n28\n1480\n1312\n1855\n666\n1574\n613\n42\n456\n351\n727\n1503\n1115\n333\n1972\n822\n1575\n848\n1087\n1262\n1671\n710\n460\n1816\n287\n172\n492\n1079\n582\n1236\n1756\n1792\n1095\n1205\n1894\n22\n1930\n1529\n1547\n1383\n1768\n364\n1108\n1972\n287\n200\n230\n1335\n187\n486\n1722\n20\n963\n792\n1114\n633\n1862\n1433\n829\n737\n215\n1570\n378\n1677\n944\n1301\n1160\n500\n150\n886\n1337\n662\n1062\n290\n460\n592\n1867\n872\n155\n1613\n1913\n1548\n1847\n855\n1702\n952\n1894\n587\n1813\n1021\n21\n654\n254\n910\n1696\n1606\n679\n1222\n696\n1319\n368\n447\n549\n905\n1194\n189\n1766\n616\n278\n1418\n1965\n872\n998\n1268\n1673\n1647\n1163\n533\n1650\n1849\n1124\n1252\n1412\n703\n944\n468\n1485\n1352\n681\n864\n1432\n1771\n497\n956\n1794\n363\n1099\n1804\n457\n1227\n1487\n446\n1993\n1576\n272\n709\n1810\n330\n876\n1107\n1187\n122\n1625\n472\n676\n314\n1257\n1509\n350\n741\n366\n33\n536\n293\n1663\n1039\n1527\n126\n923\n1937\n1767\n1302\n1510\n1518\n1343\n91\n1551\n1614\n1687\n1748\n137\n75\n738\n1977\n751\n237\n313\n566\n24\n202\n889\n1716\n1460\n129\n1760\n1597\n96\n1057\n1323\n1188\n1373\n537\n955\n65\n1679\n1441\n1315\n398\n647\n1470\n1335\n617\n331\n796\n129\n1635\n1497\n836\n855\n1472\n1828\n568\n862\n690\n1370\n1657\n819\n45\n420\n258\n1980\n672\n615\n358\n852\n1148\n1897\n1306\n1092\n1405\n719\n1752\n1456\n1338\n332\n351\n479\n747\n249\n1977\n1671\n1061\n1685\n306\n254\n1060\n764\n420\n1139\n1452\n426\n835\n929\n1424\n1336\n697\n191\n1697\n1897\n644\n546\n982\n359\n1201\n1095\n1623\n1947\n215\n10\n855\n297\n551\n1037\n945\n396\n211\n1059\n423\n1521\n1770\n203\n1828\n879\n1179\n1912\n1028\n1416\n1845\n698\n715\n1857\n817\n50\n473\n1122\n126\n70\n1773\n40\n1970\n1311\n826\n355\n1921\n23\n526\n1717\n1397\n1932\n1075\n1652\n997\n1039\n1481\n779\n415\n49\n1330\n317\n1701\n690\n245\n1824\n639\n799\n1240\n422\n344\n1639\n20\n546\n912\n1930\n1368\n1541\n1109\n369\n66\n1564\n444\n1928\n1963\n1899\n744\n1593\n1702\n100\n");
-
-        expect("10 dim a(2000)\n20 for i = 2 to 2000\n30 let a(i) = 1\n40 next i\n50 for i = 2 to sqr(2000)\n60 if a(i) = 0 then 100\n70 for j = i ^ 2 to 2000 step i\n80 let a(j) = 0\n90 next j\n100 next i\n110 for i = 2 to 2000\n120 if a(i) = 0 then 140\n130 print i\n140 next i\n150 end\n", "2\n3\n5\n7\n11\n13\n17\n19\n23\n29\n31\n37\n41\n43\n47\n53\n59\n61\n67\n71\n73\n79\n83\n89\n97\n101\n103\n107\n109\n113\n127\n131\n137\n139\n149\n151\n157\n163\n167\n173\n179\n181\n191\n193\n197\n199\n211\n223\n227\n229\n233\n239\n241\n251\n257\n263\n269\n271\n277\n281\n283\n293\n307\n311\n313\n317\n331\n337\n347\n349\n353\n359\n367\n373\n379\n383\n389\n397\n401\n409\n419\n421\n431\n433\n439\n443\n449\n457\n461\n463\n467\n479\n487\n491\n499\n503\n509\n521\n523\n541\n547\n557\n563\n569\n571\n577\n587\n593\n599\n601\n607\n613\n617\n619\n631\n641\n643\n647\n653\n659\n661\n673\n677\n683\n691\n701\n709\n719\n727\n733\n739\n743\n751\n757\n761\n769\n773\n787\n797\n809\n811\n821\n823\n827\n829\n839\n853\n857\n859\n863\n877\n881\n883\n887\n907\n911\n919\n929\n937\n941\n947\n953\n967\n971\n977\n983\n991\n997\n1009\n1013\n1019\n1021\n1031\n1033\n1039\n1049\n1051\n1061\n1063\n1069\n1087\n1091\n1093\n1097\n1103\n1109\n1117\n1123\n1129\n1151\n1153\n1163\n1171\n1181\n1187\n1193\n1201\n1213\n1217\n1223\n1229\n1231\n1237\n1249\n1259\n1277\n1279\n1283\n1289\n1291\n1297\n1301\n1303\n1307\n1319\n1321\n1327\n1361\n1367\n1373\n1381\n1399\n1409\n1423\n1427\n1429\n1433\n1439\n1447\n1451\n1453\n1459\n1471\n1481\n1483\n1487\n1489\n1493\n1499\n1511\n1523\n1531\n1543\n1549\n1553\n1559\n1567\n1571\n1579\n1583\n1597\n1601\n1607\n1609\n1613\n1619\n1621\n1627\n1637\n1657\n1663\n1667\n1669\n1693\n1697\n1699\n1709\n1721\n1723\n1733\n1741\n1747\n1753\n1759\n1777\n1783\n1787\n1789\n1801\n1811\n1823\n1831\n1847\n1861\n1867\n1871\n1873\n1877\n1879\n1889\n1901\n1907\n1913\n1931\n1933\n1949\n1951\n1973\n1979\n1987\n1993\n1997\n1999\n");
-    }
-}
diff --git a/ARES-6/Basic/caseless_map.js b/ARES-6/Basic/caseless_map.js
deleted file mode 100644
index 6699137..0000000
--- a/ARES-6/Basic/caseless_map.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class CaselessMap {
-    constructor(otherMap)
-    {
-        if (otherMap == null)
-            this._map = new Map();
-        else
-            this._map = new Map(otherMap._map);
-    }
-    
-    set(key, value)
-    {
-        this._map.set(key.toLowerCase(), value);
-    }
-    
-    has(key)
-    {
-        return this._map.has(key.toLowerCase());
-    }
-    
-    get(key)
-    {
-        return this._map.get(key.toLowerCase());
-    }
-
-    [Symbol.iterator]()
-    {
-        return this._map[Symbol.iterator]();
-    }
-}
-
diff --git a/ARES-6/Basic/lexer.js b/ARES-6/Basic/lexer.js
deleted file mode 100644
index 5dfd831..0000000
--- a/ARES-6/Basic/lexer.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-// Loosely based on ECMA 55 sections 4-8, but loosened to allow for modern conventions, like
-// multi-character variable names. But this doesn't go too far - in particular, this doesn't do
-// unicode, because that would require more thought.
-function* lex(string)
-{
-    let sourceLineNumber = 0;
-    for (let line of string.split("\n")) {
-        ++sourceLineNumber;
-        
-        function consumeWhitespace()
-        {
-            if (/^\s+/.test(line))
-                line = RegExp.rightContext;
-        }
-   
-        function consume(kind)
-        {
-            line = RegExp.rightContext;
-            return {kind, string: RegExp.lastMatch, sourceLineNumber, userLineNumber};
-        }
-        
-        const isIdentifier = /^[a-z_]([a-z0-9_]*)/i;
-        const isNumber = /^(([0-9]+(\.([0-9]*))?)|(\.[0-9]+)(e([+-]?)([0-9]+))?)/i;
-        const isString = /^\"([^\"]|(\"\"))*\"/;
-        const isKeyword = /^((base)|(data)|(def)|(dim)|(end)|(for)|(go)|(gosub)|(goto)|(if)|(input)|(let)|(next)|(on)|(option)|(print)|(randomize)|(read)|(restore)|(return)|(step)|(stop)|(sub)|(then)|(to))/i;
-        const isOperator = /^(-|\+|\*|\/|\^|\(|\)|(<[>=]?)|(>=?)|=|,|\$|;)/;
-        const isRem = /^rem\s.*/;
-        
-        consumeWhitespace();
-        
-        if (!/^[0-9]+/.test(line))
-            throw new Error("At line " + sourceLineNumber + ": Expect line number: " + line);
-        let userLineNumber = +RegExp.lastMatch;
-        line = RegExp.rightContext;
-        yield {kind: "userLineNumber", string: RegExp.lastMatch, sourceLineNumber, userLineNumber};
-        
-        consumeWhitespace();
-        
-        while (line.length) {
-            if (isKeyword.test(line))
-                yield consume("keyword");
-            else if (isIdentifier.test(line))
-                yield consume("identifier");
-            else if (isNumber.test(line)) {
-                let token = consume("number");
-                token.value = +token.string;
-                yield token;
-            } else if (isString.test(line)) {
-                let token = consume("string");
-                token.value = "";
-                for (let i = 1; i < token.string.length - 1; ++i) {
-                    let char = token.string.charAt(i);
-                    if (char == "\"")
-                        i++;
-                    token.value += char;
-                }
-                yield token;
-            } else if (isOperator.test(line))
-                yield consume("operator");
-            else if (isRem.test(line))
-                yield consume("remark");
-            else
-                throw new Error("At line " + sourceLineNumber + ": Cannot lex token: " + line);
-            consumeWhitespace();
-        }
-        
-        // Note: this is necessary for the parser, which may look-ahead without checking if we're
-        // done. Fortunately, it won't look-ahead past a newLine.
-        yield {kind: "newLine", string:"\n", sourceLineNumber, userLineNumber};
-    }
-}
diff --git a/ARES-6/Basic/number.js b/ARES-6/Basic/number.js
deleted file mode 100644
index e3f7a00..0000000
--- a/ARES-6/Basic/number.js
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class NumberValue {
-    constructor(value = 0)
-    {
-        this._value = value;
-    }
-    
-    get value() { return this._value; }
-    
-    apply(state, parameters)
-    {
-        state.validate(parameters.length == 0, "Should not pass arguments to simple numeric variables");
-        return this._value;
-    }
-    
-    leftApply(state, parameters)
-    {
-        state.validate(parameters.length == 0, "Should not pass arguments to simple numeric variables");
-        return this;
-    }
-    
-    assign(value)
-    {
-        this._value = value;
-    }
-}
-
-class NumberArray {
-    constructor(dim = [11])
-    {
-        function allocateDim(index)
-        {
-            let result = new Array(dim[index]);
-            if (index + 1 < dim.length) {
-                for (let i = 0; i < dim[index]; ++i)
-                    result[i] = allocateDim(index + 1);
-            } else {
-                for (let i = 0; i < dim[index]; ++i)
-                    result[i] = new NumberValue();
-            }
-            return result;
-        }
-        
-        this._array = allocateDim(0);
-        this._dim = dim;
-    }
-    
-    apply(state, parameters)
-    {
-        return this.leftApply(state, parameters).apply(state, []);
-    }
-    
-    leftApply(state, parameters)
-    {
-        if (this._dim.length != parameters.length)
-            state.abort("Expected " + this._dim.length + " arguments but " + parameters.length + " were passed.");
-        let result = this._array;
-        for (var i = 0; i < parameters.length; ++i) {
-            let index = Math.floor(parameters[i]);
-            if (!(index >= state.program.base) || !(index < result.length))
-                state.abort("Index out of bounds: " + index);
-            result = result[index];
-        }
-        return result;
-    }
-}
-
-class NumberFunction {
-    constructor(parameters, code)
-    {
-        this._parameters = parameters;
-        this._code = code;
-    }
-    
-    apply(state, parameters)
-    {
-        if (this._parameters.length != parameters.length)
-            state.abort("Expected " + this._parameters.length + " arguments but " + parameters.length + " were passed");
-        let oldValues = state.values;
-        state.values = new Map(oldValues);
-        for (let i = 0; i < parameters.length; ++i)
-            state.values.set(this._parameters[i], parameters[i]);
-        let result = this.code.evaluate(state);
-        state.values = oldValues;
-        return result;
-    }
-    
-    leftApply(state, parameters)
-    {
-        state.abort("Cannot use a function as an lvalue");
-    }
-}
-
-class NativeFunction {
-    constructor(callback)
-    {
-        this._callback = callback;
-    }
-    
-    apply(state, parameters)
-    {
-        if (this._callback.length != parameters.length)
-            state.abort("Expected " + this._callback.length + " arguments but " + parameters.length + " were passed");
-        return this._callback(...parameters);
-    }
-    
-    leftApply(state, parameters)
-    {
-        state.abort("Cannot use a native function as an lvalue");
-    }
-}
-
diff --git a/ARES-6/Basic/parser.js b/ARES-6/Basic/parser.js
deleted file mode 100644
index 562e157..0000000
--- a/ARES-6/Basic/parser.js
+++ /dev/null
@@ -1,558 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-function parse(tokenizer)
-{
-    let program;
-    
-    let pushBackBuffer = [];
-    
-    function nextToken()
-    {
-        if (pushBackBuffer.length)
-            return pushBackBuffer.pop();
-        let result = tokenizer.next();
-        if (result.done)
-            return {kind: "endOfFile", string: "<end of file>"};
-        return result.value;
-    }
-    
-    function pushToken(token)
-    {
-        pushBackBuffer.push(token);
-    }
-    
-    function peekToken()
-    {
-        let result = nextToken();
-        pushToken(result);
-        return result;
-    }
-    
-    function consumeKind(kind)
-    {
-        let token = nextToken();
-        if (token.kind != kind) {
-            throw new Error("At " + token.sourceLineNumber + ": expected " + kind + " but got: " + token.string);
-        }
-        return token;
-    }
-    
-    function consumeToken(string)
-    {
-        let token = nextToken();
-        if (token.string.toLowerCase() != string.toLowerCase())
-            throw new Error("At " + token.sourceLineNumber + ": expected " + string + " but got: " + token.string);
-        return token;
-    }
-    
-    function parseVariable()
-    {
-        let name = consumeKind("identifier").string;
-        let result = {evaluate: Basic.Variable, name, parameters: []};
-        if (peekToken().string == "(") {
-            do {
-                nextToken();
-                result.parameters.push(parseNumericExpression());
-            } while (peekToken().string == ",");
-            consumeToken(")");
-        }
-        return result;
-    }
-    
-    function parseNumericExpression()
-    {
-        function parsePrimary()
-        {
-            let token = nextToken();
-            switch (token.kind) {
-            case "identifier": {
-                let result = {evaluate: Basic.NumberApply, name: token.string, parameters: []};
-                if (peekToken().string == "(") {
-                    do {
-                        nextToken();
-                        result.parameters.push(parseNumericExpression());
-                    } while (peekToken().string == ",");
-                    consumeToken(")");
-                }
-                return result;
-            }
-                
-            case "number":
-                return {evaluate: Basic.Const, value: token.value};
-                
-            case "operator":
-                switch (token.string) {
-                case "(": {
-                    let result = parseNumericExpression();
-                    consumeToken(")");
-                    return result;
-                } }
-                break;
-            }
-            throw new Error("At " + token.sourceLineNumber + ": expected identifier, number, or (, but got: " + token.string);
-        }
-        
-        function parseFactor()
-        {
-            let primary = parsePrimary();
-            
-            let ok = true;
-            while (ok) {
-                switch (peekToken().string) {
-                case "^":
-                    nextToken();
-                    primary = {evaluate: Basic.NumberPow, left: primary, right: parsePrimary()};
-                    break;
-                default:
-                    ok = false;
-                    break;
-                }
-            }
-            
-            return primary;
-        }
-        
-        function parseTerm()
-        {
-            let factor = parseFactor();
-            
-            let ok = true;
-            while (ok) {
-                switch (peekToken().string) {
-                case "*":
-                    nextToken();
-                    factor = {evaluate: Basic.NumberMul, left: factor, right: parseFactor()};
-                    break;
-                case "/":
-                    nextToken();
-                    factor = {evaluate: Basic.NumberDiv, left: factor, right: parseFactor()};
-                    break;
-                default:
-                    ok = false;
-                    break;
-                }
-            }
-            
-            return factor;
-        }
-        
-        // Only the leading term in Basic can have a sign.
-        let negate = false;
-        switch (peekToken().string) {
-        case "+":
-            nextToken();
-            break;
-        case "-":
-            negate = true;
-            nextToken()
-            break;
-        }
-        
-        let term = parseTerm();
-        if (negate)
-            term = {evaluate: Basic.NumberNeg, term: term};
-        
-        let ok = true;
-        while (ok) {
-            switch (peekToken().string) {
-            case "+":
-                nextToken();
-                term = {evaluate: Basic.NumberAdd, left: term, right: parseTerm()};
-                break;
-            case "-":
-                nextToken();
-                term = {evaluate: Basic.NumberSub, left: term, right: parseTerm()};
-                break;
-            default:
-                ok = false;
-                break;
-            }
-        }
-        
-        return term;
-    }
-    
-    function parseConstant()
-    {
-        switch (peekToken().string) {
-        case "+":
-            nextToken();
-            return consumeKind("number").value;
-        case "-":
-            nextToken();
-            return -consumeKind("number").value;
-        default:
-            if (isStringExpression())
-                return consumeKind("string").value;
-            return consumeKind("number").value;
-        }
-    }
-    
-    function parseStringExpression()
-    {
-        let token = nextToken();
-        switch (token.kind) {
-        case "string":
-            return {evaluate: Basic.Const, value: token.value};
-        case "identifier":
-            consumeToken("$");
-            return {evaluate: Basic.StringVar, name: token.string};
-        default:
-            throw new Error("At " + token.sourceLineNumber + ": expected string expression but got " + token.string);
-        }
-    }
-    
-    function isStringExpression()
-    {
-        // A string expression must start with a string variable or a string constant.
-        let token = nextToken();
-        if (token.kind == "string") {
-            pushToken(token);
-            return true;
-        }
-        if (token.kind == "identifier") {
-            let result = peekToken().string == "$";
-            pushToken(token);
-            return result;
-        }
-        pushToken(token);
-        return false;
-    }
-    
-    function parseRelationalExpression()
-    {
-        if (isStringExpression()) {
-            let left = parseStringExpression();
-            let operator = nextToken();
-            let evaluate;
-            switch (operator.string) {
-            case "=":
-                evaluate = Basic.Equals;
-                break;
-            case "<>":
-                evaluate = Basic.NotEquals;
-                break;
-            default:
-                throw new Error("At " + operator.sourceLineNumber + ": expected a string comparison operator but got: " + operator.string);
-            }
-            return {evaluate, left, right: parseStringExpression()};
-        }
-        
-        let left = parseNumericExpression();
-        let operator = nextToken();
-        let evaluate;
-        switch (operator.string) {
-        case "=":
-            evaluate = Basic.Equals;
-            break;
-        case "<>":
-            evaluate = Basic.NotEquals;
-            break;
-        case "<":
-            evaluate = Basic.LessThan;
-            break;
-        case ">":
-            evaluate = Basic.GreaterThan;
-            break;
-        case "<=":
-            evaluate = Basic.LessEqual;
-            break;
-        case ">=":
-            evaluate = Basic.GreaterEqual;
-            break;
-        default:
-            throw new Error("At " + operator.sourceLineNumber + ": expected a numeric comparison operator but got: " + operator.string);
-        }
-        return {evaluate, left, right: parseNumericExpression()};
-    }
-    
-    function parseNonNegativeInteger()
-    {
-        let token = nextToken();
-        if (!/^[0-9]+$/.test(token.string))
-            throw new Error("At ", token.sourceLineNumber + ": expected a line number but got: " + token.string);
-        return token.value;
-    }
-    
-    function parseGoToStatement()
-    {
-        statement.kind = Basic.GoTo;
-        statement.target = parseNonNegativeInteger();
-    }
-    
-    function parseGoSubStatement()
-    {
-        statement.kind = Basic.GoSub;
-        statement.target = parseNonNegativeInteger();
-    }
-    
-    function parseStatement()
-    {
-        let statement = {};
-        statement.lineNumber = consumeKind("userLineNumber").userLineNumber;
-        program.statements.set(statement.lineNumber, statement);
-        
-        let command = nextToken();
-        statement.sourceLineNumber = command.sourceLineNumber;
-        switch (command.kind) {
-        case "keyword":
-            switch (command.string.toLowerCase()) {
-            case "def":
-                statement.process = Basic.Def;
-                statement.name = consumeKind("identifier");
-                statement.parameters = [];
-                if (peekToken().string == "(") {
-                    do {
-                        nextToken();
-                        statement.parameters.push(consumeKind("identifier"));
-                    } while (peekToken().string == ",");
-                }
-                statement.expression = parseNumericExpression();
-                break;
-            case "let":
-                statement.process = Basic.Let;
-                statement.variable = parseVariable();
-                consumeToken("=");
-                if (statement.process == Basic.Let)
-                    statement.expression = parseNumericExpression();
-                else
-                    statement.expression = parseStringExpression();
-                break;
-            case "go": {
-                let next = nextToken();
-                if (next.string == "to")
-                    parseGoToStatement();
-                else if (next.string == "sub")
-                    parseGoSubStatement();
-                else
-                    throw new Error("At " + next.sourceLineNumber + ": expected to or sub but got: " + next.string);
-                break;
-            }
-            case "goto":
-                parseGoToStatement();
-                break;
-            case "gosub":
-                parseGoSubStatement();
-                break;
-            case "if":
-                statement.process = Basic.If;
-                statement.condition = parseRelationalExpression();
-                consumeToken("then");
-                statement.target = parseNonNegativeInteger();
-                break;
-            case "return":
-                statement.process = Basic.Return;
-                break;
-            case "stop":
-                statement.process = Basic.Stop;
-                break;
-            case "on":
-                statement.process = Basic.On;
-                statement.expression = parseNumericExpression();
-                if (peekToken().string == "go") {
-                    consumeToken("go");
-                    consumeToken("to");
-                } else
-                    consumeToken("goto");
-                statement.targets = [];
-                for (;;) {
-                    statement.targets.push(parseNonNegativeInteger());
-                    if (peekToken().string != ",")
-                        break;
-                    nextToken();
-                }
-                break;
-            case "for":
-                statement.process = Basic.For;
-                statement.variable = consumeKind("identifier").string;
-                consumeToken("=");
-                statement.initial = parseNumericExpression();
-                consumeToken("to");
-                statement.limit = parseNumericExpression();
-                if (peekToken().string == "step") {
-                    nextToken();
-                    statement.step = parseNumericExpression();
-                } else
-                    statement.step = {evaluate: Basic.Const, value: 1};
-                consumeKind("newLine");
-                let lastStatement = parseStatements();
-                if (lastStatement.process != Basic.Next)
-                    throw new Error("At " + lastStatement.sourceLineNumber + ": expected next statement");
-                if (lastStatement.variable != statement.variable)
-                    throw new Error("At " + lastStatement.sourceLineNumber + ": expected next for " + statement.variable + " but got " + lastStatement.variable);
-                lastStatement.target = statement;
-                statement.target = lastStatement;
-                return statement;
-            case "next":
-                statement.process = Basic.Next;
-                statement.variable = consumeKind("identifier").string;
-                break;
-            case "print": {
-                statement.process = Basic.Print;
-                statement.items = [];
-                let ok = true;
-                while (ok) {
-                    switch (peekToken().string) {
-                    case ",":
-                        nextToken();
-                        statement.items.push({kind: "comma"});
-                        break;
-                    case ";":
-                        nextToken();
-                        break;
-                    case "tab":
-                        nextToken();
-                        consumeToken("(");
-                        statement.items.push({kind: "tab", value: parseNumericExpression()});
-                        break;
-                    case "\n":
-                        ok = false;
-                        break;
-                    default:
-                        if (isStringExpression()) {
-                            statement.items.push({kind: "string", value: parseStringExpression()});
-                            break;
-                        }
-                        statement.items.push({kind: "number", value: parseNumericExpression()});
-                        break;
-                    }
-                }
-                break;
-            }
-            case "input":
-                statement.process = Basic.Input;
-                statement.items = [];
-                for (;;) {
-                    stament.items.push(parseVariable());
-                    if (peekToken().string != ",")
-                        break;
-                    nextToken();
-                }
-                break;
-            case "read":
-                statement.process = Basic.Read;
-                statement.items = [];
-                for (;;) {
-                    stament.items.push(parseVariable());
-                    if (peekToken().string != ",")
-                        break;
-                    nextToken();
-                }
-                break;
-            case "restore":
-                statement.process = Basic.Restore;
-                break;
-            case "data":
-                for (;;) {
-                    program.data.push(parseConstant());
-                    if (peekToken().string != ",")
-                        break;
-                    nextToken();
-                }
-                break;
-            case "dim":
-                statement.process = Basic.Dim;
-                statement.items = [];
-                for (;;) {
-                    let name = consumeKind("identifier").string;
-                    consumeToken("(");
-                    let bounds = [];
-                    bounds.push(parseNonNegativeInteger());
-                    if (peekToken().string == ",") {
-                        nextToken();
-                        bounds.push(parseNonNegativeInteger());
-                    }
-                    consumeToken(")");
-                    statement.items.push({name, bounds});
-                    
-                    if (peekToken().string != ",")
-                        break;
-                    consumeToken(",");
-                }
-                break;
-            case "option": {
-                consumeToken("base");
-                let base = parseNonNegativeInteger();
-                if (base != 0 && base != 1)
-                    throw new Error("At " + command.sourceLineNumber + ": unexpected base: " + base);
-                program.base = base;
-                break;
-            }
-            case "randomize":
-                statement.process = Basic.Randomize;
-                break;
-            case "end":
-                statement.process = Basic.End;
-                break;
-            default:
-                throw new Error("At " + command.sourceLineNumber + ": unexpected command but got: " + command.string);
-            }
-            break;
-        case "remark":
-            // Just ignore it.
-            break;
-        default:
-            throw new Error("At " + command.sourceLineNumber + ": expected command but got: " + command.string + " (of kind " + command.kind + ")");
-        }
-        
-        consumeKind("newLine");
-        return statement;
-    }
-    
-    function parseStatements()
-    {
-        let statement;
-        do {
-            statement = parseStatement();
-        } while (!statement.process || !statement.process.isBlockEnd);
-        return statement;
-    }
-    
-    return {
-        program()
-        {
-            program = {
-                process: Basic.Program,
-                statements: new Map(),
-                data: [],
-                base: 0
-            };
-            let lastStatement = parseStatements(program.statements);
-            if (lastStatement.process != Basic.End)
-                throw new Error("At " + lastStatement.sourceLineNumber + ": expected end");
-            
-            return program;
-        },
-        
-        statement(program_)
-        {
-            program = program_;
-            return parseStatement();
-        }
-    };
-}
-
diff --git a/ARES-6/Basic/random.js b/ARES-6/Basic/random.js
deleted file mode 100644
index d940c0e..0000000
--- a/ARES-6/Basic/random.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
-// Copyright (C) 2015-2016 Apple Inc. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"use strict";
-
-// This is based on Octane's RNG.
-function createRNG(seed)
-{
-    return function() {
-        // Robert Jenkins' 32 bit integer hash function.
-        seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
-        seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
-        seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
-        seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
-        seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
-        seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
-        return (seed & 0xfffffff) / 0x10000000;
-    };
-}
-
-function createRNGWithFixedSeed()
-{
-    // This uses Octane's initial seed.
-    return createRNG(49734321);
-}
-
-function createRNGWithRandomSeed()
-{
-    return createRNG((Math.random() * 4294967296) | 0);
-}
diff --git a/ARES-6/Basic/state.js b/ARES-6/Basic/state.js
deleted file mode 100644
index 2c45971..0000000
--- a/ARES-6/Basic/state.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-class State {
-    constructor(program)
-    {
-        this.values = new CaselessMap();
-        this.stringValues = new CaselessMap();
-        this.sideState = new WeakMap();
-        this.statement = null;
-        this.nextLineNumber = 0;
-        this.subStack = [];
-        this.dataIndex = 0;
-        this.program = program;
-        this.rng = createRNGWithFixedSeed();
-        
-        let addNative = (name, callback) => {
-            this.values.set(name, new NativeFunction(callback));
-        };
-        
-        addNative("abs", x => Math.abs(x));
-        addNative("atn", x => Math.atan(x));
-        addNative("cos", x => Math.cos(x));
-        addNative("exp", x => Math.exp(x));
-        addNative("int", x => Math.floor(x));
-        addNative("log", x => Math.log(x));
-        addNative("rnd", () => this.rng());
-        addNative("sgn", x => Math.sign(x));
-        addNative("sin", x => Math.sin(x));
-        addNative("sqr", x => Math.sqrt(x));
-        addNative("tan", x => Math.tan(x));
-    }
-    
-    getValue(name, numParameters)
-    {
-        if (this.values.has(name))
-            return this.values.get(name);
-
-        let result;
-        if (numParameters == 0)
-            result = new NumberValue();
-        else {
-            let dim = [];
-            while (numParameters--)
-                dim.push(11);
-            result = new NumberArray(dim);
-        }
-        this.values.set(name, result);
-        return result;
-    }
-    
-    getSideState(key)
-    {
-        if (!this.sideState.has(key)) {
-            let result = {};
-            this.sideState.set(key, result);
-            return result;
-        }
-        return this.sideState.get(key);
-    }
-    
-    abort(text)
-    {
-        if (!this.statement)
-            throw new Error("At beginning of execution: " + text);
-        throw new Error("At " + this.statement.sourceLineNumber + ": " + text);
-    }
-    
-    validate(predicate, text)
-    {
-        if (!predicate)
-            this.abort(text);
-    }
-}
-
diff --git a/ARES-6/Basic/stress-test.js b/ARES-6/Basic/stress-test.js
deleted file mode 100644
index c169c07..0000000
--- a/ARES-6/Basic/stress-test.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-load("ast.js");
-load("basic.js");
-load("caseless_map.js");
-load("lexer.js");
-load("number.js");
-load("parser.js");
-load("random.js");
-load("state.js");
-load("util.js");
-load("benchmark.js");
-
-let benchmark = new BasicBenchmark();
-let before = preciseTime();
-
-// Run for at least 10 iterations.
-for (let i = 0; i < 10; ++i) {
-    print("Running mandatory iteration #" + (i + 1) + ":");
-    benchmark.runIteration();
-}
-
-// Run until we have been running for two seconds.
-while (preciseTime() < before + 2) {
-    print("Running bonus iteration:");
-    benchmark.runIteration();
-}
-
-print("Success!");
-
diff --git a/ARES-6/Basic/test.html b/ARES-6/Basic/test.html
deleted file mode 100644
index 10c7cad..0000000
--- a/ARES-6/Basic/test.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<html>
-<head>
-<title>Basic</title>
-<script src="ast.js"></script>
-<script src="basic.js"></script>
-<script src="caseless_map.js"></script>
-<script src="lexer.js"></script>
-<script src="number.js"></script>
-<script src="parser.js"></script>
-<script src="random.js"></script>
-<script src="state.js"></script>
-<script src="util.js"></script>
-<script src="benchmark.js"></script>
-<script>
-    function runTest() {
-        try {
-            var result = runBenchmark();
-            document.getElementById("result-summary").innerHTML = "That took " + result + " ms.";
-        } catch (e) {
-            document.getElementById("result-summary").innerHTML = "Failed: " + e;
-        }
-    }
-</script>
-</head>
-<body>
-<h1>Basic</h1>
-<p>
-  <div id="result-summary"></div>
-  <div><a href="javascript:runTest()">Start Test</a></div>
-</p>
-</body>
-</html>
-
-
diff --git a/ARES-6/Basic/test.js b/ARES-6/Basic/test.js
deleted file mode 100644
index 3c4b339..0000000
--- a/ARES-6/Basic/test.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-
-load("ast.js");
-load("basic.js");
-load("caseless_map.js");
-load("lexer.js");
-load("number.js");
-load("parser.js");
-load("random.js");
-load("state.js");
-load("util.js");
-
-load("benchmark.js");
-
-let result = runBenchmark();
-print("That took " + result + " ms.");
diff --git a/ARES-6/Basic/util.js b/ARES-6/Basic/util.js
deleted file mode 100644
index b612050..0000000
--- a/ARES-6/Basic/util.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-"use strict";
-
-let currentTime;
-if (this.performance && performance.now)
-    currentTime = function() { return performance.now() };
-else if (this.preciseTime)
-    currentTime = function() { return preciseTime() * 1000; };
-else
-    currentTime = function() { return +new Date(); };
-
diff --git a/ARES-6/ml/benchmark.js b/ARES-6/ml/benchmark.js
deleted file mode 100644
index fad285e..0000000
--- a/ARES-6/ml/benchmark.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-"use strict";
-
-class Benchmark {
-    constructor() { }
-
-    runIteration()
-    {
-        let Matrix = MLMatrix;
-        let ACTIVATION_FUNCTIONS = FeedforwardNeuralNetworksActivationFunctions;
-
-        function run() {
-            
-            let it = (name, f) => {
-                f();
-            };
-
-            function assert(b) {
-                if (!b)
-                    throw new Error("Bad");
-            }
-
-            var functions = Object.keys(ACTIVATION_FUNCTIONS);
-
-            it('Training the neural network with XOR operator', function () {
-                var trainingSet = new Matrix([[0, 0], [0, 1], [1, 0], [1, 1]]);
-                var predictions = [false, true, true, false];
-
-                for (var i = 0; i < functions.length; ++i) {
-                    var options = {
-                        hiddenLayers: [4],
-                        iterations: 40,
-                        learningRate: 0.3,
-                        activation: functions[i]
-                    };
-                    var xorNN = new FeedforwardNeuralNetwork(options);
-
-                    xorNN.train(trainingSet, predictions);
-                    var results = xorNN.predict(trainingSet);
-                }
-            });
-
-            it('Training the neural network with AND operator', function () {
-                var trainingSet = [[0, 0], [0, 1], [1, 0], [1, 1]];
-                var predictions = [[1, 0], [1, 0], [1, 0], [0, 1]];
-
-                for (var i = 0; i < functions.length; ++i) {
-                    var options = {
-                        hiddenLayers: [3],
-                        iterations: 75,
-                        learningRate: 0.3,
-                        activation: functions[i]
-                    };
-                    var andNN = new FeedforwardNeuralNetwork(options);
-                    andNN.train(trainingSet, predictions);
-
-                    var results = andNN.predict(trainingSet);
-                }
-            });
-
-            it('Export and import', function () {
-                var trainingSet = [[0, 0], [0, 1], [1, 0], [1, 1]];
-                var predictions = [0, 1, 1, 1];
-
-                for (var i = 0; i < functions.length; ++i) {
-                    var options = {
-                        hiddenLayers: [4],
-                        iterations: 40,
-                        learningRate: 0.3,
-                        activation: functions[i]
-                    };
-                    var orNN = new FeedforwardNeuralNetwork(options);
-                    orNN.train(trainingSet, predictions);
-
-                    var model = JSON.parse(JSON.stringify(orNN));
-                    var networkNN = FeedforwardNeuralNetwork.load(model);
-
-                    var results = networkNN.predict(trainingSet);
-                }
-            });
-
-            it('Multiclass clasification', function () {
-                var trainingSet = [[0, 0], [0, 1], [1, 0], [1, 1]];
-                var predictions = [2, 0, 1, 0];
-
-                for (var i = 0; i < functions.length; ++i) {
-                    var options = {
-                        hiddenLayers: [4],
-                        iterations: 40,
-                        learningRate: 0.5,
-                        activation: functions[i]
-                    };
-                    var nn = new FeedforwardNeuralNetwork(options);
-                    nn.train(trainingSet, predictions);
-
-                    var result = nn.predict(trainingSet);
-                }
-            });
-
-            it('Big case', function () {
-                var trainingSet = [[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [1, 3], [1, 4], [4, 1],
-                                    [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [5, 5], [4, 5], [3, 5]];
-                var predictions = [[1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0], [1, 0],
-                                    [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1]];
-                for (var i = 0; i < functions.length; ++i) {
-                    var options = {
-                        hiddenLayers: [20],
-                        iterations: 60,
-                        learningRate: 0.01,
-                        activation: functions[i]
-                    };
-                    var nn = new FeedforwardNeuralNetwork(options);
-                    nn.train(trainingSet, predictions);
-
-                    var result = nn.predict([[5, 4]]);
-
-                    assert(result[0][0] < result[0][1]);
-                }
-            });
-        }
-
-        run();
-    }
-}
diff --git a/ARES-6/ml/index.js b/ARES-6/ml/index.js
deleted file mode 100644
index 03871ba..0000000
--- a/ARES-6/ml/index.js
+++ /dev/null
@@ -1,6330 +0,0 @@
-/*
- * The MIT License (MIT)
- * 
- * Copyright (c) 2015 ml.js
- * 
- * 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", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
-*/
-'use strict';
-
-// ml-stat array.js
-const MLStatArray = {};
-{
-    function compareNumbers(a, b) {
-        return a - b;
-    }
-
-    /**
-     * Computes the sum of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.sum = function sum(values) {
-        var sum = 0;
-        for (var i = 0; i < values.length; i++) {
-            sum += values[i];
-        }
-        return sum;
-    };
-
-    /**
-     * Computes the maximum of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.max = function max(values) {
-        var max = values[0];
-        var l = values.length;
-        for (var i = 1; i < l; i++) {
-            if (values[i] > max) max = values[i];
-        }
-        return max;
-    };
-
-    /**
-     * Computes the minimum of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.min = function min(values) {
-        var min = values[0];
-        var l = values.length;
-        for (var i = 1; i < l; i++) {
-            if (values[i] < min) min = values[i];
-        }
-        return min;
-    };
-
-    /**
-     * Computes the min and max of the given values
-     * @param {Array} values
-     * @returns {{min: number, max: number}}
-     */
-    MLStatArray.minMax = function minMax(values) {
-        var min = values[0];
-        var max = values[0];
-        var l = values.length;
-        for (var i = 1; i < l; i++) {
-            if (values[i] < min) min = values[i];
-            if (values[i] > max) max = values[i];
-        }
-        return {
-            min: min,
-            max: max
-        };
-    };
-
-    /**
-     * Computes the arithmetic mean of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.arithmeticMean = function arithmeticMean(values) {
-        var sum = 0;
-        var l = values.length;
-        for (var i = 0; i < l; i++) {
-            sum += values[i];
-        }
-        return sum / l;
-    };
-
-    /**
-     * {@link arithmeticMean}
-     */
-    MLStatArray.mean = MLStatArray.arithmeticMean;
-
-    /**
-     * Computes the geometric mean of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.geometricMean = function geometricMean(values) {
-        var mul = 1;
-        var l = values.length;
-        for (var i = 0; i < l; i++) {
-            mul *= values[i];
-        }
-        return Math.pow(mul, 1 / l);
-    };
-
-    /**
-     * Computes the mean of the log of the given values
-     * If the return value is exponentiated, it gives the same result as the
-     * geometric mean.
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.logMean = function logMean(values) {
-        var lnsum = 0;
-        var l = values.length;
-        for (var i = 0; i < l; i++) {
-            lnsum += Math.log(values[i]);
-        }
-        return lnsum / l;
-    };
-
-    /**
-     * Computes the weighted grand mean for a list of means and sample sizes
-     * @param {Array} means - Mean values for each set of samples
-     * @param {Array} samples - Number of original values for each set of samples
-     * @returns {number}
-     */
-    MLStatArray.grandMean = function grandMean(means, samples) {
-        var sum = 0;
-        var n = 0;
-        var l = means.length;
-        for (var i = 0; i < l; i++) {
-            sum += samples[i] * means[i];
-            n += samples[i];
-        }
-        return sum / n;
-    };
-
-    /**
-     * Computes the truncated mean of the given values using a given percentage
-     * @param {Array} values
-     * @param {number} percent - The percentage of values to keep (range: [0,1])
-     * @param {boolean} [alreadySorted=false]
-     * @returns {number}
-     */
-    MLStatArray.truncatedMean = function truncatedMean(values, percent, alreadySorted) {
-        if (alreadySorted === undefined) alreadySorted = false;
-        if (!alreadySorted) {
-            values = [].concat(values).sort(compareNumbers);
-        }
-        var l = values.length;
-        var k = Math.floor(l * percent);
-        var sum = 0;
-        for (var i = k; i < (l - k); i++) {
-            sum += values[i];
-        }
-        return sum / (l - 2 * k);
-    };
-
-    /**
-     * Computes the harmonic mean of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.harmonicMean = function harmonicMean(values) {
-        var sum = 0;
-        var l = values.length;
-        for (var i = 0; i < l; i++) {
-            if (values[i] === 0) {
-                throw new RangeError('value at index ' + i + 'is zero');
-            }
-            sum += 1 / values[i];
-        }
-        return l / sum;
-    };
-
-    /**
-     * Computes the contraharmonic mean of the given values
-     * @param {Array} values
-     * @returns {number}
-     */
-    MLStatArray.contraHarmonicMean = function contraHarmonicMean(values) {
-        var r1 = 0;
-        var r2 = 0;
-        var l = values.length;
-        for (var i = 0; i < l; i++) {
-            r1 += values[i] * values[i];
-            r2 += values[i];
-        }
-        if (r2 < 0) {
-            throw new RangeError('sum of values is negative');
-        }
-        return r1 / r2;
-    };
-
-    /**
-     * Computes the median of the given values
-     * @param {Array} values
-     * @param {boolean} [alreadySorted=false]
-     * @returns {number}
-     */
-    MLStatArray.median = function median(values, alreadySorted) {
-        if (alreadySorted === undefined) alreadySorted = false;
-        if (!alreadySorted) {
-            values = [].concat(values).sort(compareNumbers);
-        }
-        var l = values.length;
-        var half = Math.floor(l / 2);
-        if (l % 2 === 0) {
-            return (values[half - 1] + values[half]) * 0.5;
-        } else {
-            return values[half];
-        }
-    };
-
-    /**
-     * Computes the variance of the given values
-     * @param {Array} values
-     * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.
-     * @returns {number}
-     */
-    MLStatArray.variance = function variance(values, unbiased) {
-        if (unbiased === undefined) unbiased = true;
-        var theMean = MLStatArray.mean(values);
-        var theVariance = 0;
-        var l = values.length;
-
-        for (var i = 0; i < l; i++) {
-            var x = values[i] - theMean;
-            theVariance += x * x;
-        }
-
-        if (unbiased) {
-            return theVariance / (l - 1);
-        } else {
-            return theVariance / l;
-        }
-    };
-
-    /**
-     * Computes the standard deviation of the given values
-     * @param {Array} values
-     * @param {boolean} [unbiased=true] - if true, divide by (n-1); if false, divide by n.
-     * @returns {number}
-     */
-    MLStatArray.standardDeviation = function standardDeviation(values, unbiased) {
-        return Math.sqrt(MLStatArray.variance(values, unbiased));
-    };
-
-    MLStatArray.standardError = function standardError(values) {
-        return MLStatArray.standardDeviation(values) / Math.sqrt(values.length);
-    };
-
-    /**
-     * IEEE Transactions on biomedical engineering, vol. 52, no. 1, january 2005, p. 76-
-     * Calculate the standard deviation via the Median of the absolute deviation
-     *  The formula for the standard deviation only holds for Gaussian random variables.
-     * @returns {{mean: number, stdev: number}}
-     */
-    MLStatArray.robustMeanAndStdev = function robustMeanAndStdev(y) {
-        var mean = 0, stdev = 0;
-        var length = y.length, i = 0;
-        for (i = 0; i < length; i++) {
-            mean += y[i];
-        }
-        mean /= length;
-        var averageDeviations = new Array(length);
-        for (i = 0; i < length; i++)
-            averageDeviations[i] = Math.abs(y[i] - mean);
-        averageDeviations.sort(compareNumbers);
-        if (length % 2 === 1) {
-            stdev = averageDeviations[(length - 1) / 2] / 0.6745;
-        } else {
-            stdev = 0.5 * (averageDeviations[length / 2] + averageDeviations[length / 2 - 1]) / 0.6745;
-        }
-
-        return {
-            mean: mean,
-            stdev: stdev
-        };
-    };
-
-    MLStatArray.quartiles = function quartiles(values, alreadySorted) {
-        if (typeof (alreadySorted) === 'undefined') alreadySorted = false;
-        if (!alreadySorted) {
-            values = [].concat(values).sort(compareNumbers);
-        }
-
-        var quart = values.length / 4;
-        var q1 = values[Math.ceil(quart) - 1];
-        var q2 = MLStatArray.median(values, true);
-        var q3 = values[Math.ceil(quart * 3) - 1];
-
-        return {q1: q1, q2: q2, q3: q3};
-    };
-
-    MLStatArray.pooledStandardDeviation = function pooledStandardDeviation(samples, unbiased) {
-        return Math.sqrt(MLStatArray.pooledVariance(samples, unbiased));
-    };
-
-    MLStatArray.pooledVariance = function pooledVariance(samples, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var sum = 0;
-        var length = 0, l = samples.length;
-        for (var i = 0; i < l; i++) {
-            var values = samples[i];
-            var vari = MLStatArray.variance(values);
-
-            sum += (values.length - 1) * vari;
-
-            if (unbiased)
-                length += values.length - 1;
-            else
-                length += values.length;
-        }
-        return sum / length;
-    };
-
-    MLStatArray.mode = function mode(values) {
-        var l = values.length,
-            itemCount = new Array(l),
-            i;
-        for (i = 0; i < l; i++) {
-            itemCount[i] = 0;
-        }
-        var itemArray = new Array(l);
-        var count = 0;
-
-        for (i = 0; i < l; i++) {
-            var index = itemArray.indexOf(values[i]);
-            if (index >= 0)
-                itemCount[index]++;
-            else {
-                itemArray[count] = values[i];
-                itemCount[count] = 1;
-                count++;
-            }
-        }
-
-        var maxValue = 0, maxIndex = 0;
-        for (i = 0; i < count; i++) {
-            if (itemCount[i] > maxValue) {
-                maxValue = itemCount[i];
-                maxIndex = i;
-            }
-        }
-
-        return itemArray[maxIndex];
-    };
-
-    MLStatArray.covariance = function covariance(vector1, vector2, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var mean1 = MLStatArray.mean(vector1);
-        var mean2 = MLStatArray.mean(vector2);
-
-        if (vector1.length !== vector2.length)
-            throw 'Vectors do not have the same dimensions';
-
-        var cov = 0, l = vector1.length;
-        for (var i = 0; i < l; i++) {
-            var x = vector1[i] - mean1;
-            var y = vector2[i] - mean2;
-            cov += x * y;
-        }
-
-        if (unbiased)
-            return cov / (l - 1);
-        else
-            return cov / l;
-    };
-
-    MLStatArray.skewness = function skewness(values, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var theMean = MLStatArray.mean(values);
-
-        var s2 = 0, s3 = 0, l = values.length;
-        for (var i = 0; i < l; i++) {
-            var dev = values[i] - theMean;
-            s2 += dev * dev;
-            s3 += dev * dev * dev;
-        }
-        var m2 = s2 / l;
-        var m3 = s3 / l;
-
-        var g = m3 / (Math.pow(m2, 3 / 2.0));
-        if (unbiased) {
-            var a = Math.sqrt(l * (l - 1));
-            var b = l - 2;
-            return (a / b) * g;
-        } else {
-            return g;
-        }
-    };
-
-    MLStatArray.kurtosis = function kurtosis(values, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var theMean = MLStatArray.mean(values);
-        var n = values.length, s2 = 0, s4 = 0;
-
-        for (var i = 0; i < n; i++) {
-            var dev = values[i] - theMean;
-            s2 += dev * dev;
-            s4 += dev * dev * dev * dev;
-        }
-        var m2 = s2 / n;
-        var m4 = s4 / n;
-
-        if (unbiased) {
-            var v = s2 / (n - 1);
-            var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));
-            var b = s4 / (v * v);
-            var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));
-
-            return a * b - 3 * c;
-        } else {
-            return m4 / (m2 * m2) - 3;
-        }
-    };
-
-    MLStatArray.entropy = function entropy(values, eps) {
-        if (typeof (eps) === 'undefined') eps = 0;
-        var sum = 0, l = values.length;
-        for (var i = 0; i < l; i++)
-            sum += values[i] * Math.log(values[i] + eps);
-        return -sum;
-    };
-
-    MLStatArray.weightedMean = function weightedMean(values, weights) {
-        var sum = 0, l = values.length;
-        for (var i = 0; i < l; i++)
-            sum += values[i] * weights[i];
-        return sum;
-    };
-
-    MLStatArray.weightedStandardDeviation = function weightedStandardDeviation(values, weights) {
-        return Math.sqrt(MLStatArray.weightedVariance(values, weights));
-    };
-
-    MLStatArray.weightedVariance = function weightedVariance(values, weights) {
-        var theMean = MLStatArray.weightedMean(values, weights);
-        var vari = 0, l = values.length;
-        var a = 0, b = 0;
-
-        for (var i = 0; i < l; i++) {
-            var z = values[i] - theMean;
-            var w = weights[i];
-
-            vari += w * (z * z);
-            b += w;
-            a += w * w;
-        }
-
-        return vari * (b / (b * b - a));
-    };
-
-    MLStatArray.center = function center(values, inPlace) {
-        if (typeof (inPlace) === 'undefined') inPlace = false;
-
-        var result = values;
-        if (!inPlace)
-            result = [].concat(values);
-
-        var theMean = MLStatArray.mean(result), l = result.length;
-        for (var i = 0; i < l; i++)
-            result[i] -= theMean;
-    };
-
-    MLStatArray.standardize = function standardize(values, standardDev, inPlace) {
-        if (typeof (standardDev) === 'undefined') standardDev = MLStatArray.standardDeviation(values);
-        if (typeof (inPlace) === 'undefined') inPlace = false;
-        var l = values.length;
-        var result = inPlace ? values : new Array(l);
-        for (var i = 0; i < l; i++)
-            result[i] = values[i] / standardDev;
-        return result;
-    };
-
-    MLStatArray.cumulativeSum = function cumulativeSum(array) {
-        var l = array.length;
-        var result = new Array(l);
-        result[0] = array[0];
-        for (var i = 1; i < l; i++)
-            result[i] = result[i - 1] + array[i];
-        return result;
-    };
-}
-
-
-// ml-stat matrix.js
-const MLStatMatrix = {};
-{
-    let arrayStat = MLStatArray;
-
-    function compareNumbers(a, b) {
-        return a - b;
-    }
-
-    MLStatMatrix.max = function max(matrix) {
-        var max = -Infinity;
-        for (var i = 0; i < matrix.length; i++) {
-            for (var j = 0; j < matrix[i].length; j++) {
-                if (matrix[i][j] > max) max = matrix[i][j];
-            }
-        }
-        return max;
-    };
-
-    MLStatMatrix.min = function min(matrix) {
-        var min = Infinity;
-        for (var i = 0; i < matrix.length; i++) {
-            for (var j = 0; j < matrix[i].length; j++) {
-                if (matrix[i][j] < min) min = matrix[i][j];
-            }
-        }
-        return min;
-    };
-
-    MLStatMatrix.minMax = function minMax(matrix) {
-        var min = Infinity;
-        var max = -Infinity;
-        for (var i = 0; i < matrix.length; i++) {
-            for (var j = 0; j < matrix[i].length; j++) {
-                if (matrix[i][j] < min) min = matrix[i][j];
-                if (matrix[i][j] > max) max = matrix[i][j];
-            }
-        }
-        return {
-            min:min,
-            max:max
-        };
-    };
-
-    MLStatMatrix.entropy = function entropy(matrix, eps) {
-        if (typeof (eps) === 'undefined') {
-            eps = 0;
-        }
-        var sum = 0,
-            l1 = matrix.length,
-            l2 = matrix[0].length;
-        for (var i = 0; i < l1; i++) {
-            for (var j = 0; j < l2; j++) {
-                sum += matrix[i][j] * Math.log(matrix[i][j] + eps);
-            }
-        }
-        return -sum;
-    };
-
-    MLStatMatrix.mean = function mean(matrix, dimension) {
-        if (typeof (dimension) === 'undefined') {
-            dimension = 0;
-        }
-        var rows = matrix.length,
-            cols = matrix[0].length,
-            theMean, N, i, j;
-
-        if (dimension === -1) {
-            theMean = [0];
-            N = rows * cols;
-            for (i = 0; i < rows; i++) {
-                for (j = 0; j < cols; j++) {
-                    theMean[0] += matrix[i][j];
-                }
-            }
-            theMean[0] /= N;
-        } else if (dimension === 0) {
-            theMean = new Array(cols);
-            N = rows;
-            for (j = 0; j < cols; j++) {
-                theMean[j] = 0;
-                for (i = 0; i < rows; i++) {
-                    theMean[j] += matrix[i][j];
-                }
-                theMean[j] /= N;
-            }
-        } else if (dimension === 1) {
-            theMean = new Array(rows);
-            N = cols;
-            for (j = 0; j < rows; j++) {
-                theMean[j] = 0;
-                for (i = 0; i < cols; i++) {
-                    theMean[j] += matrix[j][i];
-                }
-                theMean[j] /= N;
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-        return theMean;
-    };
-
-    MLStatMatrix.sum = function sum(matrix, dimension) {
-        if (typeof (dimension) === 'undefined') {
-            dimension = 0;
-        }
-        var rows = matrix.length,
-            cols = matrix[0].length,
-            theSum, i, j;
-
-        if (dimension === -1) {
-            theSum = [0];
-            for (i = 0; i < rows; i++) {
-                for (j = 0; j < cols; j++) {
-                    theSum[0] += matrix[i][j];
-                }
-            }
-        } else if (dimension === 0) {
-            theSum = new Array(cols);
-            for (j = 0; j < cols; j++) {
-                theSum[j] = 0;
-                for (i = 0; i < rows; i++) {
-                    theSum[j] += matrix[i][j];
-                }
-            }
-        } else if (dimension === 1) {
-            theSum = new Array(rows);
-            for (j = 0; j < rows; j++) {
-                theSum[j] = 0;
-                for (i = 0; i < cols; i++) {
-                    theSum[j] += matrix[j][i];
-                }
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-        return theSum;
-    };
-
-    MLStatMatrix.product = function product(matrix, dimension) {
-        if (typeof (dimension) === 'undefined') {
-            dimension = 0;
-        }
-        var rows = matrix.length,
-            cols = matrix[0].length,
-            theProduct, i, j;
-
-        if (dimension === -1) {
-            theProduct = [1];
-            for (i = 0; i < rows; i++) {
-                for (j = 0; j < cols; j++) {
-                    theProduct[0] *= matrix[i][j];
-                }
-            }
-        } else if (dimension === 0) {
-            theProduct = new Array(cols);
-            for (j = 0; j < cols; j++) {
-                theProduct[j] = 1;
-                for (i = 0; i < rows; i++) {
-                    theProduct[j] *= matrix[i][j];
-                }
-            }
-        } else if (dimension === 1) {
-            theProduct = new Array(rows);
-            for (j = 0; j < rows; j++) {
-                theProduct[j] = 1;
-                for (i = 0; i < cols; i++) {
-                    theProduct[j] *= matrix[j][i];
-                }
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-        return theProduct;
-    };
-
-    MLStatMatrix.standardDeviation = function standardDeviation(matrix, means, unbiased) {
-        var vari = MLStatMatrix.variance(matrix, means, unbiased), l = vari.length;
-        for (var i = 0; i < l; i++) {
-            vari[i] = Math.sqrt(vari[i]);
-        }
-        return vari;
-    };
-
-    MLStatMatrix.variance = function variance(matrix, means, unbiased) {
-        if (typeof (unbiased) === 'undefined') {
-            unbiased = true;
-        }
-        means = means || MLStatMatrix.mean(matrix);
-        var rows = matrix.length;
-        if (rows === 0) return [];
-        var cols = matrix[0].length;
-        var vari = new Array(cols);
-
-        for (var j = 0; j < cols; j++) {
-            var sum1 = 0, sum2 = 0, x = 0;
-            for (var i = 0; i < rows; i++) {
-                x = matrix[i][j] - means[j];
-                sum1 += x;
-                sum2 += x * x;
-            }
-            if (unbiased) {
-                vari[j] = (sum2 - ((sum1 * sum1) / rows)) / (rows - 1);
-            } else {
-                vari[j] = (sum2 - ((sum1 * sum1) / rows)) / rows;
-            }
-        }
-        return vari;
-    };
-
-    MLStatMatrix.median = function median(matrix) {
-        var rows = matrix.length, cols = matrix[0].length;
-        var medians = new Array(cols);
-
-        for (var i = 0; i < cols; i++) {
-            var data = new Array(rows);
-            for (var j = 0; j < rows; j++) {
-                data[j] = matrix[j][i];
-            }
-            data.sort(compareNumbers);
-            var N = data.length;
-            if (N % 2 === 0) {
-                medians[i] = (data[N / 2] + data[(N / 2) - 1]) * 0.5;
-            } else {
-                medians[i] = data[Math.floor(N / 2)];
-            }
-        }
-        return medians;
-    };
-
-    MLStatMatrix.mode = function mode(matrix) {
-        var rows = matrix.length,
-            cols = matrix[0].length,
-            modes = new Array(cols),
-            i, j;
-        for (i = 0; i < cols; i++) {
-            var itemCount = new Array(rows);
-            for (var k = 0; k < rows; k++) {
-                itemCount[k] = 0;
-            }
-            var itemArray = new Array(rows);
-            var count = 0;
-
-            for (j = 0; j < rows; j++) {
-                var index = itemArray.indexOf(matrix[j][i]);
-                if (index >= 0) {
-                    itemCount[index]++;
-                } else {
-                    itemArray[count] = matrix[j][i];
-                    itemCount[count] = 1;
-                    count++;
-                }
-            }
-
-            var maxValue = 0, maxIndex = 0;
-            for (j = 0; j < count; j++) {
-                if (itemCount[j] > maxValue) {
-                    maxValue = itemCount[j];
-                    maxIndex = j;
-                }
-            }
-
-            modes[i] = itemArray[maxIndex];
-        }
-        return modes;
-    };
-
-    MLStatMatrix.skewness = function skewness(matrix, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var means = MLStatMatrix.mean(matrix);
-        var n = matrix.length, l = means.length;
-        var skew = new Array(l);
-
-        for (var j = 0; j < l; j++) {
-            var s2 = 0, s3 = 0;
-            for (var i = 0; i < n; i++) {
-                var dev = matrix[i][j] - means[j];
-                s2 += dev * dev;
-                s3 += dev * dev * dev;
-            }
-
-            var m2 = s2 / n;
-            var m3 = s3 / n;
-            var g = m3 / Math.pow(m2, 3 / 2);
-
-            if (unbiased) {
-                var a = Math.sqrt(n * (n - 1));
-                var b = n - 2;
-                skew[j] = (a / b) * g;
-            } else {
-                skew[j] = g;
-            }
-        }
-        return skew;
-    };
-
-    MLStatMatrix.kurtosis = function kurtosis(matrix, unbiased) {
-        if (typeof (unbiased) === 'undefined') unbiased = true;
-        var means = MLStatMatrix.mean(matrix);
-        var n = matrix.length, m = matrix[0].length;
-        var kurt = new Array(m);
-
-        for (var j = 0; j < m; j++) {
-            var s2 = 0, s4 = 0;
-            for (var i = 0; i < n; i++) {
-                var dev = matrix[i][j] - means[j];
-                s2 += dev * dev;
-                s4 += dev * dev * dev * dev;
-            }
-            var m2 = s2 / n;
-            var m4 = s4 / n;
-
-            if (unbiased) {
-                var v = s2 / (n - 1);
-                var a = (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3));
-                var b = s4 / (v * v);
-                var c = ((n - 1) * (n - 1)) / ((n - 2) * (n - 3));
-                kurt[j] = a * b - 3 * c;
-            } else {
-                kurt[j] = m4 / (m2 * m2) - 3;
-            }
-        }
-        return kurt;
-    };
-
-    MLStatMatrix.standardError = function standardError(matrix) {
-        var samples = matrix.length;
-        var standardDeviations = MLStatMatrix.standardDeviation(matrix);
-        var l = standardDeviations.length;
-        var standardErrors = new Array(l);
-        var sqrtN = Math.sqrt(samples);
-
-        for (var i = 0; i < l; i++) {
-            standardErrors[i] = standardDeviations[i] / sqrtN;
-        }
-        return standardErrors;
-    };
-
-    MLStatMatrix.covariance = function covariance(matrix, dimension) {
-        return MLStatMatrix.scatter(matrix, undefined, dimension);
-    };
-
-    MLStatMatrix.scatter = function scatter(matrix, divisor, dimension) {
-        if (typeof (dimension) === 'undefined') {
-            dimension = 0;
-        }
-        if (typeof (divisor) === 'undefined') {
-            if (dimension === 0) {
-                divisor = matrix.length - 1;
-            } else if (dimension === 1) {
-                divisor = matrix[0].length - 1;
-            }
-        }
-        var means = MLStatMatrix.mean(matrix, dimension);
-        var rows = matrix.length;
-        if (rows === 0) {
-            return [[]];
-        }
-        var cols = matrix[0].length,
-            cov, i, j, s, k;
-
-        if (dimension === 0) {
-            cov = new Array(cols);
-            for (i = 0; i < cols; i++) {
-                cov[i] = new Array(cols);
-            }
-            for (i = 0; i < cols; i++) {
-                for (j = i; j < cols; j++) {
-                    s = 0;
-                    for (k = 0; k < rows; k++) {
-                        s += (matrix[k][j] - means[j]) * (matrix[k][i] - means[i]);
-                    }
-                    s /= divisor;
-                    cov[i][j] = s;
-                    cov[j][i] = s;
-                }
-            }
-        } else if (dimension === 1) {
-            cov = new Array(rows);
-            for (i = 0; i < rows; i++) {
-                cov[i] = new Array(rows);
-            }
-            for (i = 0; i < rows; i++) {
-                for (j = i; j < rows; j++) {
-                    s = 0;
-                    for (k = 0; k < cols; k++) {
-                        s += (matrix[j][k] - means[j]) * (matrix[i][k] - means[i]);
-                    }
-                    s /= divisor;
-                    cov[i][j] = s;
-                    cov[j][i] = s;
-                }
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-
-        return cov;
-    };
-
-    MLStatMatrix.correlation = function correlation(matrix) {
-        var means = MLStatMatrix.mean(matrix),
-            standardDeviations = MLStatMatrix.standardDeviation(matrix, true, means),
-            scores = MLStatMatrix.zScores(matrix, means, standardDeviations),
-            rows = matrix.length,
-            cols = matrix[0].length,
-            i, j;
-
-        var cor = new Array(cols);
-        for (i = 0; i < cols; i++) {
-            cor[i] = new Array(cols);
-        }
-        for (i = 0; i < cols; i++) {
-            for (j = i; j < cols; j++) {
-                var c = 0;
-                for (var k = 0, l = scores.length; k < l; k++) {
-                    c += scores[k][j] * scores[k][i];
-                }
-                c /= rows - 1;
-                cor[i][j] = c;
-                cor[j][i] = c;
-            }
-        }
-        return cor;
-    };
-
-    MLStatMatrix.zScores = function zScores(matrix, means, standardDeviations) {
-        means = means || MLStatMatrix.mean(matrix);
-        if (typeof (standardDeviations) === 'undefined') standardDeviations = MLStatMatrix.standardDeviation(matrix, true, means);
-        return MLStatMatrix.standardize(MLStatMatrix.center(matrix, means, false), standardDeviations, true);
-    };
-
-    MLStatMatrix.center = function center(matrix, means, inPlace) {
-        means = means || MLStatMatrix.mean(matrix);
-        var result = matrix,
-            l = matrix.length,
-            i, j, jj;
-
-        if (!inPlace) {
-            result = new Array(l);
-            for (i = 0; i < l; i++) {
-                result[i] = new Array(matrix[i].length);
-            }
-        }
-
-        for (i = 0; i < l; i++) {
-            var row = result[i];
-            for (j = 0, jj = row.length; j < jj; j++) {
-                row[j] = matrix[i][j] - means[j];
-            }
-        }
-        return result;
-    };
-
-    MLStatMatrix.standardize = function standardize(matrix, standardDeviations, inPlace) {
-        if (typeof (standardDeviations) === 'undefined') standardDeviations = MLStatMatrix.standardDeviation(matrix);
-        var result = matrix,
-            l = matrix.length,
-            i, j, jj;
-
-        if (!inPlace) {
-            result = new Array(l);
-            for (i = 0; i < l; i++) {
-                result[i] = new Array(matrix[i].length);
-            }
-        }
-
-        for (i = 0; i < l; i++) {
-            var resultRow = result[i];
-            var sourceRow = matrix[i];
-            for (j = 0, jj = resultRow.length; j < jj; j++) {
-                if (standardDeviations[j] !== 0 && !isNaN(standardDeviations[j])) {
-                    resultRow[j] = sourceRow[j] / standardDeviations[j];
-                }
-            }
-        }
-        return result;
-    };
-
-    MLStatMatrix.weightedVariance = function weightedVariance(matrix, weights) {
-        var means = MLStatMatrix.mean(matrix);
-        var rows = matrix.length;
-        if (rows === 0) return [];
-        var cols = matrix[0].length;
-        var vari = new Array(cols);
-
-        for (var j = 0; j < cols; j++) {
-            var sum = 0;
-            var a = 0, b = 0;
-
-            for (var i = 0; i < rows; i++) {
-                var z = matrix[i][j] - means[j];
-                var w = weights[i];
-
-                sum += w * (z * z);
-                b += w;
-                a += w * w;
-            }
-
-            vari[j] = sum * (b / (b * b - a));
-        }
-
-        return vari;
-    };
-
-    MLStatMatrix.weightedMean = function weightedMean(matrix, weights, dimension) {
-        if (typeof (dimension) === 'undefined') {
-            dimension = 0;
-        }
-        var rows = matrix.length;
-        if (rows === 0) return [];
-        var cols = matrix[0].length,
-            means, i, ii, j, w, row;
-
-        if (dimension === 0) {
-            means = new Array(cols);
-            for (i = 0; i < cols; i++) {
-                means[i] = 0;
-            }
-            for (i = 0; i < rows; i++) {
-                row = matrix[i];
-                w = weights[i];
-                for (j = 0; j < cols; j++) {
-                    means[j] += row[j] * w;
-                }
-            }
-        } else if (dimension === 1) {
-            means = new Array(rows);
-            for (i = 0; i < rows; i++) {
-                means[i] = 0;
-            }
-            for (j = 0; j < rows; j++) {
-                row = matrix[j];
-                w = weights[j];
-                for (i = 0; i < cols; i++) {
-                    means[j] += row[i] * w;
-                }
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-
-        var weightSum = arrayStat.sum(weights);
-        if (weightSum !== 0) {
-            for (i = 0, ii = means.length; i < ii; i++) {
-                means[i] /= weightSum;
-            }
-        }
-        return means;
-    };
-
-    MLStatMatrix.weightedCovariance = function weightedCovariance(matrix, weights, means, dimension) {
-        dimension = dimension || 0;
-        means = means || MLStatMatrix.weightedMean(matrix, weights, dimension);
-        var s1 = 0, s2 = 0;
-        for (var i = 0, ii = weights.length; i < ii; i++) {
-            s1 += weights[i];
-            s2 += weights[i] * weights[i];
-        }
-        var factor = s1 / (s1 * s1 - s2);
-        return MLStatMatrix.weightedScatter(matrix, weights, means, factor, dimension);
-    };
-
-    MLStatMatrix.weightedScatter = function weightedScatter(matrix, weights, means, factor, dimension) {
-        dimension = dimension || 0;
-        means = means || MLStatMatrix.weightedMean(matrix, weights, dimension);
-        if (typeof (factor) === 'undefined') {
-            factor = 1;
-        }
-        var rows = matrix.length;
-        if (rows === 0) {
-            return [[]];
-        }
-        var cols = matrix[0].length,
-            cov, i, j, k, s;
-
-        if (dimension === 0) {
-            cov = new Array(cols);
-            for (i = 0; i < cols; i++) {
-                cov[i] = new Array(cols);
-            }
-            for (i = 0; i < cols; i++) {
-                for (j = i; j < cols; j++) {
-                    s = 0;
-                    for (k = 0; k < rows; k++) {
-                        s += weights[k] * (matrix[k][j] - means[j]) * (matrix[k][i] - means[i]);
-                    }
-                    cov[i][j] = s * factor;
-                    cov[j][i] = s * factor;
-                }
-            }
-        } else if (dimension === 1) {
-            cov = new Array(rows);
-            for (i = 0; i < rows; i++) {
-                cov[i] = new Array(rows);
-            }
-            for (i = 0; i < rows; i++) {
-                for (j = i; j < rows; j++) {
-                    s = 0;
-                    for (k = 0; k < cols; k++) {
-                        s += weights[k] * (matrix[j][k] - means[j]) * (matrix[i][k] - means[i]);
-                    }
-                    cov[i][j] = s * factor;
-                    cov[j][i] = s * factor;
-                }
-            }
-        } else {
-            throw new Error('Invalid dimension');
-        }
-
-        return cov;
-    };
-}
-
-// ml-stat index.js
-const MLStat = {};
-{
-    MLStat.array = MLStatArray;
-    MLStat.matrix = MLStatMatrix;
-}
-
-
-// ml-array-utils ArrayUtils.js
-const MLArrayUtilsArrayUtils = {};
-{
-    const Stat = MLStat.array;
-    /**
-     * Function that returns an array of points given 1D array as follows:
-     *
-     * [x1, y1, .. , x2, y2, ..]
-     *
-     * And receive the number of dimensions of each point.
-     * @param array
-     * @param dimensions
-     * @returns {Array} - Array of points.
-     */
-    function coordArrayToPoints(array, dimensions) {
-        if(array.length % dimensions !== 0) {
-            throw new RangeError('Dimensions number must be accordance with the size of the array.');
-        }
-
-        var length = array.length / dimensions;
-        var pointsArr = new Array(length);
-
-        var k = 0;
-        for(var i = 0; i < array.length; i += dimensions) {
-            var point = new Array(dimensions);
-            for(var j = 0; j < dimensions; ++j) {
-                point[j] = array[i + j];
-            }
-
-            pointsArr[k] = point;
-            k++;
-        }
-
-        return pointsArr;
-    }
-
-
-    /**
-     * Function that given an array as follows:
-     * [x1, y1, .. , x2, y2, ..]
-     *
-     * Returns an array as follows:
-     * [[x1, x2, ..], [y1, y2, ..], [ .. ]]
-     *
-     * And receives the number of dimensions of each coordinate.
-     * @param array
-     * @param dimensions
-     * @returns {Array} - Matrix of coordinates
-     */
-    function coordArrayToCoordMatrix(array, dimensions) {
-        if(array.length % dimensions !== 0) {
-            throw new RangeError('Dimensions number must be accordance with the size of the array.');
-        }
-
-        var coordinatesArray = new Array(dimensions);
-        var points = array.length / dimensions;
-        for (var i = 0; i < coordinatesArray.length; i++) {
-            coordinatesArray[i] = new Array(points);
-        }
-
-        for(i = 0; i < array.length; i += dimensions) {
-            for(var j = 0; j < dimensions; ++j) {
-                var currentPoint = Math.floor(i / dimensions);
-                coordinatesArray[j][currentPoint] = array[i + j];
-            }
-        }
-
-        return coordinatesArray;
-    }
-
-    /**
-     * Function that receives a coordinate matrix as follows:
-     * [[x1, x2, ..], [y1, y2, ..], [ .. ]]
-     *
-     * Returns an array of coordinates as follows:
-     * [x1, y1, .. , x2, y2, ..]
-     *
-     * @param coordMatrix
-     * @returns {Array}
-     */
-    function coordMatrixToCoordArray(coordMatrix) {
-        var coodinatesArray = new Array(coordMatrix.length * coordMatrix[0].length);
-        var k = 0;
-        for(var i = 0; i < coordMatrix[0].length; ++i) {
-            for(var j = 0; j < coordMatrix.length; ++j) {
-                coodinatesArray[k] = coordMatrix[j][i];
-                ++k;
-            }
-        }
-
-        return coodinatesArray;
-    }
-
-    /**
-     * Tranpose a matrix, this method is for coordMatrixToPoints and
-     * pointsToCoordMatrix, that because only transposing the matrix
-     * you can change your representation.
-     *
-     * @param matrix
-     * @returns {Array}
-     */
-    function transpose(matrix) {
-        var resultMatrix = new Array(matrix[0].length);
-        for(var i = 0; i < resultMatrix.length; ++i) {
-            resultMatrix[i] = new Array(matrix.length);
-        }
-
-        for (i = 0; i < matrix.length; ++i) {
-            for(var j = 0; j < matrix[0].length; ++j) {
-                resultMatrix[j][i] = matrix[i][j];
-            }
-        }
-
-        return resultMatrix;
-    }
-
-    /**
-     * Function that transform an array of points into a coordinates array
-     * as follows:
-     * [x1, y1, .. , x2, y2, ..]
-     *
-     * @param points
-     * @returns {Array}
-     */
-    function pointsToCoordArray(points) {
-        var coodinatesArray = new Array(points.length * points[0].length);
-        var k = 0;
-        for(var i = 0; i < points.length; ++i) {
-            for(var j = 0; j < points[0].length; ++j) {
-                coodinatesArray[k] = points[i][j];
-                ++k;
-            }
-        }
-
-        return coodinatesArray;
-    }
-
-    /**
-     * Apply the dot product between the smaller vector and a subsets of the
-     * largest one.
-     *
-     * @param firstVector
-     * @param secondVector
-     * @returns {Array} each dot product of size of the difference between the
-     *                  larger and the smallest one.
-     */
-    function applyDotProduct(firstVector, secondVector) {
-        var largestVector, smallestVector;
-        if(firstVector.length <= secondVector.length) {
-            smallestVector = firstVector;
-            largestVector = secondVector;
-        } else {
-            smallestVector = secondVector;
-            largestVector = firstVector;
-        }
-
-        var difference = largestVector.length - smallestVector.length + 1;
-        var dotProductApplied = new Array(difference);
-
-        for (var i = 0; i < difference; ++i) {
-            var sum = 0;
-            for (var j = 0; j < smallestVector.length; ++j) {
-                sum += smallestVector[j] * largestVector[i + j];
-            }
-            dotProductApplied[i] = sum;
-        }
-
-        return dotProductApplied;
-    }
-    /**
-     * To scale the input array between the specified min and max values. The operation is performed inplace
-     * if the options.inplace is specified. If only one of the min or max parameters is specified, then the scaling
-     * will multiply the input array by min/min(input) or max/max(input)
-     * @param input
-     * @param options
-     * @returns {*}
-     */
-    function scale(input, options){
-        var y;
-        if(options.inPlace){
-            y = input;
-        }
-        else{
-            y = new Array(input.length);
-        }
-        const max = options.max;
-        const min = options.min;
-        if(typeof max === "number"){
-            if(typeof min === "number"){
-                var minMax = Stat.minMax(input);
-                var factor = (max - min)/(minMax.max-minMax.min);
-                for(var i=0;i< y.length;i++){
-                    y[i]=(input[i]-minMax.min)*factor+min;
-                }
-            }
-            else{
-                var currentMin = Stat.max(input);
-                var factor = max/currentMin;
-                for(var i=0;i< y.length;i++){
-                    y[i] = input[i]*factor;
-                }
-            }
-        }
-        else{
-            if(typeof min === "number"){
-                var currentMin = Stat.min(input);
-                var factor = min/currentMin;
-                for(var i=0;i< y.length;i++){
-                    y[i] = input[i]*factor;
-                }
-            }
-        }
-        return y;
-    }
-
-    MLArrayUtilsArrayUtils.coordArrayToPoints = coordArrayToPoints;
-    MLArrayUtilsArrayUtils.coordArrayToCoordMatrix = coordArrayToCoordMatrix;
-    MLArrayUtilsArrayUtils.coordMatrixToCoordArray = coordMatrixToCoordArray;
-    MLArrayUtilsArrayUtils.coordMatrixToPoints = transpose;
-    MLArrayUtilsArrayUtils.pointsToCoordArray = pointsToCoordArray;
-    MLArrayUtilsArrayUtils.pointsToCoordMatrix = transpose;
-    MLArrayUtilsArrayUtils.applyDotProduct = applyDotProduct;
-    MLArrayUtilsArrayUtils.scale = scale;
-}
-
-
-// ml-array-utils getEquallySpaced.js
-const MLArrayUtilsGetEquallySpaced = {};
-{
-    /**
-     *
-     * Function that returns a Number array of equally spaced numberOfPoints
-     * containing a representation of intensities of the spectra arguments x
-     * and y.
-     *
-     * The options parameter contains an object in the following form:
-     * from: starting point
-     * to: last point
-     * numberOfPoints: number of points between from and to
-     * variant: "slot" or "smooth" - smooth is the default option
-     *
-     * The slot variant consist that each point in the new array is calculated
-     * averaging the existing points between the slot that belongs to the current
-     * value. The smooth variant is the same but takes the integral of the range
-     * of the slot and divide by the step size between two points in the new array.
-     *
-     * @param x - sorted increasing x values
-     * @param y
-     * @param options
-     * @returns {Array} new array with the equally spaced data.
-     *
-     */
-    function getEquallySpacedData(x, y, options) {
-        if (x.length>1 && x[0]>x[1]) {
-            x=x.slice().reverse();
-            y=y.slice().reverse();
-        }
-
-        var xLength = x.length;
-        if(xLength !== y.length)
-            throw new RangeError("the x and y vector doesn't have the same size.");
-
-        if (options === undefined) options = {};
-
-        var from = options.from === undefined ? x[0] : options.from
-        if (isNaN(from) || !isFinite(from)) {
-            throw new RangeError("'From' value must be a number");
-        }
-        var to = options.to === undefined ? x[x.length - 1] : options.to;
-        if (isNaN(to) || !isFinite(to)) {
-            throw new RangeError("'To' value must be a number");
-        }
-
-        var reverse = from > to;
-        if(reverse) {
-            var temp = from;
-            from = to;
-            to = temp;
-        }
-
-        var numberOfPoints = options.numberOfPoints === undefined ? 100 : options.numberOfPoints;
-        if (isNaN(numberOfPoints) || !isFinite(numberOfPoints)) {
-            throw new RangeError("'Number of points' value must be a number");
-        }
-        if(numberOfPoints < 1)
-            throw new RangeError("the number of point must be higher than 1");
-
-        var algorithm = options.variant === "slot" ? "slot" : "smooth"; // default value: smooth
-
-        var output = algorithm === "slot" ? getEquallySpacedSlot(x, y, from, to, numberOfPoints) : getEquallySpacedSmooth(x, y, from, to, numberOfPoints);
-
-        return reverse ? output.reverse() : output;
-    }
-
-    /**
-     * function that retrieves the getEquallySpacedData with the variant "smooth"
-     *
-     * @param x
-     * @param y
-     * @param from - Initial point
-     * @param to - Final point
-     * @param numberOfPoints
-     * @returns {Array} - Array of y's equally spaced with the variant "smooth"
-     */
-    function getEquallySpacedSmooth(x, y, from, to, numberOfPoints) {
-        var xLength = x.length;
-
-        var step = (to - from) / (numberOfPoints - 1);
-        var halfStep = step / 2;
-
-        var start = from - halfStep;
-        var output = new Array(numberOfPoints);
-
-        var initialOriginalStep = x[1] - x[0];
-        var lastOriginalStep = x[x.length - 1] - x[x.length - 2];
-
-        // Init main variables
-        var min = start;
-        var max = start + step;
-
-        var previousX = Number.MIN_VALUE;
-        var previousY = 0;
-        var nextX = x[0] - initialOriginalStep;
-        var nextY = 0;
-
-        var currentValue = 0;
-        var slope = 0;
-        var intercept = 0;
-        var sumAtMin = 0;
-        var sumAtMax = 0;
-
-        var i = 0; // index of input
-        var j = 0; // index of output
-
-        function getSlope(x0, y0, x1, y1) {
-            return (y1 - y0) / (x1 - x0);
-        }
-
-        main: while(true) {
-            while (nextX - max >= 0) {
-                // no overlap with original point, just consume current value
-                var add = integral(0, max - previousX, slope, previousY);
-                sumAtMax = currentValue + add;
-
-                output[j] = (sumAtMax - sumAtMin) / step;
-                j++;
-
-                if (j === numberOfPoints)
-                    break main;
-
-                min = max;
-                max += step;
-                sumAtMin = sumAtMax;
-            }
-
-            if(previousX <= min && min <= nextX) {
-                add = integral(0, min - previousX, slope, previousY);
-                sumAtMin = currentValue + add;
-            }
-
-            currentValue += integral(previousX, nextX, slope, intercept);
-
-            previousX = nextX;
-            previousY = nextY;
-
-            if (i < xLength) {
-                nextX = x[i];
-                nextY = y[i];
-                i++;
-            } else if (i === xLength) {
-                nextX += lastOriginalStep;
-                nextY = 0;
-            }
-            // updating parameters
-            slope = getSlope(previousX, previousY, nextX, nextY);
-            intercept = -slope*previousX + previousY;
-        }
-
-        return output;
-    }
-
-    /**
-     * function that retrieves the getEquallySpacedData with the variant "slot"
-     *
-     * @param x
-     * @param y
-     * @param from - Initial point
-     * @param to - Final point
-     * @param numberOfPoints
-     * @returns {Array} - Array of y's equally spaced with the variant "slot"
-     */
-    function getEquallySpacedSlot(x, y, from, to, numberOfPoints) {
-        var xLength = x.length;
-
-        var step = (to - from) / (numberOfPoints - 1);
-        var halfStep = step / 2;
-        var lastStep = x[x.length - 1] - x[x.length - 2];
-
-        var start = from - halfStep;
-        var output = new Array(numberOfPoints);
-
-        // Init main variables
-        var min = start;
-        var max = start + step;
-
-        var previousX = -Number.MAX_VALUE;
-        var previousY = 0;
-        var nextX = x[0];
-        var nextY = y[0];
-        var frontOutsideSpectra = 0;
-        var backOutsideSpectra = true;
-
-        var currentValue = 0;
-
-        // for slot algorithm
-        var currentPoints = 0;
-
-        var i = 1; // index of input
-        var j = 0; // index of output
-
-        main: while(true) {
-            if (previousX>=nextX) throw (new Error('x must be an increasing serie'));
-            while (previousX - max > 0) {
-                // no overlap with original point, just consume current value
-                if(backOutsideSpectra) {
-                    currentPoints++;
-                    backOutsideSpectra = false;
-                }
-
-                output[j] = currentPoints <= 0 ? 0 : currentValue / currentPoints;
-                j++;
-
-                if (j === numberOfPoints)
-                    break main;
-
-                min = max;
-                max += step;
-                currentValue = 0;
-                currentPoints = 0;
-            }
-
-            if(previousX > min) {
-                currentValue += previousY;
-                currentPoints++;
-            }
-
-            if(previousX === -Number.MAX_VALUE || frontOutsideSpectra > 1)
-                currentPoints--;
-
-            previousX = nextX;
-            previousY = nextY;
-
-            if (i < xLength) {
-                nextX = x[i];
-                nextY = y[i];
-                i++;
-            } else {
-                nextX += lastStep;
-                nextY = 0;
-                frontOutsideSpectra++;
-            }
-        }
-
-        return output;
-    }
-    /**
-     * Function that calculates the integral of the line between two
-     * x-coordinates, given the slope and intercept of the line.
-     *
-     * @param x0
-     * @param x1
-     * @param slope
-     * @param intercept
-     * @returns {number} integral value.
-     */
-    function integral(x0, x1, slope, intercept) {
-        return (0.5 * slope * x1 * x1 + intercept * x1) - (0.5 * slope * x0 * x0 + intercept * x0);
-    }
-
-    MLArrayUtilsGetEquallySpaced.getEquallySpacedData = getEquallySpacedData;
-    MLArrayUtilsGetEquallySpaced.integral = integral;
-}
-
-
-// ml-array-utils snv.js
-const MLArrayUtilsSNV = {};
-{
-    MLArrayUtilsSNV.SNV = SNV;
-    let Stat = MLStat.array;
-
-    /**
-     * Function that applies the standard normal variate (SNV) to an array of values.
-     *
-     * @param data - Array of values.
-     * @returns {Array} - applied the SNV.
-     */
-    function SNV(data) {
-        var mean = Stat.mean(data);
-        var std = Stat.standardDeviation(data);
-        var result = data.slice();
-        for (var i = 0; i < data.length; i++) {
-            result[i] = (result[i] - mean) / std;
-        }
-        return result;
-    }
-}
-
-// ml-array-utils index.js
-const MLArrayUtils = {};
-{
-    MLArrayUtils.getEquallySpacedData = MLArrayUtilsGetEquallySpaced.getEquallySpacedData;
-    MLArrayUtils.SNV = MLArrayUtilsSNV.SNV;
-}
-
-
-
-// do this early so things can use it. This is from ml-matrix src/matrix.js
-const MLMatrixMatrix = {};
-
-// ml-matrix src/util.js
-const MLMatrixUtil = {};
-{
-    let exports = MLMatrixUtil;
-    let Matrix = MLMatrixMatrix;
-
-    /**
-     * @private
-     * Check that a row index is not out of bounds
-     * @param {Matrix} matrix
-     * @param {number} index
-     * @param {boolean} [outer]
-     */
-    exports.checkRowIndex = function checkRowIndex(matrix, index, outer) {
-        var max = outer ? matrix.rows : matrix.rows - 1;
-        if (index < 0 || index > max) {
-            throw new RangeError('Row index out of range');
-        }
-    };
-
-    /**
-     * @private
-     * Check that a column index is not out of bounds
-     * @param {Matrix} matrix
-     * @param {number} index
-     * @param {boolean} [outer]
-     */
-    exports.checkColumnIndex = function checkColumnIndex(matrix, index, outer) {
-        var max = outer ? matrix.columns : matrix.columns - 1;
-        if (index < 0 || index > max) {
-            throw new RangeError('Column index out of range');
-        }
-    };
-
-    /**
-     * @private
-     * Check that the provided vector is an array with the right length
-     * @param {Matrix} matrix
-     * @param {Array|Matrix} vector
-     * @return {Array}
-     * @throws {RangeError}
-     */
-    exports.checkRowVector = function checkRowVector(matrix, vector) {
-        if (vector.to1DArray) {
-            vector = vector.to1DArray();
-        }
-        if (vector.length !== matrix.columns) {
-            throw new RangeError('vector size must be the same as the number of columns');
-        }
-        return vector;
-    };
-
-    /**
-     * @private
-     * Check that the provided vector is an array with the right length
-     * @param {Matrix} matrix
-     * @param {Array|Matrix} vector
-     * @return {Array}
-     * @throws {RangeError}
-     */
-    exports.checkColumnVector = function checkColumnVector(matrix, vector) {
-        if (vector.to1DArray) {
-            vector = vector.to1DArray();
-        }
-        if (vector.length !== matrix.rows) {
-            throw new RangeError('vector size must be the same as the number of rows');
-        }
-        return vector;
-    };
-
-    exports.checkIndices = function checkIndices(matrix, rowIndices, columnIndices) {
-        var rowOut = rowIndices.some(r => {
-            return r < 0 || r >= matrix.rows;
-
-        });
-
-        var columnOut = columnIndices.some(c => {
-            return c < 0 || c >= matrix.columns;
-        });
-
-        if (rowOut || columnOut) {
-            throw new RangeError('Indices are out of range');
-        }
-
-        if (typeof rowIndices !== 'object' || typeof columnIndices !== 'object') {
-            throw new TypeError('Unexpected type for row/column indices');
-        }
-        if (!Array.isArray(rowIndices)) rowIndices = Array.from(rowIndices);
-        if (!Array.isArray(columnIndices)) rowIndices = Array.from(columnIndices);
-
-        return {
-            row: rowIndices,
-            column: columnIndices
-        };
-    };
-
-    exports.checkRange = function checkRange(matrix, startRow, endRow, startColumn, endColumn) {
-        if (arguments.length !== 5) throw new TypeError('Invalid argument type');
-        var notAllNumbers = Array.from(arguments).slice(1).some(function (arg) {
-            return typeof arg !== 'number';
-        });
-        if (notAllNumbers) throw new TypeError('Invalid argument type');
-        if (startRow > endRow || startColumn > endColumn || startRow < 0 || startRow >= matrix.rows || endRow < 0 || endRow >= matrix.rows || startColumn < 0 || startColumn >= matrix.columns || endColumn < 0 || endColumn >= matrix.columns) {
-            throw new RangeError('Submatrix indices are out of range');
-        }
-    };
-
-    exports.getRange = function getRange(from, to) {
-        var arr = new Array(to - from + 1);
-        for (var i = 0; i < arr.length; i++) {
-            arr[i] = from + i;
-        }
-        return arr;
-    };
-
-    exports.sumByRow = function sumByRow(matrix) {
-        var sum = Matrix.Matrix.zeros(matrix.rows, 1);
-        for (var i = 0; i < matrix.rows; ++i) {
-            for (var j = 0; j < matrix.columns; ++j) {
-                sum.set(i, 0, sum.get(i, 0) + matrix.get(i, j));
-            }
-        }
-        return sum;
-    };
-
-    exports.sumByColumn = function sumByColumn(matrix) {
-        var sum = Matrix.Matrix.zeros(1, matrix.columns);
-        for (var i = 0; i < matrix.rows; ++i) {
-            for (var j = 0; j < matrix.columns; ++j) {
-                sum.set(0, j, sum.get(0, j) + matrix.get(i, j));
-            }
-        }
-        return sum;
-    };
-
-    exports.sumAll = function sumAll(matrix) {
-        var v = 0;
-        for (var i = 0; i < matrix.rows; i++) {
-            for (var j = 0; j < matrix.columns; j++) {
-                v += matrix.get(i, j);
-            }
-        }
-        return v;
-    };
-}
-
-// ml-matrix symbolsspecies.js
-if (!Symbol.species) {
-    Symbol.species = Symbol.for('@@species');
-}
-
-
-// ml-matrix src/dc/util.js
-const MLMatrixDCUtil = {};
-{
-    let exports = MLMatrixDCUtil;
-    exports.hypotenuse = function hypotenuse(a, b) {
-        var r;
-        if (Math.abs(a) > Math.abs(b)) {
-            r = b / a;
-            return Math.abs(a) * Math.sqrt(1 + r * r);
-        }
-        if (b !== 0) {
-            r = a / b;
-            return Math.abs(b) * Math.sqrt(1 + r * r);
-        }
-        return 0;
-    };
-
-    // For use in the decomposition algorithms. With big matrices, access time is
-    // too long on elements from array subclass
-    // todo check when it is fixed in v8
-    // http://jsperf.com/access-and-write-array-subclass
-    exports.getEmpty2DArray = function (rows, columns) {
-        var array = new Array(rows);
-        for (var i = 0; i < rows; i++) {
-            array[i] = new Array(columns);
-        }
-        return array;
-    };
-
-    exports.getFilled2DArray = function (rows, columns, value) {
-        var array = new Array(rows);
-        for (var i = 0; i < rows; i++) {
-            array[i] = new Array(columns);
-            for (var j = 0; j < columns; j++) {
-                array[i][j] = value;
-            }
-        }
-        return array;
-    };
-}
-
-// ml-matrix src/dc/lu.js
-let MLMatrixDCLU = {};
-{
-    let Matrix = MLMatrixMatrix;
-
-    // https://github.com/lutzroeder/Mapack/blob/master/Source/LuDecomposition.cs
-    function LuDecomposition(matrix) {
-        if (!(this instanceof LuDecomposition)) {
-            return new LuDecomposition(matrix);
-        }
-
-        matrix = Matrix.Matrix.checkMatrix(matrix);
-
-        var lu = matrix.clone(),
-            rows = lu.rows,
-            columns = lu.columns,
-            pivotVector = new Array(rows),
-            pivotSign = 1,
-            i, j, k, p, s, t, v,
-            LUrowi, LUcolj, kmax;
-
-        for (i = 0; i < rows; i++) {
-            pivotVector[i] = i;
-        }
-
-        LUcolj = new Array(rows);
-
-        for (j = 0; j < columns; j++) {
-
-            for (i = 0; i < rows; i++) {
-                LUcolj[i] = lu[i][j];
-            }
-
-            for (i = 0; i < rows; i++) {
-                LUrowi = lu[i];
-                kmax = Math.min(i, j);
-                s = 0;
-                for (k = 0; k < kmax; k++) {
-                    s += LUrowi[k] * LUcolj[k];
-                }
-                LUrowi[j] = LUcolj[i] -= s;
-            }
-
-            p = j;
-            for (i = j + 1; i < rows; i++) {
-                if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {
-                    p = i;
-                }
-            }
-
-            if (p !== j) {
-                for (k = 0; k < columns; k++) {
-                    t = lu[p][k];
-                    lu[p][k] = lu[j][k];
-                    lu[j][k] = t;
-                }
-
-                v = pivotVector[p];
-                pivotVector[p] = pivotVector[j];
-                pivotVector[j] = v;
-
-                pivotSign = -pivotSign;
-            }
-
-            if (j < rows && lu[j][j] !== 0) {
-                for (i = j + 1; i < rows; i++) {
-                    lu[i][j] /= lu[j][j];
-                }
-            }
-        }
-
-        this.LU = lu;
-        this.pivotVector = pivotVector;
-        this.pivotSign = pivotSign;
-    }
-
-    LuDecomposition.prototype = {
-        isSingular: function () {
-            var data = this.LU,
-                col = data.columns;
-            for (var j = 0; j < col; j++) {
-                if (data[j][j] === 0) {
-                    return true;
-                }
-            }
-            return false;
-        },
-        get determinant() {
-            var data = this.LU;
-            if (!data.isSquare()) {
-                throw new Error('Matrix must be square');
-            }
-            var determinant = this.pivotSign, col = data.columns;
-            for (var j = 0; j < col; j++) {
-                determinant *= data[j][j];
-            }
-            return determinant;
-        },
-        get lowerTriangularMatrix() {
-            var data = this.LU,
-                rows = data.rows,
-                columns = data.columns,
-                X = new Matrix.Matrix(rows, columns);
-            for (var i = 0; i < rows; i++) {
-                for (var j = 0; j < columns; j++) {
-                    if (i > j) {
-                        X[i][j] = data[i][j];
-                    } else if (i === j) {
-                        X[i][j] = 1;
-                    } else {
-                        X[i][j] = 0;
-                    }
-                }
-            }
-            return X;
-        },
-        get upperTriangularMatrix() {
-            var data = this.LU,
-                rows = data.rows,
-                columns = data.columns,
-                X = new Matrix.Matrix(rows, columns);
-            for (var i = 0; i < rows; i++) {
-                for (var j = 0; j < columns; j++) {
-                    if (i <= j) {
-                        X[i][j] = data[i][j];
-                    } else {
-                        X[i][j] = 0;
-                    }
-                }
-            }
-            return X;
-        },
-        get pivotPermutationVector() {
-            return this.pivotVector.slice();
-        },
-        solve: function (value) {
-            value = Matrix.Matrix.checkMatrix(value);
-
-            var lu = this.LU,
-                rows = lu.rows;
-
-            if (rows !== value.rows) {
-                throw new Error('Invalid matrix dimensions');
-            }
-            if (this.isSingular()) {
-                throw new Error('LU matrix is singular');
-            }
-
-            var count = value.columns;
-            var X = value.subMatrixRow(this.pivotVector, 0, count - 1);
-            var columns = lu.columns;
-            var i, j, k;
-
-            for (k = 0; k < columns; k++) {
-                for (i = k + 1; i < columns; i++) {
-                    for (j = 0; j < count; j++) {
-                        X[i][j] -= X[k][j] * lu[i][k];
-                    }
-                }
-            }
-            for (k = columns - 1; k >= 0; k--) {
-                for (j = 0; j < count; j++) {
-                    X[k][j] /= lu[k][k];
-                }
-                for (i = 0; i < k; i++) {
-                    for (j = 0; j < count; j++) {
-                        X[i][j] -= X[k][j] * lu[i][k];
-                    }
-                }
-            }
-            return X;
-        }
-    };
-
-    MLMatrixDCLU = LuDecomposition;
-}
-
-
-// ml-matrix src/dc/svd.js
-let MLMatrixDCSVD = {};
-{
-    let Matrix = MLMatrixMatrix;
-    let util = MLMatrixDCUtil;
-    let hypotenuse = util.hypotenuse;
-    let getFilled2DArray = util.getFilled2DArray;
-
-    // https://github.com/lutzroeder/Mapack/blob/master/Source/SingularValueDecomposition.cs
-    function SingularValueDecomposition(value, options) {
-        if (!(this instanceof SingularValueDecomposition)) {
-            return new SingularValueDecomposition(value, options);
-        }
-        value = Matrix.Matrix.checkMatrix(value);
-
-        options = options || {};
-
-        var m = value.rows,
-            n = value.columns,
-            nu = Math.min(m, n);
-
-        var wantu = true, wantv = true;
-        if (options.computeLeftSingularVectors === false) wantu = false;
-        if (options.computeRightSingularVectors === false) wantv = false;
-        var autoTranspose = options.autoTranspose === true;
-
-        var swapped = false;
-        var a;
-        if (m < n) {
-            if (!autoTranspose) {
-                a = value.clone();
-                // eslint-disable-next-line no-console
-                console.warn('Computing SVD on a matrix with more columns than rows. Consider enabling autoTranspose');
-            } else {
-                a = value.transpose();
-                m = a.rows;
-                n = a.columns;
-                swapped = true;
-                var aux = wantu;
-                wantu = wantv;
-                wantv = aux;
-            }
-        } else {
-            a = value.clone();
-        }
-
-        var s = new Array(Math.min(m + 1, n)),
-            U = getFilled2DArray(m, nu, 0),
-            V = getFilled2DArray(n, n, 0),
-            e = new Array(n),
-            work = new Array(m);
-
-        var nct = Math.min(m - 1, n);
-        var nrt = Math.max(0, Math.min(n - 2, m));
-
-        var i, j, k, p, t, ks, f, cs, sn, max, kase,
-            scale, sp, spm1, epm1, sk, ek, b, c, shift, g;
-
-        for (k = 0, max = Math.max(nct, nrt); k < max; k++) {
-            if (k < nct) {
-                s[k] = 0;
-                for (i = k; i < m; i++) {
-                    s[k] = hypotenuse(s[k], a[i][k]);
-                }
-                if (s[k] !== 0) {
-                    if (a[k][k] < 0) {
-                        s[k] = -s[k];
-                    }
-                    for (i = k; i < m; i++) {
-                        a[i][k] /= s[k];
-                    }
-                    a[k][k] += 1;
-                }
-                s[k] = -s[k];
-            }
-
-            for (j = k + 1; j < n; j++) {
-                if ((k < nct) && (s[k] !== 0)) {
-                    t = 0;
-                    for (i = k; i < m; i++) {
-                        t += a[i][k] * a[i][j];
-                    }
-                    t = -t / a[k][k];
-                    for (i = k; i < m; i++) {
-                        a[i][j] += t * a[i][k];
-                    }
-                }
-                e[j] = a[k][j];
-            }
-
-            if (wantu && (k < nct)) {
-                for (i = k; i < m; i++) {
-                    U[i][k] = a[i][k];
-                }
-            }
-
-            if (k < nrt) {
-                e[k] = 0;
-                for (i = k + 1; i < n; i++) {
-                    e[k] = hypotenuse(e[k], e[i]);
-                }
-                if (e[k] !== 0) {
-                    if (e[k + 1] < 0) {
-                        e[k] = 0 - e[k];
-                    }
-                    for (i = k + 1; i < n; i++) {
-                        e[i] /= e[k];
-                    }
-                    e[k + 1] += 1;
-                }
-                e[k] = -e[k];
-                if ((k + 1 < m) && (e[k] !== 0)) {
-                    for (i = k + 1; i < m; i++) {
-                        work[i] = 0;
-                    }
-                    for (j = k + 1; j < n; j++) {
-                        for (i = k + 1; i < m; i++) {
-                            work[i] += e[j] * a[i][j];
-                        }
-                    }
-                    for (j = k + 1; j < n; j++) {
-                        t = -e[j] / e[k + 1];
-                        for (i = k + 1; i < m; i++) {
-                            a[i][j] += t * work[i];
-                        }
-                    }
-                }
-                if (wantv) {
-                    for (i = k + 1; i < n; i++) {
-                        V[i][k] = e[i];
-                    }
-                }
-            }
-        }
-
-        p = Math.min(n, m + 1);
-        if (nct < n) {
-            s[nct] = a[nct][nct];
-        }
-        if (m < p) {
-            s[p - 1] = 0;
-        }
-        if (nrt + 1 < p) {
-            e[nrt] = a[nrt][p - 1];
-        }
-        e[p - 1] = 0;
-
-        if (wantu) {
-            for (j = nct; j < nu; j++) {
-                for (i = 0; i < m; i++) {
-                    U[i][j] = 0;
-                }
-                U[j][j] = 1;
-            }
-            for (k = nct - 1; k >= 0; k--) {
-                if (s[k] !== 0) {
-                    for (j = k + 1; j < nu; j++) {
-                        t = 0;
-                        for (i = k; i < m; i++) {
-                            t += U[i][k] * U[i][j];
-                        }
-                        t = -t / U[k][k];
-                        for (i = k; i < m; i++) {
-                            U[i][j] += t * U[i][k];
-                        }
-                    }
-                    for (i = k; i < m; i++) {
-                        U[i][k] = -U[i][k];
-                    }
-                    U[k][k] = 1 + U[k][k];
-                    for (i = 0; i < k - 1; i++) {
-                        U[i][k] = 0;
-                    }
-                } else {
-                    for (i = 0; i < m; i++) {
-                        U[i][k] = 0;
-                    }
-                    U[k][k] = 1;
-                }
-            }
-        }
-
-        if (wantv) {
-            for (k = n - 1; k >= 0; k--) {
-                if ((k < nrt) && (e[k] !== 0)) {
-                    for (j = k + 1; j < n; j++) {
-                        t = 0;
-                        for (i = k + 1; i < n; i++) {
-                            t += V[i][k] * V[i][j];
-                        }
-                        t = -t / V[k + 1][k];
-                        for (i = k + 1; i < n; i++) {
-                            V[i][j] += t * V[i][k];
-                        }
-                    }
-                }
-                for (i = 0; i < n; i++) {
-                    V[i][k] = 0;
-                }
-                V[k][k] = 1;
-            }
-        }
-
-        var pp = p - 1,
-            iter = 0,
-            eps = Math.pow(2, -52);
-        while (p > 0) {
-            for (k = p - 2; k >= -1; k--) {
-                if (k === -1) {
-                    break;
-                }
-                if (Math.abs(e[k]) <= eps * (Math.abs(s[k]) + Math.abs(s[k + 1]))) {
-                    e[k] = 0;
-                    break;
-                }
-            }
-            if (k === p - 2) {
-                kase = 4;
-            } else {
-                for (ks = p - 1; ks >= k; ks--) {
-                    if (ks === k) {
-                        break;
-                    }
-                    t = (ks !== p ? Math.abs(e[ks]) : 0) + (ks !== k + 1 ? Math.abs(e[ks - 1]) : 0);
-                    if (Math.abs(s[ks]) <= eps * t) {
-                        s[ks] = 0;
-                        break;
-                    }
-                }
-                if (ks === k) {
-                    kase = 3;
-                } else if (ks === p - 1) {
-                    kase = 1;
-                } else {
-                    kase = 2;
-                    k = ks;
-                }
-            }
-
-            k++;
-
-            switch (kase) {
-                case 1: {
-                    f = e[p - 2];
-                    e[p - 2] = 0;
-                    for (j = p - 2; j >= k; j--) {
-                        t = hypotenuse(s[j], f);
-                        cs = s[j] / t;
-                        sn = f / t;
-                        s[j] = t;
-                        if (j !== k) {
-                            f = -sn * e[j - 1];
-                            e[j - 1] = cs * e[j - 1];
-                        }
-                        if (wantv) {
-                            for (i = 0; i < n; i++) {
-                                t = cs * V[i][j] + sn * V[i][p - 1];
-                                V[i][p - 1] = -sn * V[i][j] + cs * V[i][p - 1];
-                                V[i][j] = t;
-                            }
-                        }
-                    }
-                    break;
-                }
-                case 2 : {
-                    f = e[k - 1];
-                    e[k - 1] = 0;
-                    for (j = k; j < p; j++) {
-                        t = hypotenuse(s[j], f);
-                        cs = s[j] / t;
-                        sn = f / t;
-                        s[j] = t;
-                        f = -sn * e[j];
-                        e[j] = cs * e[j];
-                        if (wantu) {
-                            for (i = 0; i < m; i++) {
-                                t = cs * U[i][j] + sn * U[i][k - 1];
-                                U[i][k - 1] = -sn * U[i][j] + cs * U[i][k - 1];
-                                U[i][j] = t;
-                            }
-                        }
-                    }
-                    break;
-                }
-                case 3 : {
-                    scale = Math.max(Math.max(Math.max(Math.max(Math.abs(s[p - 1]), Math.abs(s[p - 2])), Math.abs(e[p - 2])), Math.abs(s[k])), Math.abs(e[k]));
-                    sp = s[p - 1] / scale;
-                    spm1 = s[p - 2] / scale;
-                    epm1 = e[p - 2] / scale;
-                    sk = s[k] / scale;
-                    ek = e[k] / scale;
-                    b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;
-                    c = (sp * epm1) * (sp * epm1);
-                    shift = 0;
-                    if ((b !== 0) || (c !== 0)) {
-                        shift = Math.sqrt(b * b + c);
-                        if (b < 0) {
-                            shift = -shift;
-                        }
-                        shift = c / (b + shift);
-                    }
-                    f = (sk + sp) * (sk - sp) + shift;
-                    g = sk * ek;
-                    for (j = k; j < p - 1; j++) {
-                        t = hypotenuse(f, g);
-                        cs = f / t;
-                        sn = g / t;
-                        if (j !== k) {
-                            e[j - 1] = t;
-                        }
-                        f = cs * s[j] + sn * e[j];
-                        e[j] = cs * e[j] - sn * s[j];
-                        g = sn * s[j + 1];
-                        s[j + 1] = cs * s[j + 1];
-                        if (wantv) {
-                            for (i = 0; i < n; i++) {
-                                t = cs * V[i][j] + sn * V[i][j + 1];
-                                V[i][j + 1] = -sn * V[i][j] + cs * V[i][j + 1];
-                                V[i][j] = t;
-                            }
-                        }
-                        t = hypotenuse(f, g);
-                        cs = f / t;
-                        sn = g / t;
-                        s[j] = t;
-                        f = cs * e[j] + sn * s[j + 1];
-                        s[j + 1] = -sn * e[j] + cs * s[j + 1];
-                        g = sn * e[j + 1];
-                        e[j + 1] = cs * e[j + 1];
-                        if (wantu && (j < m - 1)) {
-                            for (i = 0; i < m; i++) {
-                                t = cs * U[i][j] + sn * U[i][j + 1];
-                                U[i][j + 1] = -sn * U[i][j] + cs * U[i][j + 1];
-                                U[i][j] = t;
-                            }
-                        }
-                    }
-                    e[p - 2] = f;
-                    iter = iter + 1;
-                    break;
-                }
-                case 4: {
-                    if (s[k] <= 0) {
-                        s[k] = (s[k] < 0 ? -s[k] : 0);
-                        if (wantv) {
-                            for (i = 0; i <= pp; i++) {
-                                V[i][k] = -V[i][k];
-                            }
-                        }
-                    }
-                    while (k < pp) {
-                        if (s[k] >= s[k + 1]) {
-                            break;
-                        }
-                        t = s[k];
-                        s[k] = s[k + 1];
-                        s[k + 1] = t;
-                        if (wantv && (k < n - 1)) {
-                            for (i = 0; i < n; i++) {
-                                t = V[i][k + 1];
-                                V[i][k + 1] = V[i][k];
-                                V[i][k] = t;
-                            }
-                        }
-                        if (wantu && (k < m - 1)) {
-                            for (i = 0; i < m; i++) {
-                                t = U[i][k + 1];
-                                U[i][k + 1] = U[i][k];
-                                U[i][k] = t;
-                            }
-                        }
-                        k++;
-                    }
-                    iter = 0;
-                    p--;
-                    break;
-                }
-                // no default
-            }
-        }
-
-        if (swapped) {
-            var tmp = V;
-            V = U;
-            U = tmp;
-        }
-
-        this.m = m;
-        this.n = n;
-        this.s = s;
-        this.U = U;
-        this.V = V;
-    }
-
-    SingularValueDecomposition.prototype = {
-        get condition() {
-            return this.s[0] / this.s[Math.min(this.m, this.n) - 1];
-        },
-        get norm2() {
-            return this.s[0];
-        },
-        get rank() {
-            var eps = Math.pow(2, -52),
-                tol = Math.max(this.m, this.n) * this.s[0] * eps,
-                r = 0,
-                s = this.s;
-            for (var i = 0, ii = s.length; i < ii; i++) {
-                if (s[i] > tol) {
-                    r++;
-                }
-            }
-            return r;
-        },
-        get diagonal() {
-            return this.s;
-        },
-        // https://github.com/accord-net/framework/blob/development/Sources/Accord.Math/Decompositions/SingularValueDecomposition.cs
-        get threshold() {
-            return (Math.pow(2, -52) / 2) * Math.max(this.m, this.n) * this.s[0];
-        },
-        get leftSingularVectors() {
-            if (!Matrix.Matrix.isMatrix(this.U)) {
-                this.U = new Matrix.Matrix(this.U);
-            }
-            return this.U;
-        },
-        get rightSingularVectors() {
-            if (!Matrix.Matrix.isMatrix(this.V)) {
-                this.V = new Matrix.Matrix(this.V);
-            }
-            return this.V;
-        },
-        get diagonalMatrix() {
-            return Matrix.Matrix.diag(this.s);
-        },
-        solve: function (value) {
-
-            var Y = value,
-                e = this.threshold,
-                scols = this.s.length,
-                Ls = Matrix.Matrix.zeros(scols, scols),
-                i;
-
-            for (i = 0; i < scols; i++) {
-                if (Math.abs(this.s[i]) <= e) {
-                    Ls[i][i] = 0;
-                } else {
-                    Ls[i][i] = 1 / this.s[i];
-                }
-            }
-
-            var U = this.U;
-            var V = this.rightSingularVectors;
-
-            var VL = V.mmul(Ls),
-                vrows = V.rows,
-                urows = U.length,
-                VLU = Matrix.Matrix.zeros(vrows, urows),
-                j, k, sum;
-
-            for (i = 0; i < vrows; i++) {
-                for (j = 0; j < urows; j++) {
-                    sum = 0;
-                    for (k = 0; k < scols; k++) {
-                        sum += VL[i][k] * U[j][k];
-                    }
-                    VLU[i][j] = sum;
-                }
-            }
-
-            return VLU.mmul(Y);
-        },
-        solveForDiagonal: function (value) {
-            return this.solve(Matrix.Matrix.diag(value));
-        },
-        inverse: function () {
-            var V = this.V;
-            var e = this.threshold,
-                vrows = V.length,
-                vcols = V[0].length,
-                X = new Matrix.Matrix(vrows, this.s.length),
-                i, j;
-
-            for (i = 0; i < vrows; i++) {
-                for (j = 0; j < vcols; j++) {
-                    if (Math.abs(this.s[j]) > e) {
-                        X[i][j] = V[i][j] / this.s[j];
-                    } else {
-                        X[i][j] = 0;
-                    }
-                }
-            }
-
-            var U = this.U;
-
-            var urows = U.length,
-                ucols = U[0].length,
-                Y = new Matrix.Matrix(vrows, urows),
-                k, sum;
-
-            for (i = 0; i < vrows; i++) {
-                for (j = 0; j < urows; j++) {
-                    sum = 0;
-                    for (k = 0; k < ucols; k++) {
-                        sum += X[i][k] * U[j][k];
-                    }
-                    Y[i][j] = sum;
-                }
-            }
-
-            return Y;
-        }
-    };
-
-    MLMatrixDCSVD = SingularValueDecomposition;
-}
-
-// ml-matrix src/abstractMatrix.js
-let MLMatrixAbstractMatrix;
-{
-    let LuDecomposition = MLMatrixDCLU;
-    let SvDecomposition = MLMatrixDCSVD;
-    let arrayUtils = MLArrayUtils;
-    let util = MLMatrixUtil;
-
-    MLMatrixAbstractMatrix = function abstractMatrix(superCtor) {
-        if (superCtor === undefined) superCtor = Object;
-
-        /**
-         * Real matrix
-         * @class Matrix
-         * @param {number|Array|Matrix} nRows - Number of rows of the new matrix,
-         * 2D array containing the data or Matrix instance to clone
-         * @param {number} [nColumns] - Number of columns of the new matrix
-         */
-        class Matrix extends superCtor {
-            static get [Symbol.species]() {
-                return this;
-            }
-
-            /**
-             * Constructs a Matrix with the chosen dimensions from a 1D array
-             * @param {number} newRows - Number of rows
-             * @param {number} newColumns - Number of columns
-             * @param {Array} newData - A 1D array containing data for the matrix
-             * @return {Matrix} - The new matrix
-             */
-            static from1DArray(newRows, newColumns, newData) {
-                var length = newRows * newColumns;
-                if (length !== newData.length) {
-                    throw new RangeError('Data length does not match given dimensions');
-                }
-                var newMatrix = new this(newRows, newColumns);
-                for (var row = 0; row < newRows; row++) {
-                    for (var column = 0; column < newColumns; column++) {
-                        newMatrix.set(row, column, newData[row * newColumns + column]);
-                    }
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Creates a row vector, a matrix with only one row.
-             * @param {Array} newData - A 1D array containing data for the vector
-             * @return {Matrix} - The new matrix
-             */
-            static rowVector(newData) {
-                var vector = new this(1, newData.length);
-                for (var i = 0; i < newData.length; i++) {
-                    vector.set(0, i, newData[i]);
-                }
-                return vector;
-            }
-
-            /**
-             * Creates a column vector, a matrix with only one column.
-             * @param {Array} newData - A 1D array containing data for the vector
-             * @return {Matrix} - The new matrix
-             */
-            static columnVector(newData) {
-                var vector = new this(newData.length, 1);
-                for (var i = 0; i < newData.length; i++) {
-                    vector.set(i, 0, newData[i]);
-                }
-                return vector;
-            }
-
-            /**
-             * Creates an empty matrix with the given dimensions. Values will be undefined. Same as using new Matrix(rows, columns).
-             * @param {number} rows - Number of rows
-             * @param {number} columns - Number of columns
-             * @return {Matrix} - The new matrix
-             */
-            static empty(rows, columns) {
-                return new this(rows, columns);
-            }
-
-            /**
-             * Creates a matrix with the given dimensions. Values will be set to zero.
-             * @param {number} rows - Number of rows
-             * @param {number} columns - Number of columns
-             * @return {Matrix} - The new matrix
-             */
-            static zeros(rows, columns) {
-                return this.empty(rows, columns).fill(0);
-            }
-
-            /**
-             * Creates a matrix with the given dimensions. Values will be set to one.
-             * @param {number} rows - Number of rows
-             * @param {number} columns - Number of columns
-             * @return {Matrix} - The new matrix
-             */
-            static ones(rows, columns) {
-                return this.empty(rows, columns).fill(1);
-            }
-
-            /**
-             * Creates a matrix with the given dimensions. Values will be randomly set.
-             * @param {number} rows - Number of rows
-             * @param {number} columns - Number of columns
-             * @param {function} [rng=Math.random] - Random number generator
-             * @return {Matrix} The new matrix
-             */
-            static rand(rows, columns, rng) {
-                if (rng === undefined) rng = Math.random;
-                var matrix = this.empty(rows, columns);
-                for (var i = 0; i < rows; i++) {
-                    for (var j = 0; j < columns; j++) {
-                        matrix.set(i, j, rng());
-                    }
-                }
-                return matrix;
-            }
-
-            /**
-             * Creates a matrix with the given dimensions. Values will be random integers.
-             * @param {number} rows - Number of rows
-             * @param {number} columns - Number of columns
-             * @param {number} [maxValue=1000] - Maximum value
-             * @param {function} [rng=Math.random] - Random number generator
-             * @return {Matrix} The new matrix
-             */
-            static randInt(rows, columns, maxValue, rng) {
-                if (maxValue === undefined) maxValue = 1000;
-                if (rng === undefined) rng = Math.random;
-                var matrix = this.empty(rows, columns);
-                for (var i = 0; i < rows; i++) {
-                    for (var j = 0; j < columns; j++) {
-                        var value = Math.floor(rng() * maxValue);
-                        matrix.set(i, j, value);
-                    }
-                }
-                return matrix;
-            }
-
-            /**
-             * Creates an identity matrix with the given dimension. Values of the diagonal will be 1 and others will be 0.
-             * @param {number} rows - Number of rows
-             * @param {number} [columns=rows] - Number of columns
-             * @param {number} [value=1] - Value to fill the diagonal with
-             * @return {Matrix} - The new identity matrix
-             */
-            static eye(rows, columns, value) {
-                if (columns === undefined) columns = rows;
-                if (value === undefined) value = 1;
-                var min = Math.min(rows, columns);
-                var matrix = this.zeros(rows, columns);
-                for (var i = 0; i < min; i++) {
-                    matrix.set(i, i, value);
-                }
-                return matrix;
-            }
-
-            /**
-             * Creates a diagonal matrix based on the given array.
-             * @param {Array} data - Array containing the data for the diagonal
-             * @param {number} [rows] - Number of rows (Default: data.length)
-             * @param {number} [columns] - Number of columns (Default: rows)
-             * @return {Matrix} - The new diagonal matrix
-             */
-            static diag(data, rows, columns) {
-                var l = data.length;
-                if (rows === undefined) rows = l;
-                if (columns === undefined) columns = rows;
-                var min = Math.min(l, rows, columns);
-                var matrix = this.zeros(rows, columns);
-                for (var i = 0; i < min; i++) {
-                    matrix.set(i, i, data[i]);
-                }
-                return matrix;
-            }
-
-            /**
-             * Returns a matrix whose elements are the minimum between matrix1 and matrix2
-             * @param {Matrix} matrix1
-             * @param {Matrix} matrix2
-             * @return {Matrix}
-             */
-            static min(matrix1, matrix2) {
-                matrix1 = this.checkMatrix(matrix1);
-                matrix2 = this.checkMatrix(matrix2);
-                var rows = matrix1.rows;
-                var columns = matrix1.columns;
-                var result = new this(rows, columns);
-                for (var i = 0; i < rows; i++) {
-                    for (var j = 0; j < columns; j++) {
-                        result.set(i, j, Math.min(matrix1.get(i, j), matrix2.get(i, j)));
-                    }
-                }
-                return result;
-            }
-
-            /**
-             * Returns a matrix whose elements are the maximum between matrix1 and matrix2
-             * @param {Matrix} matrix1
-             * @param {Matrix} matrix2
-             * @return {Matrix}
-             */
-            static max(matrix1, matrix2) {
-                matrix1 = this.checkMatrix(matrix1);
-                matrix2 = this.checkMatrix(matrix2);
-                var rows = matrix1.rows;
-                var columns = matrix1.columns;
-                var result = new this(rows, columns);
-                for (var i = 0; i < rows; i++) {
-                    for (var j = 0; j < columns; j++) {
-                        result.set(i, j, Math.max(matrix1.get(i, j), matrix2.get(i, j)));
-                    }
-                }
-                return result;
-            }
-
-            /**
-             * Check that the provided value is a Matrix and tries to instantiate one if not
-             * @param {*} value - The value to check
-             * @return {Matrix}
-             */
-            static checkMatrix(value) {
-                return Matrix.isMatrix(value) ? value : new this(value);
-            }
-
-            /**
-             * Returns true if the argument is a Matrix, false otherwise
-             * @param {*} value - The value to check
-             * @return {boolean}
-             */
-            static isMatrix(value) {
-                return (value != null) && (value.klass === 'Matrix');
-            }
-
-            /**
-             * @prop {number} size - The number of elements in the matrix.
-             */
-            get size() {
-                return this.rows * this.columns;
-            }
-
-            /**
-             * Applies a callback for each element of the matrix. The function is called in the matrix (this) context.
-             * @param {function} callback - Function that will be called with two parameters : i (row) and j (column)
-             * @return {Matrix} this
-             */
-            apply(callback) {
-                if (typeof callback !== 'function') {
-                    throw new TypeError('callback must be a function');
-                }
-                var ii = this.rows;
-                var jj = this.columns;
-                for (var i = 0; i < ii; i++) {
-                    for (var j = 0; j < jj; j++) {
-                        callback.call(this, i, j);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Returns a new 1D array filled row by row with the matrix values
-             * @return {Array}
-             */
-            to1DArray() {
-                var array = new Array(this.size);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        array[i * this.columns + j] = this.get(i, j);
-                    }
-                }
-                return array;
-            }
-
-            /**
-             * Returns a 2D array containing a copy of the data
-             * @return {Array}
-             */
-            to2DArray() {
-                var copy = new Array(this.rows);
-                for (var i = 0; i < this.rows; i++) {
-                    copy[i] = new Array(this.columns);
-                    for (var j = 0; j < this.columns; j++) {
-                        copy[i][j] = this.get(i, j);
-                    }
-                }
-                return copy;
-            }
-
-            /**
-             * @return {boolean} true if the matrix has one row
-             */
-            isRowVector() {
-                return this.rows === 1;
-            }
-
-            /**
-             * @return {boolean} true if the matrix has one column
-             */
-            isColumnVector() {
-                return this.columns === 1;
-            }
-
-            /**
-             * @return {boolean} true if the matrix has one row or one column
-             */
-            isVector() {
-                return (this.rows === 1) || (this.columns === 1);
-            }
-
-            /**
-             * @return {boolean} true if the matrix has the same number of rows and columns
-             */
-            isSquare() {
-                return this.rows === this.columns;
-            }
-
-            /**
-             * @return {boolean} true if the matrix is square and has the same values on both sides of the diagonal
-             */
-            isSymmetric() {
-                if (this.isSquare()) {
-                    for (var i = 0; i < this.rows; i++) {
-                        for (var j = 0; j <= i; j++) {
-                            if (this.get(i, j) !== this.get(j, i)) {
-                                return false;
-                            }
-                        }
-                    }
-                    return true;
-                }
-                return false;
-            }
-
-            /**
-             * Sets a given element of the matrix. mat.set(3,4,1) is equivalent to mat[3][4]=1
-             * @abstract
-             * @param {number} rowIndex - Index of the row
-             * @param {number} columnIndex - Index of the column
-             * @param {number} value - The new value for the element
-             * @return {Matrix} this
-             */
-            set(rowIndex, columnIndex, value) { // eslint-disable-line no-unused-vars
-                throw new Error('set method is unimplemented');
-            }
-
-            /**
-             * Returns the given element of the matrix. mat.get(3,4) is equivalent to matrix[3][4]
-             * @abstract
-             * @param {number} rowIndex - Index of the row
-             * @param {number} columnIndex - Index of the column
-             * @return {number}
-             */
-            get(rowIndex, columnIndex) { // eslint-disable-line no-unused-vars
-                throw new Error('get method is unimplemented');
-            }
-
-            /**
-             * Creates a new matrix that is a repetition of the current matrix. New matrix has rowRep times the number of
-             * rows of the matrix, and colRep times the number of columns of the matrix
-             * @param {number} rowRep - Number of times the rows should be repeated
-             * @param {number} colRep - Number of times the columns should be re
-             * @return {Matrix}
-             * @example
-             * var matrix = new Matrix([[1,2]]);
-             * matrix.repeat(2); // [[1,2],[1,2]]
-             */
-            repeat(rowRep, colRep) {
-                rowRep = rowRep || 1;
-                colRep = colRep || 1;
-                var matrix = new this.constructor[Symbol.species](this.rows * rowRep, this.columns * colRep);
-                for (var i = 0; i < rowRep; i++) {
-                    for (var j = 0; j < colRep; j++) {
-                        matrix.setSubMatrix(this, this.rows * i, this.columns * j);
-                    }
-                }
-                return matrix;
-            }
-
-            /**
-             * Fills the matrix with a given value. All elements will be set to this value.
-             * @param {number} value - New value
-             * @return {Matrix} this
-             */
-            fill(value) {
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, value);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Negates the matrix. All elements will be multiplied by (-1)
-             * @return {Matrix} this
-             */
-            neg() {
-                return this.mulS(-1);
-            }
-
-            /**
-             * Returns a new array from the given row index
-             * @param {number} index - Row index
-             * @return {Array}
-             */
-            getRow(index) {
-                util.checkRowIndex(this, index);
-                var row = new Array(this.columns);
-                for (var i = 0; i < this.columns; i++) {
-                    row[i] = this.get(index, i);
-                }
-                return row;
-            }
-
-            /**
-             * Returns a new row vector from the given row index
-             * @param {number} index - Row index
-             * @return {Matrix}
-             */
-            getRowVector(index) {
-                return this.constructor.rowVector(this.getRow(index));
-            }
-
-            /**
-             * Sets a row at the given index
-             * @param {number} index - Row index
-             * @param {Array|Matrix} array - Array or vector
-             * @return {Matrix} this
-             */
-            setRow(index, array) {
-                util.checkRowIndex(this, index);
-                array = util.checkRowVector(this, array);
-                for (var i = 0; i < this.columns; i++) {
-                    this.set(index, i, array[i]);
-                }
-                return this;
-            }
-
-            /**
-             * Swaps two rows
-             * @param {number} row1 - First row index
-             * @param {number} row2 - Second row index
-             * @return {Matrix} this
-             */
-            swapRows(row1, row2) {
-                util.checkRowIndex(this, row1);
-                util.checkRowIndex(this, row2);
-                for (var i = 0; i < this.columns; i++) {
-                    var temp = this.get(row1, i);
-                    this.set(row1, i, this.get(row2, i));
-                    this.set(row2, i, temp);
-                }
-                return this;
-            }
-
-            /**
-             * Returns a new array from the given column index
-             * @param {number} index - Column index
-             * @return {Array}
-             */
-            getColumn(index) {
-                util.checkColumnIndex(this, index);
-                var column = new Array(this.rows);
-                for (var i = 0; i < this.rows; i++) {
-                    column[i] = this.get(i, index);
-                }
-                return column;
-            }
-
-            /**
-             * Returns a new column vector from the given column index
-             * @param {number} index - Column index
-             * @return {Matrix}
-             */
-            getColumnVector(index) {
-                return this.constructor.columnVector(this.getColumn(index));
-            }
-
-            /**
-             * Sets a column at the given index
-             * @param {number} index - Column index
-             * @param {Array|Matrix} array - Array or vector
-             * @return {Matrix} this
-             */
-            setColumn(index, array) {
-                util.checkColumnIndex(this, index);
-                array = util.checkColumnVector(this, array);
-                for (var i = 0; i < this.rows; i++) {
-                    this.set(i, index, array[i]);
-                }
-                return this;
-            }
-
-            /**
-             * Swaps two columns
-             * @param {number} column1 - First column index
-             * @param {number} column2 - Second column index
-             * @return {Matrix} this
-             */
-            swapColumns(column1, column2) {
-                util.checkColumnIndex(this, column1);
-                util.checkColumnIndex(this, column2);
-                for (var i = 0; i < this.rows; i++) {
-                    var temp = this.get(i, column1);
-                    this.set(i, column1, this.get(i, column2));
-                    this.set(i, column2, temp);
-                }
-                return this;
-            }
-
-            /**
-             * Adds the values of a vector to each row
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            addRowVector(vector) {
-                vector = util.checkRowVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) + vector[j]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Subtracts the values of a vector from each row
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            subRowVector(vector) {
-                vector = util.checkRowVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) - vector[j]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Multiplies the values of a vector with each row
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            mulRowVector(vector) {
-                vector = util.checkRowVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) * vector[j]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Divides the values of each row by those of a vector
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            divRowVector(vector) {
-                vector = util.checkRowVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) / vector[j]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Adds the values of a vector to each column
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            addColumnVector(vector) {
-                vector = util.checkColumnVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) + vector[i]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Subtracts the values of a vector from each column
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            subColumnVector(vector) {
-                vector = util.checkColumnVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) - vector[i]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Multiplies the values of a vector with each column
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            mulColumnVector(vector) {
-                vector = util.checkColumnVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) * vector[i]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Divides the values of each column by those of a vector
-             * @param {Array|Matrix} vector - Array or vector
-             * @return {Matrix} this
-             */
-            divColumnVector(vector) {
-                vector = util.checkColumnVector(this, vector);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        this.set(i, j, this.get(i, j) / vector[i]);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Multiplies the values of a row with a scalar
-             * @param {number} index - Row index
-             * @param {number} value
-             * @return {Matrix} this
-             */
-            mulRow(index, value) {
-                util.checkRowIndex(this, index);
-                for (var i = 0; i < this.columns; i++) {
-                    this.set(index, i, this.get(index, i) * value);
-                }
-                return this;
-            }
-
-            /**
-             * Multiplies the values of a column with a scalar
-             * @param {number} index - Column index
-             * @param {number} value
-             * @return {Matrix} this
-             */
-            mulColumn(index, value) {
-                util.checkColumnIndex(this, index);
-                for (var i = 0; i < this.rows; i++) {
-                    this.set(i, index, this.get(i, index) * value);
-                }
-                return this;
-            }
-
-            /**
-             * Returns the maximum value of the matrix
-             * @return {number}
-             */
-            max() {
-                var v = this.get(0, 0);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        if (this.get(i, j) > v) {
-                            v = this.get(i, j);
-                        }
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the maximum value
-             * @return {Array}
-             */
-            maxIndex() {
-                var v = this.get(0, 0);
-                var idx = [0, 0];
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        if (this.get(i, j) > v) {
-                            v = this.get(i, j);
-                            idx[0] = i;
-                            idx[1] = j;
-                        }
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns the minimum value of the matrix
-             * @return {number}
-             */
-            min() {
-                var v = this.get(0, 0);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        if (this.get(i, j) < v) {
-                            v = this.get(i, j);
-                        }
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the minimum value
-             * @return {Array}
-             */
-            minIndex() {
-                var v = this.get(0, 0);
-                var idx = [0, 0];
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        if (this.get(i, j) < v) {
-                            v = this.get(i, j);
-                            idx[0] = i;
-                            idx[1] = j;
-                        }
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns the maximum value of one row
-             * @param {number} row - Row index
-             * @return {number}
-             */
-            maxRow(row) {
-                util.checkRowIndex(this, row);
-                var v = this.get(row, 0);
-                for (var i = 1; i < this.columns; i++) {
-                    if (this.get(row, i) > v) {
-                        v = this.get(row, i);
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the maximum value of one row
-             * @param {number} row - Row index
-             * @return {Array}
-             */
-            maxRowIndex(row) {
-                util.checkRowIndex(this, row);
-                var v = this.get(row, 0);
-                var idx = [row, 0];
-                for (var i = 1; i < this.columns; i++) {
-                    if (this.get(row, i) > v) {
-                        v = this.get(row, i);
-                        idx[1] = i;
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns the minimum value of one row
-             * @param {number} row - Row index
-             * @return {number}
-             */
-            minRow(row) {
-                util.checkRowIndex(this, row);
-                var v = this.get(row, 0);
-                for (var i = 1; i < this.columns; i++) {
-                    if (this.get(row, i) < v) {
-                        v = this.get(row, i);
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the maximum value of one row
-             * @param {number} row - Row index
-             * @return {Array}
-             */
-            minRowIndex(row) {
-                util.checkRowIndex(this, row);
-                var v = this.get(row, 0);
-                var idx = [row, 0];
-                for (var i = 1; i < this.columns; i++) {
-                    if (this.get(row, i) < v) {
-                        v = this.get(row, i);
-                        idx[1] = i;
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns the maximum value of one column
-             * @param {number} column - Column index
-             * @return {number}
-             */
-            maxColumn(column) {
-                util.checkColumnIndex(this, column);
-                var v = this.get(0, column);
-                for (var i = 1; i < this.rows; i++) {
-                    if (this.get(i, column) > v) {
-                        v = this.get(i, column);
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the maximum value of one column
-             * @param {number} column - Column index
-             * @return {Array}
-             */
-            maxColumnIndex(column) {
-                util.checkColumnIndex(this, column);
-                var v = this.get(0, column);
-                var idx = [0, column];
-                for (var i = 1; i < this.rows; i++) {
-                    if (this.get(i, column) > v) {
-                        v = this.get(i, column);
-                        idx[0] = i;
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns the minimum value of one column
-             * @param {number} column - Column index
-             * @return {number}
-             */
-            minColumn(column) {
-                util.checkColumnIndex(this, column);
-                var v = this.get(0, column);
-                for (var i = 1; i < this.rows; i++) {
-                    if (this.get(i, column) < v) {
-                        v = this.get(i, column);
-                    }
-                }
-                return v;
-            }
-
-            /**
-             * Returns the index of the minimum value of one column
-             * @param {number} column - Column index
-             * @return {Array}
-             */
-            minColumnIndex(column) {
-                util.checkColumnIndex(this, column);
-                var v = this.get(0, column);
-                var idx = [0, column];
-                for (var i = 1; i < this.rows; i++) {
-                    if (this.get(i, column) < v) {
-                        v = this.get(i, column);
-                        idx[0] = i;
-                    }
-                }
-                return idx;
-            }
-
-            /**
-             * Returns an array containing the diagonal values of the matrix
-             * @return {Array}
-             */
-            diag() {
-                var min = Math.min(this.rows, this.columns);
-                var diag = new Array(min);
-                for (var i = 0; i < min; i++) {
-                    diag[i] = this.get(i, i);
-                }
-                return diag;
-            }
-
-            /**
-             * Returns the sum by the argument given, if no argument given,
-             * it returns the sum of all elements of the matrix.
-             * @param {string} by - sum by 'row' or 'column'.
-             * @return {Matrix|number}
-             */
-            sum(by) {
-                switch (by) {
-                    case 'row':
-                        return util.sumByRow(this);
-                    case 'column':
-                        return util.sumByColumn(this);
-                    default:
-                        return util.sumAll(this);
-                }
-            }
-
-            /**
-             * Returns the mean of all elements of the matrix
-             * @return {number}
-             */
-            mean() {
-                return this.sum() / this.size;
-            }
-
-            /**
-             * Returns the product of all elements of the matrix
-             * @return {number}
-             */
-            prod() {
-                var prod = 1;
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        prod *= this.get(i, j);
-                    }
-                }
-                return prod;
-            }
-
-            /**
-             * Computes the cumulative sum of the matrix elements (in place, row by row)
-             * @return {Matrix} this
-             */
-            cumulativeSum() {
-                var sum = 0;
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        sum += this.get(i, j);
-                        this.set(i, j, sum);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Computes the dot (scalar) product between the matrix and another
-             * @param {Matrix} vector2 vector
-             * @return {number}
-             */
-            dot(vector2) {
-                if (Matrix.isMatrix(vector2)) vector2 = vector2.to1DArray();
-                var vector1 = this.to1DArray();
-                if (vector1.length !== vector2.length) {
-                    throw new RangeError('vectors do not have the same size');
-                }
-                var dot = 0;
-                for (var i = 0; i < vector1.length; i++) {
-                    dot += vector1[i] * vector2[i];
-                }
-                return dot;
-            }
-
-            /**
-             * Returns the matrix product between this and other
-             * @param {Matrix} other
-             * @return {Matrix}
-             */
-            mmul(other) {
-                other = this.constructor.checkMatrix(other);
-                if (this.columns !== other.rows) {
-                    // eslint-disable-next-line no-console
-                    console.warn('Number of columns of left matrix are not equal to number of rows of right matrix.');
-                }
-
-                var m = this.rows;
-                var n = this.columns;
-                var p = other.columns;
-
-                var result = new this.constructor[Symbol.species](m, p);
-
-                var Bcolj = new Array(n);
-                for (var j = 0; j < p; j++) {
-                    for (var k = 0; k < n; k++) {
-                        Bcolj[k] = other.get(k, j);
-                    }
-
-                    for (var i = 0; i < m; i++) {
-                        var s = 0;
-                        for (k = 0; k < n; k++) {
-                            s += this.get(i, k) * Bcolj[k];
-                        }
-
-                        result.set(i, j, s);
-                    }
-                }
-                return result;
-            }
-
-            strassen2x2(other) {
-                var result = new this.constructor[Symbol.species](2, 2);
-                const a11 = this.get(0, 0);
-                const b11 = other.get(0, 0);
-                const a12 = this.get(0, 1);
-                const b12 = other.get(0, 1);
-                const a21 = this.get(1, 0);
-                const b21 = other.get(1, 0);
-                const a22 = this.get(1, 1);
-                const b22 = other.get(1, 1);
-
-                // Compute intermediate values.
-                const m1 = (a11 + a22) * (b11 + b22);
-                const m2 = (a21 + a22) * b11;
-                const m3 = a11 * (b12 - b22);
-                const m4 = a22 * (b21 - b11);
-                const m5 = (a11 + a12) * b22;
-                const m6 = (a21 - a11) * (b11 + b12);
-                const m7 = (a12 - a22) * (b21 + b22);
-
-                // Combine intermediate values into the output.
-                const c00 = m1 + m4 - m5 + m7;
-                const c01 = m3 + m5;
-                const c10 = m2 + m4;
-                const c11 = m1 - m2 + m3 + m6;
-
-                result.set(0, 0, c00);
-                result.set(0, 1, c01);
-                result.set(1, 0, c10);
-                result.set(1, 1, c11);
-                return result;
-            }
-
-            strassen3x3(other) {
-                var result = new this.constructor[Symbol.species](3, 3);
-
-                const a00 = this.get(0, 0);
-                const a01 = this.get(0, 1);
-                const a02 = this.get(0, 2);
-                const a10 = this.get(1, 0);
-                const a11 = this.get(1, 1);
-                const a12 = this.get(1, 2);
-                const a20 = this.get(2, 0);
-                const a21 = this.get(2, 1);
-                const a22 = this.get(2, 2);
-
-                const b00 = other.get(0, 0);
-                const b01 = other.get(0, 1);
-                const b02 = other.get(0, 2);
-                const b10 = other.get(1, 0);
-                const b11 = other.get(1, 1);
-                const b12 = other.get(1, 2);
-                const b20 = other.get(2, 0);
-                const b21 = other.get(2, 1);
-                const b22 = other.get(2, 2);
-
-                const m1 = (a00 + a01 + a02 - a10 - a11 - a21 - a22) * b11;
-                const m2 = (a00 - a10) * (-b01 + b11);
-                const m3 = a11 * (-b00 + b01 + b10 - b11 - b12 - b20 + b22);
-                const m4 = (-a00 + a10 + a11) * (b00 - b01 + b11);
-                const m5 = (a10 + a11) * (-b00 + b01);
-                const m6 = a00 * b00;
-                const m7 = (-a00 + a20 + a21) * (b00 - b02 + b12);
-                const m8 = (-a00 + a20) * (b02 - b12);
-                const m9 = (a20 + a21) * (-b00 + b02);
-                const m10 = (a00 + a01 + a02 - a11 - a12 - a20 - a21) * b12;
-                const m11 = a21 * (-b00 + b02 + b10 - b11 - b12 - b20 + b21);
-                const m12 = (-a02 + a21 + a22) * (b11 + b20 - b21);
-                const m13 = (a02 - a22) * (b11 - b21);
-                const m14 = a02 * b20;
-                const m15 = (a21 + a22) * (-b20 + b21);
-                const m16 = (-a02 + a11 + a12) * (b12 + b20 - b22);
-                const m17 = (a02 - a12) * (b12 - b22);
-                const m18 = (a11 + a12) * (-b20 + b22);
-                const m19 = a01 * b10;
-                const m20 = a12 * b21;
-                const m21 = a10 * b02;
-                const m22 = a20 * b01;
-                const m23 = a22 * b22;
-
-                const c00 = m6 + m14 + m19;
-                const c01 = m1 + m4 + m5 + m6 + m12 + m14 + m15;
-                const c02 = m6 + m7 + m9 + m10 + m14 + m16 + m18;
-                const c10 = m2 + m3 + m4 + m6 + m14 + m16 + m17;
-                const c11 = m2 + m4 + m5 + m6 + m20;
-                const c12 = m14 + m16 + m17 + m18 + m21;
-                const c20 = m6 + m7 + m8 + m11 + m12 + m13 + m14;
-                const c21 = m12 + m13 + m14 + m15 + m22;
-                const c22 = m6 + m7 + m8 + m9 + m23;
-
-                result.set(0, 0, c00);
-                result.set(0, 1, c01);
-                result.set(0, 2, c02);
-                result.set(1, 0, c10);
-                result.set(1, 1, c11);
-                result.set(1, 2, c12);
-                result.set(2, 0, c20);
-                result.set(2, 1, c21);
-                result.set(2, 2, c22);
-                return result;
-            }
-
-            /**
-             * Returns the matrix product between x and y. More efficient than mmul(other) only when we multiply squared matrix and when the size of the matrix is > 1000.
-             * @param {Matrix} y
-             * @return {Matrix}
-             */
-            mmulStrassen(y) {
-                var x = this.clone();
-                var r1 = x.rows;
-                var c1 = x.columns;
-                var r2 = y.rows;
-                var c2 = y.columns;
-                if (c1 !== r2) {
-                    // eslint-disable-next-line no-console
-                    console.warn(`Multiplying ${r1} x ${c1} and ${r2} x ${c2} matrix: dimensions do not match.`);
-                }
-
-                // Put a matrix into the top left of a matrix of zeros.
-                // `rows` and `cols` are the dimensions of the output matrix.
-                function embed(mat, rows, cols) {
-                    var r = mat.rows;
-                    var c = mat.columns;
-                    if ((r === rows) && (c === cols)) {
-                        return mat;
-                    } else {
-                        var resultat = Matrix.zeros(rows, cols);
-                        resultat = resultat.setSubMatrix(mat, 0, 0);
-                        return resultat;
-                    }
-                }
-
-
-                // Make sure both matrices are the same size.
-                // This is exclusively for simplicity:
-                // this algorithm can be implemented with matrices of different sizes.
-
-                var r = Math.max(r1, r2);
-                var c = Math.max(c1, c2);
-                x = embed(x, r, c);
-                y = embed(y, r, c);
-
-                // Our recursive multiplication function.
-                function blockMult(a, b, rows, cols) {
-                    // For small matrices, resort to naive multiplication.
-                    if (rows <= 512 || cols <= 512) {
-                        return a.mmul(b); // a is equivalent to this
-                    }
-
-                    // Apply dynamic padding.
-                    if ((rows % 2 === 1) && (cols % 2 === 1)) {
-                        a = embed(a, rows + 1, cols + 1);
-                        b = embed(b, rows + 1, cols + 1);
-                    } else if (rows % 2 === 1) {
-                        a = embed(a, rows + 1, cols);
-                        b = embed(b, rows + 1, cols);
-                    } else if (cols % 2 === 1) {
-                        a = embed(a, rows, cols + 1);
-                        b = embed(b, rows, cols + 1);
-                    }
-
-                    var halfRows = parseInt(a.rows / 2);
-                    var halfCols = parseInt(a.columns / 2);
-                    // Subdivide input matrices.
-                    var a11 = a.subMatrix(0, halfRows - 1, 0, halfCols - 1);
-                    var b11 = b.subMatrix(0, halfRows - 1, 0, halfCols - 1);
-
-                    var a12 = a.subMatrix(0, halfRows - 1, halfCols, a.columns - 1);
-                    var b12 = b.subMatrix(0, halfRows - 1, halfCols, b.columns - 1);
-
-                    var a21 = a.subMatrix(halfRows, a.rows - 1, 0, halfCols - 1);
-                    var b21 = b.subMatrix(halfRows, b.rows - 1, 0, halfCols - 1);
-
-                    var a22 = a.subMatrix(halfRows, a.rows - 1, halfCols, a.columns - 1);
-                    var b22 = b.subMatrix(halfRows, b.rows - 1, halfCols, b.columns - 1);
-
-                    // Compute intermediate values.
-                    var m1 = blockMult(Matrix.add(a11, a22), Matrix.add(b11, b22), halfRows, halfCols);
-                    var m2 = blockMult(Matrix.add(a21, a22), b11, halfRows, halfCols);
-                    var m3 = blockMult(a11, Matrix.sub(b12, b22), halfRows, halfCols);
-                    var m4 = blockMult(a22, Matrix.sub(b21, b11), halfRows, halfCols);
-                    var m5 = blockMult(Matrix.add(a11, a12), b22, halfRows, halfCols);
-                    var m6 = blockMult(Matrix.sub(a21, a11), Matrix.add(b11, b12), halfRows, halfCols);
-                    var m7 = blockMult(Matrix.sub(a12, a22), Matrix.add(b21, b22), halfRows, halfCols);
-
-                    // Combine intermediate values into the output.
-                    var c11 = Matrix.add(m1, m4);
-                    c11.sub(m5);
-                    c11.add(m7);
-                    var c12 = Matrix.add(m3, m5);
-                    var c21 = Matrix.add(m2, m4);
-                    var c22 = Matrix.sub(m1, m2);
-                    c22.add(m3);
-                    c22.add(m6);
-
-                    //Crop output to the desired size (undo dynamic padding).
-                    var resultat = Matrix.zeros(2 * c11.rows, 2 * c11.columns);
-                    resultat = resultat.setSubMatrix(c11, 0, 0);
-                    resultat = resultat.setSubMatrix(c12, c11.rows, 0);
-                    resultat = resultat.setSubMatrix(c21, 0, c11.columns);
-                    resultat = resultat.setSubMatrix(c22, c11.rows, c11.columns);
-                    return resultat.subMatrix(0, rows - 1, 0, cols - 1);
-                }
-                return blockMult(x, y, r, c);
-            }
-
-            /**
-             * Returns a row-by-row scaled matrix
-             * @param {number} [min=0] - Minimum scaled value
-             * @param {number} [max=1] - Maximum scaled value
-             * @return {Matrix} - The scaled matrix
-             */
-            scaleRows(min, max) {
-                min = min === undefined ? 0 : min;
-                max = max === undefined ? 1 : max;
-                if (min >= max) {
-                    throw new RangeError('min should be strictly smaller than max');
-                }
-                var newMatrix = this.constructor.empty(this.rows, this.columns);
-                for (var i = 0; i < this.rows; i++) {
-                    var scaled = arrayUtils.scale(this.getRow(i), {min, max});
-                    newMatrix.setRow(i, scaled);
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Returns a new column-by-column scaled matrix
-             * @param {number} [min=0] - Minimum scaled value
-             * @param {number} [max=1] - Maximum scaled value
-             * @return {Matrix} - The new scaled matrix
-             * @example
-             * var matrix = new Matrix([[1,2],[-1,0]]);
-             * var scaledMatrix = matrix.scaleColumns(); // [[1,1],[0,0]]
-             */
-            scaleColumns(min, max) {
-                min = min === undefined ? 0 : min;
-                max = max === undefined ? 1 : max;
-                if (min >= max) {
-                    throw new RangeError('min should be strictly smaller than max');
-                }
-                var newMatrix = this.constructor.empty(this.rows, this.columns);
-                for (var i = 0; i < this.columns; i++) {
-                    var scaled = arrayUtils.scale(this.getColumn(i), {
-                        min: min,
-                        max: max
-                    });
-                    newMatrix.setColumn(i, scaled);
-                }
-                return newMatrix;
-            }
-
-
-            /**
-             * Returns the Kronecker product (also known as tensor product) between this and other
-             * See https://en.wikipedia.org/wiki/Kronecker_product
-             * @param {Matrix} other
-             * @return {Matrix}
-             */
-            kroneckerProduct(other) {
-                other = this.constructor.checkMatrix(other);
-
-                var m = this.rows;
-                var n = this.columns;
-                var p = other.rows;
-                var q = other.columns;
-
-                var result = new this.constructor[Symbol.species](m * p, n * q);
-                for (var i = 0; i < m; i++) {
-                    for (var j = 0; j < n; j++) {
-                        for (var k = 0; k < p; k++) {
-                            for (var l = 0; l < q; l++) {
-                                result[p * i + k][q * j + l] = this.get(i, j) * other.get(k, l);
-                            }
-                        }
-                    }
-                }
-                return result;
-            }
-
-            /**
-             * Transposes the matrix and returns a new one containing the result
-             * @return {Matrix}
-             */
-            transpose() {
-                var result = new this.constructor[Symbol.species](this.columns, this.rows);
-                for (var i = 0; i < this.rows; i++) {
-                    for (var j = 0; j < this.columns; j++) {
-                        result.set(j, i, this.get(i, j));
-                    }
-                }
-                return result;
-            }
-
-            /**
-             * Sorts the rows (in place)
-             * @param {function} compareFunction - usual Array.prototype.sort comparison function
-             * @return {Matrix} this
-             */
-            sortRows(compareFunction) {
-                if (compareFunction === undefined) compareFunction = compareNumbers;
-                for (var i = 0; i < this.rows; i++) {
-                    this.setRow(i, this.getRow(i).sort(compareFunction));
-                }
-                return this;
-            }
-
-            /**
-             * Sorts the columns (in place)
-             * @param {function} compareFunction - usual Array.prototype.sort comparison function
-             * @return {Matrix} this
-             */
-            sortColumns(compareFunction) {
-                if (compareFunction === undefined) compareFunction = compareNumbers;
-                for (var i = 0; i < this.columns; i++) {
-                    this.setColumn(i, this.getColumn(i).sort(compareFunction));
-                }
-                return this;
-            }
-
-            /**
-             * Returns a subset of the matrix
-             * @param {number} startRow - First row index
-             * @param {number} endRow - Last row index
-             * @param {number} startColumn - First column index
-             * @param {number} endColumn - Last column index
-             * @return {Matrix}
-             */
-            subMatrix(startRow, endRow, startColumn, endColumn) {
-                util.checkRange(this, startRow, endRow, startColumn, endColumn);
-                var newMatrix = new this.constructor[Symbol.species](endRow - startRow + 1, endColumn - startColumn + 1);
-                for (var i = startRow; i <= endRow; i++) {
-                    for (var j = startColumn; j <= endColumn; j++) {
-                        newMatrix[i - startRow][j - startColumn] = this.get(i, j);
-                    }
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Returns a subset of the matrix based on an array of row indices
-             * @param {Array} indices - Array containing the row indices
-             * @param {number} [startColumn = 0] - First column index
-             * @param {number} [endColumn = this.columns-1] - Last column index
-             * @return {Matrix}
-             */
-            subMatrixRow(indices, startColumn, endColumn) {
-                if (startColumn === undefined) startColumn = 0;
-                if (endColumn === undefined) endColumn = this.columns - 1;
-                if ((startColumn > endColumn) || (startColumn < 0) || (startColumn >= this.columns) || (endColumn < 0) || (endColumn >= this.columns)) {
-                    throw new RangeError('Argument out of range');
-                }
-
-                var newMatrix = new this.constructor[Symbol.species](indices.length, endColumn - startColumn + 1);
-                for (var i = 0; i < indices.length; i++) {
-                    for (var j = startColumn; j <= endColumn; j++) {
-                        if (indices[i] < 0 || indices[i] >= this.rows) {
-                            throw new RangeError('Row index out of range: ' + indices[i]);
-                        }
-                        newMatrix.set(i, j - startColumn, this.get(indices[i], j));
-                    }
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Returns a subset of the matrix based on an array of column indices
-             * @param {Array} indices - Array containing the column indices
-             * @param {number} [startRow = 0] - First row index
-             * @param {number} [endRow = this.rows-1] - Last row index
-             * @return {Matrix}
-             */
-            subMatrixColumn(indices, startRow, endRow) {
-                if (startRow === undefined) startRow = 0;
-                if (endRow === undefined) endRow = this.rows - 1;
-                if ((startRow > endRow) || (startRow < 0) || (startRow >= this.rows) || (endRow < 0) || (endRow >= this.rows)) {
-                    throw new RangeError('Argument out of range');
-                }
-
-                var newMatrix = new this.constructor[Symbol.species](endRow - startRow + 1, indices.length);
-                for (var i = 0; i < indices.length; i++) {
-                    for (var j = startRow; j <= endRow; j++) {
-                        if (indices[i] < 0 || indices[i] >= this.columns) {
-                            throw new RangeError('Column index out of range: ' + indices[i]);
-                        }
-                        newMatrix.set(j - startRow, i, this.get(j, indices[i]));
-                    }
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Set a part of the matrix to the given sub-matrix
-             * @param {Matrix|Array< Array >} matrix - The source matrix from which to extract values.
-             * @param {number} startRow - The index of the first row to set
-             * @param {number} startColumn - The index of the first column to set
-             * @return {Matrix}
-             */
-            setSubMatrix(matrix, startRow, startColumn) {
-                matrix = this.constructor.checkMatrix(matrix);
-                var endRow = startRow + matrix.rows - 1;
-                var endColumn = startColumn + matrix.columns - 1;
-                util.checkRange(this, startRow, endRow, startColumn, endColumn);
-                for (var i = 0; i < matrix.rows; i++) {
-                    for (var j = 0; j < matrix.columns; j++) {
-                        this[startRow + i][startColumn + j] = matrix.get(i, j);
-                    }
-                }
-                return this;
-            }
-
-            /**
-             * Return a new matrix based on a selection of rows and columns
-             * @param {Array<number>} rowIndices - The row indices to select. Order matters and an index can be more than once.
-             * @param {Array<number>} columnIndices - The column indices to select. Order matters and an index can be use more than once.
-             * @return {Matrix} The new matrix
-             */
-            selection(rowIndices, columnIndices) {
-                var indices = util.checkIndices(this, rowIndices, columnIndices);
-                var newMatrix = new this.constructor[Symbol.species](rowIndices.length, columnIndices.length);
-                for (var i = 0; i < indices.row.length; i++) {
-                    var rowIndex = indices.row[i];
-                    for (var j = 0; j < indices.column.length; j++) {
-                        var columnIndex = indices.column[j];
-                        newMatrix[i][j] = this.get(rowIndex, columnIndex);
-                    }
-                }
-                return newMatrix;
-            }
-
-            /**
-             * Returns the trace of the matrix (sum of the diagonal elements)
-             * @return {number}
-             */
-            trace() {
-                var min = Math.min(this.rows, this.columns);
-                var trace = 0;
-                for (var i = 0; i < min; i++) {
-                    trace += this.get(i, i);
-                }
-                return trace;
-            }
-
-            /*
-             Matrix views
-             */
-
-            /**
-             * Returns a view of the transposition of the matrix
-             * @return {MatrixTransposeView}
-             */
-            transposeView() {
-                return new MLMatrixTransposeView(this);
-            }
-
-            /**
-             * Returns a view of the row vector with the given index
-             * @param {number} row - row index of the vector
-             * @return {MatrixRowView}
-             */
-            rowView(row) {
-                util.checkRowIndex(this, row);
-                return new MLMatrixRowView(this, row);
-            }
-
-            /**
-             * Returns a view of the column vector with the given index
-             * @param {number} column - column index of the vector
-             * @return {MatrixColumnView}
-             */
-            columnView(column) {
-                util.checkColumnIndex(this, column);
-                return new MLMatrixColumnView(this, column);
-            }
-
-            /**
-             * Returns a view of the matrix flipped in the row axis
-             * @return {MatrixFlipRowView}
-             */
-            flipRowView() {
-                return new MLMatrixFlipRowView(this);
-            }
-
-            /**
-             * Returns a view of the matrix flipped in the column axis
-             * @return {MatrixFlipColumnView}
-             */
-            flipColumnView() {
-                return new MLMatrixFlipColumnView(this);
-            }
-
-            /**
-             * Returns a view of a submatrix giving the index boundaries
-             * @param {number} startRow - first row index of the submatrix
-             * @param {number} endRow - last row index of the submatrix
-             * @param {number} startColumn - first column index of the submatrix
-             * @param {number} endColumn - last column index of the submatrix
-             * @return {MatrixSubView}
-             */
-            subMatrixView(startRow, endRow, startColumn, endColumn) {
-                return new MLMatrixSubView(this, startRow, endRow, startColumn, endColumn);
-            }
-
-            /**
-             * Returns a view of the cross of the row indices and the column indices
-             * @example
-             * // resulting vector is [[2], [2]]
-             * var matrix = new Matrix([[1,2,3], [4,5,6]]).selectionView([0, 0], [1])
-             * @param {Array<number>} rowIndices
-             * @param {Array<number>} columnIndices
-             * @return {MatrixSelectionView}
-             */
-            selectionView(rowIndices, columnIndices) {
-                return new MLMatrixSelectionView(this, rowIndices, columnIndices);
-            }
-
-
-            /**
-            * Calculates and returns the determinant of a matrix as a Number
-            * @example
-            *   new Matrix([[1,2,3], [4,5,6]]).det()
-            * @return {number}
-            */
-            det() {
-                if (this.isSquare()) {
-                    var a, b, c, d;
-                    if (this.columns === 2) {
-                        // 2 x 2 matrix
-                        a = this.get(0, 0);
-                        b = this.get(0, 1);
-                        c = this.get(1, 0);
-                        d = this.get(1, 1);
-
-                        return a * d - (b * c);
-                    } else if (this.columns === 3) {
-                        // 3 x 3 matrix
-                        var subMatrix0, subMatrix1, subMatrix2;
-                        subMatrix0 = this.selectionView([1, 2], [1, 2]);
-                        subMatrix1 = this.selectionView([1, 2], [0, 2]);
-                        subMatrix2 = this.selectionView([1, 2], [0, 1]);
-                        a = this.get(0, 0);
-                        b = this.get(0, 1);
-                        c = this.get(0, 2);
-
-                        return a * subMatrix0.det() - b * subMatrix1.det() + c * subMatrix2.det();
-                    } else {
-                        // general purpose determinant using the LU decomposition
-                        return new LuDecomposition(this).determinant;
-                    }
-
-                } else {
-                    throw Error('Determinant can only be calculated for a square matrix.');
-                }
-            }
-
-            /**
-             * Returns inverse of a matrix if it exists or the pseudoinverse
-             * @param {number} threshold - threshold for taking inverse of singular values (default = 1e-15)
-             * @return {Matrix} the (pseudo)inverted matrix.
-             */
-            pseudoInverse(threshold) {
-                if (threshold === undefined) threshold = Number.EPSILON;
-                var svdSolution = new SvDecomposition(this, {autoTranspose: true});
-
-                var U = svdSolution.leftSingularVectors;
-                var V = svdSolution.rightSingularVectors;
-                var s = svdSolution.diagonal;
-
-                for (var i = 0; i < s.length; i++) {
-                    if (Math.abs(s[i]) > threshold) {
-                        s[i] = 1.0 / s[i];
-                    } else {
-                        s[i] = 0.0;
-                    }
-                }
-
-                // convert list to diagonal
-                s = this.constructor[Symbol.species].diag(s);
-                return V.mmul(s.mmul(U.transposeView()));
-            }
-        }
-
-        Matrix.prototype.klass = 'Matrix';
-
-        /**
-         * @private
-         * Check that two matrices have the same dimensions
-         * @param {Matrix} matrix
-         * @param {Matrix} otherMatrix
-         */
-        function checkDimensions(matrix, otherMatrix) { // eslint-disable-line no-unused-vars
-            if (matrix.rows !== otherMatrix.rows ||
-                matrix.columns !== otherMatrix.columns) {
-                throw new RangeError('Matrices dimensions must be equal');
-            }
-        }
-
-        function compareNumbers(a, b) {
-            return a - b;
-        }
-
-        /*
-         Synonyms
-         */
-
-        Matrix.random = Matrix.rand;
-        Matrix.diagonal = Matrix.diag;
-        Matrix.prototype.diagonal = Matrix.prototype.diag;
-        Matrix.identity = Matrix.eye;
-        Matrix.prototype.negate = Matrix.prototype.neg;
-        Matrix.prototype.tensorProduct = Matrix.prototype.kroneckerProduct;
-        Matrix.prototype.determinant = Matrix.prototype.det;
-
-        /*
-         Add dynamically instance and static methods for mathematical operations
-         */
-
-        var inplaceOperator = `
-    (function %name%(value) {
-        if (typeof value === 'number') return this.%name%S(value);
-        return this.%name%M(value);
-    })
-    `;
-
-        var inplaceOperatorScalar = `
-    (function %name%S(value) {
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, this.get(i, j) %op% value);
-            }
-        }
-        return this;
-    })
-    `;
-
-        var inplaceOperatorMatrix = `
-    (function %name%M(matrix) {
-        matrix = this.constructor.checkMatrix(matrix);
-        checkDimensions(this, matrix);
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, this.get(i, j) %op% matrix.get(i, j));
-            }
-        }
-        return this;
-    })
-    `;
-
-        var staticOperator = `
-    (function %name%(matrix, value) {
-        var newMatrix = new this[Symbol.species](matrix);
-        return newMatrix.%name%(value);
-    })
-    `;
-
-        var inplaceMethod = `
-    (function %name%() {
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, %method%(this.get(i, j)));
-            }
-        }
-        return this;
-    })
-    `;
-
-        var staticMethod = `
-    (function %name%(matrix) {
-        var newMatrix = new this[Symbol.species](matrix);
-        return newMatrix.%name%();
-    })
-    `;
-
-        var inplaceMethodWithArgs = `
-    (function %name%(%args%) {
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, %method%(this.get(i, j), %args%));
-            }
-        }
-        return this;
-    })
-    `;
-
-        var staticMethodWithArgs = `
-    (function %name%(matrix, %args%) {
-        var newMatrix = new this[Symbol.species](matrix);
-        return newMatrix.%name%(%args%);
-    })
-    `;
-
-
-        var inplaceMethodWithOneArgScalar = `
-    (function %name%S(value) {
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, %method%(this.get(i, j), value));
-            }
-        }
-        return this;
-    })
-    `;
-        var inplaceMethodWithOneArgMatrix = `
-    (function %name%M(matrix) {
-        matrix = this.constructor.checkMatrix(matrix);
-        checkDimensions(this, matrix);
-        for (var i = 0; i < this.rows; i++) {
-            for (var j = 0; j < this.columns; j++) {
-                this.set(i, j, %method%(this.get(i, j), matrix.get(i, j)));
-            }
-        }
-        return this;
-    })
-    `;
-
-        var inplaceMethodWithOneArg = `
-    (function %name%(value) {
-        if (typeof value === 'number') return this.%name%S(value);
-        return this.%name%M(value);
-    })
-    `;
-
-        var staticMethodWithOneArg = staticMethodWithArgs;
-
-        var operators = [
-            // Arithmetic operators
-            ['+', 'add'],
-            ['-', 'sub', 'subtract'],
-            ['*', 'mul', 'multiply'],
-            ['/', 'div', 'divide'],
-            ['%', 'mod', 'modulus'],
-            // Bitwise operators
-            ['&', 'and'],
-            ['|', 'or'],
-            ['^', 'xor'],
-            ['<<', 'leftShift'],
-            ['>>', 'signPropagatingRightShift'],
-            ['>>>', 'rightShift', 'zeroFillRightShift']
-        ];
-
-        var i;
-
-        for (var operator of operators) {
-            var inplaceOp = eval(fillTemplateFunction(inplaceOperator, {name: operator[1], op: operator[0]}));
-            var inplaceOpS = eval(fillTemplateFunction(inplaceOperatorScalar, {name: operator[1] + 'S', op: operator[0]}));
-            var inplaceOpM = eval(fillTemplateFunction(inplaceOperatorMatrix, {name: operator[1] + 'M', op: operator[0]}));
-            var staticOp = eval(fillTemplateFunction(staticOperator, {name: operator[1]}));
-            for (i = 1; i < operator.length; i++) {
-                Matrix.prototype[operator[i]] = inplaceOp;
-                Matrix.prototype[operator[i] + 'S'] = inplaceOpS;
-                Matrix.prototype[operator[i] + 'M'] = inplaceOpM;
-                Matrix[operator[i]] = staticOp;
-            }
-        }
-
-        var methods = [
-            ['~', 'not']
-        ];
-
-        [
-            'abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'cbrt', 'ceil',
-            'clz32', 'cos', 'cosh', 'exp', 'expm1', 'floor', 'fround', 'log', 'log1p',
-            'log10', 'log2', 'round', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc'
-        ].forEach(function (mathMethod) {
-            methods.push(['Math.' + mathMethod, mathMethod]);
-        });
-
-        for (var method of methods) {
-            var inplaceMeth = eval(fillTemplateFunction(inplaceMethod, {name: method[1], method: method[0]}));
-            var staticMeth = eval(fillTemplateFunction(staticMethod, {name: method[1]}));
-            for (i = 1; i < method.length; i++) {
-                Matrix.prototype[method[i]] = inplaceMeth;
-                Matrix[method[i]] = staticMeth;
-            }
-        }
-
-        var methodsWithArgs = [
-            ['Math.pow', 1, 'pow']
-        ];
-
-        for (var methodWithArg of methodsWithArgs) {
-            var args = 'arg0';
-            for (i = 1; i < methodWithArg[1]; i++) {
-                args += `, arg${i}`;
-            }
-            if (methodWithArg[1] !== 1) {
-                var inplaceMethWithArgs = eval(fillTemplateFunction(inplaceMethodWithArgs, {
-                    name: methodWithArg[2],
-                    method: methodWithArg[0],
-                    args: args
-                }));
-                var staticMethWithArgs = eval(fillTemplateFunction(staticMethodWithArgs, {name: methodWithArg[2], args: args}));
-                for (i = 2; i < methodWithArg.length; i++) {
-                    Matrix.prototype[methodWithArg[i]] = inplaceMethWithArgs;
-                    Matrix[methodWithArg[i]] = staticMethWithArgs;
-                }
-            } else {
-                var tmplVar = {
-                    name: methodWithArg[2],
-                    args: args,
-                    method: methodWithArg[0]
-                };
-                var inplaceMethod2 = eval(fillTemplateFunction(inplaceMethodWithOneArg, tmplVar));
-                var inplaceMethodS = eval(fillTemplateFunction(inplaceMethodWithOneArgScalar, tmplVar));
-                var inplaceMethodM = eval(fillTemplateFunction(inplaceMethodWithOneArgMatrix, tmplVar));
-                var staticMethod2 = eval(fillTemplateFunction(staticMethodWithOneArg, tmplVar));
-                for (i = 2; i < methodWithArg.length; i++) {
-                    Matrix.prototype[methodWithArg[i]] = inplaceMethod2;
-                    Matrix.prototype[methodWithArg[i] + 'M'] = inplaceMethodM;
-                    Matrix.prototype[methodWithArg[i] + 'S'] = inplaceMethodS;
-                    Matrix[methodWithArg[i]] = staticMethod2;
-                }
-            }
-        }
-
-        function fillTemplateFunction(template, values) {
-            for (var value in values) {
-                template = template.replace(new RegExp('%' + value + '%', 'g'), values[value]);
-            }
-            return template;
-        }
-
-        return Matrix;
-    }
-}
-
-
-// ml-matrix src/views/base
-let MLMatrixBaseView;
-{
-    let abstractMatrix = MLMatrixAbstractMatrix;
-    let Matrix = MLMatrixMatrix;
-
-    class BaseView extends abstractMatrix() {
-        constructor(matrix, rows, columns) {
-            super();
-            this.matrix = matrix;
-            this.rows = rows;
-            this.columns = columns;
-        }
-
-        static get [Symbol.species]() {
-            return Matrix.Matrix;
-        }
-    }
-
-    MLMatrixBaseView = BaseView;
-}
-
-
-// ml-matrix src/views/column.js
-let MLMatrixColumnView;
-{
-    let BaseView = MLMatrixBaseView;
-
-    class MatrixColumnView extends BaseView {
-        constructor(matrix, column) {
-            super(matrix, matrix.rows, 1);
-            this.column = column;
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(rowIndex, this.column, value);
-            return this;
-        }
-
-        get(rowIndex) {
-            return this.matrix.get(rowIndex, this.column);
-        }
-    }
-
-    MLMatrixColumnView = MatrixColumnView;
-}
-
-
-// ml-matrix src/views/flipColumn.js
-let MLMatrixFlipColumnView;
-{
-    let BaseView = MLMatrixBaseView
-
-    class MatrixFlipColumnView extends BaseView {
-        constructor(matrix) {
-            super(matrix, matrix.rows, matrix.columns);
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(rowIndex, this.columns - columnIndex - 1, value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(rowIndex, this.columns - columnIndex - 1);
-        }
-    }
-
-    MLMatrixFlipColumnView = MatrixFlipColumnView;
-}
-
-
-// ml-matrix src/views/flipRow.js
-let MLMatrixFlipRowView;
-{
-    let BaseView = MLMatrixBaseView
-
-    class MatrixFlipRowView extends BaseView {
-        constructor(matrix) {
-            super(matrix, matrix.rows, matrix.columns);
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(this.rows - rowIndex - 1, columnIndex, value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(this.rows - rowIndex - 1, columnIndex);
-        }
-    }
-
-    MLMatrixFlipRowView = MatrixFlipRowView;
-}
-
-// ml-matrix src/views/row.js
-let MLMatrixRowView;
-{
-    let BaseView = MLMatrixBaseView;
-
-    class MatrixRowView extends BaseView {
-        constructor(matrix, row) {
-            super(matrix, 1, matrix.columns);
-            this.row = row;
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(this.row, columnIndex, value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(this.row, columnIndex);
-        }
-    }
-
-    MLMatrixRowView = MatrixRowView;
-}
-
-
-// ml-matrix src/views/selection.js
-let MLMatrixSelectionView;
-{
-    let BaseView = MLMatrixBaseView;
-    let util = MLMatrixUtil;
-
-    class MatrixSelectionView extends BaseView {
-        constructor(matrix, rowIndices, columnIndices) {
-            var indices = util.checkIndices(matrix, rowIndices, columnIndices);
-            super(matrix, indices.row.length, indices.column.length);
-            this.rowIndices = indices.row;
-            this.columnIndices = indices.column;
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(this.rowIndices[rowIndex], this.columnIndices[columnIndex], value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(this.rowIndices[rowIndex], this.columnIndices[columnIndex]);
-        }
-    }
-
-    MLMatrixSelectionView = MatrixSelectionView;
-}
-
-// ml-matrix src/views/sub.js
-let MLMatrixSubView;
-{
-    let BaseView = MLMatrixBaseView;
-    let util = MLMatrixUtil;
-
-    class MatrixSubView extends BaseView {
-        constructor(matrix, startRow, endRow, startColumn, endColumn) {
-            util.checkRange(matrix, startRow, endRow, startColumn, endColumn);
-            super(matrix, endRow - startRow + 1, endColumn - startColumn + 1);
-            this.startRow = startRow;
-            this.startColumn = startColumn;
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(this.startRow + rowIndex, this.startColumn + columnIndex, value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(this.startRow + rowIndex, this.startColumn + columnIndex);
-        }
-    }
-
-    MLMatrixSubView = MatrixSubView;
-}
-
-// ml-matrix src/views/transpose.js
-let MLMatrixTransposeView;
-{
-    let BaseView = MLMatrixBaseView;
-
-    class MatrixTransposeView extends BaseView {
-        constructor(matrix) {
-            super(matrix, matrix.columns, matrix.rows);
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this.matrix.set(columnIndex, rowIndex, value);
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this.matrix.get(columnIndex, rowIndex);
-        }
-    }
-
-    MLMatrixTransposeView = MatrixTransposeView;
-}
-
-// mlmatrix src/matrix.js
-{
-    let abstractMatrix = MLMatrixAbstractMatrix;
-    let util = MLMatrixUtil;
-
-    class Matrix extends abstractMatrix(Array) {
-        constructor(nRows, nColumns) {
-            var i;
-            if (arguments.length === 1 && typeof nRows === 'number') {
-                return new Array(nRows);
-            }
-            if (Matrix.isMatrix(nRows)) {
-                return nRows.clone();
-            } else if (Number.isInteger(nRows) && nRows > 0) { // Create an empty matrix
-                super(nRows);
-                if (Number.isInteger(nColumns) && nColumns > 0) {
-                    for (i = 0; i < nRows; i++) {
-                        this[i] = new Array(nColumns);
-                    }
-                } else {
-                    throw new TypeError('nColumns must be a positive integer');
-                }
-            } else if (Array.isArray(nRows)) { // Copy the values from the 2D array
-                const matrix = nRows;
-                nRows = matrix.length;
-                nColumns = matrix[0].length;
-                if (typeof nColumns !== 'number' || nColumns === 0) {
-                    throw new TypeError('Data must be a 2D array with at least one element');
-                }
-                super(nRows);
-                for (i = 0; i < nRows; i++) {
-                    if (matrix[i].length !== nColumns) {
-                        throw new RangeError('Inconsistent array dimensions');
-                    }
-                    this[i] = [].concat(matrix[i]);
-                }
-            } else {
-                throw new TypeError('First argument must be a positive number or an array');
-            }
-            this.rows = nRows;
-            this.columns = nColumns;
-            return this;
-        }
-
-        set(rowIndex, columnIndex, value) {
-            this[rowIndex][columnIndex] = value;
-            return this;
-        }
-
-        get(rowIndex, columnIndex) {
-            return this[rowIndex][columnIndex];
-        }
-
-        /**
-         * Creates an exact and independent copy of the matrix
-         * @return {Matrix}
-         */
-        clone() {
-            var newMatrix = new this.constructor[Symbol.species](this.rows, this.columns);
-            for (var row = 0; row < this.rows; row++) {
-                for (var column = 0; column < this.columns; column++) {
-                    newMatrix.set(row, column, this.get(row, column));
-                }
-            }
-            return newMatrix;
-        }
-
-        /**
-         * Removes a row from the given index
-         * @param {number} index - Row index
-         * @return {Matrix} this
-         */
-        removeRow(index) {
-            util.checkRowIndex(this, index);
-            if (this.rows === 1) {
-                throw new RangeError('A matrix cannot have less than one row');
-            }
-            this.splice(index, 1);
-            this.rows -= 1;
-            return this;
-        }
-
-        /**
-         * Adds a row at the given index
-         * @param {number} [index = this.rows] - Row index
-         * @param {Array|Matrix} array - Array or vector
-         * @return {Matrix} this
-         */
-        addRow(index, array) {
-            if (array === undefined) {
-                array = index;
-                index = this.rows;
-            }
-            util.checkRowIndex(this, index, true);
-            array = util.checkRowVector(this, array, true);
-            this.splice(index, 0, array);
-            this.rows += 1;
-            return this;
-        }
-
-        /**
-         * Removes a column from the given index
-         * @param {number} index - Column index
-         * @return {Matrix} this
-         */
-        removeColumn(index) {
-            util.checkColumnIndex(this, index);
-            if (this.columns === 1) {
-                throw new RangeError('A matrix cannot have less than one column');
-            }
-            for (var i = 0; i < this.rows; i++) {
-                this[i].splice(index, 1);
-            }
-            this.columns -= 1;
-            return this;
-        }
-
-        /**
-         * Adds a column at the given index
-         * @param {number} [index = this.columns] - Column index
-         * @param {Array|Matrix} array - Array or vector
-         * @return {Matrix} this
-         */
-        addColumn(index, array) {
-            if (typeof array === 'undefined') {
-                array = index;
-                index = this.columns;
-            }
-            util.checkColumnIndex(this, index, true);
-            array = util.checkColumnVector(this, array);
-            for (var i = 0; i < this.rows; i++) {
-                this[i].splice(index, 0, array[i]);
-            }
-            this.columns += 1;
-            return this;
-        }
-    }
-
-    MLMatrixMatrix.Matrix = Matrix;
-    Matrix.abstractMatrix = abstractMatrix;
-}
-
-
-// ml-matrix src/dc/cholesky.js
-let MLMatrixDCCholesky = {};
-{
-    let Matrix = MLMatrixMatrix.Matrix;
-
-    // https://github.com/lutzroeder/Mapack/blob/master/Source/CholeskyDecomposition.cs
-    function CholeskyDecomposition(value) {
-        if (!(this instanceof CholeskyDecomposition)) {
-            return new CholeskyDecomposition(value);
-        }
-        value = Matrix.checkMatrix(value);
-        if (!value.isSymmetric()) {
-            throw new Error('Matrix is not symmetric');
-        }
-
-        var a = value,
-            dimension = a.rows,
-            l = new Matrix(dimension, dimension),
-            positiveDefinite = true,
-            i, j, k;
-
-        for (j = 0; j < dimension; j++) {
-            var Lrowj = l[j];
-            var d = 0;
-            for (k = 0; k < j; k++) {
-                var Lrowk = l[k];
-                var s = 0;
-                for (i = 0; i < k; i++) {
-                    s += Lrowk[i] * Lrowj[i];
-                }
-                Lrowj[k] = s = (a[j][k] - s) / l[k][k];
-                d = d + s * s;
-            }
-
-            d = a[j][j] - d;
-
-            positiveDefinite &= (d > 0);
-            l[j][j] = Math.sqrt(Math.max(d, 0));
-            for (k = j + 1; k < dimension; k++) {
-                l[j][k] = 0;
-            }
-        }
-
-        if (!positiveDefinite) {
-            throw new Error('Matrix is not positive definite');
-        }
-
-        this.L = l;
-    }
-
-    CholeskyDecomposition.prototype = {
-        get lowerTriangularMatrix() {
-            return this.L;
-        },
-        solve: function (value) {
-            value = Matrix.checkMatrix(value);
-
-            var l = this.L,
-                dimension = l.rows;
-
-            if (value.rows !== dimension) {
-                throw new Error('Matrix dimensions do not match');
-            }
-
-            var count = value.columns,
-                B = value.clone(),
-                i, j, k;
-
-            for (k = 0; k < dimension; k++) {
-                for (j = 0; j < count; j++) {
-                    for (i = 0; i < k; i++) {
-                        B[k][j] -= B[i][j] * l[k][i];
-                    }
-                    B[k][j] /= l[k][k];
-                }
-            }
-
-            for (k = dimension - 1; k >= 0; k--) {
-                for (j = 0; j < count; j++) {
-                    for (i = k + 1; i < dimension; i++) {
-                        B[k][j] -= B[i][j] * l[i][k];
-                    }
-                    B[k][j] /= l[k][k];
-                }
-            }
-
-            return B;
-        }
-    };
-
-    MLMatrixDCCholesky = CholeskyDecomposition;
-}
-
-
-// ml-matrix src/dc/evd.js
-let MLMatrixDCEVD;
-{
-    const Matrix = MLMatrixMatrix.Matrix;
-    const util = MLMatrixDCUtil;
-    const hypotenuse = util.hypotenuse;
-    const getFilled2DArray = util.getFilled2DArray;
-
-    const defaultOptions = {
-        assumeSymmetric: false
-    };
-
-    // https://github.com/lutzroeder/Mapack/blob/master/Source/EigenvalueDecomposition.cs
-    function EigenvalueDecomposition(matrix, options) {
-        options = Object.assign({}, defaultOptions, options);
-        if (!(this instanceof EigenvalueDecomposition)) {
-            return new EigenvalueDecomposition(matrix, options);
-        }
-        matrix = Matrix.checkMatrix(matrix);
-        if (!matrix.isSquare()) {
-            throw new Error('Matrix is not a square matrix');
-        }
-
-        var n = matrix.columns,
-            V = getFilled2DArray(n, n, 0),
-            d = new Array(n),
-            e = new Array(n),
-            value = matrix,
-            i, j;
-
-        var isSymmetric = false;
-        if (options.assumeSymmetric) {
-            isSymmetric = true;
-        } else {
-            isSymmetric = matrix.isSymmetric();
-        }
-
-        if (isSymmetric) {
-            for (i = 0; i < n; i++) {
-                for (j = 0; j < n; j++) {
-                    V[i][j] = value.get(i, j);
-                }
-            }
-            tred2(n, e, d, V);
-            tql2(n, e, d, V);
-        } else {
-            var H = getFilled2DArray(n, n, 0),
-                ort = new Array(n);
-            for (j = 0; j < n; j++) {
-                for (i = 0; i < n; i++) {
-                    H[i][j] = value.get(i, j);
-                }
-            }
-            orthes(n, H, ort, V);
-            hqr2(n, e, d, V, H);
-        }
-
-        this.n = n;
-        this.e = e;
-        this.d = d;
-        this.V = V;
-    }
-
-    EigenvalueDecomposition.prototype = {
-        get realEigenvalues() {
-            return this.d;
-        },
-        get imaginaryEigenvalues() {
-            return this.e;
-        },
-        get eigenvectorMatrix() {
-            if (!Matrix.isMatrix(this.V)) {
-                this.V = new Matrix(this.V);
-            }
-            return this.V;
-        },
-        get diagonalMatrix() {
-            var n = this.n,
-                e = this.e,
-                d = this.d,
-                X = new Matrix(n, n),
-                i, j;
-            for (i = 0; i < n; i++) {
-                for (j = 0; j < n; j++) {
-                    X[i][j] = 0;
-                }
-                X[i][i] = d[i];
-                if (e[i] > 0) {
-                    X[i][i + 1] = e[i];
-                } else if (e[i] < 0) {
-                    X[i][i - 1] = e[i];
-                }
-            }
-            return X;
-        }
-    };
-
-    function tred2(n, e, d, V) {
-
-        var f, g, h, i, j, k,
-            hh, scale;
-
-        for (j = 0; j < n; j++) {
-            d[j] = V[n - 1][j];
-        }
-
-        for (i = n - 1; i > 0; i--) {
-            scale = 0;
-            h = 0;
-            for (k = 0; k < i; k++) {
-                scale = scale + Math.abs(d[k]);
-            }
-
-            if (scale === 0) {
-                e[i] = d[i - 1];
-                for (j = 0; j < i; j++) {
-                    d[j] = V[i - 1][j];
-                    V[i][j] = 0;
-                    V[j][i] = 0;
-                }
-            } else {
-                for (k = 0; k < i; k++) {
-                    d[k] /= scale;
-                    h += d[k] * d[k];
-                }
-
-                f = d[i - 1];
-                g = Math.sqrt(h);
-                if (f > 0) {
-                    g = -g;
-                }
-
-                e[i] = scale * g;
-                h = h - f * g;
-                d[i - 1] = f - g;
-                for (j = 0; j < i; j++) {
-                    e[j] = 0;
-                }
-
-                for (j = 0; j < i; j++) {
-                    f = d[j];
-                    V[j][i] = f;
-                    g = e[j] + V[j][j] * f;
-                    for (k = j + 1; k <= i - 1; k++) {
-                        g += V[k][j] * d[k];
-                        e[k] += V[k][j] * f;
-                    }
-                    e[j] = g;
-                }
-
-                f = 0;
-                for (j = 0; j < i; j++) {
-                    e[j] /= h;
-                    f += e[j] * d[j];
-                }
-
-                hh = f / (h + h);
-                for (j = 0; j < i; j++) {
-                    e[j] -= hh * d[j];
-                }
-
-                for (j = 0; j < i; j++) {
-                    f = d[j];
-                    g = e[j];
-                    for (k = j; k <= i - 1; k++) {
-                        V[k][j] -= (f * e[k] + g * d[k]);
-                    }
-                    d[j] = V[i - 1][j];
-                    V[i][j] = 0;
-                }
-            }
-            d[i] = h;
-        }
-
-        for (i = 0; i < n - 1; i++) {
-            V[n - 1][i] = V[i][i];
-            V[i][i] = 1;
-            h = d[i + 1];
-            if (h !== 0) {
-                for (k = 0; k <= i; k++) {
-                    d[k] = V[k][i + 1] / h;
-                }
-
-                for (j = 0; j <= i; j++) {
-                    g = 0;
-                    for (k = 0; k <= i; k++) {
-                        g += V[k][i + 1] * V[k][j];
-                    }
-                    for (k = 0; k <= i; k++) {
-                        V[k][j] -= g * d[k];
-                    }
-                }
-            }
-
-            for (k = 0; k <= i; k++) {
-                V[k][i + 1] = 0;
-            }
-        }
-
-        for (j = 0; j < n; j++) {
-            d[j] = V[n - 1][j];
-            V[n - 1][j] = 0;
-        }
-
-        V[n - 1][n - 1] = 1;
-        e[0] = 0;
-    }
-
-    function tql2(n, e, d, V) {
-
-        var g, h, i, j, k, l, m, p, r,
-            dl1, c, c2, c3, el1, s, s2,
-            iter;
-
-        for (i = 1; i < n; i++) {
-            e[i - 1] = e[i];
-        }
-
-        e[n - 1] = 0;
-
-        var f = 0,
-            tst1 = 0,
-            eps = Math.pow(2, -52);
-
-        for (l = 0; l < n; l++) {
-            tst1 = Math.max(tst1, Math.abs(d[l]) + Math.abs(e[l]));
-            m = l;
-            while (m < n) {
-                if (Math.abs(e[m]) <= eps * tst1) {
-                    break;
-                }
-                m++;
-            }
-
-            if (m > l) {
-                iter = 0;
-                do {
-                    iter = iter + 1;
-
-                    g = d[l];
-                    p = (d[l + 1] - g) / (2 * e[l]);
-                    r = hypotenuse(p, 1);
-                    if (p < 0) {
-                        r = -r;
-                    }
-
-                    d[l] = e[l] / (p + r);
-                    d[l + 1] = e[l] * (p + r);
-                    dl1 = d[l + 1];
-                    h = g - d[l];
-                    for (i = l + 2; i < n; i++) {
-                        d[i] -= h;
-                    }
-
-                    f = f + h;
-
-                    p = d[m];
-                    c = 1;
-                    c2 = c;
-                    c3 = c;
-                    el1 = e[l + 1];
-                    s = 0;
-                    s2 = 0;
-                    for (i = m - 1; i >= l; i--) {
-                        c3 = c2;
-                        c2 = c;
-                        s2 = s;
-                        g = c * e[i];
-                        h = c * p;
-                        r = hypotenuse(p, e[i]);
-                        e[i + 1] = s * r;
-                        s = e[i] / r;
-                        c = p / r;
-                        p = c * d[i] - s * g;
-                        d[i + 1] = h + s * (c * g + s * d[i]);
-
-                        for (k = 0; k < n; k++) {
-                            h = V[k][i + 1];
-                            V[k][i + 1] = s * V[k][i] + c * h;
-                            V[k][i] = c * V[k][i] - s * h;
-                        }
-                    }
-
-                    p = -s * s2 * c3 * el1 * e[l] / dl1;
-                    e[l] = s * p;
-                    d[l] = c * p;
-
-                }
-                while (Math.abs(e[l]) > eps * tst1);
-            }
-            d[l] = d[l] + f;
-            e[l] = 0;
-        }
-
-        for (i = 0; i < n - 1; i++) {
-            k = i;
-            p = d[i];
-            for (j = i + 1; j < n; j++) {
-                if (d[j] < p) {
-                    k = j;
-                    p = d[j];
-                }
-            }
-
-            if (k !== i) {
-                d[k] = d[i];
-                d[i] = p;
-                for (j = 0; j < n; j++) {
-                    p = V[j][i];
-                    V[j][i] = V[j][k];
-                    V[j][k] = p;
-                }
-            }
-        }
-    }
-
-    function orthes(n, H, ort, V) {
-
-        var low = 0,
-            high = n - 1,
-            f, g, h, i, j, m,
-            scale;
-
-        for (m = low + 1; m <= high - 1; m++) {
-            scale = 0;
-            for (i = m; i <= high; i++) {
-                scale = scale + Math.abs(H[i][m - 1]);
-            }
-
-            if (scale !== 0) {
-                h = 0;
-                for (i = high; i >= m; i--) {
-                    ort[i] = H[i][m - 1] / scale;
-                    h += ort[i] * ort[i];
-                }
-
-                g = Math.sqrt(h);
-                if (ort[m] > 0) {
-                    g = -g;
-                }
-
-                h = h - ort[m] * g;
-                ort[m] = ort[m] - g;
-
-                for (j = m; j < n; j++) {
-                    f = 0;
-                    for (i = high; i >= m; i--) {
-                        f += ort[i] * H[i][j];
-                    }
-
-                    f = f / h;
-                    for (i = m; i <= high; i++) {
-                        H[i][j] -= f * ort[i];
-                    }
-                }
-
-                for (i = 0; i <= high; i++) {
-                    f = 0;
-                    for (j = high; j >= m; j--) {
-                        f += ort[j] * H[i][j];
-                    }
-
-                    f = f / h;
-                    for (j = m; j <= high; j++) {
-                        H[i][j] -= f * ort[j];
-                    }
-                }
-
-                ort[m] = scale * ort[m];
-                H[m][m - 1] = scale * g;
-            }
-        }
-
-        for (i = 0; i < n; i++) {
-            for (j = 0; j < n; j++) {
-                V[i][j] = (i === j ? 1 : 0);
-            }
-        }
-
-        for (m = high - 1; m >= low + 1; m--) {
-            if (H[m][m - 1] !== 0) {
-                for (i = m + 1; i <= high; i++) {
-                    ort[i] = H[i][m - 1];
-                }
-
-                for (j = m; j <= high; j++) {
-                    g = 0;
-                    for (i = m; i <= high; i++) {
-                        g += ort[i] * V[i][j];
-                    }
-
-                    g = (g / ort[m]) / H[m][m - 1];
-                    for (i = m; i <= high; i++) {
-                        V[i][j] += g * ort[i];
-                    }
-                }
-            }
-        }
-    }
-
-    function hqr2(nn, e, d, V, H) {
-        var n = nn - 1,
-            low = 0,
-            high = nn - 1,
-            eps = Math.pow(2, -52),
-            exshift = 0,
-            norm = 0,
-            p = 0,
-            q = 0,
-            r = 0,
-            s = 0,
-            z = 0,
-            iter = 0,
-            i, j, k, l, m, t, w, x, y,
-            ra, sa, vr, vi,
-            notlast, cdivres;
-
-        for (i = 0; i < nn; i++) {
-            if (i < low || i > high) {
-                d[i] = H[i][i];
-                e[i] = 0;
-            }
-
-            for (j = Math.max(i - 1, 0); j < nn; j++) {
-                norm = norm + Math.abs(H[i][j]);
-            }
-        }
-
-        while (n >= low) {
-            l = n;
-            while (l > low) {
-                s = Math.abs(H[l - 1][l - 1]) + Math.abs(H[l][l]);
-                if (s === 0) {
-                    s = norm;
-                }
-                if (Math.abs(H[l][l - 1]) < eps * s) {
-                    break;
-                }
-                l--;
-            }
-
-            if (l === n) {
-                H[n][n] = H[n][n] + exshift;
-                d[n] = H[n][n];
-                e[n] = 0;
-                n--;
-                iter = 0;
-            } else if (l === n - 1) {
-                w = H[n][n - 1] * H[n - 1][n];
-                p = (H[n - 1][n - 1] - H[n][n]) / 2;
-                q = p * p + w;
-                z = Math.sqrt(Math.abs(q));
-                H[n][n] = H[n][n] + exshift;
-                H[n - 1][n - 1] = H[n - 1][n - 1] + exshift;
-                x = H[n][n];
-
-                if (q >= 0) {
-                    z = (p >= 0) ? (p + z) : (p - z);
-                    d[n - 1] = x + z;
-                    d[n] = d[n - 1];
-                    if (z !== 0) {
-                        d[n] = x - w / z;
-                    }
-                    e[n - 1] = 0;
-                    e[n] = 0;
-                    x = H[n][n - 1];
-                    s = Math.abs(x) + Math.abs(z);
-                    p = x / s;
-                    q = z / s;
-                    r = Math.sqrt(p * p + q * q);
-                    p = p / r;
-                    q = q / r;
-
-                    for (j = n - 1; j < nn; j++) {
-                        z = H[n - 1][j];
-                        H[n - 1][j] = q * z + p * H[n][j];
-                        H[n][j] = q * H[n][j] - p * z;
-                    }
-
-                    for (i = 0; i <= n; i++) {
-                        z = H[i][n - 1];
-                        H[i][n - 1] = q * z + p * H[i][n];
-                        H[i][n] = q * H[i][n] - p * z;
-                    }
-
-                    for (i = low; i <= high; i++) {
-                        z = V[i][n - 1];
-                        V[i][n - 1] = q * z + p * V[i][n];
-                        V[i][n] = q * V[i][n] - p * z;
-                    }
-                } else {
-                    d[n - 1] = x + p;
-                    d[n] = x + p;
-                    e[n - 1] = z;
-                    e[n] = -z;
-                }
-
-                n = n - 2;
-                iter = 0;
-            } else {
-                x = H[n][n];
-                y = 0;
-                w = 0;
-                if (l < n) {
-                    y = H[n - 1][n - 1];
-                    w = H[n][n - 1] * H[n - 1][n];
-                }
-
-                if (iter === 10) {
-                    exshift += x;
-                    for (i = low; i <= n; i++) {
-                        H[i][i] -= x;
-                    }
-                    s = Math.abs(H[n][n - 1]) + Math.abs(H[n - 1][n - 2]);
-                    x = y = 0.75 * s;
-                    w = -0.4375 * s * s;
-                }
-
-                if (iter === 30) {
-                    s = (y - x) / 2;
-                    s = s * s + w;
-                    if (s > 0) {
-                        s = Math.sqrt(s);
-                        if (y < x) {
-                            s = -s;
-                        }
-                        s = x - w / ((y - x) / 2 + s);
-                        for (i = low; i <= n; i++) {
-                            H[i][i] -= s;
-                        }
-                        exshift += s;
-                        x = y = w = 0.964;
-                    }
-                }
-
-                iter = iter + 1;
-
-                m = n - 2;
-                while (m >= l) {
-                    z = H[m][m];
-                    r = x - z;
-                    s = y - z;
-                    p = (r * s - w) / H[m + 1][m] + H[m][m + 1];
-                    q = H[m + 1][m + 1] - z - r - s;
-                    r = H[m + 2][m + 1];
-                    s = Math.abs(p) + Math.abs(q) + Math.abs(r);
-                    p = p / s;
-                    q = q / s;
-                    r = r / s;
-                    if (m === l) {
-                        break;
-                    }
-                    if (Math.abs(H[m][m - 1]) * (Math.abs(q) + Math.abs(r)) < eps * (Math.abs(p) * (Math.abs(H[m - 1][m - 1]) + Math.abs(z) + Math.abs(H[m + 1][m + 1])))) {
-                        break;
-                    }
-                    m--;
-                }
-
-                for (i = m + 2; i <= n; i++) {
-                    H[i][i - 2] = 0;
-                    if (i > m + 2) {
-                        H[i][i - 3] = 0;
-                    }
-                }
-
-                for (k = m; k <= n - 1; k++) {
-                    notlast = (k !== n - 1);
-                    if (k !== m) {
-                        p = H[k][k - 1];
-                        q = H[k + 1][k - 1];
-                        r = (notlast ? H[k + 2][k - 1] : 0);
-                        x = Math.abs(p) + Math.abs(q) + Math.abs(r);
-                        if (x !== 0) {
-                            p = p / x;
-                            q = q / x;
-                            r = r / x;
-                        }
-                    }
-
-                    if (x === 0) {
-                        break;
-                    }
-
-                    s = Math.sqrt(p * p + q * q + r * r);
-                    if (p < 0) {
-                        s = -s;
-                    }
-
-                    if (s !== 0) {
-                        if (k !== m) {
-                            H[k][k - 1] = -s * x;
-                        } else if (l !== m) {
-                            H[k][k - 1] = -H[k][k - 1];
-                        }
-
-                        p = p + s;
-                        x = p / s;
-                        y = q / s;
-                        z = r / s;
-                        q = q / p;
-                        r = r / p;
-
-                        for (j = k; j < nn; j++) {
-                            p = H[k][j] + q * H[k + 1][j];
-                            if (notlast) {
-                                p = p + r * H[k + 2][j];
-                                H[k + 2][j] = H[k + 2][j] - p * z;
-                            }
-
-                            H[k][j] = H[k][j] - p * x;
-                            H[k + 1][j] = H[k + 1][j] - p * y;
-                        }
-
-                        for (i = 0; i <= Math.min(n, k + 3); i++) {
-                            p = x * H[i][k] + y * H[i][k + 1];
-                            if (notlast) {
-                                p = p + z * H[i][k + 2];
-                                H[i][k + 2] = H[i][k + 2] - p * r;
-                            }
-
-                            H[i][k] = H[i][k] - p;
-                            H[i][k + 1] = H[i][k + 1] - p * q;
-                        }
-
-                        for (i = low; i <= high; i++) {
-                            p = x * V[i][k] + y * V[i][k + 1];
-                            if (notlast) {
-                                p = p + z * V[i][k + 2];
-                                V[i][k + 2] = V[i][k + 2] - p * r;
-                            }
-
-                            V[i][k] = V[i][k] - p;
-                            V[i][k + 1] = V[i][k + 1] - p * q;
-                        }
-                    }
-                }
-            }
-        }
-
-        if (norm === 0) {
-            return;
-        }
-
-        for (n = nn - 1; n >= 0; n--) {
-            p = d[n];
-            q = e[n];
-
-            if (q === 0) {
-                l = n;
-                H[n][n] = 1;
-                for (i = n - 1; i >= 0; i--) {
-                    w = H[i][i] - p;
-                    r = 0;
-                    for (j = l; j <= n; j++) {
-                        r = r + H[i][j] * H[j][n];
-                    }
-
-                    if (e[i] < 0) {
-                        z = w;
-                        s = r;
-                    } else {
-                        l = i;
-                        if (e[i] === 0) {
-                            H[i][n] = (w !== 0) ? (-r / w) : (-r / (eps * norm));
-                        } else {
-                            x = H[i][i + 1];
-                            y = H[i + 1][i];
-                            q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
-                            t = (x * s - z * r) / q;
-                            H[i][n] = t;
-                            H[i + 1][n] = (Math.abs(x) > Math.abs(z)) ? ((-r - w * t) / x) : ((-s - y * t) / z);
-                        }
-
-                        t = Math.abs(H[i][n]);
-                        if ((eps * t) * t > 1) {
-                            for (j = i; j <= n; j++) {
-                                H[j][n] = H[j][n] / t;
-                            }
-                        }
-                    }
-                }
-            } else if (q < 0) {
-                l = n - 1;
-
-                if (Math.abs(H[n][n - 1]) > Math.abs(H[n - 1][n])) {
-                    H[n - 1][n - 1] = q / H[n][n - 1];
-                    H[n - 1][n] = -(H[n][n] - p) / H[n][n - 1];
-                } else {
-                    cdivres = cdiv(0, -H[n - 1][n], H[n - 1][n - 1] - p, q);
-                    H[n - 1][n - 1] = cdivres[0];
-                    H[n - 1][n] = cdivres[1];
-                }
-
-                H[n][n - 1] = 0;
-                H[n][n] = 1;
-                for (i = n - 2; i >= 0; i--) {
-                    ra = 0;
-                    sa = 0;
-                    for (j = l; j <= n; j++) {
-                        ra = ra + H[i][j] * H[j][n - 1];
-                        sa = sa + H[i][j] * H[j][n];
-                    }
-
-                    w = H[i][i] - p;
-
-                    if (e[i] < 0) {
-                        z = w;
-                        r = ra;
-                        s = sa;
-                    } else {
-                        l = i;
-                        if (e[i] === 0) {
-                            cdivres = cdiv(-ra, -sa, w, q);
-                            H[i][n - 1] = cdivres[0];
-                            H[i][n] = cdivres[1];
-                        } else {
-                            x = H[i][i + 1];
-                            y = H[i + 1][i];
-                            vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
-                            vi = (d[i] - p) * 2 * q;
-                            if (vr === 0 && vi === 0) {
-                                vr = eps * norm * (Math.abs(w) + Math.abs(q) + Math.abs(x) + Math.abs(y) + Math.abs(z));
-                            }
-                            cdivres = cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi);
-                            H[i][n - 1] = cdivres[0];
-                            H[i][n] = cdivres[1];
-                            if (Math.abs(x) > (Math.abs(z) + Math.abs(q))) {
-                                H[i + 1][n - 1] = (-ra - w * H[i][n - 1] + q * H[i][n]) / x;
-                                H[i + 1][n] = (-sa - w * H[i][n] - q * H[i][n - 1]) / x;
-                            } else {
-                                cdivres = cdiv(-r - y * H[i][n - 1], -s - y * H[i][n], z, q);
-                                H[i + 1][n - 1] = cdivres[0];
-                                H[i + 1][n] = cdivres[1];
-                            }
-                        }
-
-                        t = Math.max(Math.abs(H[i][n - 1]), Math.abs(H[i][n]));
-                        if ((eps * t) * t > 1) {
-                            for (j = i; j <= n; j++) {
-                                H[j][n - 1] = H[j][n - 1] / t;
-                                H[j][n] = H[j][n] / t;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-
-        for (i = 0; i < nn; i++) {
-            if (i < low || i > high) {
-                for (j = i; j < nn; j++) {
-                    V[i][j] = H[i][j];
-                }
-            }
-        }
-
-        for (j = nn - 1; j >= low; j--) {
-            for (i = low; i <= high; i++) {
-                z = 0;
-                for (k = low; k <= Math.min(j, high); k++) {
-                    z = z + V[i][k] * H[k][j];
-                }
-                V[i][j] = z;
-            }
-        }
-    }
-
-    function cdiv(xr, xi, yr, yi) {
-        var r, d;
-        if (Math.abs(yr) > Math.abs(yi)) {
-            r = yi / yr;
-            d = yr + r * yi;
-            return [(xr + r * xi) / d, (xi - r * xr) / d];
-        } else {
-            r = yr / yi;
-            d = yi + r * yr;
-            return [(r * xr + xi) / d, (r * xi - xr) / d];
-        }
-    }
-
-    MLMatrixDCEVD = EigenvalueDecomposition;
-}
-
-
-// ml-matrix src/dc/qr.js
-let MLMatrixDCQR;
-{
-    let Matrix = MLMatrixMatrix.Matrix;
-    let hypotenuse = MLMatrixDCUtil.hypotenuse;
-
-    //https://github.com/lutzroeder/Mapack/blob/master/Source/QrDecomposition.cs
-    function QrDecomposition(value) {
-        if (!(this instanceof QrDecomposition)) {
-            return new QrDecomposition(value);
-        }
-        value = Matrix.checkMatrix(value);
-
-        var qr = value.clone(),
-            m = value.rows,
-            n = value.columns,
-            rdiag = new Array(n),
-            i, j, k, s;
-
-        for (k = 0; k < n; k++) {
-            var nrm = 0;
-            for (i = k; i < m; i++) {
-                nrm = hypotenuse(nrm, qr[i][k]);
-            }
-            if (nrm !== 0) {
-                if (qr[k][k] < 0) {
-                    nrm = -nrm;
-                }
-                for (i = k; i < m; i++) {
-                    qr[i][k] /= nrm;
-                }
-                qr[k][k] += 1;
-                for (j = k + 1; j < n; j++) {
-                    s = 0;
-                    for (i = k; i < m; i++) {
-                        s += qr[i][k] * qr[i][j];
-                    }
-                    s = -s / qr[k][k];
-                    for (i = k; i < m; i++) {
-                        qr[i][j] += s * qr[i][k];
-                    }
-                }
-            }
-            rdiag[k] = -nrm;
-        }
-
-        this.QR = qr;
-        this.Rdiag = rdiag;
-    }
-
-    QrDecomposition.prototype = {
-        solve: function (value) {
-            value = Matrix.checkMatrix(value);
-
-            var qr = this.QR,
-                m = qr.rows;
-
-            if (value.rows !== m) {
-                throw new Error('Matrix row dimensions must agree');
-            }
-            if (!this.isFullRank()) {
-                throw new Error('Matrix is rank deficient');
-            }
-
-            var count = value.columns;
-            var X = value.clone();
-            var n = qr.columns;
-            var i, j, k, s;
-
-            for (k = 0; k < n; k++) {
-                for (j = 0; j < count; j++) {
-                    s = 0;
-                    for (i = k; i < m; i++) {
-                        s += qr[i][k] * X[i][j];
-                    }
-                    s = -s / qr[k][k];
-                    for (i = k; i < m; i++) {
-                        X[i][j] += s * qr[i][k];
-                    }
-                }
-            }
-            for (k = n - 1; k >= 0; k--) {
-                for (j = 0; j < count; j++) {
-                    X[k][j] /= this.Rdiag[k];
-                }
-                for (i = 0; i < k; i++) {
-                    for (j = 0; j < count; j++) {
-                        X[i][j] -= X[k][j] * qr[i][k];
-                    }
-                }
-            }
-
-            return X.subMatrix(0, n - 1, 0, count - 1);
-        },
-        isFullRank: function () {
-            var columns = this.QR.columns;
-            for (var i = 0; i < columns; i++) {
-                if (this.Rdiag[i] === 0) {
-                    return false;
-                }
-            }
-            return true;
-        },
-        get upperTriangularMatrix() {
-            var qr = this.QR,
-                n = qr.columns,
-                X = new Matrix(n, n),
-                i, j;
-            for (i = 0; i < n; i++) {
-                for (j = 0; j < n; j++) {
-                    if (i < j) {
-                        X[i][j] = qr[i][j];
-                    } else if (i === j) {
-                        X[i][j] = this.Rdiag[i];
-                    } else {
-                        X[i][j] = 0;
-                    }
-                }
-            }
-            return X;
-        },
-        get orthogonalMatrix() {
-            var qr = this.QR,
-                rows = qr.rows,
-                columns = qr.columns,
-                X = new Matrix(rows, columns),
-                i, j, k, s;
-
-            for (k = columns - 1; k >= 0; k--) {
-                for (i = 0; i < rows; i++) {
-                    X[i][k] = 0;
-                }
-                X[k][k] = 1;
-                for (j = k; j < columns; j++) {
-                    if (qr[k][k] !== 0) {
-                        s = 0;
-                        for (i = k; i < rows; i++) {
-                            s += qr[i][k] * X[i][j];
-                        }
-
-                        s = -s / qr[k][k];
-
-                        for (i = k; i < rows; i++) {
-                            X[i][j] += s * qr[i][k];
-                        }
-                    }
-                }
-            }
-            return X;
-        }
-    };
-
-    MLMatrixDCQR = QrDecomposition;
-}
-
-// ml-matric src/decompositions.js
-let MLMatrixDecompositions = {};
-{
-    let Matrix = MLMatrixMatrix.Matrix;
-
-    let SingularValueDecomposition = MLMatrixDCSVD;
-    let EigenvalueDecomposition = MLMatrixDCEVD;
-    let LuDecomposition = MLMatrixDCLU;
-    let QrDecomposition = MLMatrixDCQR
-    let CholeskyDecomposition = MLMatrixDCCholesky;
-
-    function inverse(matrix) {
-        matrix = Matrix.checkMatrix(matrix);
-        return solve(matrix, Matrix.eye(matrix.rows));
-    }
-
-    /**
-     * Returns the inverse
-     * @memberOf Matrix
-     * @static
-     * @param {Matrix} matrix
-     * @return {Matrix} matrix
-     * @alias inv
-     */
-    Matrix.inverse = Matrix.inv = inverse;
-
-    /**
-     * Returns the inverse
-     * @memberOf Matrix
-     * @static
-     * @param {Matrix} matrix
-     * @return {Matrix} matrix
-     * @alias inv
-     */
-    Matrix.prototype.inverse = Matrix.prototype.inv = function () {
-        return inverse(this);
-    };
-
-    function solve(leftHandSide, rightHandSide) {
-        leftHandSide = Matrix.checkMatrix(leftHandSide);
-        rightHandSide = Matrix.checkMatrix(rightHandSide);
-        return leftHandSide.isSquare() ? new LuDecomposition(leftHandSide).solve(rightHandSide) : new QrDecomposition(leftHandSide).solve(rightHandSide);
-    }
-
-    Matrix.solve = solve;
-    Matrix.prototype.solve = function (other) {
-        return solve(this, other);
-    };
-
-    MLMatrixDecompositions = {
-        SingularValueDecomposition: SingularValueDecomposition,
-        SVD: SingularValueDecomposition,
-        EigenvalueDecomposition: EigenvalueDecomposition,
-        EVD: EigenvalueDecomposition,
-        LuDecomposition: LuDecomposition,
-        LU: LuDecomposition,
-        QrDecomposition: QrDecomposition,
-        QR: QrDecomposition,
-        CholeskyDecomposition: CholeskyDecomposition,
-        CHO: CholeskyDecomposition,
-        inverse: inverse,
-        solve: solve
-    };
-}
-
-// ml-matrix src/index.js
-let MLMatrix = {};
-{
-    MLMatrix = MLMatrixMatrix.Matrix;
-    MLMatrix.Decompositions = MLMatrix.DC = MLMatrixDecompositions;
-}
-
-// feedforward-neural-networks utils.js
-let FeedforwardNeuralNetworksUtils;
-{
-    let Matrix = MLMatrix;
-
-    /**
-     * @private
-     * Retrieves the sum at each row of the given matrix.
-     * @param {Matrix} matrix
-     * @return {Matrix}
-     */
-    function sumRow(matrix) {
-        var sum = Matrix.zeros(matrix.rows, 1);
-        for (var i = 0; i < matrix.rows; ++i) {
-            for (var j = 0; j < matrix.columns; ++j) {
-                sum[i][0] += matrix[i][j];
-            }
-        }
-        return sum;
-    }
-
-    /**
-     * @private
-     * Retrieves the sum at each column of the given matrix.
-     * @param {Matrix} matrix
-     * @return {Matrix}
-     */
-    function sumCol(matrix) {
-        var sum = Matrix.zeros(1, matrix.columns);
-        for (var i = 0; i < matrix.rows; ++i) {
-            for (var j = 0; j < matrix.columns; ++j) {
-                sum[0][j] += matrix[i][j];
-            }
-        }
-        return sum;
-    }
-
-    /**
-     * @private
-     * Method that given an array of labels(predictions), returns two dictionaries, one to transform from labels to
-     * numbers and other in the reverse way
-     * @param {Array} array
-     * @return {object}
-     */
-    function dictOutputs(array) {
-        var inputs = {}, outputs = {}, l = array.length, index = 0;
-        for (var i = 0; i < l; i += 1) {
-            if (inputs[array[i]] === undefined) {
-                inputs[array[i]] = index;
-                outputs[index] = array[i];
-                index++;
-            }
-        }
-
-        return {
-            inputs: inputs,
-            outputs: outputs
-        };
-    }
-
-    FeedforwardNeuralNetworksUtils = {
-        dictOutputs: dictOutputs,
-        sumCol: sumCol,
-        sumRow: sumRow
-    };
-}
-
-// feedforward-neural-networks activationFunctions.js
-let FeedforwardNeuralNetworksActivationFunctions;
-{
-    function logistic(val) {
-        return 1 / (1 + Math.exp(-val));
-    }
-
-    function expELU(val, param) {
-        return val < 0 ? param * (Math.exp(val) - 1) : val;
-    }
-
-    function softExponential(val, param) {
-        if (param < 0) {
-            return -Math.log(1 - param * (val + param)) / param;
-        }
-        if (param > 0) {
-            return ((Math.exp(param * val) - 1) / param) + param;
-        }
-        return val;
-    }
-
-    function softExponentialPrime(val, param) {
-        if (param < 0) {
-            return 1 / (1 - param * (param + val));
-        } else {
-            return Math.exp(param * val);
-        }
-    }
-
-    const ACTIVATION_FUNCTIONS = {
-        'tanh': {
-            activation: Math.tanh,
-            derivate: val => 1 - (val * val)
-        },
-        'identity': {
-            activation: val => val,
-            derivate: () => 1
-        },
-        'logistic': {
-            activation: logistic,
-            derivate: val => logistic(val) * (1 - logistic(val))
-        },
-        'arctan': {
-            activation: Math.atan,
-            derivate: val => 1 / (val * val + 1)
-        },
-        'softsign': {
-            activation: val => val / (1 + Math.abs(val)),
-            derivate: val => 1 / ((1 + Math.abs(val)) * (1 + Math.abs(val)))
-        },
-        'relu': {
-            activation: val => val < 0 ? 0 : val,
-            derivate: val => val < 0 ? 0 : 1
-        },
-        'softplus': {
-            activation: val => Math.log(1 + Math.exp(val)),
-            derivate: val => 1 / (1 + Math.exp(-val))
-        },
-        'bent': {
-            activation: val => ((Math.sqrt(val * val + 1) - 1) / 2) + val,
-            derivate: val => (val / (2 * Math.sqrt(val * val + 1))) + 1
-        },
-        'sinusoid': {
-            activation: Math.sin,
-            derivate: Math.cos
-        },
-        'sinc': {
-            activation: val => val === 0 ? 1 : Math.sin(val) / val,
-            derivate: val => val === 0 ? 0 : (Math.cos(val) / val) - (Math.sin(val) / (val * val))
-        },
-        'gaussian': {
-            activation: val => Math.exp(-(val * val)),
-            derivate: val => -2 * val * Math.exp(-(val * val))
-        },
-        'parametric-relu': {
-            activation: (val, param) => val < 0 ? param * val : val,
-            derivate: (val, param) => val < 0 ? param : 1
-        },
-        'exponential-elu': {
-            activation: expELU,
-            derivate: (val, param) => val < 0 ? expELU(val, param) + param : 1
-        },
-        'soft-exponential': {
-            activation: softExponential,
-            derivate: softExponentialPrime
-        }
-    };
-
-    FeedforwardNeuralNetworksActivationFunctions = ACTIVATION_FUNCTIONS;
-}
-
-// feedforward-neural-networks Layer.js
-let FeedforwardNeuralNetworksLayer;
-{
-    let Matrix = MLMatrix;
-
-    let Utils = FeedforwardNeuralNetworksUtils;
-    const ACTIVATION_FUNCTIONS = FeedforwardNeuralNetworksActivationFunctions;
-
-    class Layer {
-        /**
-         * @private
-         * Create a new layer with the given options
-         * @param {object} options
-         * @param {number} [options.inputSize] - Number of conections that enter the neurons.
-         * @param {number} [options.outputSize] - Number of conections that leave the neurons.
-         * @param {number} [options.regularization] - Regularization parameter.
-         * @param {number} [options.epsilon] - Learning rate parameter.
-         * @param {string} [options.activation] - Activation function parameter from the FeedForwardNeuralNetwork class.
-         * @param {number} [options.activationParam] - Activation parameter if needed.
-         */
-        constructor(options) {
-            this.inputSize = options.inputSize;
-            this.outputSize = options.outputSize;
-            this.regularization = options.regularization;
-            this.epsilon = options.epsilon;
-            this.activation = options.activation;
-            this.activationParam = options.activationParam;
-
-            var selectedFunction = ACTIVATION_FUNCTIONS[options.activation];
-            var params = selectedFunction.activation.length;
-
-            var actFunction = params > 1 ? val => selectedFunction.activation(val, options.activationParam) : selectedFunction.activation;
-            var derFunction = params > 1 ? val => selectedFunction.derivate(val, options.activationParam) : selectedFunction.derivate;
-
-            this.activationFunction = function (i, j) {
-                this[i][j] = actFunction(this[i][j]);
-            };
-            this.derivate = function (i, j) {
-                this[i][j] = derFunction(this[i][j]);
-            };
-
-            if (options.model) {
-                // load model
-                this.W = Matrix.checkMatrix(options.W);
-                this.b = Matrix.checkMatrix(options.b);
-
-            } else {
-                // default constructor
-
-                this.W = Matrix.rand(this.inputSize, this.outputSize);
-                this.b = Matrix.zeros(1, this.outputSize);
-
-                this.W.apply(function (i, j) {
-                    this[i][j] /= Math.sqrt(options.inputSize);
-                });
-            }
-        }
-
-        /**
-         * @private
-         * propagate the given input through the current layer.
-         * @param {Matrix} X - input.
-         * @return {Matrix} output at the current layer.
-         */
-        forward(X) {
-            var z = X.mmul(this.W).addRowVector(this.b);
-            z.apply(this.activationFunction);
-            this.a = z.clone();
-            return z;
-        }
-
-        /**
-         * @private
-         * apply backpropagation algorithm at the current layer
-         * @param {Matrix} delta - delta values estimated at the following layer.
-         * @param {Matrix} a - 'a' values from the following layer.
-         * @return {Matrix} the new delta values for the next layer.
-         */
-        backpropagation(delta, a) {
-            this.dW = a.transposeView().mmul(delta);
-            this.db = Utils.sumCol(delta);
-
-            var aCopy = a.clone();
-            return delta.mmul(this.W.transposeView()).mul(aCopy.apply(this.derivate));
-        }
-
-        /**
-         * @private
-         * Function that updates the weights at the current layer with the derivatives.
-         */
-        update() {
-            this.dW.add(this.W.clone().mul(this.regularization));
-            this.W.add(this.dW.mul(-this.epsilon));
-            this.b.add(this.db.mul(-this.epsilon));
-        }
-
-        /**
-         * @private
-         * Export the current layer to JSON.
-         * @return {object} model
-         */
-        toJSON() {
-            return {
-                model: 'Layer',
-                inputSize: this.inputSize,
-                outputSize: this.outputSize,
-                regularization: this.regularization,
-                epsilon: this.epsilon,
-                activation: this.activation,
-                W: this.W,
-                b: this.b
-            };
-        }
-
-        /**
-         * @private
-         * Creates a new Layer with the given model.
-         * @param {object} model
-         * @return {Layer}
-         */
-        static load(model) {
-            if (model.model !== 'Layer') {
-                throw new RangeError('the current model is not a Layer model');
-            }
-            return new Layer(model);
-        }
-
-    }
-
-    FeedforwardNeuralNetworksLayer = Layer;
-}
-
-// feedforward-neural-networks OutputLayer.js
-let FeedforwardNeuralNetworksOutputLayer;
-{
-    let Layer = FeedforwardNeuralNetworksLayer;
-
-    class OutputLayer extends Layer {
-        constructor(options) {
-            super(options);
-
-            this.activationFunction = function (i, j) {
-                this[i][j] = Math.exp(this[i][j]);
-            };
-        }
-
-        static load(model) {
-            if (model.model !== 'Layer') {
-                throw new RangeError('the current model is not a Layer model');
-            }
-
-            return new OutputLayer(model);
-        }
-    }
-
-    FeedforwardNeuralNetworksOutputLayer = OutputLayer;
-}
-
-// feedforward-neural-networks FeedForwardNeuralNetwork.js
-let FeedforwardNeuralNetwork;
-{
-    const Matrix = MLMatrix;
-
-    const Layer = FeedforwardNeuralNetworksLayer;
-    const OutputLayer = FeedforwardNeuralNetworksOutputLayer;
-    const Utils = FeedforwardNeuralNetworksUtils;
-    const ACTIVATION_FUNCTIONS = FeedforwardNeuralNetworksActivationFunctions;
-
-    class FeedForwardNeuralNetworks {
-
-        /**
-         * Create a new Feedforword neural network model.
-         * @param {object} options
-         * @param {Array} [options.hiddenLayers=[10]] - Array that contains the sizes of the hidden layers.
-         * @oaram {number} [options.iterations=50] - Number of iterations at the training step.
-         * @param {number} [options.learningRate=0.01] - Learning rate of the neural net (also known as epsilon).
-         * @poram {number} [options.regularization=0.01] - Regularization parameter af the neural net.
-         * @poram {string} [options.activation='tanh'] - activation function to be used. (options: 'tanh'(default),
-         * 'identity', 'logistic', 'arctan', 'softsign', 'relu', 'softplus', 'bent', 'sinusoid', 'sinc', 'gaussian').
-         * (single-parametric options: 'parametric-relu', 'exponential-relu', 'soft-exponential').
-         * @param {number} [options.activationParam=1] - if the selected activation function needs a parameter.
-         */
-        constructor(options) {
-            options = options || {};
-            if (options.model) {
-                // load network
-                this.hiddenLayers = options.hiddenLayers;
-                this.iterations = options.iterations;
-                this.learningRate = options.learningRate;
-                this.regularization = options.regularization;
-                this.dicts = options.dicts;
-                this.activation = options.activation;
-                this.activationParam = options.activationParam;
-                this.model = new Array(options.layers.length);
-
-                for (var i = 0; i < this.model.length - 1; ++i) {
-                    this.model[i] = Layer.load(options.layers[i]);
-                }
-                this.model[this.model.length - 1] = OutputLayer.load(options.layers[this.model.length - 1]);
-            } else {
-                // default constructor
-                this.hiddenLayers = options.hiddenLayers === undefined ? [10] : options.hiddenLayers;
-                this.iterations = options.iterations === undefined ? 50 : options.iterations;
-
-                this.learningRate = options.learningRate === undefined ? 0.01 : options.learningRate;
-                //this.momentum = options.momentum === undefined ? 0.1 : options.momentum;
-                this.regularization = options.regularization === undefined ? 0.01 : options.regularization;
-
-                this.activation = options.activation === undefined ? 'tanh' : options.activation;
-                this.activationParam = options.activationParam === undefined ? 1 : options.activationParam;
-                if (!(this.activation in Object.keys(ACTIVATION_FUNCTIONS))) {
-                    this.activation = 'tanh';
-                }
-            }
-        }
-
-        /**
-         * @private
-         * Function that build and initialize the neural net.
-         * @param {number} inputSize - total of features to fit.
-         * @param {number} outputSize - total of labels of the prediction set.
-         */
-        buildNetwork(inputSize, outputSize) {
-            var size = 2 + (this.hiddenLayers.length - 1);
-            this.model = new Array(size);
-
-            // input layer
-            this.model[0] = new Layer({
-                inputSize: inputSize,
-                outputSize: this.hiddenLayers[0],
-                activation: this.activation,
-                activationParam: this.activationParam,
-                regularization: this.regularization,
-                epsilon: this.learningRate
-            });
-
-            // hidden layers
-            for (var i = 1; i < this.hiddenLayers.length; ++i) {
-                this.model[i] = new Layer({
-                    inputSize: this.hiddenLayers[i - 1],
-                    outputSize: this.hiddenLayers[i],
-                    activation: this.activation,
-                    activationParam: this.activationParam,
-                    regularization: this.regularization,
-                    epsilon: this.learningRate
-                });
-            }
-
-            // output layer
-            this.model[size - 1] = new OutputLayer({
-                inputSize: this.hiddenLayers[this.hiddenLayers.length - 1],
-                outputSize: outputSize,
-                activation: this.activation,
-                activationParam: this.activationParam,
-                regularization: this.regularization,
-                epsilon: this.learningRate
-            });
-        }
-
-        /**
-         * Train the neural net with the given features and labels.
-         * @param {Matrix|Array} features
-         * @param {Matrix|Array} labels
-         */
-        train(features, labels) {
-            features = Matrix.checkMatrix(features);
-            this.dicts = Utils.dictOutputs(labels);
-
-            var inputSize = features.columns;
-            var outputSize = Object.keys(this.dicts.inputs).length;
-
-            this.buildNetwork(inputSize, outputSize);
-
-            for (var i = 0; i < this.iterations; ++i) {
-                var probabilities = this.propagate(features);
-                this.backpropagation(features, labels, probabilities);
-            }
-        }
-
-        /**
-         * @private
-         * Propagate the input(training set) and retrives the probabilities of each class.
-         * @param {Matrix} X
-         * @return {Matrix} probabilities of each class.
-         */
-        propagate(X) {
-            var input = X;
-            for (var i = 0; i < this.model.length; ++i) {
-                //console.log(i);
-                input = this.model[i].forward(input);
-            }
-
-            // get probabilities
-            return input.divColumnVector(Utils.sumRow(input));
-        }
-
-        /**
-         * @private
-         * Function that applies the backpropagation algorithm on each layer of the network
-         * in order to fit the features and labels.
-         * @param {Matrix} features
-         * @param {Array} labels
-         * @param {Matrix} probabilities - probabilities of each class of the feature set.
-         */
-        backpropagation(features, labels, probabilities) {
-            for (var i = 0; i < probabilities.length; ++i) {
-                probabilities[i][this.dicts.inputs[labels[i]]] -= 1;
-            }
-
-            // remember, the last delta doesn't matter
-            var delta = probabilities;
-            for (i = this.model.length - 1; i >= 0; --i) {
-                var a = i > 0 ? this.model[i - 1].a : features;
-                delta = this.model[i].backpropagation(delta, a);
-            }
-
-            for (i = 0; i < this.model.length; ++i) {
-                this.model[i].update();
-            }
-        }
-
-        /**
-         * Predict the output given the feature set.
-         * @param {Array|Matrix} features
-         * @return {Array}
-         */
-        predict(features) {
-            features = Matrix.checkMatrix(features);
-            var outputs = new Array(features.rows);
-            var probabilities = this.propagate(features);
-            for (var i = 0; i < features.rows; ++i) {
-                outputs[i] = this.dicts.outputs[probabilities.maxRowIndex(i)[1]];
-            }
-
-            return outputs;
-        }
-
-        /**
-         * Export the current model to JSOM.
-         * @return {object} model
-         */
-        toJSON() {
-            var model = {
-                model: 'FNN',
-                hiddenLayers: this.hiddenLayers,
-                iterations: this.iterations,
-                learningRate: this.learningRate,
-                regularization: this.regularization,
-                activation: this.activation,
-                activationParam: this.activationParam,
-                dicts: this.dicts,
-                layers: new Array(this.model.length)
-            };
-
-            for (var i = 0; i < this.model.length; ++i) {
-                model.layers[i] = this.model[i].toJSON();
-            }
-
-            return model;
-        }
-
-        /**
-         * Load a Feedforward Neural Network with the current model.
-         * @param {object} model
-         * @return {FeedForwardNeuralNetworks}
-         */
-        static load(model) {
-            if (model.model !== 'FNN') {
-                throw new RangeError('the current model is not a feed forward network');
-            }
-
-            return new FeedForwardNeuralNetworks(model);
-        }
-    }
-
-    FeedforwardNeuralNetwork = FeedForwardNeuralNetworks;
-}
diff --git a/CDjsSetup.js b/CDjsSetup.js
new file mode 100644
index 0000000..3914411
--- /dev/null
+++ b/CDjsSetup.js
@@ -0,0 +1,60 @@
+// Copyright (C) 2015 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+
+var CDjsFiles = [
+    "constants.js",
+    "util.js",
+    "red_black_tree.js",
+    "call_sign.js",
+    "vector_2d.js",
+    "vector_3d.js",
+    "motion.js",
+    "reduce_collision_set.js",
+    "simulator.js",
+    "collision.js",
+    "collision_detector.js",
+    "benchmark.js"
+];
+
+var code = "";
+for (var i = 0; i < CDjsFiles.length; ++i)
+    code += "<script src=\"cdjs/" + CDjsFiles[i] + "\"></script>\n";
+code += "<script>\n";
+code += "console.log(\"running...\");\n";
+code += "var __result = benchmark();\n";
+code += "console.log(\"got result: \" + __result);\n";
+code += "top.JetStream.reportResult(__result);\n";
+code += "</script>";
+
+console.log("code = " + code);
+
+JetStream.addPlan({
+    name: "cdjs",
+    benchmarks: [{
+        name: "cdjs",
+        category: "Latency",
+        unit: "ms"
+    }],
+    code: code
+});
+
diff --git a/JetStream-Logo.png b/JetStream-Logo.png
new file mode 100644
index 0000000..cfc3a07
--- /dev/null
+++ b/JetStream-Logo.png
Binary files differ
diff --git a/JetStream-Logo@2x.png b/JetStream-Logo@2x.png
new file mode 100644
index 0000000..f32abfe
--- /dev/null
+++ b/JetStream-Logo@2x.png
Binary files differ
diff --git a/JetStream.css b/JetStream.css
index 2686eea..3d2fd50 100644
--- a/JetStream.css
+++ b/JetStream.css
@@ -1,56 +1,25 @@
-/*
- * Copyright (C) 2018-2022 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-html {
-    font-family: "Helvetica Neue", Helvetica, Verdana, sans-serif;
-    font-size: 62.5%;
-    font-synthesis: none;
-}
-
 body {
-    margin: 0;
-    font-size: 1.6rem;
-    font-weight: 400;
-    line-height: 1.4;
+    font-family: "Helvetica Neue", Helvetica, Verdana, sans-serif;
+    font-size: 14px;
+    line-height: 19px;
+    background-image: url(Swoosh.png);
     background-repeat: no-repeat;
-    background-position: center -5vw;
-    background-size: 100vw;
-    padding-bottom: 0px;
-    background-image: url('clouds.svg');
+    background-position: center -40px;
+    background-size: 3000px auto;
+    padding-bottom: 00px;
 }
 
 ::selection {
-    background-color: #34AADC;
+    background-color: rgb(19, 157, 215);
     color: white;
 }
 
 main {
-    display: block;
-    max-width: 1180px;
+    display: block; /* For IE11 */
+    width: 850px;
     margin: auto;
     text-align: center;
+    padding: 10px;
 }
 
 img {
@@ -58,41 +27,10 @@
     -webkit-user-drag: none;
 }
 
-.logo {
-    box-sizing: border-box;
-    width: 100%;
-    -webkit-touch-callout: none;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-    perspective: 600;
-}
-
-.logo .logo-image {
-    display: block;
-    box-sizing: border-box;
-    background-repeat: no-repeat;
-    background-position: center;
-    background-image: url('JetStream3Logo.svg');
-    color: transparent;
-    animation: swingin 350ms ease-out forwards;
-    will-change: transform, opacity;
-    height: 75px;
-}
-
-#jetstreams {
-    background-image: url('jetstreams.svg');
-    background-repeat: no-repeat;
-    background-size: contain;
-    background-position: center;
-    padding: 2rem 0;
-    margin: -2rem 0;
-}
-
-#jetstreams svg {
-    width: 100%;
-    max-height: 120px;
+#logo {
+    width: 621px;
+    height: 96px;
+    margin-top: 40px;
 }
 
 #magic {
@@ -104,55 +42,47 @@
     display: none;
 }
 
-.summary {
+@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi) {
+    #logo {
+        content: url(JetStream-Logo@2x.png); /* FIXME: This does not work in Firefox. */
+    }
+
+    body {
+        background-image: url(Swoosh@2x.png);
+    }
+}
+
+p.summary {
+    margin: 18px auto 5px;
+    background-image: -webkit-linear-gradient(right, white 70%, rgba(255, 255, 255, 0));
+    background-image: -moz-linear-gradient(right, white 70%, rgba(255, 255, 255, 0));
+    background-image: linear-gradient(to right, white 70%, rgba(255, 255, 255, 0));
+    padding: 15px 125px 0;
     text-align: center;
 }
 
-.summary + .summary {
+p.summary + p.summary {
     padding-top: 5px;
     margin-top: 5px;
 }
 
-.summary:empty {
+p.summary:empty {
     display: none;
 }
 
-article, .summary {
-    max-width: 70rem;
-    margin: 0 auto 1rem;
-    opacity: 0;
-    animation: fadein 0.5s ease-in-out forwards;
-    animation-delay: 200ms;
-}
-
 h1 {
-    color: black;
-    text-align: center;
-}
-
-
-h2, h3, h4, h5, h6 {
-     color: #2C98D1;
-     text-align: left;
-}
-
-
-h4, h5, h6 {
-    margin-bottom: 0;
+    color: rgb(19, 157, 215);
+    text-align: left;
+    margin-top: 40px;
 }
 
 p {
     text-align: left;
-    color: #555555;
-    margin: 0 0 3rem 0;
+    text-indent: 20px;
 }
 
-h5, h6 {
-    font-size: 1.6rem;
-}
-
-h6 {
-    color: #444444;
+p:first-of-type {
+    text-indent: 0;
 }
 
 dt {
@@ -167,88 +97,16 @@
     margin: 0;
 }
 
-a:link,
-a:visited {
-    color: #34AADC;
-}
-
-a:hover,
-a:active {
-    color: #0086BF;
+#status {
+    margin-top: 20px;
 }
 
 #status {
-    margin: 2rem 0rem;
+    height: 20px;
 }
 
-#status label,
-a.button {
-    display: inline-block;
-    font-weight: 500;
-    text-decoration: none;
-    font-size: 2rem;
-    background-color: rgb(52,170,220);
-    background-image: linear-gradient(180deg, rgba(134,217,255,1) -80%, rgba(52,170,220,1) 100%);
-    color: rgb(255,255,255);
-    border: 1px solid rgb(52,170,220);
-    border-radius: 2px;
-    padding: 0.3rem 9rem 0.5rem;
-    -webkit-touch-callout: none;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-}
-
-a.button {
-    animation: fadein 500ms ease-in forwards, scaledown 500ms ease-in forwards;
-    opacity: 0;
-}
-
-#status label,
-.button:hover {
-    background-image: none;
-}
-
-#status.loading {
-    position: absolute;
-    top: 0;
-    left: 0;
-    margin: 48vh 0 0;
-    width: 100%;
-    line-height: 1.2;
-    font-size: 4rem;
-    font-style: italic;
-    font-weight: 500;
-    letter-spacing: -0.10rem;
-    color: transparent;
-    background-image: linear-gradient(132deg, #96E5FF 0%, #96E5FF 2%, #86D9FF 42%, #8BDAFF 84%, #96E5FF 98%, #96E5FF 100%);
-    -webkit-background-clip: text;
-    background-size: 1200px 100%;
-    background-repeat: no-repeat;
-    -webkit-touch-callout: none;
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-}
-
-#status.error {
-    max-width: 70rem;
-    margin: 0 auto 1rem;
-}
-
-.error h2, .error p {
-    color: #d24a59;
-    margin-bottom: 0;
-    text-align: center;
-    font-weight: 500;
-}
-
-.error h2 {
-    font-size: 5rem;
-    letter-spacing: -0.1rem;
-    line-height: 1;
+#status a:link {
+    font-weight: bold;
 }
 
 #result-summary:empty {
@@ -256,194 +114,105 @@
 }
 
 #result-summary {
-    margin-top: 20px;
+	margin-top: 20px;
 }
 
 #result-summary label {
-    color: #6c6c71;
+    font-weight: bold;
 }
 
 #result-summary .score {
-    font-weight: bold;
-    font-size: 4rem;
-    line-height: 1;
-    color: #34AADC;
-    font-weight: 500;
+	font-weight: bold;
+    font-size: 40px;
+	line-height: 40px;
+    color: rgb(19, 157, 215);
 }
 
 #result-summary .score .interval {
-    display: block;
-    font-weight: normal;
+	display: block;
+	font-size: 16px;
+	line-height: 16px;
+	font-weight: normal;
 }
 
-#results {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-around;
-    animation: fadein 500ms ease-out forwards;
-    opacity: 0;
+.interval {
+    opacity: 0.75;
 }
 
-.benchmark {
-    position: relative;
-    flex: 1;
-    max-width: 20%;
-    min-width: 200px;
-    text-align: left;
-    color: #8E8E93;
-    font-size: 1.6rem;
-    margin: 0 1.6rem 3rem 0;
-
-}
-
-.benchmark h3, .benchmark h4, .benchmark .result, .benchmark label {
-    color: transparent;
-    background: linear-gradient(160deg, rgba(249,249,249,1) 0%, rgba(238,238,238,1) 100%);
-    border-radius: 3px;
-}
-
-.benchmark-running h4, .benchmark-running .result, .benchmark-running label {
-    color: #86D9FF;
-    background-color: #86D9FF;
-    background-image: none;
-}
-
-.benchmark-done h3, .benchmark-done h4, .benchmark-done .result, .benchmark-done label {
-    background-color: transparent;
-    background-image: none;
-    -webkit-touch-callout: revert;
-    -webkit-user-select: text;
-    -moz-user-select: text;
-    -ms-user-select: text;
-    user-select: text;
-}
-
-.benchmark h3 {
-    font-weight: 400;
-    font-size: 1.6rem;
-    margin: 0;
-}
-
-.benchmark-running h3 {
-    background-color: transparent;
-    background-image: none;
-    color: #34AADC;
-}
-
-.benchmark-done h3 {
-    color: #6c6c71;
-}
-
-.benchmark h3 a,
-.benchmark h3 a:link,
-.benchmark h3 a:active,
-.benchmark h3 a:hover,
-.benchmark h3 a:visited {
-    color: inherit;
+a:link, a:visited {
+    color: rgb(19, 157, 215);
     text-decoration: none;
 }
 
-.benchmark-done h3 a:hover {
-    color: #34AADC;
+a:link:hover {
     text-decoration: underline;
 }
 
-.benchmark h4 {
-    margin: 0.3rem 0;
-    line-height: 1;
-    font-weight: 400;
-    font-size: 2.4rem;
+table {
+    border-spacing: 0;
+    border-collapse: collapse;
+    margin-top: 15px;
+    width: 100%;
+    table-layout: fixed;
 }
 
-.benchmark-done h4 {
-    color: #34AADC;
-    background-color: none;
+td, th {
+    padding: 4px 8px;
 }
 
-.benchmark p,
-.benchmark-done p {
-    margin: 0;
+th {
+    font-size: 12px;
 }
 
-.benchmark .result {
-    display: inline-block;
-    margin-right: 1.6rem;
-    line-height: 1.3;
-    font-size: 1.3rem;
+tr:first-child > th:nth-child(odd):not(:first-child) {
+    border-left: 15px solid white;
+}
+
+tr:first-child > th:nth-child(odd) {
+    text-align: left;
+}
+
+tr:first-child > th:nth-child(even) {
+    width: px;
+}
+
+tr:nth-child(even):not(:first-child) {
+    background-color: rgb(230, 238, 242);
+}
+
+.result {
+    color: rgb(19, 157, 215);
+    white-space: nowrap;
+}
+
+.benchmark-name {
+    white-space: nowrap;
+    text-align: left;
+}
+
+.result.category,
+.benchmark-name.category {
     font-weight: bold;
 }
 
-.benchmark-done .result {
-    color: #4A4A4A;
+.benchmark-name:not(.category):not(.geometric-mean) {
+    text-indent: 0.5em;
 }
 
-.benchmark label {
-    display: block;
+.geometric-mean {
+    font-weight: bold;
 }
 
-.benchmark-done label {
-    color: #8E8E93;
-    font-weight: 400;
+.benchmark-name:not(:first-child) {
+    border-left: 15px solid white;
 }
 
-@keyframes fadein {
-    from {
-        opacity: 0;
-    }
-    to {
-        opacity: 1;
-    }
+.benchmark-name a:link,
+.benchmark-name a:visited {
+    color: black;
 }
 
-@keyframes scaledown {
-    from {
-        transform: scale(1.3,1.3);
-    }
-    to {
-        transform: scale(1,1);
-    }
+.highlighted-result {
+    background-color: rgb(19, 157, 215);
+    color: white;
 }
-
-@keyframes shine {
-    0% {
-        background-position: -1200px center;
-    }
-    100% {
-        background-position: 100vw center;
-    }
-}
-
-@keyframes swingin {
-    from {
-        opacity: 0;
-        transform: rotateY(-85deg) translateZ(200px);
-    }
-    to {
-        opacity: 1;
-        transform: rotateY(0deg) translateZ(0px);
-    }
-}
-
-@media (max-width: 415px) {
-    body {
-        background-position: center 4rem;
-    }
-
-    .logo .logo-image {
-        height: 60px;
-    }
-
-    #jetstreams {
-        background-size: 200%;
-    }
-
-
-    article, .summary {
-        padding-top: 10rem;
-        margin: 0 1rem;
-    }
-
-    a.button {
-        padding: 0.3rem 6rem 0.5rem;
-    }
-}
\ No newline at end of file
diff --git a/JetStream3Logo.svg b/JetStream3Logo.svg
deleted file mode 100644
index de676c7..0000000
--- a/JetStream3Logo.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   viewBox="0 0 436 94"
-   version="1.1"
-   id="svg84"
-   sodipodi:docname="JetStream3Logo.svg"
-   inkscape:version="1.2.1 (9c6d41e, 2022-07-14)"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:svg="http://www.w3.org/2000/svg">
-  <sodipodi:namedview
-     id="namedview86"
-     pagecolor="#ffffff"
-     bordercolor="#000000"
-     borderopacity="0.25"
-     inkscape:showpageshadow="2"
-     inkscape:pageopacity="0.0"
-     inkscape:pagecheckerboard="0"
-     inkscape:deskcolor="#d1d1d1"
-     showgrid="false"
-     inkscape:zoom="2.5106383"
-     inkscape:cx="410.65254"
-     inkscape:cy="38.834746"
-     inkscape:window-width="1435"
-     inkscape:window-height="621"
-     inkscape:window-x="164"
-     inkscape:window-y="37"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="svg84" />
-  <!-- Copyright © 2019 Apple Inc. All rights reserved. -->
-  <defs
-     id="defs68">
-    <radialGradient
-       id="a"
-       cy="44.467%"
-       r="222.449%"
-       fx="50%"
-       fy="44.467%"
-       gradientTransform="matrix(.22477 0 0 .18868 .388 .36)">
-      <stop
-         stop-color="#FFFFFF"
-         offset="0%"
-         id="stop61" />
-      <stop
-         stop-color="#FFFFFF"
-         stop-opacity=".962"
-         offset="53.383%"
-         id="stop63" />
-      <stop
-         stop-color="#FFFFFF"
-         stop-opacity="0"
-         offset="100%"
-         id="stop65" />
-    </radialGradient>
-  </defs>
-  <ellipse
-     cx="218"
-     cy="53"
-     fill="url(#a)"
-     rx="218"
-     ry="49"
-     id="ellipse70" />
-  <path
-     fill="rgb(52, 169, 218)"
-     d="M 80.4277 41.9199C 80.4277 39.2959 80.0587 37.3279 79.3237 36.0159 78.5877 34.7049 77.3867 34.0479 75.7237 34.0479 73.4827 34.0479 71.6587 35.1369 70.2517 37.3119 68.8437 39.4879 67.7557 42.2729 66.9877 45.6639L 80.2357 45.6639C 80.3637 43.8089 80.4277 42.5609 80.4277 41.9199M 59.0677 34.8639C 62.4277 28.1119 68.2027 24.7349 76.3957 24.7349 86.8267 24.7349 92.0437 30.4639 92.0437 41.9199 92.0437 46.2729 91.6917 50.3049 90.9877 54.0159L 65.7397 54.0159C 65.6107 55.3589 65.5477 56.8329 65.5477 58.4319 65.5477 61.7609 65.9637 64.2249 66.7957 65.8239 67.6267 67.4239 68.9707 68.2239 70.8277 68.2239 72.6187 68.2239 74.1397 67.3589 75.3877 65.6319 76.6357 63.9029 77.5477 61.6639 78.1237 58.9119L 89.9317 58.9119C 87.1147 71.3289 80.5867 77.5359 70.3477 77.5359 64.8427 77.5359 60.7477 76.0809 58.0597 73.1679 55.3717 70.2559 54.0277 65.8239 54.0277 59.8719 54.0277 49.9519 55.7077 41.6169 59.0677 34.8639M 100.4912 52.9121C 101.7062 44.4331 102.5382 38.6561 102.9872 35.5841L 97.8992 35.5841 99.2432 25.8881 104.3312 25.8881 106.2512 11.6801 118.2512 11.6801 115.6592 25.8881 122.9552 25.8881 121.6112 35.5841 114.4112 35.5841C 113.9632 38.5281 113.1782 44.0161 112.0592 52.0481 110.9392 60.0801 110.3792 64.2881 110.3792 64.6721 110.3792 66.7841 111.5312 67.8401 113.8352 67.8401L 117.0032 67.8401 115.8512 76.3841C 115.0182 76.7031 113.9142 76.9741 112.5392 77.2001 111.1622 77.4231 109.9302 77.5361 108.8432 77.5361 105.2582 77.5361 102.6662 76.5761 101.0672 74.6561 99.4672 72.7351 98.6672 70.2401 98.6672 67.1681 98.6672 66.1441 99.2752 61.3921 100.4912 52.9121M 124.2988 54.0156L 136.9708 54.0156C 136.6498 55.2966 136.4908 56.8326 136.4908 58.6236 136.4908 60.8656 137.2108 62.8166 138.6508 64.4796 140.0908 66.1446 142.6978 66.9756 146.4748 66.9756 149.7388 66.9756 152.2978 66.1446 154.1548 64.4796 156.0098 62.8166 156.9388 60.7996 156.9388 58.4316 156.9388 56.5116 156.4108 54.8656 155.3548 53.4876 154.2988 52.1126 152.9858 50.9766 151.4188 50.0796 149.8498 49.1846 147.6578 48.0966 144.8428 46.8156 141.4498 45.2806 138.7138 43.8726 136.6348 42.5916 134.5538 41.3126 132.7778 39.5836 131.3068 37.4086 129.8338 35.2326 129.0988 32.5116 129.0988 29.2476 129.0988 25.7916 129.8498 22.5606 131.3548 19.5516 132.8578 16.5436 135.2748 14.0966 138.6028 12.2076 141.9298 10.3206 146.1868 9.3756 151.3708 9.3756 159.0508 9.3756 164.3938 11.2326 167.4028 14.9436 170.4098 18.6566 171.9148 23.6486 171.9148 29.9196L 159.5308 29.9196C 159.5308 26.9766 158.7948 24.5916 157.3228 22.7676 155.8498 20.9436 153.6418 20.0326 150.6988 20.0326 148.7148 20.0326 146.7628 20.4966 144.8428 21.4236 142.9228 22.3526 141.9628 24.1606 141.9628 26.8476 141.9628 29.1516 142.8418 30.9606 144.6028 32.2716 146.3618 33.5836 149.0978 35.0076 152.8108 36.5436 156.3938 38.0796 159.3058 39.5196 161.5468 40.8646 163.7858 42.2076 165.7058 44.1126 167.3068 46.5766 168.9058 49.0396 169.7068 52.1606 169.7068 55.9356 169.7068 60.4156 168.6658 64.2876 166.5868 67.5516 164.5068 70.8156 161.6428 73.2966 157.9948 74.9926 154.3468 76.6866 150.2508 77.5366 145.7068 77.5366 142.1858 77.5366 138.7468 76.9266 135.3868 75.7116 132.0268 74.4966 129.2578 72.5606 127.0828 69.9036 124.9058 67.2486 123.8188 63.9036 123.8188 59.8716 123.8188 57.5676 123.9778 55.6166 124.2988 54.0156M 179.2104 52.9121C 180.4254 44.4331 181.2574 38.6561 181.7064 35.5841L 176.6184 35.5841 177.9624 25.8881 183.0504 25.8881 184.9704 11.6801 196.9704 11.6801 194.3784 25.8881 201.6744 25.8881 200.3304 35.5841 193.1304 35.5841C 192.6824 38.5281 191.8974 44.0161 190.7784 52.0481 189.6584 60.0801 189.0984 64.2881 189.0984 64.6721 189.0984 66.7841 190.2504 67.8401 192.5544 67.8401L 195.7224 67.8401 194.5704 76.3841C 193.7374 76.7031 192.6334 76.9741 191.2584 77.2001 189.8814 77.4231 188.6494 77.5361 187.5624 77.5361 183.9774 77.5361 181.3854 76.5761 179.7864 74.6561 178.1864 72.7351 177.3864 70.2401 177.3864 67.1681 177.3864 66.1441 177.9944 61.3921 179.2104 52.9121M 218.0898 33.5674C 219.3698 30.9444 220.8258 28.8154 222.4578 27.1834 224.0898 25.5514 226.0898 24.7354 228.4578 24.7354 229.6728 24.7354 230.6978 24.8484 231.5298 25.0724 232.3608 25.2964 232.8738 25.4404 233.0658 25.5044L 231.6258 36.6394 227.9778 36.6394C 225.1608 36.6394 222.7768 37.5374 220.8258 39.3284 218.8728 41.1204 217.6098 44.0964 217.0338 48.2554L 213.0978 76.3834 201.7698 76.3834 208.7778 25.8874 218.0898 25.8874 218.0898 33.5674zM 259.7524 41.9199C 259.7524 39.2959 259.3834 37.3279 258.6484 36.0159 257.9124 34.7049 256.7114 34.0479 255.0484 34.0479 252.8074 34.0479 250.9834 35.1369 249.5764 37.3119 248.1684 39.4879 247.0804 42.2729 246.3124 45.6639L 259.5604 45.6639C 259.6884 43.8089 259.7524 42.5609 259.7524 41.9199M 238.3924 34.8639C 241.7524 28.1119 247.5274 24.7349 255.7204 24.7349 266.1514 24.7349 271.3684 30.4639 271.3684 41.9199 271.3684 46.2729 271.0164 50.3049 270.3124 54.0159L 245.0644 54.0159C 244.9354 55.3589 244.8724 56.8329 244.8724 58.4319 244.8724 61.7609 245.2884 64.2249 246.1204 65.8239 246.9514 67.4239 248.2954 68.2239 250.1524 68.2239 251.9434 68.2239 253.4644 67.3589 254.7124 65.6319 255.9604 63.9029 256.8724 61.6639 257.4484 58.9119L 269.2564 58.9119C 266.4394 71.3289 259.9114 77.5359 249.6724 77.5359 244.1674 77.5359 240.0724 76.0809 237.3844 73.1679 234.6964 70.2559 233.3524 65.8239 233.3524 59.8719 233.3524 49.9519 235.0324 41.6169 238.3924 34.8639M 298.5361 63.5674C 300.0071 60.8484 301.0321 57.6644 301.6081 54.0154 302.1841 50.3684 302.4721 47.0074 302.4721 43.9354 302.4721 40.8004 302.0881 38.4634 301.3201 36.9274 300.5521 35.3914 299.2391 34.6244 297.3841 34.6244 294.9511 34.6244 292.9991 36.0634 291.5281 38.9434 290.0551 41.8244 289.0151 45.1044 288.4081 48.7844 287.7991 52.4644 287.4961 55.5854 287.4961 58.1434 287.4961 64.4794 289.2241 67.6474 292.6801 67.6474 295.1111 67.6474 297.0631 66.2894 298.5361 63.5674M 305.7361 31.9354L 307.6561 25.8874 316.5841 25.8874C 315.9441 29.8564 314.7911 37.2804 313.1271 48.1604 311.4631 59.0414 310.6311 64.7054 310.6311 65.1514 310.6311 66.9444 311.4011 67.8394 312.9361 67.8394L 314.6641 67.8394 313.5121 76.0004C 311.7841 77.0224 309.8951 77.5364 307.8481 77.5364 305.7361 77.5364 304.0081 76.9434 302.6641 75.7594 301.3201 74.5764 300.3911 72.9274 299.8801 70.8154 298.7281 73.0564 297.2071 74.7364 295.3201 75.8554 293.4321 76.9744 291.5591 77.5364 289.7041 77.5364 285.3511 77.5364 281.9911 76.0334 279.6241 73.0234 277.2551 70.0164 276.0721 65.5684 276.0721 59.6794 276.0721 51.9364 276.9671 45.4404 278.7601 40.1914 280.5511 34.9444 282.9031 31.0564 285.8161 28.5274 288.7271 26.0004 291.8481 24.7354 295.1761 24.7354 300.2951 24.7354 303.8161 27.1354 305.7361 31.9354M 336.4546 32.416C 339.7816 27.296 344.0066 24.735 349.1266 24.735 352.0076 24.735 354.3426 25.456 356.1356 26.895 357.9266 28.336 359.1416 30.368 359.7826 32.992 361.4466 30.433 363.3346 28.417 365.4466 26.943 367.5586 25.473 370.0866 24.735 373.0306 24.735 376.6796 24.735 379.4626 25.873 381.3836 28.144 383.3036 30.416 384.2636 33.601 384.2636 37.695 384.2636 38.593 384.1186 40.177 383.8306 42.448 383.5426 44.721 383.0156 48.544 382.2466 53.92 381.8626 57.057 381.3976 60.513 380.8546 64.288 380.3096 68.064 379.7506 72.097 379.1756 76.384L 367.7506 76.384 370.9186 53.632C 371.5586 49.345 371.9896 46.288 372.2156 44.464 372.4376 42.64 372.5516 41.408 372.5516 40.768 372.5516 37.057 370.9816 35.2 367.8476 35.2 365.8626 35.2 364.0696 36.16 362.4716 38.08 360.8706 40 359.8466 42.656 359.3986 46.048L 355.3666 76.384 343.9426 76.384 347.1106 53.344C 347.6866 49.185 348.0856 46.208 348.3106 44.416 348.5346 42.625 348.6466 41.408 348.6466 40.768 348.6466 37.057 347.1106 35.2 344.0386 35.2 341.9896 35.2 340.1826 36.145 338.6146 38.032 337.0456 39.92 336.0376 42.592 335.5916 46.048L 331.4626 76.384 320.0386 76.384 327.1426 25.888 336.4546 25.888 336.4546 32.416z"
-     id="path72" />
-  <mask
-     id="b"
-     fill="white">
-    <use
-       id="use74" />
-  </mask>
-  <mask
-     id="d"
-     fill="white">
-    <use
-       id="use79" />
-  </mask>
-  <path
-     fill="rgb(52, 169, 218)"
-     d="M 44.054 72.415 L 52.885 9.999 L 39.856 9.999 L 31.22 71.534 C 29.982 79.967 25.236 81.735 21.472 81.735 C 15.725 81.735 12.688 78.782 12.688 73.195 C 12.688 72.419 12.906 70.498 13.354 67.34 L 1.063 67.34 C 0.189 73.715 -0.0 75.973 -0.0 76.733 C -0.0 81.987 1.756 85.858 5.368 88.567 C 9.038 91.32 14.456 92.715 21.472 92.715 C 27.879 92.715 33.064 90.973 36.882 87.538 C 40.711 84.092 43.124 79.004 44.054 72.415"
-     id="path82" />
-  <text
-     xml:space="preserve"
-     style="font-size:90.4118px;fill:#86d9ff;fill-opacity:1;stroke-width:0.94179"
-     x="412.03653"
-     y="70.147377"
-     id="text300"
-     transform="scale(0.94178983,1.061808)"><tspan
-       sodipodi:role="line"
-       id="tspan298"
-       x="412.03653"
-       y="70.147377"
-       style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:90.4118px;font-family:Normatica;-inkscape-font-specification:'Normatica Bold Italic';fill:#86d9ff;fill-opacity:1;stroke-width:0.94179">3</tspan><tspan
-       sodipodi:role="line"
-       x="412.03653"
-       y="183.16217"
-       style="font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:90.4118px;font-family:Normatica;-inkscape-font-specification:'Normatica Bold Italic';fill:#86d9ff;fill-opacity:1;stroke-width:0.94179"
-       id="tspan352" /></text>
-</svg>
diff --git a/JetStreamDriver.js b/JetStreamDriver.js
index f763b42..73ee420 100644
--- a/JetStreamDriver.js
+++ b/JetStreamDriver.js
@@ -1,2194 +1,552 @@
-"use strict";
+// Copyright (C) 2014 Apple Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+// BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
 
-/*
- * Copyright (C) 2018-2022 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
-*/
+var JetStream = (function() {
+    var isRunning;
+    var hasAlreadyRun;
+    var currentPlan;
+    var currentIteration;
+    var numberOfIterations;
+    var accumulator;
+    var selectBenchmark;
 
-const measureTotalTimeAsSubtest = false; // Once we move to preloading all resources, it would be good to turn this on.
+    var givenPlans = [];
+    var givenReferences = {};
+    var categoryNames;
+    var plans;
+    var benchmarks;
 
-globalThis.performance ??= Date;
-globalThis.RAMification ??= false;
-globalThis.testIterationCount ??= undefined;
-globalThis.testIterationCountMap ??= new Map();
-globalThis.testWorstCaseCountMap ??= new Map();
-globalThis.dumpJSONResults ??= false;
-globalThis.customTestList ??= [];
+    // Import Octane benchmarks.
 
-let shouldReport = false;
-if (typeof(URLSearchParams) !== "undefined") {
-    const urlParameters = new URLSearchParams(window.location.search);
-    shouldReport = urlParameters.has('report') && urlParameters.get('report').toLowerCase() == 'true';
-    if (urlParameters.has('test'))
-        customTestList = urlParameters.getAll("test");
-}
+    var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96];
+    var tMax = tDistribution.length;
+    var tLimit = 1.96;
 
-// Used for the promise representing the current benchmark run.
-this.currentResolve = null;
-this.currentReject = null;
-
-const defaultIterationCount = 120;
-const defaultWorstCaseCount = 4;
-
-let showScoreDetails = false;
-let categoryScores = null;
-
-function displayCategoryScores() {
-    if (!categoryScores)
-        return;
-
-    let summaryElement = document.getElementById("result-summary");
-    for (let [category, scores] of categoryScores)
-        summaryElement.innerHTML += `<p> ${category}: ${uiFriendlyNumber(geomean(scores))}</p>`
-
-    categoryScores = null;
-}
-
-function getIterationCount(plan) {
-    if (testIterationCountMap.has(plan.name))
-        return testIterationCountMap.get(plan.name);
-    if (testIterationCount)
-        return testIterationCount;
-    if (plan.iterations)
-        return plan.iterations;
-    return defaultIterationCount;
-}
-
-function getWorstCaseCount(plan) {
-    if (testWorstCaseCountMap.has(plan.name))
-        return testWorstCaseCountMap.get(plan.name);
-    if (plan.worstCaseCount)
-        return plan.worstCaseCount;
-    return defaultWorstCaseCount;
-}
-
-if (isInBrowser) {
-    document.onkeydown = (keyboardEvent) => {
-        let key = keyboardEvent.key;
-        if (key === "d" || key === "D") {
-            showScoreDetails = true;
-
-            displayCategoryScores();
-        }
-    };
-}
-
-function assert(b, m = "") {
-    if (!b)
-        throw new Error("Bad assertion: " + m);
-}
-
-function firstID(benchmark) {
-    return `results-cell-${benchmark.name}-first`;
-}
-
-function worst4ID(benchmark) {
-    return `results-cell-${benchmark.name}-worst4`;
-}
-
-function avgID(benchmark) {
-    return `results-cell-${benchmark.name}-avg`;
-}
-
-function scoreID(benchmark) {
-    return `results-cell-${benchmark.name}-score`;
-}
-
-function mean(values) {
-    assert(values instanceof Array);
-    let sum = 0;
-    for (let x of values)
-        sum += x;
-    return sum / values.length;
-}
-
-function geomean(values) {
-    assert(values instanceof Array);
-    let product = 1;
-    for (let x of values)
-        product *= x;
-    return product ** (1 / values.length);
-}
-
-function toScore(timeValue) {
-    return 5000 / Math.max(timeValue, 1);
-}
-
-function toTimeValue(score) {
-    return 5000 / score;
-}
-
-function updateUI() {
-    return new Promise((resolve) => {
-        if (isInBrowser)
-            requestAnimationFrame(() => setTimeout(resolve, 0));
-        else
-            resolve();
-    });
-}
-
-function uiFriendlyNumber(num) {
-    if (Number.isInteger(num))
-        return num;
-    return num.toFixed(3);
-}
-
-function uiFriendlyDuration(time)
-{
-    let minutes = time.getMinutes();
-    let seconds = time.getSeconds();
-    let milliSeconds = time.getMilliseconds();
-    let result = "" + minutes + ":";
-
-    result = result + (seconds < 10 ? "0" : "") + seconds + ".";
-    result = result + (milliSeconds < 10 ? "00" : (milliSeconds < 100 ? "0" : "")) + milliSeconds;
-
-    return result;
-}
-
-const fileLoader = (function() {
-    class Loader {
-        constructor() {
-            this.requests = new Map;
-        }
-
-        async _loadInternal(url) {
-            if (!isInBrowser)
-                return Promise.resolve(readFile(url));
-
-            let response;
-            let tries = 3;
-            while (tries--) {
-                let hasError = false;
-                try {
-                    response = await fetch(url);
-                } catch (e) {
-                    hasError = true;
-                }
-                if (!hasError && response.ok)
-                    break;
-                if (tries)
-                    continue;
-                window.allIsGood = false;
-                throw new Error("Fetch failed");
-            }
-            if (url.indexOf(".js") !== -1)
-                return response.text();
-            else if (url.indexOf(".wasm") !== -1)
-                return response.arrayBuffer();
-
-            throw new Error("should not be reached!");
-        }
-
-        async load(url) {
-            if (this.requests.has(url))
-                return this.requests.get(url);
-
-            let promise = this._loadInternal(url);
-            this.requests.set(url, promise);
-            return promise;
-        }
-    }
-    return new Loader;
-})();
-
-class Driver {
-    constructor() {
-        this.benchmarks = [];
-        this.blobDataCache = { };
-        this.loadCache = { };
-        this.counter = { };
-        this.counter.loadedResources = 0;
-        this.counter.totalResources = 0;
-        this.counter.failedPreloadResources = 0;
-    }
-
-    addPlan(plan, BenchmarkClass = DefaultBenchmark) {
-        this.benchmarks.push(new BenchmarkClass(plan));
-    }
-
-    async start() {
-        let statusElement = false;
-        let summaryElement = false;
-        if (isInBrowser) {
-            statusElement = document.getElementById("status");
-            summaryElement = document.getElementById("result-summary");
-            statusElement.innerHTML = `<label>Running...</label>`;
-        } else if (!dumpJSONResults)
-            console.log("Starting JetStream3");
-
-        await updateUI();
-
-        let start = performance.now();
-        for (let benchmark of this.benchmarks) {
-            benchmark.updateUIBeforeRun();
-
-            await updateUI();
-
-            try {
-                await benchmark.run();
-            } catch(e) {
-                JetStream.reportError(benchmark);
-                throw e;
-            }
-
-            benchmark.updateUIAfterRun();
-
-            if (isInBrowser) {
-                let cache = JetStream.blobDataCache;
-                for (let file of benchmark.plan.files) {
-                    let blobData = cache[file];
-                    blobData.refCount--;
-                    if (!blobData.refCount)
-                        cache[file] = undefined;
-                }
-            }
-        }
-
-        let totalTime = performance.now() - start;
-        if (measureTotalTimeAsSubtest) {
-            if (isInBrowser)
-                document.getElementById("benchmark-total-time-score").innerHTML = uiFriendlyNumber(totalTime);
-            else if (!dumpJSONResults)
-                console.log("Total time:", uiFriendlyNumber(totalTime));
-            allScores.push(totalTime);
-        }
-
-        let allScores = [];
-        for (let benchmark of this.benchmarks)
-            allScores.push(benchmark.score);
-
-        categoryScores = new Map;
-        for (let benchmark of this.benchmarks) {
-            for (let category of Object.keys(benchmark.subTimes()))
-                categoryScores.set(category, []);
-        }
-
-        for (let benchmark of this.benchmarks) {
-            for (let [category, value] of Object.entries(benchmark.subTimes())) {
-                let arr = categoryScores.get(category);
-                arr.push(value);
-            }
-        }
-
-        if (isInBrowser) {
-            summaryElement.classList.add('done');
-            summaryElement.innerHTML = "<div class=\"score\">" + uiFriendlyNumber(geomean(allScores)) + "</div><label>Score</label>";
-            summaryElement.onclick = displayCategoryScores;
-            if (showScoreDetails)
-                displayCategoryScores();
-            statusElement.innerHTML = '';
-        } else if (!dumpJSONResults) {
-            console.log("\n");
-            for (let [category, scores] of categoryScores)
-                console.log(`${category}: ${uiFriendlyNumber(geomean(scores))}`);
-
-            console.log("\nTotal Score: ", uiFriendlyNumber(geomean(allScores)), "\n");
-        }
-
-        this.reportScoreToRunBenchmarkRunner();
-        this.dumpJSONResultsIfNeeded();
-    }
-
-    runCode(string)
+    function tDist(n)
     {
-        if (!isInBrowser) {
-            let scripts = string;
-            let globalObject;
-            let realm;
-            if (isD8) {
-                realm = Realm.createAllowCrossRealmAccess();
-                globalObject = Realm.global(realm);
-                globalObject.loadString = function(s) {
-                    return Realm.eval(realm, s);
-                };
-                globalObject.readFile = read;
-            } else if (isSpiderMonkey) {
-                globalObject = newGlobal();
-                globalObject.loadString = globalObject.evaluate;
-                globalObject.readFile = globalObject.readRelativeToScript;
-            } else
-                globalObject = runString("");
+        if (n > tMax)
+            return tLimit;
+        return tDistribution[n];
+    }
 
-            globalObject.console = { log: globalObject.print, warn: (e) => { print("Warn: " + e); /*$vm.abort();*/ } }
-            globalObject.self = globalObject;
-            globalObject.top = {
-                currentResolve,
-                currentReject
-            };
+    function displayResultMessage(name, message, style)
+    {
+        var element = document.getElementById("results-cell-" + name);
+        element.innerHTML = message || "&mdash;";
+        if (element.classList) {
+            element.classList.remove("result");
+            element.classList.remove("highlighted-result");
+            element.classList.add(style);
+        } else
+            element.className = style;
+    }
 
-            globalObject.performance ??= performance;
-            for (let script of scripts)
-                globalObject.loadString(script);
+    function displayResultMessageForPlan(plan, message, style)
+    {
+        for (var i = plan.benchmarks.length; i--;)
+            displayResultMessage(plan.benchmarks[i].name, message, style);
+    }
 
-            return isD8 ? realm : globalObject;
+    function computeStatistics(values)
+    {
+        if (!values.length)
+            return {n: 0};
+
+        var sum = 0;
+        var n = 0;
+        for (var i = 0; i < values.length; ++i) {
+            if (!(i in values))
+                continue;
+            sum += values[i];
+            n++;
         }
 
+        if (n != values.length)
+            return {n: values.length, failed: values.length - n};
+
+        var mean = sum / n;
+
+        if (n <= 2)
+            return {n: n, mean: mean};
+
+        var sumForStdDev = 0;
+        for (var i = 0; i < values.length; ++i) {
+            if (!(i in values))
+                continue;
+            sumForStdDev += Math.pow(values[i] - mean, 2);
+        }
+        var standardDeviation = Math.sqrt(sumForStdDev / (n - 1));
+        var standardError = standardDeviation / Math.sqrt(n);
+        var interval = tDist(n) * standardError;
+        return {n: n, mean: mean, interval: interval};
+    }
+
+    function formatResult(values, options)
+    {
+        options = options || {};
+        var extraPrecision = options.extraPrecision || 0;
+
+        function prepare(value)
+        {
+            var precision = 4 + extraPrecision;
+            var digitsAfter;
+            if (value) {
+                var log = Math.log(value) / Math.log(10);
+                if (log >= precision)
+                    digitsAfter = 0;
+                else if (log < 0)
+                    digitsAfter = precision;
+                else
+                    digitsAfter = precision - 1 - (log | 0);
+            } else
+                digitsAfter = precision - 1;
+
+            return value.toFixed(digitsAfter);
+        }
+
+        var statistics = computeStatistics(values);
+
+        if (!statistics.n)
+            return "";
+
+        if ("failed" in statistics) {
+            if (statistics.n == 1)
+                return "ERROR";
+            return "ERROR <i>(failed " + statistics.failed + "/" + statistics.n + ")</i>";
+        }
+
+        if ("interval" in statistics)
+            return prepare(statistics.mean) + "<span class=\"interval\"> &plusmn; " + prepare(statistics.interval) + "</span>";
+
+        return prepare(statistics.mean);
+    }
+
+    function runCode(string)
+    {
         var magic = document.getElementById("magic");
         magic.contentDocument.body.textContent = "";
         magic.contentDocument.body.innerHTML = "<iframe id=\"magicframe\" frameborder=\"0\">";
 
         var magicFrame = magic.contentDocument.getElementById("magicframe");
         magicFrame.contentDocument.open();
-        magicFrame.contentDocument.write("<!DOCTYPE html><head><title>benchmark payload</title></head><body>\n" + string + "</body></html>");
-
-        return magicFrame;
+        magicFrame.contentDocument.write(
+            "<!DOCTYPE html><head><title>benchmark payload</title></head><body><script>\n" +
+            "window.onerror = top.JetStream.reportError;</script>\n" +
+            string + "</body></html>");
+        magicFrame.contentDocument.close();
     }
 
-    prepareToRun()
+    function addPlan(plan)
     {
-        this.benchmarks.sort((a, b) => a.plan.name.toLowerCase() < b.plan.name.toLowerCase() ? 1 : -1);
+        givenPlans.push(plan);
+    }
 
-        let text = "";
-        let newBenchmarks = [];
-        for (let benchmark of this.benchmarks) {
-            let id = JSON.stringify(benchmark.constructor.scoreDescription());
-            let description = JSON.parse(id);
+    function addReferences(references)
+    {
+        for (var s in references)
+            givenReferences[s] = references[s];
+    }
 
-            newBenchmarks.push(benchmark);
-            let scoreIds = benchmark.scoreIdentifiers()
-            let overallScoreId = scoreIds.pop();
+    function reset()
+    {
+        var categoryMap = {};
+        benchmarks = [];
+        for (var i = 0; i < givenPlans.length; ++i) {
+            var plan = givenPlans[i];
+            if (selectBenchmark && plan.name != selectBenchmark)
+                continue;
+            for (var j = 0; j < plan.benchmarks.length; ++j) {
+                var benchmark = plan.benchmarks[j];
+                benchmarks.push(benchmark);
+                var benchmarksForCategory = categoryMap[benchmark.category];
+                if (!benchmarksForCategory)
+                    benchmarksForCategory = categoryMap[benchmark.category] = [];
+                benchmarksForCategory.push(benchmark);
+                benchmark.plan = plan;
+                benchmark.reference = givenReferences[benchmark.name] || 1;
+            }
+        }
+        categoryNames = [];
+        for (var category in categoryMap)
+            categoryNames.push(category);
+        categoryNames.sort();
 
-            if (isInBrowser) {
-                text +=
-                    `<div class="benchmark" id="benchmark-${benchmark.name}">
-                    <h3 class="benchmark-name"><a href="in-depth.html#${benchmark.name}">${benchmark.name}</a></h3>
-                    <h4 class="score" id="${overallScoreId}">___</h4><p>`;
-                for (let i = 0; i < scoreIds.length; i++) {
-                    let id = scoreIds[i];
-                    let label = description[i];
-                    text += `<span class="result"><span id="${id}">___</span><label>${label}</label></span>`
-                }
-                text += `</p></div>`;
+        var cells = [];
+        for (var i = 0; i < categoryNames.length; ++i) {
+            var categoryName = categoryNames[i];
+            cells.push({kind: "category", name: categoryName});
+            var benchmarksForCategory = categoryMap[categoryName];
+            benchmarksForCategory.sort(function(a, b) {
+                return a.name.localeCompare(b.name);
+            });
+            for (var j = 0; j < benchmarksForCategory.length; ++j)
+                cells.push({kind: "benchmark", benchmark: benchmarksForCategory[j]});
+        }
+
+        plans = [];
+        var remainingPlans = [].concat(givenPlans);
+        for (var i = 0; i < cells.length; ++i) {
+            var cell = cells[i];
+            switch (cell.kind) {
+            case "category":
+                break;
+
+            case "benchmark":
+                var plan = cell.benchmark.plan;
+                var index = remainingPlans.indexOf(plan);
+                if (index < 0)
+                    break;
+                plans.push(plan);
+                remainingPlans.splice(index, 1);
+                break;
+
+            default:
+                throw "Bad cell kind: " + cell.king;
             }
         }
 
-        if (!isInBrowser)
-            return;
+        var numColumns = 3;
+        var columnHeight = Math.ceil((cells.length + 1) / numColumns);
 
-        for (let f = 0; f < 5; f++)
-            text += `<div class="benchmark fill"></div>`;
+        var resultsTable = document.getElementById("results");
 
-        let timestamp = performance.now();
-        document.getElementById('jetstreams').style.backgroundImage = `url('jetstreams.svg?${timestamp}')`;
-        let resultsTable = document.getElementById("results");
+        var text = "";
+
+        text += "<tr>";
+        for (var i = 0; i < numColumns; ++i)
+            text += "<th>Benchmark</th><th>Average Score</th>";
+        text += "</tr>";
+
+        for (var i = 0; i < columnHeight; ++i) {
+            function benchmarkLine(index)
+            {
+                if (index > cells.length)
+                    return "";
+
+                var result = "";
+
+                if (index == cells.length) {
+                    result += "<td class=\"benchmark-name geometric-mean\">Geometric Mean</td>";
+                    result += "<td class=\"result geometric-mean\" id=\"results-cell-geomean\">&mdash;</td>";
+                } else {
+                    var cell = cells[index];
+                    switch (cell.kind) {
+                    case "category":
+                        result += "<td class=\"benchmark-name category\">" + cell.name + "</td>";
+                        result += "<td class=\"result category\" id=\"results-cell-geomean-" + cell.name + "\">&mdash;</td>";
+                        break;
+
+                    case "benchmark":
+                        var benchmark = cell.benchmark;
+                        result += "<td class=\"benchmark-name\">";
+                        result += "<a href=\"in-depth.html#" + benchmark.name + "\" target=\"_blank\">" + benchmark.name + "</a></td>";
+                        result += "<td class=\"result\" id=\"results-cell-" + benchmark.name + "\">&mdash;</td>";
+                        break;
+
+                    default:
+                        throw "Bad cell kind: " + cell.kind;
+                    }
+                }
+
+                return result;
+            }
+
+            text += "<tr>";
+            for (var j = 0; j < numColumns; ++j)
+                text += benchmarkLine(j * columnHeight + i);
+            text += "</tr>";
+        }
+
         resultsTable.innerHTML = text;
 
         document.getElementById("magic").textContent = "";
-        document.addEventListener('keypress', function (e) {
-            if (e.which === 13)
-                JetStream.start();
-        });
+
+        for (var i = benchmarks.length; i--;) {
+            benchmarks[i].results = [];
+            benchmarks[i].times = [];
+        }
+
+        currentIteration = 0;
+        currentPlan = -1;
+        isRunning = false;
+        hasAlreadyRun = false;
     }
 
-    reportError(benchmark)
+    function prepareToStart()
     {
-        if (!isInBrowser)
-            return;
-
-        for (let id of benchmark.scoreIdentifiers())
-            document.getElementById(id).innerHTML = "error";
+        var startButton = document.getElementById("status");
+        startButton.innerHTML =
+            "<a href=\"javascript:void(JetStream.start())\">" +
+            (hasAlreadyRun ? "Test Again" : "Start Test") + "</a>";
     }
 
-    async initialize() {
-        await this.prefetchResourcesForBrowser();
-        await this.fetchResources();
-        this.prepareToRun();
-        if (isInBrowser && shouldReport) {
-            setTimeout(() => this.start(), 4000);
-        }
-    }
-
-    async prefetchResourcesForBrowser() {
-        if (!isInBrowser)
-            return;
-
-        var promises = [];
-        for (let benchmark of this.benchmarks)
-            promises.push(benchmark.prefetchResourcesForBrowser());
-
-        await Promise.all(promises);
-
-        let counter = JetStream.counter;
-        if (counter.failedPreloadResources || counter.loadedResources != counter.totalResources) {
-            for (let benchmark of this.benchmarks) {
-                let allFilesLoaded = await benchmark.retryPrefetchResourcesForBrowser(counter);
-                if (allFilesLoaded)
-                    break;
-            }
-
-            if (counter.failedPreloadResources || counter.loadedResources != counter.totalResources) {
-                // If we've failed to prefetch resources even after a sequential 1 by 1 retry,
-                // then fail out early rather than letting subtests fail with a hang.
-                window.allIsGood = false;
-                throw new Error("Fetch failed"); 
-            }
-        }
-
-        JetStream.loadCache = { }; // Done preloading all the files.
-    }
-
-    async fetchResources() {
-        var promises = [];
-        for (let benchmark of this.benchmarks)
-            promises.push(benchmark.fetchResources());
-        await Promise.all(promises);
-
-        if (!isInBrowser)
-            return;
-
-        let statusElement = document.getElementById("status");
-        statusElement.classList.remove('loading');
-        statusElement.innerHTML = `<a href="javascript:JetStream.start()" class="button">Start Test</a>`;
-        statusElement.onclick = () => {
-            statusElement.onclick = null;
-            JetStream.start();
-            return false;
-        }
-    }
-
-    resultsJSON()
+    function initializeWithMode(modeLine)
     {
-        let results = {};
-        for (let benchmark of this.benchmarks) {
-            const subResults = {}
-            const subTimes = benchmark.subTimes();
-            for (const name in subTimes) {
-                subResults[name] = {"metrics": {"Time": {"current": [toTimeValue(subTimes[name])]}}};
-            }
-            results[benchmark.name] = {
-                "metrics" : {
-                    "Score" : {"current" : [benchmark.score]},
-                    "Time": ["Geometric"],
-                },
-                "tests": subResults,
-            };
-        }
+        reset();
+        prepareToStart();
 
-        results = {"JetStream3.0": {"metrics" : {"Score" : ["Geometric"]}, "tests" : results}};
+        var experimentalMethod = document.getElementById("mode-description");
+        selectBenchmark = null;
+        var modes = modeLine.split(",");
+        for (var i = 0; i < modes.length; ++i) {
+            var mode = modes[i];
 
-        return JSON.stringify(results);
-    }
-
-    dumpJSONResultsIfNeeded()
-    {
-        if (dumpJSONResults) {
-            console.log("\n");
-            console.log(this.resultsJSON());
-            console.log("\n");
-        }
-    }
-
-    async reportScoreToRunBenchmarkRunner()
-    {
-        if (!isInBrowser)
-            return;
-
-        if (!shouldReport)
-            return;
-
-        const content = this.resultsJSON();
-        await fetch("/report", {
-            method: "POST",
-            heeaders: {
-                "Content-Type": "application/json",
-                "Content-Length": content.length,
-                "Connection": "close",
-            },
-            body: content,
-        });
-    }
-};
-
-class Benchmark {
-    constructor(plan)
-    {
-        this.plan = plan;
-        this.iterations = getIterationCount(plan);
-        this.isAsync = !!plan.isAsync;
-
-        this.scripts = null;
-
-        this._resourcesPromise = null;
-        this.fetchResources();
-    }
-
-    get name() { return this.plan.name; }
-
-    get runnerCode() {
-        return `
-            let __benchmark = new Benchmark(${this.iterations});
-            let results = [];
-            for (let i = 0; i < ${this.iterations}; i++) {
-                if (__benchmark.prepareForNextIteration)
-                    __benchmark.prepareForNextIteration();
-
-                ${this.preiterationCode}
-                let start = performance.now();
-                __benchmark.runIteration();
-                let end = performance.now();
-
-                results.push(Math.max(1, end - start));
-            }
-            if (__benchmark.validate)
-                __benchmark.validate();
-            top.currentResolve(results);`;
-    }
-
-    processResults() {
-        throw new Error("Subclasses need to implement this");
-    }
-
-    get score() {
-        throw new Error("Subclasses need to implement this");
-    }
-
-    get prerunCode() { return null; }
-
-    get preiterationCode() {
-        if (this.plan.deterministicRandom)
-            return `Math.random.__resetSeed();`;
-
-        return "";
-    }
-
-    async run() {
-        let code;
-        if (isInBrowser)
-            code = "";
-        else
-            code = [];
-
-        let addScript = (text) => {
-            if (isInBrowser)
-                code += `<script>${text}</script>`;
-            else
-                code.push(text);
-        };
-
-        let addScriptWithURL = (url) => {
-            if (isInBrowser)
-                code += `<script src="${url}"></script>`;
-            else
-                assert(false, "Should not reach here in CLI");
-        };
-
-        addScript(`const isInBrowser = ${isInBrowser};`);
-
-        if (!!this.plan.deterministicRandom) {
-            addScript(`
-                 (() => {
-                    const initialSeed = 49734321;
-                    let seed = initialSeed;
-
-                    Math.random = () => {
-                        // Robert Jenkins' 32 bit integer hash function.
-                        seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffff_ffff;
-                        seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffff_ffff;
-                        seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffff_ffff;
-                        seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffff_ffff;
-                        seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffff_ffff;
-                        seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffff_ffff;
-                        // Note that Math.random should return a value that is
-                        // greater than or equal to 0 and less than 1. Here, we
-                        // cast to uint32 first then divided by 2^32 for double.
-                        return (seed >>> 0) / 0x1_0000_0000;
-                    };
-
-                    Math.random.__resetSeed = () => {
-                        seed = initialSeed;
-                    };
-                })();
-            `);
-        }
-
-        if (this.plan.preload) {
-            let str = "";
-            for (let [variableName, blobUrl] of this.preloads)
-                str += `const ${variableName} = "${blobUrl}";\n`;
-            addScript(str);
-        }
-
-        let prerunCode = this.prerunCode;
-        if (prerunCode)
-            addScript(prerunCode);
-
-        if (!isInBrowser) {
-            assert(this.scripts && this.scripts.length === this.plan.files.length);
-
-            for (let text of this.scripts)
-                addScript(text);
-        } else {
-            let cache = JetStream.blobDataCache;
-            for (let file of this.plan.files)
-                addScriptWithURL(cache[file].blobURL);
-        }
-
-        let promise = new Promise((resolve, reject) => {
-            currentResolve = resolve;
-            currentReject = reject;
-        });
-
-        if (isInBrowser) {
-            code = `
-                <script> window.onerror = top.currentReject; </script>
-                ${code}
-            `;
-        }
-        addScript(this.runnerCode);
-
-        this.startTime = new Date();
-
-        if (RAMification)
-            resetMemoryPeak();
-
-        let magicFrame;
-        try {
-            magicFrame = JetStream.runCode(code);
-        } catch(e) {
-            console.log("Error in runCode: ", e);
-            console.log(e.stack)
-            throw e;
-        }
-        let results = await promise;
-
-        this.endTime = new Date();
-
-        if (RAMification) {
-            let memoryFootprint = MemoryFootprint();
-            this.currentFootprint = memoryFootprint.current;
-            this.peakFootprint = memoryFootprint.peak;
-        }
-
-        this.processResults(results);
-        if (isInBrowser)
-            magicFrame.contentDocument.close();
-        else if (isD8)
-            Realm.dispose(magicFrame);
-    }
-
-    async doLoadBlob(resource) {
-        let response;
-        let tries = 3;
-        while (tries--) {
-            let hasError = false;
-            try {
-                response = await fetch(resource, { cache: "no-store" });
-            } catch (e) {
-                hasError = true;
-            }
-            if (!hasError && response.ok)
-                break;
-            if (tries)
+            if (/benchmark=/.test(mode)) {
+                selectBenchmark = RegExp.rightContext;
                 continue;
-            throw new Error("Fetch failed");
-        }
-        let blob = await response.blob();
-        var blobData = JetStream.blobDataCache[resource];
-        blobData.blob = blob;
-        blobData.blobURL = URL.createObjectURL(blob);
-        return blobData;
-    }
+            }
 
-    async loadBlob(type, prop, resource, incrementRefCount = true) {
-        var blobData = JetStream.blobDataCache[resource];
-        if (!blobData) {
-            blobData = {
-                type: type,
-                prop: prop,
-                resource: resource,
-                blob: null,
-                blobURL: null,
-                refCount: 0
-            };
-            JetStream.blobDataCache[resource] = blobData;
-        }
+            var confidenceIntervals = "<a href=\"http://en.wikipedia.org/wiki/Confidence_interval\">confidence intervals</a>";
 
-        if (incrementRefCount)
-            blobData.refCount++;
+            switch (mode) {
+            case "quick":
+                numberOfIterations = 1;
+                experimentalMethod.innerHTML =
+                    "<strong>Note:</strong> Only one iteration will run per benchmark and no statistics can be calulated.<br><em>This mode is " +
+                    "not statistically valid &mdash; please don't report these results.</em> <a " +
+                    "href=\"javascript:JetStream.switchToNormal()\">Switch to three iterations.</a>";
+                break;
 
-        let promise = JetStream.loadCache[resource];
-        if (promise)
-            return promise;
+            case "long":
+                numberOfIterations = 7;
+                experimentalMethod.innerHTML =
+                    "<strong>Note:</strong> Seven iterations will run per benchmark and report scores with 95% " +
+                    confidenceIntervals + ".";
+                break;
 
-        promise = this.doLoadBlob(resource);
-        JetStream.loadCache[resource] = promise;
-        return promise;
-    }
-
-    updateCounter() {
-        let counter = JetStream.counter;
-        ++counter.loadedResources;
-        var statusElement = document.getElementById("status");
-        statusElement.innerHTML = `Loading ${counter.loadedResources} of ${counter.totalResources} ...`;
-    }
-
-    prefetchResourcesForBrowser() {
-        if (!isInBrowser)
-            return;
-        let promises = this.plan.files.map((file) => this.loadBlob("file", null, file).then((blobData) => {
-                if (!window.allIsGood)
-                    return;
-                this.updateCounter();
-            }).catch((error) => {
-                // We'll try again later in retryPrefetchResourceForBrowser(). Don't throw an error.
-            }));
-
-        if (this.plan.preload) {
-            this.preloads = [];
-            for (let prop of Object.getOwnPropertyNames(this.plan.preload)) {
-                promises.push(this.loadBlob("preload", prop, this.plan.preload[prop]).then((blobData) => {
-                    if (!window.allIsGood)
-                        return;
-                    this.preloads.push([ blobData.prop, blobData.blobURL ]);
-                    this.updateCounter();
-                }).catch((error) => {
-                    // We'll try again later in retryPrefetchResourceForBrowser(). Don't throw an error.
-                    if (!this.failedPreloads)
-                        this.failedPreloads = { };
-                    this.failedPreloads[prop] = true;
-                    JetStream.counter.failedPreloadResources++;
-                }));
+            default:
+                numberOfIterations = 3;
+                experimentalMethod.textContent = "";
+                break;
             }
         }
-
-        JetStream.counter.totalResources += promises.length;
-        return Promise.all(promises);
     }
 
-    async retryPrefetchResource(type, prop, file) {
-        let counter = JetStream.counter;
-        var blobData = JetStream.blobDataCache[file];
-        if (blobData.blob) {
-            // The same preload blob may be used by multiple subtests. Though the blob is already loaded,
-            // we still need to check if this subtest failed to load it before. If so, handle accordingly.
-            if (type == "preload") {
-                if (this.failedPreloads && this.failedPreloads[blobData.prop]) {
-                    this.failedPreloads[blobData.prop] = false;
-                    this.preloads.push([ blobData.prop, blobData.blobURL ]);
-                    counter.failedPreloadResources--;
+    function initialize()
+    {
+        function initializeWithModeBasedOnHash()
+        {
+            initializeWithMode(window.location.hash.substr(1));
+        }
+
+        initializeWithModeBasedOnHash();
+        window.onpopstate = initializeWithModeBasedOnHash;
+    }
+
+    function switchMode(mode)
+    {
+        window.location.hash = "#" + mode;
+        initializeWithMode(mode);
+    }
+
+    function start()
+    {
+        document.getElementById("status").textContent = "";
+        document.getElementById("result-summary").textContent = "";
+        reset();
+        isRunning = true;
+        iterate();
+    }
+
+    function allSelector(benchmark) { return true; }
+    function createCategorySelector(category) {
+        return function(benchmark) {
+            return benchmark.category == category;
+        };
+    }
+
+    function computeGeomeans(selector)
+    {
+        var geomeans = [];
+
+        for (var iterationIndex = 0; ; ++iterationIndex) {
+            var sum = 0;
+            var numDone = 0;
+            var numSelected = 0;
+            var allFinished = true;
+            for (var i = 0; i < benchmarks.length; ++i) {
+                if (!selector(benchmarks[i]))
+                    continue;
+                numSelected++;
+                if (iterationIndex >= benchmarks[i].results.length) {
+                    allFinished = false;
+                    break;
                 }
+                if (!(iterationIndex in benchmarks[i].results))
+                    continue;
+                sum += Math.log(benchmarks[i].results[iterationIndex]);
+                numDone++;
             }
-            return !counter.failedPreloadResources && counter.loadedResources == counter.totalResources;
+            if (!allFinished)
+                break;
+            if (numDone != numSelected)
+                geomeans.length++;
+            else
+                geomeans.push(Math.exp(sum * (1 / numDone)));
         }
 
-        // Retry fetching the resource.
-        JetStream.loadCache[file] = null;
-        await this.loadBlob(type, prop, file, false).then((blobData) => {
-            if (!window.allIsGood)
+        return geomeans;
+    }
+
+    function formatGeomean(selector)
+    {
+        return formatResult(computeGeomeans(selector), {extraPrecision: 1});
+    }
+
+    function updateGeomeans()
+    {
+        for (var i = 0; i < categoryNames.length; ++i) {
+            var categoryName = categoryNames[i];
+            displayResultMessage(
+                "geomean-" + categoryName,
+                formatGeomean(createCategorySelector(categoryName)),
+                "result");
+        }
+        displayResultMessage(
+            "geomean", formatGeomean(allSelector),
+            computeGeomeans(allSelector).length == numberOfIterations ? "highlighted-result" : "result");
+    }
+
+    function computeRawResults()
+    {
+        function rawResultsLine(values) {
+            return {
+                result: values,
+                statistics: computeStatistics(values)
+            };
+        }
+
+        var rawResults = {};
+        for (var i = 0; i < benchmarks.length; ++i) {
+            var line = rawResultsLine(benchmarks[i].results);
+            line.times = benchmarks[i].times;
+            line.category = benchmarks[i].category;
+            line.reference = benchmarks[i].reference;
+            rawResults[benchmarks[i].name] = line;
+        }
+        rawResults.geomean = rawResultsLine(computeGeomeans(allSelector));
+
+        return rawResults;
+    }
+
+    function end()
+    {
+        console.log("Raw results:", JSON.stringify(computeRawResults()));
+
+        document.getElementById("result-summary").innerHTML = "<label>Score</label><br><span class=\"score\">" + formatGeomean(allSelector) + "</span>";
+
+        isRunning = false;
+        hasAlreadyRun = true;
+        prepareToStart();
+    }
+
+    function iterate()
+    {
+        ++currentPlan;
+
+        updateGeomeans();
+
+        if (currentPlan >= plans.length) {
+            if (++currentIteration >= numberOfIterations) {
+                end();
                 return;
-            if (blobData.type == "preload")
-                this.preloads.push([ blobData.prop, blobData.blobURL ]);
-            this.updateCounter();
-        });
-
-        if (!blobData.blob) {
-            window.allIsGood = false;
-            throw new Error("Fetch failed"); 
+            } else
+                currentPlan = 0;
         }
 
-        return !counter.failedPreloadResources && counter.loadedResources == counter.totalResources;
-    }
+        document.getElementById("status").innerHTML = "<em>Running iteration " + (currentIteration + 1) + " of " + numberOfIterations + "\u2026</em>";
+        displayResultMessageForPlan(
+            plans[currentPlan], "<em>Running\u2026</em>", "highlighted-result");
 
-    async retryPrefetchResourcesForBrowser() {
-        if (!isInBrowser)
-            return;
+        accumulator = void 0;
 
-        let counter = JetStream.counter;
-        for (let resource of this.plan.files) {
-            let allDone = await this.retryPrefetchResource("file", null, resource);
-            if (allDone)
-                return true; // All resources loaded, nothing more to do.
-        }
-
-        if (this.plan.preload) {
-            for (let prop of Object.getOwnPropertyNames(this.plan.preload)) {
-                let resource = this.plan.preload[prop];
-                let allDone = await this.retryPrefetchResource("preload", prop, resource);
-                if (allDone)
-                    return true; // All resources loaded, nothing more to do.
-            }
-        }
-        return !counter.failedPreloadResources && counter.loadedResources == counter.totalResources;
-    }
-
-    fetchResources() {
-        if (this._resourcesPromise)
-            return this._resourcesPromise;
-
-        let filePromises = !isInBrowser ? this.plan.files.map((file) => fileLoader.load(file)) : [];
-
-        let promise = Promise.all(filePromises).then((texts) => {
-            if (isInBrowser)
+        window.setTimeout(function() {
+            if (!isRunning)
                 return;
-            this.scripts = [];
-            assert(texts.length === this.plan.files.length);
-            for (let text of texts)
-                this.scripts.push(text);
-        });
-
-        this.preloads = [];
-        this.blobs = [];
-
-        this._resourcesPromise = promise;
-        return this._resourcesPromise;
+            runCode(plans[currentPlan].code);
+        }, 100);
     }
 
-    static scoreDescription() { throw new Error("Must be implemented by subclasses."); }
-    scoreIdentifiers() { throw new Error("Must be implemented by subclasses"); }
-
-    updateUIBeforeRun() {
-        if (!isInBrowser) {
-            if (!dumpJSONResults)
-                console.log(`Running ${this.name}:`);
+    function reportError(message, url, lineNumber)
+    {
+        var plan = plans[currentPlan];
+        if (!plan)
             return;
+        console.error(plan.name + ": ERROR: " + url + ":" + lineNumber + ": " + message);
+
+        for (var i = plan.benchmarks.length; i--;) {
+            plan.benchmarks[i].times.length++;
+            plan.benchmarks[i].results.length++;
+            displayResultMessage(
+                plan.benchmarks[i].name,
+                formatResult(plan.benchmarks[i].results, plan.benchmarks[i]),
+                "result");
         }
-
-        let containerUI = document.getElementById("results");
-        let resultsBenchmarkUI = document.getElementById(`benchmark-${this.name}`);
-        containerUI.insertBefore(resultsBenchmarkUI, containerUI.firstChild);
-        resultsBenchmarkUI.classList.add("benchmark-running");
-
-        for (let id of this.scoreIdentifiers())
-            document.getElementById(id).innerHTML = "...";
+        iterate();
     }
 
-    updateUIAfterRun() {
-        if (!isInBrowser)
-            return;
-
-        let benchmarkResultsUI = document.getElementById(`benchmark-${this.name}`);
-        benchmarkResultsUI.classList.remove("benchmark-running");
-        benchmarkResultsUI.classList.add("benchmark-done");
-
-    }
-};
-
-class DefaultBenchmark extends Benchmark {
-    constructor(...args) {
-        super(...args);
-
-        this.worstCaseCount = getWorstCaseCount(this.plan);
-        this.firstIteration = null;
-        this.worst4 = null;
-        this.average = null;
-
-        assert(this.iterations > this.worstCaseCount);
-    }
-
-    processResults(results) {
-        function copyArray(a) {
-            let result = [];
-            for (let x of a)
-                result.push(x);
-            return result;
+    function reportResult()
+    {
+        var plan = plans[currentPlan];
+        for (var i = plan.benchmarks.length; i--;) {
+            var benchmark = plan.benchmarks[i];
+            benchmark.times.push(arguments[i]);
+            benchmark.results.push(100 * benchmark.reference / arguments[i]);
+            displayResultMessage(
+                benchmark.name,
+                formatResult(benchmark.results, plan.benchmarks[i]),
+                "result");
         }
-        results = copyArray(results);
-
-        this.firstIteration = toScore(results[0]);
-
-        results = results.slice(1);
-        results.sort((a, b) => a < b ? 1 : -1);
-        for (let i = 0; i + 1 < results.length; ++i)
-            assert(results[i] >= results[i + 1]);
-
-        let worstCase = [];
-        for (let i = 0; i < this.worstCaseCount; ++i)
-            worstCase.push(results[i]);
-        this.worst4 = toScore(mean(worstCase));
-        this.average = toScore(mean(results));
+        iterate();
     }
 
-    get score() {
-        return geomean([this.firstIteration, this.worst4, this.average]);
+    function accumulate(data)
+    {
+        accumulator = data;
+        window.setTimeout(function() {
+            if (!isRunning)
+                return;
+            runCode(plans[currentPlan].code);
+        }, 0);
     }
 
-    subTimes() {
-        return {
-            "First": this.firstIteration,
-            "Worst": this.worst4,
-            "Average": this.average,
-        };
+    function getAccumulator()
+    {
+        return accumulator;
     }
 
-    static scoreDescription() {
-        return ["First", "Worst", "Average", "Score"];
-    }
-
-    scoreIdentifiers() {
-        return [firstID(this), worst4ID(this), avgID(this), scoreID(this)];
-    }
-
-    updateUIAfterRun() {
-        super.updateUIAfterRun();
-
-        if (isInBrowser) {
-            document.getElementById(firstID(this)).innerHTML = uiFriendlyNumber(this.firstIteration);
-            document.getElementById(worst4ID(this)).innerHTML = uiFriendlyNumber(this.worst4);
-            document.getElementById(avgID(this)).innerHTML = uiFriendlyNumber(this.average);
-            document.getElementById(scoreID(this)).innerHTML = uiFriendlyNumber(this.score);
-            return;
-        }
-
-        if (dumpJSONResults)
-            return;
-
-        console.log("    Startup:", uiFriendlyNumber(this.firstIteration));
-        console.log("    Worst Case:", uiFriendlyNumber(this.worst4));
-        console.log("    Average:", uiFriendlyNumber(this.average));
-        console.log("    Score:", uiFriendlyNumber(this.score));
-        if (RAMification) {
-            console.log("    Current Footprint:", uiFriendlyNumber(this.currentFootprint));
-            console.log("    Peak Footprint:", uiFriendlyNumber(this.peakFootprint));
-        }
-        console.log("    Wall time:", uiFriendlyDuration(new Date(this.endTime - this.startTime)));
-    }
-}
-
-class AsyncBenchmark extends DefaultBenchmark {
-    get runnerCode() {
-        return `
-        async function doRun() {
-            let __benchmark = new Benchmark();
-            let results = [];
-            for (let i = 0; i < ${this.iterations}; i++) {
-                ${this.preiterationCode}
-                let start = performance.now();
-                await __benchmark.runIteration();
-                let end = performance.now();
-                results.push(Math.max(1, end - start));
-            }
-            if (__benchmark.validate)
-                __benchmark.validate();
-            top.currentResolve(results);
-        }
-        doRun().catch((error) => { top.currentReject(error); });`
-    }
-};
-
-class WSLBenchmark extends Benchmark {
-    constructor(...args) {
-        super(...args);
-
-        this.stdlib = null;
-        this.mainRun = null;
-    }
-
-    processResults(results) {
-        this.stdlib = toScore(results[0]);
-        this.mainRun = toScore(results[1]);
-    }
-
-    get score() {
-        return geomean([this.stdlib, this.mainRun]);
-    }
-
-    get runnerCode() {
-        return `
-            let benchmark = new Benchmark();
-            let results = [];
-            {
-                let start = performance.now();
-                benchmark.buildStdlib();
-                results.push(performance.now() - start);
-            }
-
-            {
-                let start = performance.now();
-                benchmark.run();
-                results.push(performance.now() - start);
-            }
-
-            top.currentResolve(results);
-            `;
-    }
-
-    subTimes() {
-        return {
-            "Stdlib": this.stdlib,
-            "MainRun": this.mainRun,
-        };
-    }
-
-    static scoreDescription() {
-        return ["Stdlib", "MainRun", "Score"];
-    }
-
-    scoreIdentifiers() {
-        return ["wsl-stdlib-score", "wsl-tests-score", "wsl-score-score"];
-    }
-
-    updateUIAfterRun() {
-        super.updateUIAfterRun();
-
-        if (isInBrowser) {
-            document.getElementById("wsl-stdlib-score").innerHTML = uiFriendlyNumber(this.stdlib);
-            document.getElementById("wsl-tests-score").innerHTML = uiFriendlyNumber(this.mainRun);
-            document.getElementById("wsl-score-score").innerHTML = uiFriendlyNumber(this.score);
-            return;
-        }
-
-        if (dumpJSONResults)
-            return;
-
-        console.log("    Stdlib:", uiFriendlyNumber(this.stdlib));
-        console.log("    Tests:", uiFriendlyNumber(this.mainRun));
-        console.log("    Score:", uiFriendlyNumber(this.score));
-        if (RAMification) {
-            console.log("    Current Footprint:", uiFriendlyNumber(this.currentFootprint));
-            console.log("    Peak Footprint:", uiFriendlyNumber(this.peakFootprint));
-        }
-        console.log("    Wall time:", uiFriendlyDuration(new Date(this.endTime - this.startTime)));
-    }
-};
-
-class WasmBenchmark extends Benchmark {
-    constructor(...args) {
-        super(...args);
-
-        this.startupTime = null;
-        this.runTime = null;
-    }
-
-    processResults(results) {
-        this.startupTime = toScore(results[0]);
-        this.runTime = toScore(results[1]);
-    }
-
-    get score() {
-        return geomean([this.startupTime, this.runTime]);
-    }
-
-    get prerunCode() {
-        let str = `
-            let verbose = false;
-
-            let compileTime = null;
-            let runTime = null;
-
-            let globalObject = this;
-
-            globalObject.benchmarkTime = performance.now.bind(performance);
-
-            globalObject.reportCompileTime = (t) => {
-                if (compileTime !== null)
-                    throw new Error("called report compile time twice");
-                compileTime = t;
-            };
-
-            globalObject.reportRunTime = (t) => {
-                if (runTime !== null)
-                    throw new Error("called report run time twice")
-                runTime = t;
-                top.currentResolve([compileTime, runTime]);
-            };
-
-            abort = quit = function() {
-                if (verbose)
-                    console.log('Intercepted quit/abort');
-            };
-
-            oldPrint = globalObject.print;
-            globalObject.print = globalObject.printErr = (...args) => {
-                if (verbose)
-                    console.log('Intercepted print: ', ...args);
-            };
-
-            let Module = {
-                preRun: [],
-                postRun: [],
-                print: function() { },
-                printErr: function() { },
-                setStatus: function(text) {
-                },
-                totalDependencies: 0,
-                monitorRunDependencies: function(left) {
-                    this.totalDependencies = Math.max(this.totalDependencies, left);
-                    Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
-                }
-            };
-            globalObject.Module = Module;
-            `;
-        return str;
-    }
-
-    get runnerCode() {
-        let str = `function loadBlob(key, path, andThen) {`;
-
-        if (isInBrowser) {
-            str += `
-                var xhr = new XMLHttpRequest();
-                xhr.open('GET', path, true);
-                xhr.responseType = 'arraybuffer';
-                xhr.onload = function() {
-                    Module[key] = new Int8Array(xhr.response);
-                    andThen();
-                };
-                xhr.send(null);
-            `;
-        } else {
-            str += `
-            Module[key] = new Int8Array(read(path, "binary"));
-            if (andThen == doRun) {
-                globalObject.read = (...args) => {
-                    console.log("should not be inside read: ", ...args);
-                    throw new Error;
-                };
-            };
-
-            Module.setStatus = null;
-            Module.monitorRunDependencies = null;
-
-            Promise.resolve(42).then(() => {
-                try {
-                    andThen();
-                } catch(e) {
-                    console.log("error running wasm:", e);
-                    console.log(e.stack);
-                    throw e;
-                }
-            })
-            `;
-        }
-
-        str += "}";
-
-        let keys = Object.keys(this.plan.preload);
-        for (let i = 0; i < keys.length; ++i) {
-            str += `loadBlob("${keys[i]}", "${this.plan.preload[keys[i]]}", () => {\n`;
-        }
-        if (this.plan.async) {
-            str += `doRun().catch((e) => {
-                console.log("error running wasm:", e);
-                console.log(e.stack)
-                throw e;
-            });`;
-        } else {
-            str += `doRun();`
-        }
-        for (let i = 0; i < keys.length; ++i) {
-            str += `})`;
-        }
-        str += `;`;
-
-        return str;
-    }
-
-    subTimes() {
-        return {
-            "Startup": this.startupTime,
-            "Runtime": this.runTime,
-        };
-    }
-
-    static scoreDescription() {
-        return ["Startup", "Runtime", "Score"];
-    }
-
-    get startupID() {
-        return `wasm-startup-id${this.name}`;
-    }
-    get runID() {
-        return `wasm-run-id${this.name}`;
-    }
-    get scoreID() {
-        return `wasm-score-id${this.name}`;
-    }
-
-    scoreIdentifiers() {
-        return [this.startupID, this.runID, this.scoreID];
-    }
-
-    updateUIAfterRun() {
-        super.updateUIAfterRun();
-
-        if (isInBrowser) {
-            document.getElementById(this.startupID).innerHTML = uiFriendlyNumber(this.startupTime);
-            document.getElementById(this.runID).innerHTML = uiFriendlyNumber(this.runTime);
-            document.getElementById(this.scoreID).innerHTML = uiFriendlyNumber(this.score);
-            return;
-        }
-
-        if (dumpJSONResults)
-            return;
-
-        console.log("    Startup:", uiFriendlyNumber(this.startupTime));
-        console.log("    Run time:", uiFriendlyNumber(this.runTime));
-        if (RAMification) {
-            console.log("    Current Footprint:", uiFriendlyNumber(this.currentFootprint));
-            console.log("    Peak Footprint:", uiFriendlyNumber(this.peakFootprint));
-        }
-        console.log("    Score:", uiFriendlyNumber(this.score));
-    }
-};
-
-const ARESGroup = Symbol.for("ARES");
-const CDJSGroup = Symbol.for("CDJS");
-const CodeLoadGroup = Symbol.for("CodeLoad");
-const LuaJSFightGroup = Symbol.for("LuaJSFight");
-const OctaneGroup = Symbol.for("Octane");
-const RexBenchGroup = Symbol.for("RexBench");
-const SeaMonsterGroup = Symbol.for("SeaMonster");
-const SimpleGroup = Symbol.for("Simple");
-const SunSpiderGroup = Symbol.for("SunSpider");
-const BigIntNobleGroup = Symbol.for("BigIntNoble");
-const BigIntMiscGroup = Symbol.for("BigIntMisc");
-const ProxyGroup = Symbol.for("ProxyGroup");
-const ClassFieldsGroup = Symbol.for("ClassFieldsGroup");
-const GeneratorsGroup = Symbol.for("GeneratorsGroup");
-const WasmGroup = Symbol.for("Wasm");
-const WorkerTestsGroup = Symbol.for("WorkerTests");
-const WSLGroup = Symbol.for("WSL");
-const WTBGroup = Symbol.for("WTB");
-
-
-let testPlans = [
-    // ARES
-    {
-        name: "Air",
-        files: [
-            "./ARES-6/Air/symbols.js"
-            , "./ARES-6/Air/tmp_base.js"
-            , "./ARES-6/Air/arg.js"
-            , "./ARES-6/Air/basic_block.js"
-            , "./ARES-6/Air/code.js"
-            , "./ARES-6/Air/frequented_block.js"
-            , "./ARES-6/Air/inst.js"
-            , "./ARES-6/Air/opcode.js"
-            , "./ARES-6/Air/reg.js"
-            , "./ARES-6/Air/stack_slot.js"
-            , "./ARES-6/Air/tmp.js"
-            , "./ARES-6/Air/util.js"
-            , "./ARES-6/Air/custom.js"
-            , "./ARES-6/Air/liveness.js"
-            , "./ARES-6/Air/insertion_set.js"
-            , "./ARES-6/Air/allocate_stack.js"
-            , "./ARES-6/Air/payload-gbemu-executeIteration.js"
-            , "./ARES-6/Air/payload-imaging-gaussian-blur-gaussianBlur.js"
-            , "./ARES-6/Air/payload-airjs-ACLj8C.js"
-            , "./ARES-6/Air/payload-typescript-scanIdentifier.js"
-            , "./ARES-6/Air/benchmark.js"
-        ],
-        testGroup: ARESGroup
-    },
-    {
-        name: "Basic",
-        files: [
-            "./ARES-6/Basic/ast.js"
-            , "./ARES-6/Basic/basic.js"
-            , "./ARES-6/Basic/caseless_map.js"
-            , "./ARES-6/Basic/lexer.js"
-            , "./ARES-6/Basic/number.js"
-            , "./ARES-6/Basic/parser.js"
-            , "./ARES-6/Basic/random.js"
-            , "./ARES-6/Basic/state.js"
-            , "./ARES-6/Basic/util.js"
-            , "./ARES-6/Basic/benchmark.js"
-        ],
-        testGroup: ARESGroup
-    },
-    {
-        name: "ML",
-        files: [
-            "./ARES-6/ml/index.js"
-            , "./ARES-6/ml/benchmark.js"
-        ],
-        iterations: 60,
-        testGroup: ARESGroup
-    },
-    {
-        name: "Babylon",
-        files: [
-            "./ARES-6/Babylon/index.js"
-            , "./ARES-6/Babylon/benchmark.js"
-        ],
-        preload: {
-            airBlob: "./ARES-6/Babylon/air-blob.js",
-            basicBlob: "./ARES-6/Babylon/basic-blob.js",
-            inspectorBlob: "./ARES-6/Babylon/inspector-blob.js",
-            babylonBlob: "./ARES-6/Babylon/babylon-blob.js"
-        },
-        testGroup: ARESGroup
-    },
-    // CDJS
-    {
-        name: "cdjs",
-        files: [
-            "./cdjs/constants.js"
-            , "./cdjs/util.js"
-            , "./cdjs/red_black_tree.js"
-            , "./cdjs/call_sign.js"
-            , "./cdjs/vector_2d.js"
-            , "./cdjs/vector_3d.js"
-            , "./cdjs/motion.js"
-            , "./cdjs/reduce_collision_set.js"
-            , "./cdjs/simulator.js"
-            , "./cdjs/collision.js"
-            , "./cdjs/collision_detector.js"
-            , "./cdjs/benchmark.js"
-        ],
-        iterations: 60,
-        worstCaseCount: 3,
-        testGroup: CDJSGroup
-    },
-    // CodeLoad
-    {
-        name: "first-inspector-code-load",
-        files: [
-            "./code-load/code-first-load.js"
-        ],
-        preload: {
-            inspectorPayloadBlob: "./code-load/inspector-payload-minified.js"
-        },
-        testGroup: CodeLoadGroup
-    },
-    {
-        name: "multi-inspector-code-load",
-        files: [
-            "./code-load/code-multi-load.js"
-        ],
-        preload: {
-            inspectorPayloadBlob: "./code-load/inspector-payload-minified.js"
-        },
-        testGroup: CodeLoadGroup
-    },
-    // Octane
-    {
-        name: "Box2D",
-        files: [
-            "./Octane/box2d.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "octane-code-load",
-        files: [
-            "./Octane/code-first-load.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "crypto",
-        files: [
-            "./Octane/crypto.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "delta-blue",
-        files: [
-            "./Octane/deltablue.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "earley-boyer",
-        files: [
-            "./Octane/earley-boyer.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "gbemu",
-        files: [
-            "./Octane/gbemu-part1.js"
-            , "./Octane/gbemu-part2.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "mandreel",
-        files: [
-            "./Octane/mandreel.js"
-        ],
-        iterations: 80,
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "navier-stokes",
-        files: [
-            "./Octane/navier-stokes.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "pdfjs",
-        files: [
-            "./Octane/pdfjs.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "raytrace",
-        files: [
-            "./Octane/raytrace.js"
-        ],
-        testGroup: OctaneGroup
-    },
-    {
-        name: "regexp",
-        files: [
-            "./Octane/regexp.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "richards",
-        files: [
-            "./Octane/richards.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "splay",
-        files: [
-            "./Octane/splay.js"
-        ],
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "typescript",
-        files: [
-            "./Octane/typescript-compiler.js"
-            , "./Octane/typescript-input.js"
-            , "./Octane/typescript.js"
-        ],
-        iterations: 15,
-        worstCaseCount: 2,
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    {
-        name: "octane-zlib",
-        files: [
-            "./Octane/zlib-data.js"
-            , "./Octane/zlib.js"
-        ],
-        iterations: 15,
-        worstCaseCount: 2,
-        deterministicRandom: true,
-        testGroup: OctaneGroup
-    },
-    // RexBench
-    {
-        name: "FlightPlanner",
-        files: [
-            "./RexBench/FlightPlanner/airways.js"
-            , "./RexBench/FlightPlanner/waypoints.js"
-            , "./RexBench/FlightPlanner/flight_planner.js"
-            , "./RexBench/FlightPlanner/expectations.js"
-            , "./RexBench/FlightPlanner/benchmark.js"
-        ],
-        testGroup: RexBenchGroup
-    },
-    {
-        name: "OfflineAssembler",
-        files: [
-            "./RexBench/OfflineAssembler/registers.js"
-            , "./RexBench/OfflineAssembler/instructions.js"
-            , "./RexBench/OfflineAssembler/ast.js"
-            , "./RexBench/OfflineAssembler/parser.js"
-            , "./RexBench/OfflineAssembler/file.js"
-            , "./RexBench/OfflineAssembler/LowLevelInterpreter.js"
-            , "./RexBench/OfflineAssembler/LowLevelInterpreter32_64.js"
-            , "./RexBench/OfflineAssembler/LowLevelInterpreter64.js"
-            , "./RexBench/OfflineAssembler/InitBytecodes.js"
-            , "./RexBench/OfflineAssembler/expected.js"
-            , "./RexBench/OfflineAssembler/benchmark.js"
-        ],
-        iterations: 80,
-        testGroup: RexBenchGroup
-    },
-    {
-        name: "UniPoker",
-        files: [
-            "./RexBench/UniPoker/poker.js"
-            , "./RexBench/UniPoker/expected.js"
-            , "./RexBench/UniPoker/benchmark.js"
-        ],
-        deterministicRandom: true,
-        testGroup: RexBenchGroup
-    },
-    // Simple
-    {
-        name: "float-mm.c",
-        files: [
-            "./simple/float-mm.c.js"
-        ],
-        iterations: 15,
-        worstCaseCount: 2,
-        testGroup: SimpleGroup
-    },
-    {
-        name: "hash-map",
-        files: [
-            "./simple/hash-map.js"
-        ],
-        testGroup: SimpleGroup
-    },
-    {
-        name: "doxbee-promise",
-        files: [
-            "./simple/doxbee-promise.js",
-        ],
-        benchmarkClass: AsyncBenchmark,
-        testGroup: SimpleGroup,
-    },
-    {
-        name: "doxbee-async",
-        files: [
-            "./simple/doxbee-async.js",
-        ],
-        benchmarkClass: AsyncBenchmark,
-        testGroup: SimpleGroup,
-    },
-    // SeaMonster
-    {
-        name: "ai-astar",
-        files: [
-            "./SeaMonster/ai-astar.js"
-        ],
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "gaussian-blur",
-        files: [
-            "./SeaMonster/gaussian-blur.js"
-        ],
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "stanford-crypto-aes",
-        files: [
-            "./SeaMonster/sjlc.js"
-            , "./SeaMonster/stanford-crypto-aes.js"
-        ],
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "stanford-crypto-pbkdf2",
-        files: [
-            "./SeaMonster/sjlc.js"
-            , "./SeaMonster/stanford-crypto-pbkdf2.js"
-        ],
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "stanford-crypto-sha256",
-        files: [
-            "./SeaMonster/sjlc.js"
-            , "./SeaMonster/stanford-crypto-sha256.js"
-        ],
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "json-stringify-inspector",
-        files: [
-            "./SeaMonster/inspector-json-payload.js"
-            , "./SeaMonster/json-stringify-inspector.js"
-        ],
-        iterations: 20,
-        worstCaseCount: 2,
-        testGroup: SeaMonsterGroup
-    },
-    {
-        name: "json-parse-inspector",
-        files: [
-            "./SeaMonster/inspector-json-payload.js"
-            , "./SeaMonster/json-parse-inspector.js"
-        ],
-        iterations: 20,
-        worstCaseCount: 2,
-        testGroup: SeaMonsterGroup
-    },
-    // BigInt
-    {
-        name: "bigint-noble-bls12-381",
-        files: [
-            "./bigint/web-crypto-sham.js",
-            "./bigint/noble-bls12-381-bundle.js",
-            "./bigint/noble-benchmark.js",
-        ],
-        iterations: 4,
-        worstCaseCount: 1,
-        benchmarkClass: AsyncBenchmark,
-        deterministicRandom: true,
-        testGroup: BigIntNobleGroup,
-    },
-    {
-        name: "bigint-noble-secp256k1",
-        files: [
-            "./bigint/web-crypto-sham.js",
-            "./bigint/noble-secp256k1-bundle.js",
-            "./bigint/noble-benchmark.js",
-        ],
-        benchmarkClass: AsyncBenchmark,
-        deterministicRandom: true,
-        testGroup: BigIntNobleGroup,
-    },
-    {
-        name: "bigint-noble-ed25519",
-        files: [
-            "./bigint/web-crypto-sham.js",
-            "./bigint/noble-ed25519-bundle.js",
-            "./bigint/noble-benchmark.js",
-        ],
-        iterations: 30,
-        benchmarkClass: AsyncBenchmark,
-        deterministicRandom: true,
-        testGroup: BigIntNobleGroup,
-    },
-    {
-        name: "bigint-paillier",
-        files: [
-            "./bigint/web-crypto-sham.js",
-            "./bigint/paillier-bundle.js",
-            "./bigint/paillier-benchmark.js",
-        ],
-        iterations: 10,
-        worstCaseCount: 2,
-        deterministicRandom: true,
-        testGroup: BigIntMiscGroup,
-    },
-    {
-        name: "bigint-bigdenary",
-        files: [
-            "./bigint/bigdenary-bundle.js",
-            "./bigint/bigdenary-benchmark.js",
-        ],
-        iterations: 160,
-        worstCaseCount: 16,
-        testGroup: BigIntMiscGroup,
-    },
-    // Proxy
-    {
-        name: "proxy-mobx",
-        files: [
-            "./proxy/common.js",
-            "./proxy/mobx-bundle.js",
-            "./proxy/mobx-benchmark.js",
-        ],
-        iterations: defaultIterationCount * 3,
-        worstCaseCount: defaultWorstCaseCount * 3,
-        benchmarkClass: AsyncBenchmark,
-        testGroup: ProxyGroup,
-    },
-    {
-        name: "proxy-vue",
-        files: [
-            "./proxy/common.js",
-            "./proxy/vue-bundle.js",
-            "./proxy/vue-benchmark.js",
-        ],
-        benchmarkClass: AsyncBenchmark,
-        testGroup: ProxyGroup,
-    },
-    // Class fields
-    {
-        name: "raytrace-public-class-fields",
-        files: [
-            "./class-fields/raytrace-public-class-fields.js",
-        ],
-        testGroup: ClassFieldsGroup,
-    },
-    {
-        name: "raytrace-private-class-fields",
-        files: [
-            "./class-fields/raytrace-private-class-fields.js",
-        ],
-        testGroup: ClassFieldsGroup,
-    },
-    // Generators
-    {
-        name: "async-fs",
-        files: [
-            "./generators/async-file-system.js",
-        ],
-        iterations: 80,
-        worstCaseCount: 6,
-        deterministicRandom: true,
-        benchmarkClass: AsyncBenchmark,
-        testGroup: GeneratorsGroup,
-    },
-    {
-        name: "sync-fs",
-        files: [
-            "./generators/sync-file-system.js",
-        ],
-        iterations: 80,
-        worstCaseCount: 6,
-        deterministicRandom: true,
-        testGroup: GeneratorsGroup,
-    },
-    {
-        name: "lazy-collections",
-        files: [
-            "./generators/lazy-collections.js",
-        ],
-        testGroup: GeneratorsGroup,
-    },
-    {
-        name: "js-tokens",
-        files: [
-            "./generators/js-tokens.js",
-        ],
-        testGroup: GeneratorsGroup,
-    },
-    // Wasm
-    {
-        name: "HashSet-wasm",
-        files: [
-            "./wasm/HashSet.js"
-        ],
-        preload: {
-            wasmBinary: "./wasm/HashSet.wasm"
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "tsf-wasm",
-        files: [
-            "./wasm/tsf.js"
-        ],
-        preload: {
-            wasmBinary: "./wasm/tsf.wasm"
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "quicksort-wasm",
-        files: [
-            "./wasm/quicksort.js"
-        ],
-        preload: {
-            wasmBinary: "./wasm/quicksort.wasm"
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "gcc-loops-wasm",
-        files: [
-            "./wasm/gcc-loops.js"
-        ],
-        preload: {
-            wasmBinary: "./wasm/gcc-loops.wasm"
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "richards-wasm",
-        files: [
-            "./wasm/richards.js"
-        ],
-        preload: {
-            wasmBinary: "./wasm/richards.wasm"
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "tfjs-wasm",
-        files: [
-            "./wasm/tfjs-model-helpers.js",
-            "./wasm/tfjs-model-mobilenet-v3.js",
-            "./wasm/tfjs-model-mobilenet-v1.js",
-            "./wasm/tfjs-model-coco-ssd.js",
-            "./wasm/tfjs-model-use.js",
-            "./wasm/tfjs-model-use-vocab.js",
-            "./wasm/tfjs-bundle.js",
-            "./wasm/tfjs.js",
-            "./wasm/tfjs-benchmark.js"
-        ],
-        preload: {
-            tfjsBackendWasmBlob: "./wasm/tfjs-backend-wasm.wasm",
-        },
-        benchmarkClass: WasmBenchmark,
-        async: true,
-        deterministicRandom: true,
-        testGroup: WasmGroup
-    },
-    {
-        name: "tfjs-wasm-simd",
-        files: [
-            "./wasm/tfjs-model-helpers.js",
-            "./wasm/tfjs-model-mobilenet-v3.js",
-            "./wasm/tfjs-model-mobilenet-v1.js",
-            "./wasm/tfjs-model-coco-ssd.js",
-            "./wasm/tfjs-model-use.js",
-            "./wasm/tfjs-model-use-vocab.js",
-            "./wasm/tfjs-bundle.js",
-            "./wasm/tfjs.js",
-            "./wasm/tfjs-benchmark.js"
-        ],
-        preload: {
-            tfjsBackendWasmSimdBlob: "./wasm/tfjs-backend-wasm-simd.wasm",
-        },
-        benchmarkClass: WasmBenchmark,
-        async: true,
-        deterministicRandom: true,
-        testGroup: WasmGroup
-    },
-    {
-        name: "argon2-wasm",
-        files: [
-            "./wasm/argon2-bundle.js",
-            "./wasm/argon2.js",
-            "./wasm/argon2-benchmark.js"
-        ],
-        preload: {
-            argon2WasmBlob: "./wasm/argon2.wasm",
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    {
-        name: "argon2-wasm-simd",
-        files: [
-            "./wasm/argon2-bundle.js",
-            "./wasm/argon2.js",
-            "./wasm/argon2-benchmark.js"
-        ],
-        preload: {
-            argon2WasmSimdBlob: "./wasm/argon2-simd.wasm",
-        },
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    },
-    // WorkerTests
-    {
-        name: "bomb-workers",
-        files: [
-            "./worker/bomb.js"
-        ],
-        iterations: 80,
-        preload: {
-            rayTrace3D: "./worker/bomb-subtests/3d-raytrace.js"
-            , accessNbody: "./worker/bomb-subtests/access-nbody.js"
-            , morph3D: "./worker/bomb-subtests/3d-morph.js"
-            , cube3D: "./worker/bomb-subtests/3d-cube.js"
-            , accessFunnkuch: "./worker/bomb-subtests/access-fannkuch.js"
-            , accessBinaryTrees: "./worker/bomb-subtests/access-binary-trees.js"
-            , accessNsieve: "./worker/bomb-subtests/access-nsieve.js"
-            , bitopsBitwiseAnd: "./worker/bomb-subtests/bitops-bitwise-and.js"
-            , bitopsNsieveBits: "./worker/bomb-subtests/bitops-nsieve-bits.js"
-            , controlflowRecursive: "./worker/bomb-subtests/controlflow-recursive.js"
-            , bitops3BitBitsInByte: "./worker/bomb-subtests/bitops-3bit-bits-in-byte.js"
-            , botopsBitsInByte: "./worker/bomb-subtests/bitops-bits-in-byte.js"
-            , cryptoAES: "./worker/bomb-subtests/crypto-aes.js"
-            , cryptoMD5: "./worker/bomb-subtests/crypto-md5.js"
-            , cryptoSHA1: "./worker/bomb-subtests/crypto-sha1.js"
-            , dateFormatTofte: "./worker/bomb-subtests/date-format-tofte.js"
-            , dateFormatXparb: "./worker/bomb-subtests/date-format-xparb.js"
-            , mathCordic: "./worker/bomb-subtests/math-cordic.js"
-            , mathPartialSums: "./worker/bomb-subtests/math-partial-sums.js"
-            , mathSpectralNorm: "./worker/bomb-subtests/math-spectral-norm.js"
-            , stringBase64: "./worker/bomb-subtests/string-base64.js"
-            , stringFasta: "./worker/bomb-subtests/string-fasta.js"
-            , stringValidateInput: "./worker/bomb-subtests/string-validate-input.js"
-            , stringTagcloud: "./worker/bomb-subtests/string-tagcloud.js"
-            , stringUnpackCode: "./worker/bomb-subtests/string-unpack-code.js"
-            , regexpDNA: "./worker/bomb-subtests/regexp-dna.js"
-        },
-        benchmarkClass: AsyncBenchmark,
-        testGroup: WorkerTestsGroup
-    },
-    {
-        name: "segmentation",
-        files: [
-            "./worker/segmentation.js"
-        ],
-        preload: {
-            asyncTaskBlob: "./worker/async-task.js"
-        },
-        iterations: 36,
-        worstCaseCount: 3,
-        benchmarkClass: AsyncBenchmark,
-        testGroup: WorkerTestsGroup
-    },
-    // WSL
-    {
-        name: "WSL",
-        files: ["./WSL/Node.js" ,"./WSL/Type.js" ,"./WSL/ReferenceType.js" ,"./WSL/Value.js" ,"./WSL/Expression.js" ,"./WSL/Rewriter.js" ,"./WSL/Visitor.js" ,"./WSL/CreateLiteral.js" ,"./WSL/CreateLiteralType.js" ,"./WSL/PropertyAccessExpression.js" ,"./WSL/AddressSpace.js" ,"./WSL/AnonymousVariable.js" ,"./WSL/ArrayRefType.js" ,"./WSL/ArrayType.js" ,"./WSL/Assignment.js" ,"./WSL/AutoWrapper.js" ,"./WSL/Block.js" ,"./WSL/BoolLiteral.js" ,"./WSL/Break.js" ,"./WSL/CallExpression.js" ,"./WSL/CallFunction.js" ,"./WSL/Check.js" ,"./WSL/CheckLiteralTypes.js" ,"./WSL/CheckLoops.js" ,"./WSL/CheckRecursiveTypes.js" ,"./WSL/CheckRecursion.js" ,"./WSL/CheckReturns.js" ,"./WSL/CheckUnreachableCode.js" ,"./WSL/CheckWrapped.js" ,"./WSL/Checker.js" ,"./WSL/CloneProgram.js" ,"./WSL/CommaExpression.js" ,"./WSL/ConstexprFolder.js" ,"./WSL/ConstexprTypeParameter.js" ,"./WSL/Continue.js" ,"./WSL/ConvertPtrToArrayRefExpression.js" ,"./WSL/DereferenceExpression.js" ,"./WSL/DoWhileLoop.js" ,"./WSL/DotExpression.js" ,"./WSL/DoubleLiteral.js" ,"./WSL/DoubleLiteralType.js" ,"./WSL/EArrayRef.js" ,"./WSL/EBuffer.js" ,"./WSL/EBufferBuilder.js" ,"./WSL/EPtr.js" ,"./WSL/EnumLiteral.js" ,"./WSL/EnumMember.js" ,"./WSL/EnumType.js" ,"./WSL/EvaluationCommon.js" ,"./WSL/Evaluator.js" ,"./WSL/ExpressionFinder.js" ,"./WSL/ExternalOrigin.js" ,"./WSL/Field.js" ,"./WSL/FindHighZombies.js" ,"./WSL/FlattenProtocolExtends.js" ,"./WSL/FlattenedStructOffsetGatherer.js" ,"./WSL/FloatLiteral.js" ,"./WSL/FloatLiteralType.js" ,"./WSL/FoldConstexprs.js" ,"./WSL/ForLoop.js" ,"./WSL/Func.js" ,"./WSL/FuncDef.js" ,"./WSL/FuncInstantiator.js" ,"./WSL/FuncParameter.js" ,"./WSL/FunctionLikeBlock.js" ,"./WSL/HighZombieFinder.js" ,"./WSL/IdentityExpression.js" ,"./WSL/IfStatement.js" ,"./WSL/IndexExpression.js" ,"./WSL/InferTypesForCall.js" ,"./WSL/Inline.js" ,"./WSL/Inliner.js" ,"./WSL/InstantiateImmediates.js" ,"./WSL/IntLiteral.js" ,"./WSL/IntLiteralType.js" ,"./WSL/Intrinsics.js" ,"./WSL/LateChecker.js" ,"./WSL/Lexer.js" ,"./WSL/LexerToken.js" ,"./WSL/LiteralTypeChecker.js" ,"./WSL/LogicalExpression.js" ,"./WSL/LogicalNot.js" ,"./WSL/LoopChecker.js" ,"./WSL/MakeArrayRefExpression.js" ,"./WSL/MakePtrExpression.js" ,"./WSL/NameContext.js" ,"./WSL/NameFinder.js" ,"./WSL/NameResolver.js" ,"./WSL/NativeFunc.js" ,"./WSL/NativeFuncInstance.js" ,"./WSL/NativeType.js" ,"./WSL/NativeTypeInstance.js" ,"./WSL/NormalUsePropertyResolver.js" ,"./WSL/NullLiteral.js" ,"./WSL/NullType.js" ,"./WSL/OriginKind.js" ,"./WSL/OverloadResolutionFailure.js" ,"./WSL/Parse.js" ,"./WSL/Prepare.js" ,"./WSL/Program.js" ,"./WSL/ProgramWithUnnecessaryThingsRemoved.js" ,"./WSL/PropertyResolver.js" ,"./WSL/Protocol.js" ,"./WSL/ProtocolDecl.js" ,"./WSL/ProtocolFuncDecl.js" ,"./WSL/ProtocolRef.js" ,"./WSL/PtrType.js" ,"./WSL/ReadModifyWriteExpression.js" ,"./WSL/RecursionChecker.js" ,"./WSL/RecursiveTypeChecker.js" ,"./WSL/ResolveNames.js" ,"./WSL/ResolveOverloadImpl.js" ,"./WSL/ResolveProperties.js" ,"./WSL/ResolveTypeDefs.js" ,"./WSL/Return.js" ,"./WSL/ReturnChecker.js" ,"./WSL/ReturnException.js" ,"./WSL/StandardLibrary.js" ,"./WSL/StatementCloner.js" ,"./WSL/StructLayoutBuilder.js" ,"./WSL/StructType.js" ,"./WSL/Substitution.js" ,"./WSL/SwitchCase.js" ,"./WSL/SwitchStatement.js" ,"./WSL/SynthesizeEnumFunctions.js" ,"./WSL/SynthesizeStructAccessors.js" ,"./WSL/TrapStatement.js" ,"./WSL/TypeDef.js" ,"./WSL/TypeDefResolver.js" ,"./WSL/TypeOrVariableRef.js" ,"./WSL/TypeParameterRewriter.js" ,"./WSL/TypeRef.js" ,"./WSL/TypeVariable.js" ,"./WSL/TypeVariableTracker.js" ,"./WSL/TypedValue.js" ,"./WSL/UintLiteral.js" ,"./WSL/UintLiteralType.js" ,"./WSL/UnificationContext.js" ,"./WSL/UnreachableCodeChecker.js" ,"./WSL/VariableDecl.js" ,"./WSL/VariableRef.js" ,"./WSL/VisitingSet.js" ,"./WSL/WSyntaxError.js" ,"./WSL/WTrapError.js" ,"./WSL/WTypeError.js" ,"./WSL/WhileLoop.js" ,"./WSL/WrapChecker.js", "./WSL/Test.js"],
-        benchmarkClass: WSLBenchmark,
-        testGroup: WSLGroup
-    },
-    // 8bitbench
-    {
-        name: "8bitbench-wasm",
-        files: [
-            "./8bitbench/lib/fast-text-encoding-1.0.3/text.js",
-            "./8bitbench/rust/pkg/emu_bench.js",
-            "./8bitbench/js3harness.js"
-        ],
-        preload: {
-            wasmBinary: "./8bitbench/rust/pkg/emu_bench_bg.wasm.release",
-            romBinary: "./8bitbench/assets/program.bin"
-        },
-        async: true,
-        benchmarkClass: WasmBenchmark,
-        testGroup: WasmGroup
-    }
-];
-
-// LuaJSFight tests
-let luaJSFightTests = [
-    "hello_world"
-    , "list_search"
-    , "lists"
-    , "string_lists"
-];
-for (let test of luaJSFightTests) {
-    testPlans.push({
-        name: `${test}-LJF`,
-        files: [
-            `./LuaJSFight/${test}.js`
-        ],
-        testGroup: LuaJSFightGroup
-    });
-}
-
-// SunSpider tests
-let sunSpiderTests = [
-    "3d-cube"
-    , "3d-raytrace"
-    , "base64"
-    , "crypto-aes"
-    , "crypto-md5"
-    , "crypto-sha1"
-    , "date-format-tofte"
-    , "date-format-xparb"
-    , "n-body"
-    , "regex-dna"
-    , "string-unpack-code"
-    , "tagcloud"
-];
-for (let test of sunSpiderTests) {
-    testPlans.push({
-        name: `${test}-SP`,
-        files: [
-            `./SunSpider/${test}.js`
-        ],
-        testGroup: SunSpiderGroup
-    });
-}
-
-// WTB (Web Tooling Benchmark) tests
-let WTBTests = [
-    "acorn"
-    , "babylon"
-    , "chai"
-    , "coffeescript"
-    , "espree"
-    , "jshint"
-    , "lebab"
-    , "prepack"
-    , "uglify-js"
-];
-for (let name of WTBTests) {
-    testPlans.push({
-        name: `${name}-wtb`,
-        files: [
-            isInBrowser ? "./web-tooling-benchmark/browser.js" : "./web-tooling-benchmark/cli.js"
-            , `./web-tooling-benchmark/${name}.js`
-        ],
-        iterations: 5,
-        worstCaseCount: 1,
-        testGroup: WTBGroup
-    });
-}
-
-
-let testsByName = new Map();
-let testsByGroup = new Map();
-
-for (let plan of testPlans) {
-    let testName = plan.name;
-
-    if (testsByName.has(plan.name))
-        throw "Duplicate test plan with name \"" + testName + "\"";
-    else
-        testsByName.set(testName, plan);
-
-    let group = plan.testGroup;
-
-    if (testsByGroup.has(group))
-        testsByGroup.get(group).push(testName);
-    else
-        testsByGroup.set(group, [testName]);
-}
-
-this.JetStream = new Driver();
-
-function addTestByName(testName)
-{
-    let plan = testsByName.get(testName);
-
-    if (plan)
-        JetStream.addPlan(plan, plan.benchmarkClass);
-    else
-        throw "Couldn't find test named \"" +  testName + "\"";
-}
-
-function addTestsByGroup(group)
-{
-    let testList = testsByGroup.get(group);
-
-    if (!testList)
-        throw "Couldn't find test group named: \"" + Symbol.keyFor(group) + "\"";
-
-    for (let testName of testList)
-        addTestByName(testName);
-}
-
-function processTestList(testList)
-{
-    let tests = [];
-
-    if (testList instanceof Array)
-        tests = testList;
-    else
-        tests = testList.split(/[\s,]/);
-
-    for (let testName of tests) {
-        let groupTest = testsByGroup.get(Symbol.for(testName));
-
-        if (groupTest) {
-            for (let testName of groupTest)
-                addTestByName(testName);
-        } else
-            addTestByName(testName);
-    }
-}
-
-let runOctane = true;
-let runARES = true;
-let runWSL = true;
-let runRexBench = true;
-let runWTB = true;
-let runSunSpider = true;
-let runBigIntNoble = true;
-let runBigIntMisc = true;
-let runProxy = true;
-let runClassFields = true;
-let runGenerators = true;
-let runSimple = true;
-let runCDJS = true;
-let runWorkerTests = !!isInBrowser;
-let runSeaMonster = true;
-let runCodeLoad = true;
-let runWasm = true;
-if (typeof WebAssembly === "undefined")
-    runWasm = false;
-
-if (false) {
-    runOctane = false;
-    runARES = false;
-    runWSL = false;
-    runRexBench = false;
-    runWTB = false;
-    runSunSpider = false;
-    runBigIntNoble = false;
-    runBigIntMisc = false;
-    runProxy = false;
-    runClassFields = false;
-    runGenerators = false;
-    runSimple = false;
-    runCDJS = false;
-    runWorkerTests = false;
-    runSeaMonster = false;
-    runCodeLoad = false;
-    runWasm = false;
-}
-
-if (typeof testList !== "undefined") {
-    processTestList(testList);
-} else if (customTestList.length) {
-    processTestList(customTestList);
-} else {
-    if (runARES)
-        addTestsByGroup(ARESGroup);
-
-    if (runCDJS)
-        addTestsByGroup(CDJSGroup);
-
-    if (runCodeLoad)
-        addTestsByGroup(CodeLoadGroup);
-
-    if (runOctane)
-        addTestsByGroup(OctaneGroup);
-
-    if (runRexBench)
-        addTestsByGroup(RexBenchGroup);
-
-    if (runSeaMonster)
-        addTestsByGroup(SeaMonsterGroup);
-
-    if (runSimple)
-        addTestsByGroup(SimpleGroup);
-
-    if (runSunSpider)
-        addTestsByGroup(SunSpiderGroup);
-
-    if (runBigIntNoble)
-        addTestsByGroup(BigIntNobleGroup);
-
-    if (runBigIntMisc)
-        addTestsByGroup(BigIntMiscGroup);
-
-    if (runProxy)
-        addTestsByGroup(ProxyGroup);
-
-    if (runClassFields)
-        addTestsByGroup(ClassFieldsGroup);
-
-    if (runGenerators)
-        addTestsByGroup(GeneratorsGroup);
-
-    if (runWasm)
-        addTestsByGroup(WasmGroup);
-
-    if (runWorkerTests)
-        addTestsByGroup(WorkerTestsGroup);
-
-    if (runWSL)
-        addTestsByGroup(WSLGroup);
-
-    if (runWTB)
-        addTestsByGroup(WTBGroup);
-}
+    return {
+        addPlan: addPlan,
+        addReferences: addReferences,
+        initialize: initialize,
+        switchToQuick: function() { switchMode("quick") },
+        switchToNormal: function() { switchMode("normal") },
+        switchToLong: function() { switchMode("long") },
+        start: start,
+        reportResult: reportResult,
+        reportError: reportError,
+        accumulate: accumulate,
+        getAccumulator: getAccumulator,
+        goodTime: Date.now
+    };
+})();
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 6de641f..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-
-Copyright (C) 2007-2024 Apple Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/LLVM-test-suite-LICENSE.txt b/LLVM-test-suite-LICENSE.txt
new file mode 100644
index 0000000..ab370a7
--- /dev/null
+++ b/LLVM-test-suite-LICENSE.txt
@@ -0,0 +1,43 @@
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003, 2004, 2005 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+    LLVM Team
+
+    University of Illinois at Urbana-Champaign
+
+    http://llvm.org/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+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:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimers.
+
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimers in the
+      documentation and/or other materials provided with the distribution.
+
+    * Neither the names of the LLVM Team, University of Illinois at
+      Urbana-Champaign, nor the names of its contributors may be used to
+      endorse or promote products derived from this Software without specific
+      prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
diff --git a/LuaJSFight/hello_world.js b/LuaJSFight/hello_world.js
deleted file mode 100644
index defc677..0000000
--- a/LuaJSFight/hello_world.js
+++ /dev/null
@@ -1 +0,0 @@
-print("Hello world!");
diff --git a/LuaJSFight/list_search.js b/LuaJSFight/list_search.js
deleted file mode 100644
index 878a14b..0000000
--- a/LuaJSFight/list_search.js
+++ /dev/null
@@ -1,12 +0,0 @@
-function firstWhere(list, fn) {
-    for (var x of list) {
-        if (fn(x)) {
-            return x;
-        }
-    }
-    return null;
-}
-nums = [1, 2, 3, 4, 5, 6, 7];
-function isEven(x) { return (x & 1) == 0; }
-firstEven = firstWhere(nums, isEven);
-print('First even: ' + firstEven)
diff --git a/LuaJSFight/lists.js b/LuaJSFight/lists.js
deleted file mode 100644
index c6bf148..0000000
--- a/LuaJSFight/lists.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var n = 40000;
-var i = 0;
-var items = [];
-
-while (i < n) {
-    items.push(i);
-    i = i + 1;
-}
diff --git a/LuaJSFight/richards.js b/LuaJSFight/richards.js
deleted file mode 100644
index 330c394..0000000
--- a/LuaJSFight/richards.js
+++ /dev/null
@@ -1,537 +0,0 @@
-// Copyright 2006-2008 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// This is a JavaScript implementation of the Richards
-// benchmark from:
-//
-//    http://www.cl.cam.ac.uk/~mr10/Bench.html
-//
-// The benchmark was originally implemented in BCPL by
-// Martin Richards.
-
-
-/**
- * The Richards benchmark simulates the task dispatcher of an
- * operating system.
- **/
-function runRichards() {
-  var scheduler = new Scheduler();
-  scheduler.addIdleTask(ID_IDLE, 0, null, COUNT);
-
-  var queue = new Packet(null, ID_WORKER, KIND_WORK);
-  queue = new Packet(queue,  ID_WORKER, KIND_WORK);
-  scheduler.addWorkerTask(ID_WORKER, 1000, queue);
-
-  queue = new Packet(null, ID_DEVICE_A, KIND_DEVICE);
-  queue = new Packet(queue,  ID_DEVICE_A, KIND_DEVICE);
-  queue = new Packet(queue,  ID_DEVICE_A, KIND_DEVICE);
-  scheduler.addHandlerTask(ID_HANDLER_A, 2000, queue);
-
-  queue = new Packet(null, ID_DEVICE_B, KIND_DEVICE);
-  queue = new Packet(queue,  ID_DEVICE_B, KIND_DEVICE);
-  queue = new Packet(queue,  ID_DEVICE_B, KIND_DEVICE);
-  scheduler.addHandlerTask(ID_HANDLER_B, 3000, queue);
-
-  scheduler.addDeviceTask(ID_DEVICE_A, 4000, null);
-
-  scheduler.addDeviceTask(ID_DEVICE_B, 5000, null);
-
-  scheduler.schedule();
-
-  if (scheduler.queueCount != EXPECTED_QUEUE_COUNT ||
-      scheduler.holdCount != EXPECTED_HOLD_COUNT) {
-    var msg =
-        "Error during execution: queueCount = " + scheduler.queueCount +
-        ", holdCount = " + scheduler.holdCount + ".";
-    throw new Error(msg);
-  }
-}
-
-var COUNT = 1000;
-
-/**
- * These two constants specify how many times a packet is queued and
- * how many times a task is put on hold in a correct run of richards.
- * They don't have any meaning a such but are characteristic of a
- * correct run so if the actual queue or hold count is different from
- * the expected there must be a bug in the implementation.
- **/
-var EXPECTED_QUEUE_COUNT = 2322;
-var EXPECTED_HOLD_COUNT = 928;
-
-
-/**
- * A scheduler can be used to schedule a set of tasks based on their relative
- * priorities.  Scheduling is done by maintaining a list of task control blocks
- * which holds tasks and the data queue they are processing.
- * @constructor
- */
-function Scheduler() {
-  this.queueCount = 0;
-  this.holdCount = 0;
-  this.blocks = new Array(NUMBER_OF_IDS);
-  this.list = null;
-  this.currentTcb = null;
-  this.currentId = null;
-}
-
-var ID_IDLE       = 0;
-var ID_WORKER     = 1;
-var ID_HANDLER_A  = 2;
-var ID_HANDLER_B  = 3;
-var ID_DEVICE_A   = 4;
-var ID_DEVICE_B   = 5;
-var NUMBER_OF_IDS = 6;
-
-var KIND_DEVICE   = 0;
-var KIND_WORK     = 1;
-
-/**
- * Add an idle task to this scheduler.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- * @param {int} count the number of times to schedule the task
- */
-Scheduler.prototype.addIdleTask = function (id, priority, queue, count) {
-  this.addRunningTask(id, priority, queue, new IdleTask(this, 1, count));
-};
-
-/**
- * Add a work task to this scheduler.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- */
-Scheduler.prototype.addWorkerTask = function (id, priority, queue) {
-  this.addTask(id, priority, queue, new WorkerTask(this, ID_HANDLER_A, 0));
-};
-
-/**
- * Add a handler task to this scheduler.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- */
-Scheduler.prototype.addHandlerTask = function (id, priority, queue) {
-  this.addTask(id, priority, queue, new HandlerTask(this));
-};
-
-/**
- * Add a handler task to this scheduler.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- */
-Scheduler.prototype.addDeviceTask = function (id, priority, queue) {
-  this.addTask(id, priority, queue, new DeviceTask(this))
-};
-
-/**
- * Add the specified task and mark it as running.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- * @param {Task} task the task to add
- */
-Scheduler.prototype.addRunningTask = function (id, priority, queue, task) {
-  this.addTask(id, priority, queue, task);
-  this.currentTcb.setRunning();
-};
-
-/**
- * Add the specified task to this scheduler.
- * @param {int} id the identity of the task
- * @param {int} priority the task's priority
- * @param {Packet} queue the queue of work to be processed by the task
- * @param {Task} task the task to add
- */
-Scheduler.prototype.addTask = function (id, priority, queue, task) {
-  this.currentTcb = new TaskControlBlock(this.list, id, priority, queue, task);
-  this.list = this.currentTcb;
-  this.blocks[id] = this.currentTcb;
-};
-
-/**
- * Execute the tasks managed by this scheduler.
- */
-Scheduler.prototype.schedule = function () {
-  this.currentTcb = this.list;
-  while (this.currentTcb != null) {
-    if (this.currentTcb.isHeldOrSuspended()) {
-      this.currentTcb = this.currentTcb.link;
-    } else {
-      this.currentId = this.currentTcb.id;
-      this.currentTcb = this.currentTcb.run();
-    }
-  }
-};
-
-/**
- * Release a task that is currently blocked and return the next block to run.
- * @param {int} id the id of the task to suspend
- */
-Scheduler.prototype.release = function (id) {
-  var tcb = this.blocks[id];
-  if (tcb == null) return tcb;
-  tcb.markAsNotHeld();
-  if (tcb.priority > this.currentTcb.priority) {
-    return tcb;
-  } else {
-    return this.currentTcb;
-  }
-};
-
-/**
- * Block the currently executing task and return the next task control block
- * to run.  The blocked task will not be made runnable until it is explicitly
- * released, even if new work is added to it.
- */
-Scheduler.prototype.holdCurrent = function () {
-  this.holdCount++;
-  this.currentTcb.markAsHeld();
-  return this.currentTcb.link;
-};
-
-/**
- * Suspend the currently executing task and return the next task control block
- * to run.  If new work is added to the suspended task it will be made runnable.
- */
-Scheduler.prototype.suspendCurrent = function () {
-  this.currentTcb.markAsSuspended();
-  return this.currentTcb;
-};
-
-/**
- * Add the specified packet to the end of the worklist used by the task
- * associated with the packet and make the task runnable if it is currently
- * suspended.
- * @param {Packet} packet the packet to add
- */
-Scheduler.prototype.queue = function (packet) {
-  var t = this.blocks[packet.id];
-  if (t == null) return t;
-  this.queueCount++;
-  packet.link = null;
-  packet.id = this.currentId;
-  return t.checkPriorityAdd(this.currentTcb, packet);
-};
-
-/**
- * A task control block manages a task and the queue of work packages associated
- * with it.
- * @param {TaskControlBlock} link the preceding block in the linked block list
- * @param {int} id the id of this block
- * @param {int} priority the priority of this block
- * @param {Packet} queue the queue of packages to be processed by the task
- * @param {Task} task the task
- * @constructor
- */
-function TaskControlBlock(link, id, priority, queue, task) {
-  this.link = link;
-  this.id = id;
-  this.priority = priority;
-  this.queue = queue;
-  this.task = task;
-  if (queue == null) {
-    this.state = STATE_SUSPENDED;
-  } else {
-    this.state = STATE_SUSPENDED_RUNNABLE;
-  }
-}
-
-/**
- * The task is running and is currently scheduled.
- */
-var STATE_RUNNING = 0;
-
-/**
- * The task has packets left to process.
- */
-var STATE_RUNNABLE = 1;
-
-/**
- * The task is not currently running.  The task is not blocked as such and may
-* be started by the scheduler.
- */
-var STATE_SUSPENDED = 2;
-
-/**
- * The task is blocked and cannot be run until it is explicitly released.
- */
-var STATE_HELD = 4;
-
-var STATE_SUSPENDED_RUNNABLE = STATE_SUSPENDED | STATE_RUNNABLE;
-var STATE_NOT_HELD = ~STATE_HELD;
-
-TaskControlBlock.prototype.setRunning = function () {
-  this.state = STATE_RUNNING;
-};
-
-TaskControlBlock.prototype.markAsNotHeld = function () {
-  this.state = this.state & STATE_NOT_HELD;
-};
-
-TaskControlBlock.prototype.markAsHeld = function () {
-  this.state = this.state | STATE_HELD;
-};
-
-TaskControlBlock.prototype.isHeldOrSuspended = function () {
-  return (this.state & STATE_HELD) != 0 || (this.state == STATE_SUSPENDED);
-};
-
-TaskControlBlock.prototype.markAsSuspended = function () {
-  this.state = this.state | STATE_SUSPENDED;
-};
-
-TaskControlBlock.prototype.markAsRunnable = function () {
-  this.state = this.state | STATE_RUNNABLE;
-};
-
-/**
- * Runs this task, if it is ready to be run, and returns the next task to run.
- */
-TaskControlBlock.prototype.run = function () {
-  var packet;
-  if (this.state == STATE_SUSPENDED_RUNNABLE) {
-    packet = this.queue;
-    this.queue = packet.link;
-    if (this.queue == null) {
-      this.state = STATE_RUNNING;
-    } else {
-      this.state = STATE_RUNNABLE;
-    }
-  } else {
-    packet = null;
-  }
-  return this.task.run(packet);
-};
-
-/**
- * Adds a packet to the worklist of this block's task, marks this as runnable if
- * necessary, and returns the next runnable object to run (the one
- * with the highest priority).
- */
-TaskControlBlock.prototype.checkPriorityAdd = function (task, packet) {
-  if (this.queue == null) {
-    this.queue = packet;
-    this.markAsRunnable();
-    if (this.priority > task.priority) return this;
-  } else {
-    this.queue = packet.addTo(this.queue);
-  }
-  return task;
-};
-
-TaskControlBlock.prototype.toString = function () {
-  return "tcb { " + this.task + "@" + this.state + " }";
-};
-
-/**
- * An idle task doesn't do any work itself but cycles control between the two
- * device tasks.
- * @param {Scheduler} scheduler the scheduler that manages this task
- * @param {int} v1 a seed value that controls how the device tasks are scheduled
- * @param {int} count the number of times this task should be scheduled
- * @constructor
- */
-function IdleTask(scheduler, v1, count) {
-  this.scheduler = scheduler;
-  this.v1 = v1;
-  this.count = count;
-}
-
-IdleTask.prototype.run = function (packet) {
-  this.count--;
-  if (this.count == 0) return this.scheduler.holdCurrent();
-  if ((this.v1 & 1) == 0) {
-    this.v1 = this.v1 >> 1;
-    return this.scheduler.release(ID_DEVICE_A);
-  } else {
-    this.v1 = (this.v1 >> 1) ^ 0xD008;
-    return this.scheduler.release(ID_DEVICE_B);
-  }
-};
-
-IdleTask.prototype.toString = function () {
-  return "IdleTask"
-};
-
-/**
- * A task that suspends itself after each time it has been run to simulate
- * waiting for data from an external device.
- * @param {Scheduler} scheduler the scheduler that manages this task
- * @constructor
- */
-function DeviceTask(scheduler) {
-  this.scheduler = scheduler;
-  this.v1 = null;
-}
-
-DeviceTask.prototype.run = function (packet) {
-  if (packet == null) {
-    if (this.v1 == null) return this.scheduler.suspendCurrent();
-    var v = this.v1;
-    this.v1 = null;
-    return this.scheduler.queue(v);
-  } else {
-    this.v1 = packet;
-    return this.scheduler.holdCurrent();
-  }
-};
-
-DeviceTask.prototype.toString = function () {
-  return "DeviceTask";
-};
-
-/**
- * A task that manipulates work packets.
- * @param {Scheduler} scheduler the scheduler that manages this task
- * @param {int} v1 a seed used to specify how work packets are manipulated
- * @param {int} v2 another seed used to specify how work packets are manipulated
- * @constructor
- */
-function WorkerTask(scheduler, v1, v2) {
-  this.scheduler = scheduler;
-  this.v1 = v1;
-  this.v2 = v2;
-}
-
-WorkerTask.prototype.run = function (packet) {
-  if (packet == null) {
-    return this.scheduler.suspendCurrent();
-  } else {
-    if (this.v1 == ID_HANDLER_A) {
-      this.v1 = ID_HANDLER_B;
-    } else {
-      this.v1 = ID_HANDLER_A;
-    }
-    packet.id = this.v1;
-    packet.a1 = 0;
-    for (var i = 0; i < DATA_SIZE; i++) {
-      this.v2++;
-      if (this.v2 > 26) this.v2 = 1;
-      packet.a2[i] = this.v2;
-    }
-    return this.scheduler.queue(packet);
-  }
-};
-
-WorkerTask.prototype.toString = function () {
-  return "WorkerTask";
-};
-
-/**
- * A task that manipulates work packets and then suspends itself.
- * @param {Scheduler} scheduler the scheduler that manages this task
- * @constructor
- */
-function HandlerTask(scheduler) {
-  this.scheduler = scheduler;
-  this.v1 = null;
-  this.v2 = null;
-}
-
-HandlerTask.prototype.run = function (packet) {
-  if (packet != null) {
-    if (packet.kind == KIND_WORK) {
-      this.v1 = packet.addTo(this.v1);
-    } else {
-      this.v2 = packet.addTo(this.v2);
-    }
-  }
-  if (this.v1 != null) {
-    var count = this.v1.a1;
-    var v;
-    if (count < DATA_SIZE) {
-      if (this.v2 != null) {
-        v = this.v2;
-        this.v2 = this.v2.link;
-        v.a1 = this.v1.a2[count];
-        this.v1.a1 = count + 1;
-        return this.scheduler.queue(v);
-      }
-    } else {
-      v = this.v1;
-      this.v1 = this.v1.link;
-      return this.scheduler.queue(v);
-    }
-  }
-  return this.scheduler.suspendCurrent();
-};
-
-HandlerTask.prototype.toString = function () {
-  return "HandlerTask";
-};
-
-/* --- *
- * P a c k e t
- * --- */
-
-var DATA_SIZE = 4;
-
-/**
- * A simple package of data that is manipulated by the tasks.  The exact layout
- * of the payload data carried by a packet is not importaint, and neither is the
- * nature of the work performed on packets by the tasks.
- *
- * Besides carrying data, packets form linked lists and are hence used both as
- * data and worklists.
- * @param {Packet} link the tail of the linked list of packets
- * @param {int} id an ID for this packet
- * @param {int} kind the type of this packet
- * @constructor
- */
-function Packet(link, id, kind) {
-  this.link = link;
-  this.id = id;
-  this.kind = kind;
-  this.a1 = 0;
-  this.a2 = new Array(DATA_SIZE);
-}
-
-/**
- * Add this packet to the end of a worklist, and return the worklist.
- * @param {Packet} queue the worklist to add this packet to
- */
-Packet.prototype.addTo = function (queue) {
-  this.link = null;
-  if (queue == null) return this;
-  var peek, next = queue;
-  while ((peek = next.link) != null)
-    next = peek;
-  next.link = this;
-  return queue;
-};
-
-Packet.prototype.toString = function () {
-  return "Packet";
-};
-
-
-runRichards();
diff --git a/LuaJSFight/string_lists.js b/LuaJSFight/string_lists.js
deleted file mode 100644
index 774dcfb..0000000
--- a/LuaJSFight/string_lists.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var n = 40000;
-var i = 0;
-var items = [];
-
-while (i < n) {
-    items.push("digit" + i);
-    i = i + 1;
-}
diff --git a/Octane/base.js b/Octane/base.js
new file mode 100644
index 0000000..8801f2d
--- /dev/null
+++ b/Octane/base.js
@@ -0,0 +1,289 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Simple framework for running the benchmark suites and
+// computing a score based on the timing measurements.
+
+
+// A benchmark has a name (string) and a function that will be run to
+// do the performance measurement. The optional setup and tearDown
+// arguments are functions that will be invoked before and after
+// running the benchmark, but the running time of these functions will
+// not be accounted for in the benchmark score.
+function Benchmark(name, run, setup, tearDown, minIterations) {
+  this.name = name;
+  this.run = run;
+  this.Setup = setup ? setup : function() { };
+  this.TearDown = tearDown ? tearDown : function() { };
+  this.minIterations = minIterations ? minIterations : 32;
+}
+
+
+// Benchmark results hold the benchmark and the measured time used to
+// run the benchmark. The benchmark score is computed later once a
+// full benchmark suite has run to completion.
+function BenchmarkResult(benchmark, time) {
+  this.benchmark = benchmark;
+  this.time = time;
+}
+
+
+// Automatically convert results to numbers. Used by the geometric
+// mean computation.
+BenchmarkResult.prototype.valueOf = function() {
+  return this.time;
+}
+
+
+// Suites of benchmarks consist of a name and the set of benchmarks in
+// addition to the reference timing that the final score will be based
+// on. This way, all scores are relative to a reference run and higher
+// scores implies better performance.
+function BenchmarkSuite(name, reference, benchmarks) {
+  this.name = name;
+  this.reference = reference;
+  this.benchmarks = benchmarks;
+  BenchmarkSuite.suites.push(this);
+}
+
+
+// Keep track of all declared benchmark suites.
+BenchmarkSuite.suites = [];
+
+
+// Scores are not comparable across versions. Bump the version if
+// you're making changes that will affect that scores, e.g. if you add
+// a new benchmark or change an existing one.
+BenchmarkSuite.version = '8';
+
+// Override the alert function to throw an exception instead.
+alert = function(s) {
+  throw "Alert called with argument: " + s;
+};
+
+// To make the benchmark results predictable, we replace Math.random
+// with a 100% deterministic alternative.
+Math.random = (function() {
+  var seed = 49734321;
+  return function() {
+    // Robert Jenkins' 32 bit integer hash function.
+    seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
+    seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
+    seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
+    seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
+    seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
+    seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
+    return (seed & 0xfffffff) / 0x10000000;
+  };
+})();
+
+
+// Runs all registered benchmark suites and optionally yields between
+// each individual benchmark to avoid running for too long in the
+// context of browsers. Once done, the final score is reported to the
+// runner.
+BenchmarkSuite.RunSuites = function(runner) {
+  var continuation = null;
+  var suites = BenchmarkSuite.suites;
+  var length = suites.length;
+  BenchmarkSuite.scores = [];
+  var index = 0;
+  function RunStep() {
+    while (continuation || index < length) {
+      if (continuation) {
+        continuation = continuation();
+      } else {
+        var suite = suites[index++];
+        if (runner.NotifyStart) runner.NotifyStart(suite.name);
+        continuation = suite.RunStep(runner);
+      }
+      if (continuation && typeof window != 'undefined' && window.setTimeout) {
+        window.setTimeout(RunStep, 25);
+        return;
+      }
+    }
+    if (runner.NotifyScore) {
+      var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores);
+      var formatted = BenchmarkSuite.FormatScore(100 * score);
+      runner.NotifyScore(formatted);
+    }
+  }
+  RunStep();
+}
+
+
+// Counts the total number of registered benchmarks. Useful for
+// showing progress as a percentage.
+BenchmarkSuite.CountBenchmarks = function() {
+  var result = 0;
+  var suites = BenchmarkSuite.suites;
+  for (var i = 0; i < suites.length; i++) {
+    result += suites[i].benchmarks.length;
+  }
+  return result;
+}
+
+
+// Computes the geometric mean of a set of numbers.
+BenchmarkSuite.GeometricMean = function(numbers) {
+  var log = 0;
+  for (var i = 0; i < numbers.length; i++) {
+    log += Math.log(numbers[i]);
+  }
+  return Math.pow(Math.E, log / numbers.length);
+}
+
+
+// Converts a score value to a string with at least three significant
+// digits.
+BenchmarkSuite.FormatScore = function(value) {
+  if (value > 100) {
+    return value.toFixed(0);
+  } else {
+    return value.toPrecision(3);
+  }
+}
+
+// Notifies the runner that we're done running a single benchmark in
+// the benchmark suite. This can be useful to report progress.
+BenchmarkSuite.prototype.NotifyStep = function(result) {
+  this.results.push(result);
+  if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name);
+}
+
+
+// Notifies the runner that we're done with running a suite and that
+// we have a result which can be reported to the user if needed.
+BenchmarkSuite.prototype.NotifyResult = function() {
+  var mean = BenchmarkSuite.GeometricMean(this.results);
+  var score = this.reference / mean;
+  BenchmarkSuite.scores.push(score);
+  if (this.runner.NotifyResult) {
+    var formatted = BenchmarkSuite.FormatScore(100 * score);
+    this.runner.NotifyResult(this.name, formatted);
+  }
+}
+
+
+// Notifies the runner that running a benchmark resulted in an error.
+BenchmarkSuite.prototype.NotifyError = function(error) {
+  if (this.runner.NotifyError) {
+    this.runner.NotifyError(this.name, error);
+  }
+  if (this.runner.NotifyStep) {
+    this.runner.NotifyStep(this.name);
+  }
+}
+
+
+// Runs a single benchmark for at least a second and computes the
+// average time it takes to run a single iteration.
+BenchmarkSuite.prototype.RunSingleBenchmark = function(benchmark, data) {
+  function Measure(data) {
+    var elapsed = 0;
+    var start = new Date();
+    for (var n = 0; elapsed < 1000; n++) {
+      benchmark.run();
+      elapsed = new Date() - start;
+    }
+    if (data != null) {
+      data.runs += n;
+      data.elapsed += elapsed;
+    }
+  }
+
+  if (data == null) {
+    // Measure the benchmark once for warm up and throw the result
+    // away. Return a fresh data object.
+    Measure(null);
+    return { runs: 0, elapsed: 0 };
+  } else {
+    Measure(data);
+    // If we've run too few iterations, we continue for another second.
+    if (data.runs < benchmark.minIterations) return data;
+    var usec = (data.elapsed * 1000) / data.runs;
+    this.NotifyStep(new BenchmarkResult(benchmark, usec));
+    return null;
+  }
+}
+
+
+// This function starts running a suite, but stops between each
+// individual benchmark in the suite and returns a continuation
+// function which can be invoked to run the next benchmark. Once the
+// last benchmark has been executed, null is returned.
+BenchmarkSuite.prototype.RunStep = function(runner) {
+  this.results = [];
+  this.runner = runner;
+  var length = this.benchmarks.length;
+  var index = 0;
+  var suite = this;
+  var data;
+
+  // Run the setup, the actual benchmark, and the tear down in three
+  // separate steps to allow the framework to yield between any of the
+  // steps.
+
+  function RunNextSetup() {
+    if (index < length) {
+      try {
+        suite.benchmarks[index].Setup();
+      } catch (e) {
+        suite.NotifyError(e);
+        return null;
+      }
+      return RunNextBenchmark;
+    }
+    suite.NotifyResult();
+    return null;
+  }
+
+  function RunNextBenchmark() {
+    try {
+      data = suite.RunSingleBenchmark(suite.benchmarks[index], data);
+    } catch (e) {
+      suite.NotifyError(e);
+      return null;
+    }
+    // If data is null, we're done with this benchmark.
+    return (data == null) ? RunNextTearDown : RunNextBenchmark();
+  }
+
+  function RunNextTearDown() {
+    try {
+      suite.benchmarks[index++].TearDown();
+    } catch (e) {
+      suite.NotifyError(e);
+      return null;
+    }
+    return RunNextSetup;
+  }
+
+  // Start out running the setup.
+  return RunNextSetup();
+}
diff --git a/Octane/box2d.js b/Octane/box2d.js
deleted file mode 100644
index 4038477..0000000
--- a/Octane/box2d.js
+++ /dev/null
@@ -1,556 +0,0 @@
-// Portions copyright 2013 Google, Inc
-
-/*
-* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
-*
-* This software is provided 'as-is', without any express or implied
-* warranty.  In no event will the authors be held liable for any damages
-* arising from the use of this software.
-* Permission is granted to anyone to use this software for any purpose,
-* including commercial applications, and to alter it and redistribute it
-* freely, subject to the following restrictions:
-* 1. The origin of this software must not be misrepresented; you must not
-* claim that you wrote the original software. If you use this software
-* in a product, an acknowledgment in the product documentation would be
-* appreciated but is not required.
-* 2. Altered source versions must be plainly marked as such, and must not be
-* misrepresented as being the original software.
-* 3. This notice may not be removed or altered from any source distribution.
-*/
-
-var Box2D={};
-(function(F,G){function K(){}if(!(Object.defineProperty instanceof Function)&&Object.prototype.__defineGetter__ instanceof Function&&Object.prototype.__defineSetter__ instanceof Function)Object.defineProperty=function(y,w,A){A.get instanceof Function&&y.__defineGetter__(w,A.get);A.set instanceof Function&&y.__defineSetter__(w,A.set)};F.inherit=function(y,w){K.prototype=w.prototype;y.prototype=new K;y.prototype.constructor=y};F.generateCallback=function(y,w){return function(){w.apply(y,arguments)}};
-F.NVector=function(y){if(y===G)y=0;for(var w=Array(y||0),A=0;A<y;++A)w[A]=0;return w};F.is=function(y,w){if(y===null)return false;if(w instanceof Function&&y instanceof w)return true;if(y.constructor.__implements!=G&&y.constructor.__implements[w])return true;return false};F.parseUInt=function(y){return Math.abs(parseInt(y))}})(Box2D);var Vector=Array,Vector_a2j_Number=Box2D.NVector;if(typeof Box2D==="undefined")Box2D={};if(typeof Box2D.Collision==="undefined")Box2D.Collision={};
-if(typeof Box2D.Collision.Shapes==="undefined")Box2D.Collision.Shapes={};if(typeof Box2D.Common==="undefined")Box2D.Common={};if(typeof Box2D.Common.Math==="undefined")Box2D.Common.Math={};if(typeof Box2D.Dynamics==="undefined")Box2D.Dynamics={};if(typeof Box2D.Dynamics.Contacts==="undefined")Box2D.Dynamics.Contacts={};if(typeof Box2D.Dynamics.Controllers==="undefined")Box2D.Dynamics.Controllers={};if(typeof Box2D.Dynamics.Joints==="undefined")Box2D.Dynamics.Joints={};
-(function(){function F(){F.b2AABB.apply(this,arguments)}function G(){G.b2Bound.apply(this,arguments)}function K(){K.b2BoundValues.apply(this,arguments);this.constructor===K&&this.b2BoundValues.apply(this,arguments)}function y(){y.b2Collision.apply(this,arguments)}function w(){w.b2ContactID.apply(this,arguments);this.constructor===w&&this.b2ContactID.apply(this,arguments)}function A(){A.b2ContactPoint.apply(this,arguments)}function U(){U.b2Distance.apply(this,arguments)}function p(){p.b2DistanceInput.apply(this,
-arguments)}function B(){B.b2DistanceOutput.apply(this,arguments)}function Q(){Q.b2DistanceProxy.apply(this,arguments)}function V(){V.b2DynamicTree.apply(this,arguments);this.constructor===V&&this.b2DynamicTree.apply(this,arguments)}function M(){M.b2DynamicTreeBroadPhase.apply(this,arguments)}function L(){L.b2DynamicTreeNode.apply(this,arguments)}function I(){I.b2DynamicTreePair.apply(this,arguments)}function W(){W.b2Manifold.apply(this,arguments);this.constructor===W&&this.b2Manifold.apply(this,arguments)}
-function Y(){Y.b2ManifoldPoint.apply(this,arguments);this.constructor===Y&&this.b2ManifoldPoint.apply(this,arguments)}function k(){k.b2Point.apply(this,arguments)}function z(){z.b2RayCastInput.apply(this,arguments);this.constructor===z&&this.b2RayCastInput.apply(this,arguments)}function u(){u.b2RayCastOutput.apply(this,arguments)}function D(){D.b2Segment.apply(this,arguments)}function H(){H.b2SeparationFunction.apply(this,arguments)}function O(){O.b2Simplex.apply(this,arguments);this.constructor===
-O&&this.b2Simplex.apply(this,arguments)}function E(){E.b2SimplexCache.apply(this,arguments)}function R(){R.b2SimplexVertex.apply(this,arguments)}function N(){N.b2TimeOfImpact.apply(this,arguments)}function S(){S.b2TOIInput.apply(this,arguments)}function aa(){aa.b2WorldManifold.apply(this,arguments);this.constructor===aa&&this.b2WorldManifold.apply(this,arguments)}function Z(){Z.ClipVertex.apply(this,arguments)}function d(){d.Features.apply(this,arguments)}function h(){h.b2CircleShape.apply(this,arguments);
-this.constructor===h&&this.b2CircleShape.apply(this,arguments)}function l(){l.b2EdgeChainDef.apply(this,arguments);this.constructor===l&&this.b2EdgeChainDef.apply(this,arguments)}function j(){j.b2EdgeShape.apply(this,arguments);this.constructor===j&&this.b2EdgeShape.apply(this,arguments)}function o(){o.b2MassData.apply(this,arguments)}function q(){q.b2PolygonShape.apply(this,arguments);this.constructor===q&&this.b2PolygonShape.apply(this,arguments)}function n(){n.b2Shape.apply(this,arguments);this.constructor===
-n&&this.b2Shape.apply(this,arguments)}function a(){a.b2Color.apply(this,arguments);this.constructor===a&&this.b2Color.apply(this,arguments)}function c(){c.b2Settings.apply(this,arguments)}function g(){g.b2Mat22.apply(this,arguments);this.constructor===g&&this.b2Mat22.apply(this,arguments)}function b(){b.b2Mat33.apply(this,arguments);this.constructor===b&&this.b2Mat33.apply(this,arguments)}function e(){e.b2Math.apply(this,arguments)}function f(){f.b2Sweep.apply(this,arguments)}function m(){m.b2Transform.apply(this,
-arguments);this.constructor===m&&this.b2Transform.apply(this,arguments)}function r(){r.b2Vec2.apply(this,arguments);this.constructor===r&&this.b2Vec2.apply(this,arguments)}function s(){s.b2Vec3.apply(this,arguments);this.constructor===s&&this.b2Vec3.apply(this,arguments)}function v(){v.b2Body.apply(this,arguments);this.constructor===v&&this.b2Body.apply(this,arguments)}function t(){t.b2BodyDef.apply(this,arguments);this.constructor===t&&this.b2BodyDef.apply(this,arguments)}function x(){x.b2ContactFilter.apply(this,
-arguments)}function C(){C.b2ContactImpulse.apply(this,arguments)}function J(){J.b2ContactListener.apply(this,arguments)}function T(){T.b2ContactManager.apply(this,arguments);this.constructor===T&&this.b2ContactManager.apply(this,arguments)}function P(){P.b2DebugDraw.apply(this,arguments);this.constructor===P&&this.b2DebugDraw.apply(this,arguments)}function X(){X.b2DestructionListener.apply(this,arguments)}function $(){$.b2FilterData.apply(this,arguments)}function ba(){ba.b2Fixture.apply(this,arguments);
-this.constructor===ba&&this.b2Fixture.apply(this,arguments)}function ca(){ca.b2FixtureDef.apply(this,arguments);this.constructor===ca&&this.b2FixtureDef.apply(this,arguments)}function da(){da.b2Island.apply(this,arguments);this.constructor===da&&this.b2Island.apply(this,arguments)}function Fa(){Fa.b2TimeStep.apply(this,arguments)}function ea(){ea.b2World.apply(this,arguments);this.constructor===ea&&this.b2World.apply(this,arguments)}function Ga(){Ga.b2CircleContact.apply(this,arguments)}function fa(){fa.b2Contact.apply(this,
-arguments);this.constructor===fa&&this.b2Contact.apply(this,arguments)}function ga(){ga.b2ContactConstraint.apply(this,arguments);this.constructor===ga&&this.b2ContactConstraint.apply(this,arguments)}function Ha(){Ha.b2ContactConstraintPoint.apply(this,arguments)}function Ia(){Ia.b2ContactEdge.apply(this,arguments)}function ha(){ha.b2ContactFactory.apply(this,arguments);this.constructor===ha&&this.b2ContactFactory.apply(this,arguments)}function Ja(){Ja.b2ContactRegister.apply(this,arguments)}function Ka(){Ka.b2ContactResult.apply(this,
-arguments)}function ia(){ia.b2ContactSolver.apply(this,arguments);this.constructor===ia&&this.b2ContactSolver.apply(this,arguments)}function La(){La.b2EdgeAndCircleContact.apply(this,arguments)}function ja(){ja.b2NullContact.apply(this,arguments);this.constructor===ja&&this.b2NullContact.apply(this,arguments)}function Ma(){Ma.b2PolyAndCircleContact.apply(this,arguments)}function Na(){Na.b2PolyAndEdgeContact.apply(this,arguments)}function Oa(){Oa.b2PolygonContact.apply(this,arguments)}function ka(){ka.b2PositionSolverManifold.apply(this,
-arguments);this.constructor===ka&&this.b2PositionSolverManifold.apply(this,arguments)}function Pa(){Pa.b2BuoyancyController.apply(this,arguments)}function Qa(){Qa.b2ConstantAccelController.apply(this,arguments)}function Ra(){Ra.b2ConstantForceController.apply(this,arguments)}function Sa(){Sa.b2Controller.apply(this,arguments)}function Ta(){Ta.b2ControllerEdge.apply(this,arguments)}function Ua(){Ua.b2GravityController.apply(this,arguments)}function Va(){Va.b2TensorDampingController.apply(this,arguments)}
-function la(){la.b2DistanceJoint.apply(this,arguments);this.constructor===la&&this.b2DistanceJoint.apply(this,arguments)}function ma(){ma.b2DistanceJointDef.apply(this,arguments);this.constructor===ma&&this.b2DistanceJointDef.apply(this,arguments)}function na(){na.b2FrictionJoint.apply(this,arguments);this.constructor===na&&this.b2FrictionJoint.apply(this,arguments)}function oa(){oa.b2FrictionJointDef.apply(this,arguments);this.constructor===oa&&this.b2FrictionJointDef.apply(this,arguments)}function pa(){pa.b2GearJoint.apply(this,
-arguments);this.constructor===pa&&this.b2GearJoint.apply(this,arguments)}function qa(){qa.b2GearJointDef.apply(this,arguments);this.constructor===qa&&this.b2GearJointDef.apply(this,arguments)}function Wa(){Wa.b2Jacobian.apply(this,arguments)}function ra(){ra.b2Joint.apply(this,arguments);this.constructor===ra&&this.b2Joint.apply(this,arguments)}function sa(){sa.b2JointDef.apply(this,arguments);this.constructor===sa&&this.b2JointDef.apply(this,arguments)}function Xa(){Xa.b2JointEdge.apply(this,arguments)}
-function ta(){ta.b2LineJoint.apply(this,arguments);this.constructor===ta&&this.b2LineJoint.apply(this,arguments)}function ua(){ua.b2LineJointDef.apply(this,arguments);this.constructor===ua&&this.b2LineJointDef.apply(this,arguments)}function va(){va.b2MouseJoint.apply(this,arguments);this.constructor===va&&this.b2MouseJoint.apply(this,arguments)}function wa(){wa.b2MouseJointDef.apply(this,arguments);this.constructor===wa&&this.b2MouseJointDef.apply(this,arguments)}function xa(){xa.b2PrismaticJoint.apply(this,
-arguments);this.constructor===xa&&this.b2PrismaticJoint.apply(this,arguments)}function ya(){ya.b2PrismaticJointDef.apply(this,arguments);this.constructor===ya&&this.b2PrismaticJointDef.apply(this,arguments)}function za(){za.b2PulleyJoint.apply(this,arguments);this.constructor===za&&this.b2PulleyJoint.apply(this,arguments)}function Aa(){Aa.b2PulleyJointDef.apply(this,arguments);this.constructor===Aa&&this.b2PulleyJointDef.apply(this,arguments)}function Ba(){Ba.b2RevoluteJoint.apply(this,arguments);
-this.constructor===Ba&&this.b2RevoluteJoint.apply(this,arguments)}function Ca(){Ca.b2RevoluteJointDef.apply(this,arguments);this.constructor===Ca&&this.b2RevoluteJointDef.apply(this,arguments)}function Da(){Da.b2WeldJoint.apply(this,arguments);this.constructor===Da&&this.b2WeldJoint.apply(this,arguments)}function Ea(){Ea.b2WeldJointDef.apply(this,arguments);this.constructor===Ea&&this.b2WeldJointDef.apply(this,arguments)}Box2D.Collision.IBroadPhase="Box2D.Collision.IBroadPhase";Box2D.Collision.b2AABB=
-F;Box2D.Collision.b2Bound=G;Box2D.Collision.b2BoundValues=K;Box2D.Collision.b2Collision=y;Box2D.Collision.b2ContactID=w;Box2D.Collision.b2ContactPoint=A;Box2D.Collision.b2Distance=U;Box2D.Collision.b2DistanceInput=p;Box2D.Collision.b2DistanceOutput=B;Box2D.Collision.b2DistanceProxy=Q;Box2D.Collision.b2DynamicTree=V;Box2D.Collision.b2DynamicTreeBroadPhase=M;Box2D.Collision.b2DynamicTreeNode=L;Box2D.Collision.b2DynamicTreePair=I;Box2D.Collision.b2Manifold=W;Box2D.Collision.b2ManifoldPoint=Y;Box2D.Collision.b2Point=
-k;Box2D.Collision.b2RayCastInput=z;Box2D.Collision.b2RayCastOutput=u;Box2D.Collision.b2Segment=D;Box2D.Collision.b2SeparationFunction=H;Box2D.Collision.b2Simplex=O;Box2D.Collision.b2SimplexCache=E;Box2D.Collision.b2SimplexVertex=R;Box2D.Collision.b2TimeOfImpact=N;Box2D.Collision.b2TOIInput=S;Box2D.Collision.b2WorldManifold=aa;Box2D.Collision.ClipVertex=Z;Box2D.Collision.Features=d;Box2D.Collision.Shapes.b2CircleShape=h;Box2D.Collision.Shapes.b2EdgeChainDef=l;Box2D.Collision.Shapes.b2EdgeShape=j;Box2D.Collision.Shapes.b2MassData=
-o;Box2D.Collision.Shapes.b2PolygonShape=q;Box2D.Collision.Shapes.b2Shape=n;Box2D.Common.b2internal="Box2D.Common.b2internal";Box2D.Common.b2Color=a;Box2D.Common.b2Settings=c;Box2D.Common.Math.b2Mat22=g;Box2D.Common.Math.b2Mat33=b;Box2D.Common.Math.b2Math=e;Box2D.Common.Math.b2Sweep=f;Box2D.Common.Math.b2Transform=m;Box2D.Common.Math.b2Vec2=r;Box2D.Common.Math.b2Vec3=s;Box2D.Dynamics.b2Body=v;Box2D.Dynamics.b2BodyDef=t;Box2D.Dynamics.b2ContactFilter=x;Box2D.Dynamics.b2ContactImpulse=C;Box2D.Dynamics.b2ContactListener=
-J;Box2D.Dynamics.b2ContactManager=T;Box2D.Dynamics.b2DebugDraw=P;Box2D.Dynamics.b2DestructionListener=X;Box2D.Dynamics.b2FilterData=$;Box2D.Dynamics.b2Fixture=ba;Box2D.Dynamics.b2FixtureDef=ca;Box2D.Dynamics.b2Island=da;Box2D.Dynamics.b2TimeStep=Fa;Box2D.Dynamics.b2World=ea;Box2D.Dynamics.Contacts.b2CircleContact=Ga;Box2D.Dynamics.Contacts.b2Contact=fa;Box2D.Dynamics.Contacts.b2ContactConstraint=ga;Box2D.Dynamics.Contacts.b2ContactConstraintPoint=Ha;Box2D.Dynamics.Contacts.b2ContactEdge=Ia;Box2D.Dynamics.Contacts.b2ContactFactory=
-ha;Box2D.Dynamics.Contacts.b2ContactRegister=Ja;Box2D.Dynamics.Contacts.b2ContactResult=Ka;Box2D.Dynamics.Contacts.b2ContactSolver=ia;Box2D.Dynamics.Contacts.b2EdgeAndCircleContact=La;Box2D.Dynamics.Contacts.b2NullContact=ja;Box2D.Dynamics.Contacts.b2PolyAndCircleContact=Ma;Box2D.Dynamics.Contacts.b2PolyAndEdgeContact=Na;Box2D.Dynamics.Contacts.b2PolygonContact=Oa;Box2D.Dynamics.Contacts.b2PositionSolverManifold=ka;Box2D.Dynamics.Controllers.b2BuoyancyController=Pa;Box2D.Dynamics.Controllers.b2ConstantAccelController=
-Qa;Box2D.Dynamics.Controllers.b2ConstantForceController=Ra;Box2D.Dynamics.Controllers.b2Controller=Sa;Box2D.Dynamics.Controllers.b2ControllerEdge=Ta;Box2D.Dynamics.Controllers.b2GravityController=Ua;Box2D.Dynamics.Controllers.b2TensorDampingController=Va;Box2D.Dynamics.Joints.b2DistanceJoint=la;Box2D.Dynamics.Joints.b2DistanceJointDef=ma;Box2D.Dynamics.Joints.b2FrictionJoint=na;Box2D.Dynamics.Joints.b2FrictionJointDef=oa;Box2D.Dynamics.Joints.b2GearJoint=pa;Box2D.Dynamics.Joints.b2GearJointDef=qa;
-Box2D.Dynamics.Joints.b2Jacobian=Wa;Box2D.Dynamics.Joints.b2Joint=ra;Box2D.Dynamics.Joints.b2JointDef=sa;Box2D.Dynamics.Joints.b2JointEdge=Xa;Box2D.Dynamics.Joints.b2LineJoint=ta;Box2D.Dynamics.Joints.b2LineJointDef=ua;Box2D.Dynamics.Joints.b2MouseJoint=va;Box2D.Dynamics.Joints.b2MouseJointDef=wa;Box2D.Dynamics.Joints.b2PrismaticJoint=xa;Box2D.Dynamics.Joints.b2PrismaticJointDef=ya;Box2D.Dynamics.Joints.b2PulleyJoint=za;Box2D.Dynamics.Joints.b2PulleyJointDef=Aa;Box2D.Dynamics.Joints.b2RevoluteJoint=
-Ba;Box2D.Dynamics.Joints.b2RevoluteJointDef=Ca;Box2D.Dynamics.Joints.b2WeldJoint=Da;Box2D.Dynamics.Joints.b2WeldJointDef=Ea})();Box2D.postDefs=[];
-(function(){var F=Box2D.Collision.Shapes.b2CircleShape,G=Box2D.Collision.Shapes.b2PolygonShape,K=Box2D.Collision.Shapes.b2Shape,y=Box2D.Common.b2Settings,w=Box2D.Common.Math.b2Math,A=Box2D.Common.Math.b2Sweep,U=Box2D.Common.Math.b2Transform,p=Box2D.Common.Math.b2Vec2,B=Box2D.Collision.b2AABB,Q=Box2D.Collision.b2Bound,V=Box2D.Collision.b2BoundValues,M=Box2D.Collision.b2Collision,L=Box2D.Collision.b2ContactID,I=Box2D.Collision.b2ContactPoint,W=Box2D.Collision.b2Distance,Y=Box2D.Collision.b2DistanceInput,
-k=Box2D.Collision.b2DistanceOutput,z=Box2D.Collision.b2DistanceProxy,u=Box2D.Collision.b2DynamicTree,D=Box2D.Collision.b2DynamicTreeBroadPhase,H=Box2D.Collision.b2DynamicTreeNode,O=Box2D.Collision.b2DynamicTreePair,E=Box2D.Collision.b2Manifold,R=Box2D.Collision.b2ManifoldPoint,N=Box2D.Collision.b2Point,S=Box2D.Collision.b2RayCastInput,aa=Box2D.Collision.b2RayCastOutput,Z=Box2D.Collision.b2Segment,d=Box2D.Collision.b2SeparationFunction,h=Box2D.Collision.b2Simplex,l=Box2D.Collision.b2SimplexCache,j=
-Box2D.Collision.b2SimplexVertex,o=Box2D.Collision.b2TimeOfImpact,q=Box2D.Collision.b2TOIInput,n=Box2D.Collision.b2WorldManifold,a=Box2D.Collision.ClipVertex,c=Box2D.Collision.Features,g=Box2D.Collision.IBroadPhase;B.b2AABB=function(){this.lowerBound=new p;this.upperBound=new p};B.prototype.IsValid=function(){var b=this.upperBound.y-this.lowerBound.y;return b=(b=this.upperBound.x-this.lowerBound.x>=0&&b>=0)&&this.lowerBound.IsValid()&&this.upperBound.IsValid()};B.prototype.GetCenter=function(){return new p((this.lowerBound.x+
-this.upperBound.x)/2,(this.lowerBound.y+this.upperBound.y)/2)};B.prototype.GetExtents=function(){return new p((this.upperBound.x-this.lowerBound.x)/2,(this.upperBound.y-this.lowerBound.y)/2)};B.prototype.Contains=function(b){var e=true;return e=(e=(e=(e=e&&this.lowerBound.x<=b.lowerBound.x)&&this.lowerBound.y<=b.lowerBound.y)&&b.upperBound.x<=this.upperBound.x)&&b.upperBound.y<=this.upperBound.y};B.prototype.RayCast=function(b,e){var f=-Number.MAX_VALUE,m=Number.MAX_VALUE,r=e.p1.x,s=e.p1.y,v=e.p2.x-
-e.p1.x,t=e.p2.y-e.p1.y,x=Math.abs(t),C=b.normal,J=0,T=0,P=J=0;P=0;if(Math.abs(v)<Number.MIN_VALUE){if(r<this.lowerBound.x||this.upperBound.x<r)return false}else{J=1/v;T=(this.lowerBound.x-r)*J;J=(this.upperBound.x-r)*J;P=-1;if(T>J){P=T;T=J;J=P;P=1}if(T>f){C.x=P;C.y=0;f=T}m=Math.min(m,J);if(f>m)return false}if(x<Number.MIN_VALUE){if(s<this.lowerBound.y||this.upperBound.y<s)return false}else{J=1/t;T=(this.lowerBound.y-s)*J;J=(this.upperBound.y-s)*J;P=-1;if(T>J){P=T;T=J;J=P;P=1}if(T>f){C.y=P;C.x=0;f=
-T}m=Math.min(m,J);if(f>m)return false}b.fraction=f;return true};B.prototype.TestOverlap=function(b){var e=b.lowerBound.y-this.upperBound.y,f=this.lowerBound.y-b.upperBound.y;if(b.lowerBound.x-this.upperBound.x>0||e>0)return false;if(this.lowerBound.x-b.upperBound.x>0||f>0)return false;return true};B.Combine=function(b,e){var f=new B;f.Combine(b,e);return f};B.prototype.Combine=function(b,e){this.lowerBound.x=Math.min(b.lowerBound.x,e.lowerBound.x);this.lowerBound.y=Math.min(b.lowerBound.y,e.lowerBound.y);
-this.upperBound.x=Math.max(b.upperBound.x,e.upperBound.x);this.upperBound.y=Math.max(b.upperBound.y,e.upperBound.y)};Q.b2Bound=function(){};Q.prototype.IsLower=function(){return(this.value&1)==0};Q.prototype.IsUpper=function(){return(this.value&1)==1};Q.prototype.Swap=function(b){var e=this.value,f=this.proxy,m=this.stabbingCount;this.value=b.value;this.proxy=b.proxy;this.stabbingCount=b.stabbingCount;b.value=e;b.proxy=f;b.stabbingCount=m};V.b2BoundValues=function(){};V.prototype.b2BoundValues=function(){this.lowerValues=
-new Vector_a2j_Number;this.lowerValues[0]=0;this.lowerValues[1]=0;this.upperValues=new Vector_a2j_Number;this.upperValues[0]=0;this.upperValues[1]=0};M.b2Collision=function(){};M.ClipSegmentToLine=function(b,e,f,m){if(m===undefined)m=0;var r,s=0;r=e[0];var v=r.v;r=e[1];var t=r.v,x=f.x*v.x+f.y*v.y-m;r=f.x*t.x+f.y*t.y-m;x<=0&&b[s++].Set(e[0]);r<=0&&b[s++].Set(e[1]);if(x*r<0){f=x/(x-r);r=b[s];r=r.v;r.x=v.x+f*(t.x-v.x);r.y=v.y+f*(t.y-v.y);r=b[s];r.id=(x>0?e[0]:e[1]).id;++s}return s};M.EdgeSeparation=
-function(b,e,f,m,r){if(f===undefined)f=0;parseInt(b.m_vertexCount);var s=b.m_vertices;b=b.m_normals;var v=parseInt(m.m_vertexCount),t=m.m_vertices,x,C;x=e.R;C=b[f];b=x.col1.x*C.x+x.col2.x*C.y;m=x.col1.y*C.x+x.col2.y*C.y;x=r.R;var J=x.col1.x*b+x.col1.y*m;x=x.col2.x*b+x.col2.y*m;for(var T=0,P=Number.MAX_VALUE,X=0;X<v;++X){C=t[X];C=C.x*J+C.y*x;if(C<P){P=C;T=X}}C=s[f];x=e.R;f=e.position.x+(x.col1.x*C.x+x.col2.x*C.y);e=e.position.y+(x.col1.y*C.x+x.col2.y*C.y);C=t[T];x=r.R;s=r.position.x+(x.col1.x*C.x+
-x.col2.x*C.y);r=r.position.y+(x.col1.y*C.x+x.col2.y*C.y);s-=f;r-=e;return s*b+r*m};M.FindMaxSeparation=function(b,e,f,m,r){var s=parseInt(e.m_vertexCount),v=e.m_normals,t,x;x=r.R;t=m.m_centroid;var C=r.position.x+(x.col1.x*t.x+x.col2.x*t.y),J=r.position.y+(x.col1.y*t.x+x.col2.y*t.y);x=f.R;t=e.m_centroid;C-=f.position.x+(x.col1.x*t.x+x.col2.x*t.y);J-=f.position.y+(x.col1.y*t.x+x.col2.y*t.y);x=C*f.R.col1.x+J*f.R.col1.y;J=C*f.R.col2.x+J*f.R.col2.y;C=0;for(var T=-Number.MAX_VALUE,P=0;P<s;++P){t=v[P];
-t=t.x*x+t.y*J;if(t>T){T=t;C=P}}v=M.EdgeSeparation(e,f,C,m,r);t=parseInt(C-1>=0?C-1:s-1);x=M.EdgeSeparation(e,f,t,m,r);J=parseInt(C+1<s?C+1:0);T=M.EdgeSeparation(e,f,J,m,r);var X=P=0,$=0;if(x>v&&x>T){$=-1;P=t;X=x}else if(T>v){$=1;P=J;X=T}else{b[0]=C;return v}for(;;){C=$==-1?P-1>=0?P-1:s-1:P+1<s?P+1:0;v=M.EdgeSeparation(e,f,C,m,r);if(v>X){P=C;X=v}else break}b[0]=P;return X};M.FindIncidentEdge=function(b,e,f,m,r,s){if(m===undefined)m=0;parseInt(e.m_vertexCount);var v=e.m_normals,t=parseInt(r.m_vertexCount);
-e=r.m_vertices;r=r.m_normals;var x;x=f.R;f=v[m];v=x.col1.x*f.x+x.col2.x*f.y;var C=x.col1.y*f.x+x.col2.y*f.y;x=s.R;f=x.col1.x*v+x.col1.y*C;C=x.col2.x*v+x.col2.y*C;v=f;x=0;for(var J=Number.MAX_VALUE,T=0;T<t;++T){f=r[T];f=v*f.x+C*f.y;if(f<J){J=f;x=T}}r=parseInt(x);v=parseInt(r+1<t?r+1:0);t=b[0];f=e[r];x=s.R;t.v.x=s.position.x+(x.col1.x*f.x+x.col2.x*f.y);t.v.y=s.position.y+(x.col1.y*f.x+x.col2.y*f.y);t.id.features.referenceEdge=m;t.id.features.incidentEdge=r;t.id.features.incidentVertex=0;t=b[1];f=e[v];
-x=s.R;t.v.x=s.position.x+(x.col1.x*f.x+x.col2.x*f.y);t.v.y=s.position.y+(x.col1.y*f.x+x.col2.y*f.y);t.id.features.referenceEdge=m;t.id.features.incidentEdge=v;t.id.features.incidentVertex=1};M.MakeClipPointVector=function(){var b=new Vector(2);b[0]=new a;b[1]=new a;return b};M.CollidePolygons=function(b,e,f,m,r){var s;b.m_pointCount=0;var v=e.m_radius+m.m_radius;s=0;M.s_edgeAO[0]=s;var t=M.FindMaxSeparation(M.s_edgeAO,e,f,m,r);s=M.s_edgeAO[0];if(!(t>v)){var x=0;M.s_edgeBO[0]=x;var C=M.FindMaxSeparation(M.s_edgeBO,
-m,r,e,f);x=M.s_edgeBO[0];if(!(C>v)){var J=0,T=0;if(C>0.98*t+0.0010){t=m;m=e;e=r;f=f;J=x;b.m_type=E.e_faceB;T=1}else{t=e;m=m;e=f;f=r;J=s;b.m_type=E.e_faceA;T=0}s=M.s_incidentEdge;M.FindIncidentEdge(s,t,e,J,m,f);x=parseInt(t.m_vertexCount);r=t.m_vertices;t=r[J];var P;P=J+1<x?r[parseInt(J+1)]:r[0];J=M.s_localTangent;J.Set(P.x-t.x,P.y-t.y);J.Normalize();r=M.s_localNormal;r.x=J.y;r.y=-J.x;m=M.s_planePoint;m.Set(0.5*(t.x+P.x),0.5*(t.y+P.y));C=M.s_tangent;x=e.R;C.x=x.col1.x*J.x+x.col2.x*J.y;C.y=x.col1.y*
-J.x+x.col2.y*J.y;var X=M.s_tangent2;X.x=-C.x;X.y=-C.y;J=M.s_normal;J.x=C.y;J.y=-C.x;var $=M.s_v11,ba=M.s_v12;$.x=e.position.x+(x.col1.x*t.x+x.col2.x*t.y);$.y=e.position.y+(x.col1.y*t.x+x.col2.y*t.y);ba.x=e.position.x+(x.col1.x*P.x+x.col2.x*P.y);ba.y=e.position.y+(x.col1.y*P.x+x.col2.y*P.y);e=J.x*$.x+J.y*$.y;x=C.x*ba.x+C.y*ba.y+v;P=M.s_clipPoints1;t=M.s_clipPoints2;ba=0;ba=M.ClipSegmentToLine(P,s,X,-C.x*$.x-C.y*$.y+v);if(!(ba<2)){ba=M.ClipSegmentToLine(t,P,C,x);if(!(ba<2)){b.m_localPlaneNormal.SetV(r);
-b.m_localPoint.SetV(m);for(m=r=0;m<y.b2_maxManifoldPoints;++m){s=t[m];if(J.x*s.v.x+J.y*s.v.y-e<=v){C=b.m_points[r];x=f.R;X=s.v.x-f.position.x;$=s.v.y-f.position.y;C.m_localPoint.x=X*x.col1.x+$*x.col1.y;C.m_localPoint.y=X*x.col2.x+$*x.col2.y;C.m_id.Set(s.id);C.m_id.features.flip=T;++r}}b.m_pointCount=r}}}}};M.CollideCircles=function(b,e,f,m,r){b.m_pointCount=0;var s,v;s=f.R;v=e.m_p;var t=f.position.x+(s.col1.x*v.x+s.col2.x*v.y);f=f.position.y+(s.col1.y*v.x+s.col2.y*v.y);s=r.R;v=m.m_p;t=r.position.x+
-(s.col1.x*v.x+s.col2.x*v.y)-t;r=r.position.y+(s.col1.y*v.x+s.col2.y*v.y)-f;s=e.m_radius+m.m_radius;if(!(t*t+r*r>s*s)){b.m_type=E.e_circles;b.m_localPoint.SetV(e.m_p);b.m_localPlaneNormal.SetZero();b.m_pointCount=1;b.m_points[0].m_localPoint.SetV(m.m_p);b.m_points[0].m_id.key=0}};M.CollidePolygonAndCircle=function(b,e,f,m,r){var s=b.m_pointCount=0,v=0,t,x;x=r.R;t=m.m_p;var C=r.position.y+(x.col1.y*t.x+x.col2.y*t.y);s=r.position.x+(x.col1.x*t.x+x.col2.x*t.y)-f.position.x;v=C-f.position.y;x=f.R;f=s*
-x.col1.x+v*x.col1.y;x=s*x.col2.x+v*x.col2.y;var J=0;C=-Number.MAX_VALUE;r=e.m_radius+m.m_radius;var T=parseInt(e.m_vertexCount),P=e.m_vertices;e=e.m_normals;for(var X=0;X<T;++X){t=P[X];s=f-t.x;v=x-t.y;t=e[X];s=t.x*s+t.y*v;if(s>r)return;if(s>C){C=s;J=X}}s=parseInt(J);v=parseInt(s+1<T?s+1:0);t=P[s];P=P[v];if(C<Number.MIN_VALUE){b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.SetV(e[J]);b.m_localPoint.x=0.5*(t.x+P.x);b.m_localPoint.y=0.5*(t.y+P.y)}else{C=(f-P.x)*(t.x-P.x)+(x-P.y)*(t.y-P.y);
-if((f-t.x)*(P.x-t.x)+(x-t.y)*(P.y-t.y)<=0){if((f-t.x)*(f-t.x)+(x-t.y)*(x-t.y)>r*r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=f-t.x;b.m_localPlaneNormal.y=x-t.y;b.m_localPlaneNormal.Normalize();b.m_localPoint.SetV(t)}else if(C<=0){if((f-P.x)*(f-P.x)+(x-P.y)*(x-P.y)>r*r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=f-P.x;b.m_localPlaneNormal.y=x-P.y;b.m_localPlaneNormal.Normalize();b.m_localPoint.SetV(P)}else{J=0.5*(t.x+P.x);t=0.5*(t.y+P.y);C=(f-J)*e[s].x+
-(x-t)*e[s].y;if(C>r)return;b.m_pointCount=1;b.m_type=E.e_faceA;b.m_localPlaneNormal.x=e[s].x;b.m_localPlaneNormal.y=e[s].y;b.m_localPlaneNormal.Normalize();b.m_localPoint.Set(J,t)}}b.m_points[0].m_localPoint.SetV(m.m_p);b.m_points[0].m_id.key=0};M.TestOverlap=function(b,e){var f=e.lowerBound,m=b.upperBound,r=f.x-m.x,s=f.y-m.y;f=b.lowerBound;m=e.upperBound;var v=f.y-m.y;if(r>0||s>0)return false;if(f.x-m.x>0||v>0)return false;return true};Box2D.postDefs.push(function(){Box2D.Collision.b2Collision.s_incidentEdge=
-M.MakeClipPointVector();Box2D.Collision.b2Collision.s_clipPoints1=M.MakeClipPointVector();Box2D.Collision.b2Collision.s_clipPoints2=M.MakeClipPointVector();Box2D.Collision.b2Collision.s_edgeAO=new Vector_a2j_Number(1);Box2D.Collision.b2Collision.s_edgeBO=new Vector_a2j_Number(1);Box2D.Collision.b2Collision.s_localTangent=new p;Box2D.Collision.b2Collision.s_localNormal=new p;Box2D.Collision.b2Collision.s_planePoint=new p;Box2D.Collision.b2Collision.s_normal=new p;Box2D.Collision.b2Collision.s_tangent=
-new p;Box2D.Collision.b2Collision.s_tangent2=new p;Box2D.Collision.b2Collision.s_v11=new p;Box2D.Collision.b2Collision.s_v12=new p;Box2D.Collision.b2Collision.b2CollidePolyTempVec=new p;Box2D.Collision.b2Collision.b2_nullFeature=255});L.b2ContactID=function(){this.features=new c};L.prototype.b2ContactID=function(){this.features._m_id=this};L.prototype.Set=function(b){this.key=b._key};L.prototype.Copy=function(){var b=new L;b.key=this.key;return b};Object.defineProperty(L.prototype,"key",{enumerable:false,
-configurable:true,get:function(){return this._key}});Object.defineProperty(L.prototype,"key",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._key=b;this.features._referenceEdge=this._key&255;this.features._incidentEdge=(this._key&65280)>>8&255;this.features._incidentVertex=(this._key&16711680)>>16&255;this.features._flip=(this._key&4278190080)>>24&255}});I.b2ContactPoint=function(){this.position=new p;this.velocity=new p;this.normal=new p;this.id=new L};W.b2Distance=
-function(){};W.Distance=function(b,e,f){++W.b2_gjkCalls;var m=f.proxyA,r=f.proxyB,s=f.transformA,v=f.transformB,t=W.s_simplex;t.ReadCache(e,m,s,r,v);var x=t.m_vertices,C=W.s_saveA,J=W.s_saveB,T=0;t.GetClosestPoint().LengthSquared();for(var P=0,X,$=0;$<20;){T=t.m_count;for(P=0;P<T;P++){C[P]=x[P].indexA;J[P]=x[P].indexB}switch(t.m_count){case 1:break;case 2:t.Solve2();break;case 3:t.Solve3();break;default:y.b2Assert(false)}if(t.m_count==3)break;X=t.GetClosestPoint();X.LengthSquared();P=t.GetSearchDirection();
-if(P.LengthSquared()<Number.MIN_VALUE*Number.MIN_VALUE)break;X=x[t.m_count];X.indexA=m.GetSupport(w.MulTMV(s.R,P.GetNegative()));X.wA=w.MulX(s,m.GetVertex(X.indexA));X.indexB=r.GetSupport(w.MulTMV(v.R,P));X.wB=w.MulX(v,r.GetVertex(X.indexB));X.w=w.SubtractVV(X.wB,X.wA);++$;++W.b2_gjkIters;var ba=false;for(P=0;P<T;P++)if(X.indexA==C[P]&&X.indexB==J[P]){ba=true;break}if(ba)break;++t.m_count}W.b2_gjkMaxIters=w.Max(W.b2_gjkMaxIters,$);t.GetWitnessPoints(b.pointA,b.pointB);b.distance=w.SubtractVV(b.pointA,
-b.pointB).Length();b.iterations=$;t.WriteCache(e);if(f.useRadii){e=m.m_radius;r=r.m_radius;if(b.distance>e+r&&b.distance>Number.MIN_VALUE){b.distance-=e+r;f=w.SubtractVV(b.pointB,b.pointA);f.Normalize();b.pointA.x+=e*f.x;b.pointA.y+=e*f.y;b.pointB.x-=r*f.x;b.pointB.y-=r*f.y}else{X=new p;X.x=0.5*(b.pointA.x+b.pointB.x);X.y=0.5*(b.pointA.y+b.pointB.y);b.pointA.x=b.pointB.x=X.x;b.pointA.y=b.pointB.y=X.y;b.distance=0}}};Box2D.postDefs.push(function(){Box2D.Collision.b2Distance.s_simplex=new h;Box2D.Collision.b2Distance.s_saveA=
-new Vector_a2j_Number(3);Box2D.Collision.b2Distance.s_saveB=new Vector_a2j_Number(3)});Y.b2DistanceInput=function(){};k.b2DistanceOutput=function(){this.pointA=new p;this.pointB=new p};z.b2DistanceProxy=function(){};z.prototype.Set=function(b){switch(b.GetType()){case K.e_circleShape:b=b instanceof F?b:null;this.m_vertices=new Vector(1,true);this.m_vertices[0]=b.m_p;this.m_count=1;this.m_radius=b.m_radius;break;case K.e_polygonShape:b=b instanceof G?b:null;this.m_vertices=b.m_vertices;this.m_count=
-b.m_vertexCount;this.m_radius=b.m_radius;break;default:y.b2Assert(false)}};z.prototype.GetSupport=function(b){for(var e=0,f=this.m_vertices[0].x*b.x+this.m_vertices[0].y*b.y,m=1;m<this.m_count;++m){var r=this.m_vertices[m].x*b.x+this.m_vertices[m].y*b.y;if(r>f){e=m;f=r}}return e};z.prototype.GetSupportVertex=function(b){for(var e=0,f=this.m_vertices[0].x*b.x+this.m_vertices[0].y*b.y,m=1;m<this.m_count;++m){var r=this.m_vertices[m].x*b.x+this.m_vertices[m].y*b.y;if(r>f){e=m;f=r}}return this.m_vertices[e]};
-z.prototype.GetVertexCount=function(){return this.m_count};z.prototype.GetVertex=function(b){if(b===undefined)b=0;y.b2Assert(0<=b&&b<this.m_count);return this.m_vertices[b]};u.b2DynamicTree=function(){};u.prototype.b2DynamicTree=function(){this.m_freeList=this.m_root=null;this.m_insertionCount=this.m_path=0};u.prototype.CreateProxy=function(b,e){var f=this.AllocateNode(),m=y.b2_aabbExtension,r=y.b2_aabbExtension;f.aabb.lowerBound.x=b.lowerBound.x-m;f.aabb.lowerBound.y=b.lowerBound.y-r;f.aabb.upperBound.x=
-b.upperBound.x+m;f.aabb.upperBound.y=b.upperBound.y+r;f.userData=e;this.InsertLeaf(f);return f};u.prototype.DestroyProxy=function(b){this.RemoveLeaf(b);this.FreeNode(b)};u.prototype.MoveProxy=function(b,e,f){y.b2Assert(b.IsLeaf());if(b.aabb.Contains(e))return false;this.RemoveLeaf(b);var m=y.b2_aabbExtension+y.b2_aabbMultiplier*(f.x>0?f.x:-f.x);f=y.b2_aabbExtension+y.b2_aabbMultiplier*(f.y>0?f.y:-f.y);b.aabb.lowerBound.x=e.lowerBound.x-m;b.aabb.lowerBound.y=e.lowerBound.y-f;b.aabb.upperBound.x=e.upperBound.x+
-m;b.aabb.upperBound.y=e.upperBound.y+f;this.InsertLeaf(b);return true};u.prototype.Rebalance=function(b){if(b===undefined)b=0;if(this.m_root!=null)for(var e=0;e<b;e++){for(var f=this.m_root,m=0;f.IsLeaf()==false;){f=this.m_path>>m&1?f.child2:f.child1;m=m+1&31}++this.m_path;this.RemoveLeaf(f);this.InsertLeaf(f)}};u.prototype.GetFatAABB=function(b){return b.aabb};u.prototype.GetUserData=function(b){return b.userData};u.prototype.Query=function(b,e){if(this.m_root!=null){var f=new Vector,m=0;for(f[m++]=
-this.m_root;m>0;){var r=f[--m];if(r.aabb.TestOverlap(e))if(r.IsLeaf()){if(!b(r))break}else{f[m++]=r.child1;f[m++]=r.child2}}}};u.prototype.RayCast=function(b,e){if(this.m_root!=null){var f=e.p1,m=e.p2,r=w.SubtractVV(f,m);r.Normalize();r=w.CrossFV(1,r);var s=w.AbsV(r),v=e.maxFraction,t=new B,x=0,C=0;x=f.x+v*(m.x-f.x);C=f.y+v*(m.y-f.y);t.lowerBound.x=Math.min(f.x,x);t.lowerBound.y=Math.min(f.y,C);t.upperBound.x=Math.max(f.x,x);t.upperBound.y=Math.max(f.y,C);var J=new Vector,T=0;for(J[T++]=this.m_root;T>
-0;){v=J[--T];if(v.aabb.TestOverlap(t)!=false){x=v.aabb.GetCenter();C=v.aabb.GetExtents();if(!(Math.abs(r.x*(f.x-x.x)+r.y*(f.y-x.y))-s.x*C.x-s.y*C.y>0))if(v.IsLeaf()){x=new S;x.p1=e.p1;x.p2=e.p2;x.maxFraction=e.maxFraction;v=b(x,v);if(v==0)break;if(v>0){x=f.x+v*(m.x-f.x);C=f.y+v*(m.y-f.y);t.lowerBound.x=Math.min(f.x,x);t.lowerBound.y=Math.min(f.y,C);t.upperBound.x=Math.max(f.x,x);t.upperBound.y=Math.max(f.y,C)}}else{J[T++]=v.child1;J[T++]=v.child2}}}}};u.prototype.AllocateNode=function(){if(this.m_freeList){var b=
-this.m_freeList;this.m_freeList=b.parent;b.parent=null;b.child1=null;b.child2=null;return b}return new H};u.prototype.FreeNode=function(b){b.parent=this.m_freeList;this.m_freeList=b};u.prototype.InsertLeaf=function(b){++this.m_insertionCount;if(this.m_root==null){this.m_root=b;this.m_root.parent=null}else{var e=b.aabb.GetCenter(),f=this.m_root;if(f.IsLeaf()==false){do{var m=f.child1;f=f.child2;f=Math.abs((m.aabb.lowerBound.x+m.aabb.upperBound.x)/2-e.x)+Math.abs((m.aabb.lowerBound.y+m.aabb.upperBound.y)/
-2-e.y)<Math.abs((f.aabb.lowerBound.x+f.aabb.upperBound.x)/2-e.x)+Math.abs((f.aabb.lowerBound.y+f.aabb.upperBound.y)/2-e.y)?m:f}while(f.IsLeaf()==false)}e=f.parent;m=this.AllocateNode();m.parent=e;m.userData=null;m.aabb.Combine(b.aabb,f.aabb);if(e){if(f.parent.child1==f)e.child1=m;else e.child2=m;m.child1=f;m.child2=b;f.parent=m;b.parent=m;do{if(e.aabb.Contains(m.aabb))break;e.aabb.Combine(e.child1.aabb,e.child2.aabb);m=e;e=e.parent}while(e)}else{m.child1=f;m.child2=b;f.parent=m;this.m_root=b.parent=
-m}}};u.prototype.RemoveLeaf=function(b){if(b==this.m_root)this.m_root=null;else{var e=b.parent,f=e.parent;b=e.child1==b?e.child2:e.child1;if(f){if(f.child1==e)f.child1=b;else f.child2=b;b.parent=f;for(this.FreeNode(e);f;){e=f.aabb;f.aabb=B.Combine(f.child1.aabb,f.child2.aabb);if(e.Contains(f.aabb))break;f=f.parent}}else{this.m_root=b;b.parent=null;this.FreeNode(e)}}};D.b2DynamicTreeBroadPhase=function(){this.m_tree=new u;this.m_moveBuffer=new Vector;this.m_pairBuffer=new Vector;this.m_pairCount=0};
-D.prototype.CreateProxy=function(b,e){var f=this.m_tree.CreateProxy(b,e);++this.m_proxyCount;this.BufferMove(f);return f};D.prototype.DestroyProxy=function(b){this.UnBufferMove(b);--this.m_proxyCount;this.m_tree.DestroyProxy(b)};D.prototype.MoveProxy=function(b,e,f){this.m_tree.MoveProxy(b,e,f)&&this.BufferMove(b)};D.prototype.TestOverlap=function(b,e){var f=this.m_tree.GetFatAABB(b),m=this.m_tree.GetFatAABB(e);return f.TestOverlap(m)};D.prototype.GetUserData=function(b){return this.m_tree.GetUserData(b)};
-D.prototype.GetFatAABB=function(b){return this.m_tree.GetFatAABB(b)};D.prototype.GetProxyCount=function(){return this.m_proxyCount};D.prototype.UpdatePairs=function(b){var e=this;var f=e.m_pairCount=0,m;for(f=0;f<e.m_moveBuffer.length;++f){m=e.m_moveBuffer[f];var r=e.m_tree.GetFatAABB(m);e.m_tree.Query(function(t){if(t==m)return true;if(e.m_pairCount==e.m_pairBuffer.length)e.m_pairBuffer[e.m_pairCount]=new O;var x=e.m_pairBuffer[e.m_pairCount];x.proxyA=t<m?t:m;x.proxyB=t>=m?t:m;++e.m_pairCount;return true},
-r)}for(f=e.m_moveBuffer.length=0;f<e.m_pairCount;){r=e.m_pairBuffer[f];var s=e.m_tree.GetUserData(r.proxyA),v=e.m_tree.GetUserData(r.proxyB);b(s,v);for(++f;f<e.m_pairCount;){s=e.m_pairBuffer[f];if(s.proxyA!=r.proxyA||s.proxyB!=r.proxyB)break;++f}}};D.prototype.Query=function(b,e){this.m_tree.Query(b,e)};D.prototype.RayCast=function(b,e){this.m_tree.RayCast(b,e)};D.prototype.Validate=function(){};D.prototype.Rebalance=function(b){if(b===undefined)b=0;this.m_tree.Rebalance(b)};D.prototype.BufferMove=
-function(b){this.m_moveBuffer[this.m_moveBuffer.length]=b};D.prototype.UnBufferMove=function(b){this.m_moveBuffer.splice(parseInt(this.m_moveBuffer.indexOf(b)),1)};D.prototype.ComparePairs=function(){return 0};D.__implements={};D.__implements[g]=true;H.b2DynamicTreeNode=function(){this.aabb=new B};H.prototype.IsLeaf=function(){return this.child1==null};O.b2DynamicTreePair=function(){};E.b2Manifold=function(){this.m_pointCount=0};E.prototype.b2Manifold=function(){this.m_points=new Vector(y.b2_maxManifoldPoints);
-for(var b=0;b<y.b2_maxManifoldPoints;b++)this.m_points[b]=new R;this.m_localPlaneNormal=new p;this.m_localPoint=new p};E.prototype.Reset=function(){for(var b=0;b<y.b2_maxManifoldPoints;b++)(this.m_points[b]instanceof R?this.m_points[b]:null).Reset();this.m_localPlaneNormal.SetZero();this.m_localPoint.SetZero();this.m_pointCount=this.m_type=0};E.prototype.Set=function(b){this.m_pointCount=b.m_pointCount;for(var e=0;e<y.b2_maxManifoldPoints;e++)(this.m_points[e]instanceof R?this.m_points[e]:null).Set(b.m_points[e]);
-this.m_localPlaneNormal.SetV(b.m_localPlaneNormal);this.m_localPoint.SetV(b.m_localPoint);this.m_type=b.m_type};E.prototype.Copy=function(){var b=new E;b.Set(this);return b};Box2D.postDefs.push(function(){Box2D.Collision.b2Manifold.e_circles=1;Box2D.Collision.b2Manifold.e_faceA=2;Box2D.Collision.b2Manifold.e_faceB=4});R.b2ManifoldPoint=function(){this.m_localPoint=new p;this.m_id=new L};R.prototype.b2ManifoldPoint=function(){this.Reset()};R.prototype.Reset=function(){this.m_localPoint.SetZero();this.m_tangentImpulse=
-this.m_normalImpulse=0;this.m_id.key=0};R.prototype.Set=function(b){this.m_localPoint.SetV(b.m_localPoint);this.m_normalImpulse=b.m_normalImpulse;this.m_tangentImpulse=b.m_tangentImpulse;this.m_id.Set(b.m_id)};N.b2Point=function(){this.p=new p};N.prototype.Support=function(){return this.p};N.prototype.GetFirstVertex=function(){return this.p};S.b2RayCastInput=function(){this.p1=new p;this.p2=new p};S.prototype.b2RayCastInput=function(b,e,f){if(b===undefined)b=null;if(e===undefined)e=null;if(f===undefined)f=
-1;b&&this.p1.SetV(b);e&&this.p2.SetV(e);this.maxFraction=f};aa.b2RayCastOutput=function(){this.normal=new p};Z.b2Segment=function(){this.p1=new p;this.p2=new p};Z.prototype.TestSegment=function(b,e,f,m){if(m===undefined)m=0;var r=f.p1,s=f.p2.x-r.x,v=f.p2.y-r.y;f=this.p2.y-this.p1.y;var t=-(this.p2.x-this.p1.x),x=100*Number.MIN_VALUE,C=-(s*f+v*t);if(C>x){var J=r.x-this.p1.x,T=r.y-this.p1.y;r=J*f+T*t;if(0<=r&&r<=m*C){m=-s*T+v*J;if(-x*C<=m&&m<=C*(1+x)){r/=C;m=Math.sqrt(f*f+t*t);f/=m;t/=m;b[0]=r;e.Set(f,
-t);return true}}}return false};Z.prototype.Extend=function(b){this.ExtendForward(b);this.ExtendBackward(b)};Z.prototype.ExtendForward=function(b){var e=this.p2.x-this.p1.x,f=this.p2.y-this.p1.y;b=Math.min(e>0?(b.upperBound.x-this.p1.x)/e:e<0?(b.lowerBound.x-this.p1.x)/e:Number.POSITIVE_INFINITY,f>0?(b.upperBound.y-this.p1.y)/f:f<0?(b.lowerBound.y-this.p1.y)/f:Number.POSITIVE_INFINITY);this.p2.x=this.p1.x+e*b;this.p2.y=this.p1.y+f*b};Z.prototype.ExtendBackward=function(b){var e=-this.p2.x+this.p1.x,
-f=-this.p2.y+this.p1.y;b=Math.min(e>0?(b.upperBound.x-this.p2.x)/e:e<0?(b.lowerBound.x-this.p2.x)/e:Number.POSITIVE_INFINITY,f>0?(b.upperBound.y-this.p2.y)/f:f<0?(b.lowerBound.y-this.p2.y)/f:Number.POSITIVE_INFINITY);this.p1.x=this.p2.x+e*b;this.p1.y=this.p2.y+f*b};d.b2SeparationFunction=function(){this.m_localPoint=new p;this.m_axis=new p};d.prototype.Initialize=function(b,e,f,m,r){this.m_proxyA=e;this.m_proxyB=m;var s=parseInt(b.count);y.b2Assert(0<s&&s<3);var v,t,x,C,J=C=x=m=e=0,T=0;J=0;if(s==
-1){this.m_type=d.e_points;v=this.m_proxyA.GetVertex(b.indexA[0]);t=this.m_proxyB.GetVertex(b.indexB[0]);s=v;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=t;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);this.m_axis.x=x-e;this.m_axis.y=C-m;this.m_axis.Normalize()}else{if(b.indexB[0]==b.indexB[1]){this.m_type=d.e_faceA;e=this.m_proxyA.GetVertex(b.indexA[0]);m=this.m_proxyA.GetVertex(b.indexA[1]);t=this.m_proxyB.GetVertex(b.indexB[0]);
-this.m_localPoint.x=0.5*(e.x+m.x);this.m_localPoint.y=0.5*(e.y+m.y);this.m_axis=w.CrossVF(w.SubtractVV(m,e),1);this.m_axis.Normalize();s=this.m_axis;b=f.R;J=b.col1.x*s.x+b.col2.x*s.y;T=b.col1.y*s.x+b.col2.y*s.y;s=this.m_localPoint;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=t;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);J=(x-e)*J+(C-m)*T}else if(b.indexA[0]==b.indexA[0]){this.m_type=d.e_faceB;x=this.m_proxyB.GetVertex(b.indexB[0]);
-C=this.m_proxyB.GetVertex(b.indexB[1]);v=this.m_proxyA.GetVertex(b.indexA[0]);this.m_localPoint.x=0.5*(x.x+C.x);this.m_localPoint.y=0.5*(x.y+C.y);this.m_axis=w.CrossVF(w.SubtractVV(C,x),1);this.m_axis.Normalize();s=this.m_axis;b=r.R;J=b.col1.x*s.x+b.col2.x*s.y;T=b.col1.y*s.x+b.col2.y*s.y;s=this.m_localPoint;b=r.R;x=r.position.x+(b.col1.x*s.x+b.col2.x*s.y);C=r.position.y+(b.col1.y*s.x+b.col2.y*s.y);s=v;b=f.R;e=f.position.x+(b.col1.x*s.x+b.col2.x*s.y);m=f.position.y+(b.col1.y*s.x+b.col2.y*s.y);J=(e-
-x)*J+(m-C)*T}else{e=this.m_proxyA.GetVertex(b.indexA[0]);m=this.m_proxyA.GetVertex(b.indexA[1]);x=this.m_proxyB.GetVertex(b.indexB[0]);C=this.m_proxyB.GetVertex(b.indexB[1]);w.MulX(f,v);v=w.MulMV(f.R,w.SubtractVV(m,e));w.MulX(r,t);J=w.MulMV(r.R,w.SubtractVV(C,x));r=v.x*v.x+v.y*v.y;t=J.x*J.x+J.y*J.y;b=w.SubtractVV(J,v);f=v.x*b.x+v.y*b.y;b=J.x*b.x+J.y*b.y;v=v.x*J.x+v.y*J.y;T=r*t-v*v;J=0;if(T!=0)J=w.Clamp((v*b-f*t)/T,0,1);if((v*J+b)/t<0)J=w.Clamp((v-f)/r,0,1);v=new p;v.x=e.x+J*(m.x-e.x);v.y=e.y+J*(m.y-
-e.y);t=new p;t.x=x.x+J*(C.x-x.x);t.y=x.y+J*(C.y-x.y);if(J==0||J==1){this.m_type=d.e_faceB;this.m_axis=w.CrossVF(w.SubtractVV(C,x),1);this.m_axis.Normalize();this.m_localPoint=t}else{this.m_type=d.e_faceA;this.m_axis=w.CrossVF(w.SubtractVV(m,e),1);this.m_localPoint=v}}J<0&&this.m_axis.NegativeSelf()}};d.prototype.Evaluate=function(b,e){var f,m,r=0;switch(this.m_type){case d.e_points:f=w.MulTMV(b.R,this.m_axis);m=w.MulTMV(e.R,this.m_axis.GetNegative());f=this.m_proxyA.GetSupportVertex(f);m=this.m_proxyB.GetSupportVertex(m);
-f=w.MulX(b,f);m=w.MulX(e,m);return r=(m.x-f.x)*this.m_axis.x+(m.y-f.y)*this.m_axis.y;case d.e_faceA:r=w.MulMV(b.R,this.m_axis);f=w.MulX(b,this.m_localPoint);m=w.MulTMV(e.R,r.GetNegative());m=this.m_proxyB.GetSupportVertex(m);m=w.MulX(e,m);return r=(m.x-f.x)*r.x+(m.y-f.y)*r.y;case d.e_faceB:r=w.MulMV(e.R,this.m_axis);m=w.MulX(e,this.m_localPoint);f=w.MulTMV(b.R,r.GetNegative());f=this.m_proxyA.GetSupportVertex(f);f=w.MulX(b,f);return r=(f.x-m.x)*r.x+(f.y-m.y)*r.y;default:y.b2Assert(false);return 0}};
-Box2D.postDefs.push(function(){Box2D.Collision.b2SeparationFunction.e_points=1;Box2D.Collision.b2SeparationFunction.e_faceA=2;Box2D.Collision.b2SeparationFunction.e_faceB=4});h.b2Simplex=function(){this.m_v1=new j;this.m_v2=new j;this.m_v3=new j;this.m_vertices=new Vector(3)};h.prototype.b2Simplex=function(){this.m_vertices[0]=this.m_v1;this.m_vertices[1]=this.m_v2;this.m_vertices[2]=this.m_v3};h.prototype.ReadCache=function(b,e,f,m,r){y.b2Assert(0<=b.count&&b.count<=3);var s,v;this.m_count=b.count;
-for(var t=this.m_vertices,x=0;x<this.m_count;x++){var C=t[x];C.indexA=b.indexA[x];C.indexB=b.indexB[x];s=e.GetVertex(C.indexA);v=m.GetVertex(C.indexB);C.wA=w.MulX(f,s);C.wB=w.MulX(r,v);C.w=w.SubtractVV(C.wB,C.wA);C.a=0}if(this.m_count>1){b=b.metric;s=this.GetMetric();if(s<0.5*b||2*b<s||s<Number.MIN_VALUE)this.m_count=0}if(this.m_count==0){C=t[0];C.indexA=0;C.indexB=0;s=e.GetVertex(0);v=m.GetVertex(0);C.wA=w.MulX(f,s);C.wB=w.MulX(r,v);C.w=w.SubtractVV(C.wB,C.wA);this.m_count=1}};h.prototype.WriteCache=
-function(b){b.metric=this.GetMetric();b.count=Box2D.parseUInt(this.m_count);for(var e=this.m_vertices,f=0;f<this.m_count;f++){b.indexA[f]=Box2D.parseUInt(e[f].indexA);b.indexB[f]=Box2D.parseUInt(e[f].indexB)}};h.prototype.GetSearchDirection=function(){switch(this.m_count){case 1:return this.m_v1.w.GetNegative();case 2:var b=w.SubtractVV(this.m_v2.w,this.m_v1.w);return w.CrossVV(b,this.m_v1.w.GetNegative())>0?w.CrossFV(1,b):w.CrossVF(b,1);default:y.b2Assert(false);return new p}};h.prototype.GetClosestPoint=
-function(){switch(this.m_count){case 0:y.b2Assert(false);return new p;case 1:return this.m_v1.w;case 2:return new p(this.m_v1.a*this.m_v1.w.x+this.m_v2.a*this.m_v2.w.x,this.m_v1.a*this.m_v1.w.y+this.m_v2.a*this.m_v2.w.y);default:y.b2Assert(false);return new p}};h.prototype.GetWitnessPoints=function(b,e){switch(this.m_count){case 0:y.b2Assert(false);break;case 1:b.SetV(this.m_v1.wA);e.SetV(this.m_v1.wB);break;case 2:b.x=this.m_v1.a*this.m_v1.wA.x+this.m_v2.a*this.m_v2.wA.x;b.y=this.m_v1.a*this.m_v1.wA.y+
-this.m_v2.a*this.m_v2.wA.y;e.x=this.m_v1.a*this.m_v1.wB.x+this.m_v2.a*this.m_v2.wB.x;e.y=this.m_v1.a*this.m_v1.wB.y+this.m_v2.a*this.m_v2.wB.y;break;case 3:e.x=b.x=this.m_v1.a*this.m_v1.wA.x+this.m_v2.a*this.m_v2.wA.x+this.m_v3.a*this.m_v3.wA.x;e.y=b.y=this.m_v1.a*this.m_v1.wA.y+this.m_v2.a*this.m_v2.wA.y+this.m_v3.a*this.m_v3.wA.y;break;default:y.b2Assert(false)}};h.prototype.GetMetric=function(){switch(this.m_count){case 0:y.b2Assert(false);return 0;case 1:return 0;case 2:return w.SubtractVV(this.m_v1.w,
-this.m_v2.w).Length();case 3:return w.CrossVV(w.SubtractVV(this.m_v2.w,this.m_v1.w),w.SubtractVV(this.m_v3.w,this.m_v1.w));default:y.b2Assert(false);return 0}};h.prototype.Solve2=function(){var b=this.m_v1.w,e=this.m_v2.w,f=w.SubtractVV(e,b);b=-(b.x*f.x+b.y*f.y);if(b<=0)this.m_count=this.m_v1.a=1;else{e=e.x*f.x+e.y*f.y;if(e<=0){this.m_count=this.m_v2.a=1;this.m_v1.Set(this.m_v2)}else{f=1/(e+b);this.m_v1.a=e*f;this.m_v2.a=b*f;this.m_count=2}}};h.prototype.Solve3=function(){var b=this.m_v1.w,e=this.m_v2.w,
-f=this.m_v3.w,m=w.SubtractVV(e,b),r=w.Dot(b,m),s=w.Dot(e,m);r=-r;var v=w.SubtractVV(f,b),t=w.Dot(b,v),x=w.Dot(f,v);t=-t;var C=w.SubtractVV(f,e),J=w.Dot(e,C);C=w.Dot(f,C);J=-J;v=w.CrossVV(m,v);m=v*w.CrossVV(e,f);f=v*w.CrossVV(f,b);b=v*w.CrossVV(b,e);if(r<=0&&t<=0)this.m_count=this.m_v1.a=1;else if(s>0&&r>0&&b<=0){x=1/(s+r);this.m_v1.a=s*x;this.m_v2.a=r*x;this.m_count=2}else if(x>0&&t>0&&f<=0){s=1/(x+t);this.m_v1.a=x*s;this.m_v3.a=t*s;this.m_count=2;this.m_v2.Set(this.m_v3)}else if(s<=0&&J<=0){this.m_count=
-this.m_v2.a=1;this.m_v1.Set(this.m_v2)}else if(x<=0&&C<=0){this.m_count=this.m_v3.a=1;this.m_v1.Set(this.m_v3)}else if(C>0&&J>0&&m<=0){s=1/(C+J);this.m_v2.a=C*s;this.m_v3.a=J*s;this.m_count=2;this.m_v1.Set(this.m_v3)}else{s=1/(m+f+b);this.m_v1.a=m*s;this.m_v2.a=f*s;this.m_v3.a=b*s;this.m_count=3}};l.b2SimplexCache=function(){this.indexA=new Vector_a2j_Number(3);this.indexB=new Vector_a2j_Number(3)};j.b2SimplexVertex=function(){};j.prototype.Set=function(b){this.wA.SetV(b.wA);this.wB.SetV(b.wB);this.w.SetV(b.w);
-this.a=b.a;this.indexA=b.indexA;this.indexB=b.indexB};o.b2TimeOfImpact=function(){};o.TimeOfImpact=function(b){++o.b2_toiCalls;var e=b.proxyA,f=b.proxyB,m=b.sweepA,r=b.sweepB;y.b2Assert(m.t0==r.t0);y.b2Assert(1-m.t0>Number.MIN_VALUE);var s=e.m_radius+f.m_radius;b=b.tolerance;var v=0,t=0,x=0;o.s_cache.count=0;for(o.s_distanceInput.useRadii=false;;){m.GetTransform(o.s_xfA,v);r.GetTransform(o.s_xfB,v);o.s_distanceInput.proxyA=e;o.s_distanceInput.proxyB=f;o.s_distanceInput.transformA=o.s_xfA;o.s_distanceInput.transformB=
-o.s_xfB;W.Distance(o.s_distanceOutput,o.s_cache,o.s_distanceInput);if(o.s_distanceOutput.distance<=0){v=1;break}o.s_fcn.Initialize(o.s_cache,e,o.s_xfA,f,o.s_xfB);var C=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(C<=0){v=1;break}if(t==0)x=C>s?w.Max(s-b,0.75*s):w.Max(C-b,0.02*s);if(C-x<0.5*b){if(t==0){v=1;break}break}var J=v,T=v,P=1;C=C;m.GetTransform(o.s_xfA,P);r.GetTransform(o.s_xfB,P);var X=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(X>=x){v=1;break}for(var $=0;;){var ba=0;ba=$&1?T+(x-C)*(P-T)/(X-C):0.5*(T+P);
-m.GetTransform(o.s_xfA,ba);r.GetTransform(o.s_xfB,ba);var ca=o.s_fcn.Evaluate(o.s_xfA,o.s_xfB);if(w.Abs(ca-x)<0.025*b){J=ba;break}if(ca>x){T=ba;C=ca}else{P=ba;X=ca}++$;++o.b2_toiRootIters;if($==50)break}o.b2_toiMaxRootIters=w.Max(o.b2_toiMaxRootIters,$);if(J<(1+100*Number.MIN_VALUE)*v)break;v=J;t++;++o.b2_toiIters;if(t==1E3)break}o.b2_toiMaxIters=w.Max(o.b2_toiMaxIters,t);return v};Box2D.postDefs.push(function(){Box2D.Collision.b2TimeOfImpact.b2_toiCalls=0;Box2D.Collision.b2TimeOfImpact.b2_toiIters=
-0;Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters=0;Box2D.Collision.b2TimeOfImpact.b2_toiRootIters=0;Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters=0;Box2D.Collision.b2TimeOfImpact.s_cache=new l;Box2D.Collision.b2TimeOfImpact.s_distanceInput=new Y;Box2D.Collision.b2TimeOfImpact.s_xfA=new U;Box2D.Collision.b2TimeOfImpact.s_xfB=new U;Box2D.Collision.b2TimeOfImpact.s_fcn=new d;Box2D.Collision.b2TimeOfImpact.s_distanceOutput=new k});q.b2TOIInput=function(){this.proxyA=new z;this.proxyB=new z;this.sweepA=
-new A;this.sweepB=new A};n.b2WorldManifold=function(){this.m_normal=new p};n.prototype.b2WorldManifold=function(){this.m_points=new Vector(y.b2_maxManifoldPoints);for(var b=0;b<y.b2_maxManifoldPoints;b++)this.m_points[b]=new p};n.prototype.Initialize=function(b,e,f,m,r){if(f===undefined)f=0;if(r===undefined)r=0;if(b.m_pointCount!=0){var s=0,v,t,x=0,C=0,J=0,T=0,P=0;v=0;switch(b.m_type){case E.e_circles:t=e.R;v=b.m_localPoint;s=e.position.x+t.col1.x*v.x+t.col2.x*v.y;e=e.position.y+t.col1.y*v.x+t.col2.y*
-v.y;t=m.R;v=b.m_points[0].m_localPoint;b=m.position.x+t.col1.x*v.x+t.col2.x*v.y;m=m.position.y+t.col1.y*v.x+t.col2.y*v.y;v=b-s;t=m-e;x=v*v+t*t;if(x>Number.MIN_VALUE*Number.MIN_VALUE){x=Math.sqrt(x);this.m_normal.x=v/x;this.m_normal.y=t/x}else{this.m_normal.x=1;this.m_normal.y=0}v=e+f*this.m_normal.y;m=m-r*this.m_normal.y;this.m_points[0].x=0.5*(s+f*this.m_normal.x+(b-r*this.m_normal.x));this.m_points[0].y=0.5*(v+m);break;case E.e_faceA:t=e.R;v=b.m_localPlaneNormal;x=t.col1.x*v.x+t.col2.x*v.y;C=t.col1.y*
-v.x+t.col2.y*v.y;t=e.R;v=b.m_localPoint;J=e.position.x+t.col1.x*v.x+t.col2.x*v.y;T=e.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_normal.x=x;this.m_normal.y=C;for(s=0;s<b.m_pointCount;s++){t=m.R;v=b.m_points[s].m_localPoint;P=m.position.x+t.col1.x*v.x+t.col2.x*v.y;v=m.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_points[s].x=P+0.5*(f-(P-J)*x-(v-T)*C-r)*x;this.m_points[s].y=v+0.5*(f-(P-J)*x-(v-T)*C-r)*C}break;case E.e_faceB:t=m.R;v=b.m_localPlaneNormal;x=t.col1.x*v.x+t.col2.x*v.y;C=t.col1.y*v.x+t.col2.y*
-v.y;t=m.R;v=b.m_localPoint;J=m.position.x+t.col1.x*v.x+t.col2.x*v.y;T=m.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_normal.x=-x;this.m_normal.y=-C;for(s=0;s<b.m_pointCount;s++){t=e.R;v=b.m_points[s].m_localPoint;P=e.position.x+t.col1.x*v.x+t.col2.x*v.y;v=e.position.y+t.col1.y*v.x+t.col2.y*v.y;this.m_points[s].x=P+0.5*(r-(P-J)*x-(v-T)*C-f)*x;this.m_points[s].y=v+0.5*(r-(P-J)*x-(v-T)*C-f)*C}}}};a.ClipVertex=function(){this.v=new p;this.id=new L};a.prototype.Set=function(b){this.v.SetV(b.v);this.id.Set(b.id)};
-c.Features=function(){};Object.defineProperty(c.prototype,"referenceEdge",{enumerable:false,configurable:true,get:function(){return this._referenceEdge}});Object.defineProperty(c.prototype,"referenceEdge",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._referenceEdge=b;this._m_id._key=this._m_id._key&4294967040|this._referenceEdge&255}});Object.defineProperty(c.prototype,"incidentEdge",{enumerable:false,configurable:true,get:function(){return this._incidentEdge}});Object.defineProperty(c.prototype,
-"incidentEdge",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._incidentEdge=b;this._m_id._key=this._m_id._key&4294902015|this._incidentEdge<<8&65280}});Object.defineProperty(c.prototype,"incidentVertex",{enumerable:false,configurable:true,get:function(){return this._incidentVertex}});Object.defineProperty(c.prototype,"incidentVertex",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._incidentVertex=b;this._m_id._key=this._m_id._key&4278255615|
-this._incidentVertex<<16&16711680}});Object.defineProperty(c.prototype,"flip",{enumerable:false,configurable:true,get:function(){return this._flip}});Object.defineProperty(c.prototype,"flip",{enumerable:false,configurable:true,set:function(b){if(b===undefined)b=0;this._flip=b;this._m_id._key=this._m_id._key&16777215|this._flip<<24&4278190080}})})();
-(function(){var F=Box2D.Common.b2Settings,G=Box2D.Collision.Shapes.b2CircleShape,K=Box2D.Collision.Shapes.b2EdgeChainDef,y=Box2D.Collision.Shapes.b2EdgeShape,w=Box2D.Collision.Shapes.b2MassData,A=Box2D.Collision.Shapes.b2PolygonShape,U=Box2D.Collision.Shapes.b2Shape,p=Box2D.Common.Math.b2Mat22,B=Box2D.Common.Math.b2Math,Q=Box2D.Common.Math.b2Transform,V=Box2D.Common.Math.b2Vec2,M=Box2D.Collision.b2Distance,L=Box2D.Collision.b2DistanceInput,I=Box2D.Collision.b2DistanceOutput,W=Box2D.Collision.b2DistanceProxy,
-Y=Box2D.Collision.b2SimplexCache;Box2D.inherit(G,Box2D.Collision.Shapes.b2Shape);G.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;G.b2CircleShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments);this.m_p=new V};G.prototype.Copy=function(){var k=new G;k.Set(this);return k};G.prototype.Set=function(k){this.__super.Set.call(this,k);if(Box2D.is(k,G))this.m_p.SetV((k instanceof G?k:null).m_p)};G.prototype.TestPoint=function(k,z){var u=k.R,D=k.position.x+(u.col1.x*this.m_p.x+
-u.col2.x*this.m_p.y);u=k.position.y+(u.col1.y*this.m_p.x+u.col2.y*this.m_p.y);D=z.x-D;u=z.y-u;return D*D+u*u<=this.m_radius*this.m_radius};G.prototype.RayCast=function(k,z,u){var D=u.R,H=z.p1.x-(u.position.x+(D.col1.x*this.m_p.x+D.col2.x*this.m_p.y));u=z.p1.y-(u.position.y+(D.col1.y*this.m_p.x+D.col2.y*this.m_p.y));D=z.p2.x-z.p1.x;var O=z.p2.y-z.p1.y,E=H*D+u*O,R=D*D+O*O,N=E*E-R*(H*H+u*u-this.m_radius*this.m_radius);if(N<0||R<Number.MIN_VALUE)return false;E=-(E+Math.sqrt(N));if(0<=E&&E<=z.maxFraction*
-R){E/=R;k.fraction=E;k.normal.x=H+E*D;k.normal.y=u+E*O;k.normal.Normalize();return true}return false};G.prototype.ComputeAABB=function(k,z){var u=z.R,D=z.position.x+(u.col1.x*this.m_p.x+u.col2.x*this.m_p.y);u=z.position.y+(u.col1.y*this.m_p.x+u.col2.y*this.m_p.y);k.lowerBound.Set(D-this.m_radius,u-this.m_radius);k.upperBound.Set(D+this.m_radius,u+this.m_radius)};G.prototype.ComputeMass=function(k,z){if(z===undefined)z=0;k.mass=z*F.b2_pi*this.m_radius*this.m_radius;k.center.SetV(this.m_p);k.I=k.mass*
-(0.5*this.m_radius*this.m_radius+(this.m_p.x*this.m_p.x+this.m_p.y*this.m_p.y))};G.prototype.ComputeSubmergedArea=function(k,z,u,D){if(z===undefined)z=0;u=B.MulX(u,this.m_p);var H=-(B.Dot(k,u)-z);if(H<-this.m_radius+Number.MIN_VALUE)return 0;if(H>this.m_radius){D.SetV(u);return Math.PI*this.m_radius*this.m_radius}z=this.m_radius*this.m_radius;var O=H*H;H=z*(Math.asin(H/this.m_radius)+Math.PI/2)+H*Math.sqrt(z-O);z=-2/3*Math.pow(z-O,1.5)/H;D.x=u.x+k.x*z;D.y=u.y+k.y*z;return H};G.prototype.GetLocalPosition=
-function(){return this.m_p};G.prototype.SetLocalPosition=function(k){this.m_p.SetV(k)};G.prototype.GetRadius=function(){return this.m_radius};G.prototype.SetRadius=function(k){if(k===undefined)k=0;this.m_radius=k};G.prototype.b2CircleShape=function(k){if(k===undefined)k=0;this.__super.b2Shape.call(this);this.m_type=U.e_circleShape;this.m_radius=k};K.b2EdgeChainDef=function(){};K.prototype.b2EdgeChainDef=function(){this.vertexCount=0;this.isALoop=true;this.vertices=[]};Box2D.inherit(y,Box2D.Collision.Shapes.b2Shape);
-y.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;y.b2EdgeShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments);this.s_supportVec=new V;this.m_v1=new V;this.m_v2=new V;this.m_coreV1=new V;this.m_coreV2=new V;this.m_normal=new V;this.m_direction=new V;this.m_cornerDir1=new V;this.m_cornerDir2=new V};y.prototype.TestPoint=function(){return false};y.prototype.RayCast=function(k,z,u){var D,H=z.p2.x-z.p1.x,O=z.p2.y-z.p1.y;D=u.R;var E=u.position.x+(D.col1.x*this.m_v1.x+
-D.col2.x*this.m_v1.y),R=u.position.y+(D.col1.y*this.m_v1.x+D.col2.y*this.m_v1.y),N=u.position.y+(D.col1.y*this.m_v2.x+D.col2.y*this.m_v2.y)-R;u=-(u.position.x+(D.col1.x*this.m_v2.x+D.col2.x*this.m_v2.y)-E);D=100*Number.MIN_VALUE;var S=-(H*N+O*u);if(S>D){E=z.p1.x-E;var aa=z.p1.y-R;R=E*N+aa*u;if(0<=R&&R<=z.maxFraction*S){z=-H*aa+O*E;if(-D*S<=z&&z<=S*(1+D)){R/=S;k.fraction=R;z=Math.sqrt(N*N+u*u);k.normal.x=N/z;k.normal.y=u/z;return true}}}return false};y.prototype.ComputeAABB=function(k,z){var u=z.R,
-D=z.position.x+(u.col1.x*this.m_v1.x+u.col2.x*this.m_v1.y),H=z.position.y+(u.col1.y*this.m_v1.x+u.col2.y*this.m_v1.y),O=z.position.x+(u.col1.x*this.m_v2.x+u.col2.x*this.m_v2.y);u=z.position.y+(u.col1.y*this.m_v2.x+u.col2.y*this.m_v2.y);if(D<O){k.lowerBound.x=D;k.upperBound.x=O}else{k.lowerBound.x=O;k.upperBound.x=D}if(H<u){k.lowerBound.y=H;k.upperBound.y=u}else{k.lowerBound.y=u;k.upperBound.y=H}};y.prototype.ComputeMass=function(k){k.mass=0;k.center.SetV(this.m_v1);k.I=0};y.prototype.ComputeSubmergedArea=
-function(k,z,u,D){if(z===undefined)z=0;var H=new V(k.x*z,k.y*z),O=B.MulX(u,this.m_v1);u=B.MulX(u,this.m_v2);var E=B.Dot(k,O)-z;k=B.Dot(k,u)-z;if(E>0)if(k>0)return 0;else{O.x=-k/(E-k)*O.x+E/(E-k)*u.x;O.y=-k/(E-k)*O.y+E/(E-k)*u.y}else if(k>0){u.x=-k/(E-k)*O.x+E/(E-k)*u.x;u.y=-k/(E-k)*O.y+E/(E-k)*u.y}D.x=(H.x+O.x+u.x)/3;D.y=(H.y+O.y+u.y)/3;return 0.5*((O.x-H.x)*(u.y-H.y)-(O.y-H.y)*(u.x-H.x))};y.prototype.GetLength=function(){return this.m_length};y.prototype.GetVertex1=function(){return this.m_v1};y.prototype.GetVertex2=
-function(){return this.m_v2};y.prototype.GetCoreVertex1=function(){return this.m_coreV1};y.prototype.GetCoreVertex2=function(){return this.m_coreV2};y.prototype.GetNormalVector=function(){return this.m_normal};y.prototype.GetDirectionVector=function(){return this.m_direction};y.prototype.GetCorner1Vector=function(){return this.m_cornerDir1};y.prototype.GetCorner2Vector=function(){return this.m_cornerDir2};y.prototype.Corner1IsConvex=function(){return this.m_cornerConvex1};y.prototype.Corner2IsConvex=
-function(){return this.m_cornerConvex2};y.prototype.GetFirstVertex=function(k){var z=k.R;return new V(k.position.x+(z.col1.x*this.m_coreV1.x+z.col2.x*this.m_coreV1.y),k.position.y+(z.col1.y*this.m_coreV1.x+z.col2.y*this.m_coreV1.y))};y.prototype.GetNextEdge=function(){return this.m_nextEdge};y.prototype.GetPrevEdge=function(){return this.m_prevEdge};y.prototype.Support=function(k,z,u){if(z===undefined)z=0;if(u===undefined)u=0;var D=k.R,H=k.position.x+(D.col1.x*this.m_coreV1.x+D.col2.x*this.m_coreV1.y),
-O=k.position.y+(D.col1.y*this.m_coreV1.x+D.col2.y*this.m_coreV1.y),E=k.position.x+(D.col1.x*this.m_coreV2.x+D.col2.x*this.m_coreV2.y);k=k.position.y+(D.col1.y*this.m_coreV2.x+D.col2.y*this.m_coreV2.y);if(H*z+O*u>E*z+k*u){this.s_supportVec.x=H;this.s_supportVec.y=O}else{this.s_supportVec.x=E;this.s_supportVec.y=k}return this.s_supportVec};y.prototype.b2EdgeShape=function(k,z){this.__super.b2Shape.call(this);this.m_type=U.e_edgeShape;this.m_nextEdge=this.m_prevEdge=null;this.m_v1=k;this.m_v2=z;this.m_direction.Set(this.m_v2.x-
-this.m_v1.x,this.m_v2.y-this.m_v1.y);this.m_length=this.m_direction.Normalize();this.m_normal.Set(this.m_direction.y,-this.m_direction.x);this.m_coreV1.Set(-F.b2_toiSlop*(this.m_normal.x-this.m_direction.x)+this.m_v1.x,-F.b2_toiSlop*(this.m_normal.y-this.m_direction.y)+this.m_v1.y);this.m_coreV2.Set(-F.b2_toiSlop*(this.m_normal.x+this.m_direction.x)+this.m_v2.x,-F.b2_toiSlop*(this.m_normal.y+this.m_direction.y)+this.m_v2.y);this.m_cornerDir1=this.m_normal;this.m_cornerDir2.Set(-this.m_normal.x,-this.m_normal.y)};
-y.prototype.SetPrevEdge=function(k,z,u,D){this.m_prevEdge=k;this.m_coreV1=z;this.m_cornerDir1=u;this.m_cornerConvex1=D};y.prototype.SetNextEdge=function(k,z,u,D){this.m_nextEdge=k;this.m_coreV2=z;this.m_cornerDir2=u;this.m_cornerConvex2=D};w.b2MassData=function(){this.mass=0;this.center=new V(0,0);this.I=0};Box2D.inherit(A,Box2D.Collision.Shapes.b2Shape);A.prototype.__super=Box2D.Collision.Shapes.b2Shape.prototype;A.b2PolygonShape=function(){Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this,arguments)};
-A.prototype.Copy=function(){var k=new A;k.Set(this);return k};A.prototype.Set=function(k){this.__super.Set.call(this,k);if(Box2D.is(k,A)){k=k instanceof A?k:null;this.m_centroid.SetV(k.m_centroid);this.m_vertexCount=k.m_vertexCount;this.Reserve(this.m_vertexCount);for(var z=0;z<this.m_vertexCount;z++){this.m_vertices[z].SetV(k.m_vertices[z]);this.m_normals[z].SetV(k.m_normals[z])}}};A.prototype.SetAsArray=function(k,z){if(z===undefined)z=0;var u=new Vector,D=0,H;for(D=0;D<k.length;++D){H=k[D];u.push(H)}this.SetAsVector(u,
-z)};A.AsArray=function(k,z){if(z===undefined)z=0;var u=new A;u.SetAsArray(k,z);return u};A.prototype.SetAsVector=function(k,z){if(z===undefined)z=0;if(z==0)z=k.length;F.b2Assert(2<=z);this.m_vertexCount=z;this.Reserve(z);var u=0;for(u=0;u<this.m_vertexCount;u++)this.m_vertices[u].SetV(k[u]);for(u=0;u<this.m_vertexCount;++u){var D=parseInt(u),H=parseInt(u+1<this.m_vertexCount?u+1:0);D=B.SubtractVV(this.m_vertices[H],this.m_vertices[D]);F.b2Assert(D.LengthSquared()>Number.MIN_VALUE);this.m_normals[u].SetV(B.CrossVF(D,
-1));this.m_normals[u].Normalize()}this.m_centroid=A.ComputeCentroid(this.m_vertices,this.m_vertexCount)};A.AsVector=function(k,z){if(z===undefined)z=0;var u=new A;u.SetAsVector(k,z);return u};A.prototype.SetAsBox=function(k,z){if(k===undefined)k=0;if(z===undefined)z=0;this.m_vertexCount=4;this.Reserve(4);this.m_vertices[0].Set(-k,-z);this.m_vertices[1].Set(k,-z);this.m_vertices[2].Set(k,z);this.m_vertices[3].Set(-k,z);this.m_normals[0].Set(0,-1);this.m_normals[1].Set(1,0);this.m_normals[2].Set(0,
-1);this.m_normals[3].Set(-1,0);this.m_centroid.SetZero()};A.AsBox=function(k,z){if(k===undefined)k=0;if(z===undefined)z=0;var u=new A;u.SetAsBox(k,z);return u};A.prototype.SetAsOrientedBox=function(k,z,u,D){if(k===undefined)k=0;if(z===undefined)z=0;if(u===undefined)u=null;if(D===undefined)D=0;this.m_vertexCount=4;this.Reserve(4);this.m_vertices[0].Set(-k,-z);this.m_vertices[1].Set(k,-z);this.m_vertices[2].Set(k,z);this.m_vertices[3].Set(-k,z);this.m_normals[0].Set(0,-1);this.m_normals[1].Set(1,0);
-this.m_normals[2].Set(0,1);this.m_normals[3].Set(-1,0);this.m_centroid=u;k=new Q;k.position=u;k.R.Set(D);for(u=0;u<this.m_vertexCount;++u){this.m_vertices[u]=B.MulX(k,this.m_vertices[u]);this.m_normals[u]=B.MulMV(k.R,this.m_normals[u])}};A.AsOrientedBox=function(k,z,u,D){if(k===undefined)k=0;if(z===undefined)z=0;if(u===undefined)u=null;if(D===undefined)D=0;var H=new A;H.SetAsOrientedBox(k,z,u,D);return H};A.prototype.SetAsEdge=function(k,z){this.m_vertexCount=2;this.Reserve(2);this.m_vertices[0].SetV(k);
-this.m_vertices[1].SetV(z);this.m_centroid.x=0.5*(k.x+z.x);this.m_centroid.y=0.5*(k.y+z.y);this.m_normals[0]=B.CrossVF(B.SubtractVV(z,k),1);this.m_normals[0].Normalize();this.m_normals[1].x=-this.m_normals[0].x;this.m_normals[1].y=-this.m_normals[0].y};A.AsEdge=function(k,z){var u=new A;u.SetAsEdge(k,z);return u};A.prototype.TestPoint=function(k,z){var u;u=k.R;for(var D=z.x-k.position.x,H=z.y-k.position.y,O=D*u.col1.x+H*u.col1.y,E=D*u.col2.x+H*u.col2.y,R=0;R<this.m_vertexCount;++R){u=this.m_vertices[R];
-D=O-u.x;H=E-u.y;u=this.m_normals[R];if(u.x*D+u.y*H>0)return false}return true};A.prototype.RayCast=function(k,z,u){var D=0,H=z.maxFraction,O=0,E=0,R,N;O=z.p1.x-u.position.x;E=z.p1.y-u.position.y;R=u.R;var S=O*R.col1.x+E*R.col1.y,aa=O*R.col2.x+E*R.col2.y;O=z.p2.x-u.position.x;E=z.p2.y-u.position.y;R=u.R;z=O*R.col1.x+E*R.col1.y-S;R=O*R.col2.x+E*R.col2.y-aa;for(var Z=parseInt(-1),d=0;d<this.m_vertexCount;++d){N=this.m_vertices[d];O=N.x-S;E=N.y-aa;N=this.m_normals[d];O=N.x*O+N.y*E;E=N.x*z+N.y*R;if(E==
-0){if(O<0)return false}else if(E<0&&O<D*E){D=O/E;Z=d}else if(E>0&&O<H*E)H=O/E;if(H<D-Number.MIN_VALUE)return false}if(Z>=0){k.fraction=D;R=u.R;N=this.m_normals[Z];k.normal.x=R.col1.x*N.x+R.col2.x*N.y;k.normal.y=R.col1.y*N.x+R.col2.y*N.y;return true}return false};A.prototype.ComputeAABB=function(k,z){for(var u=z.R,D=this.m_vertices[0],H=z.position.x+(u.col1.x*D.x+u.col2.x*D.y),O=z.position.y+(u.col1.y*D.x+u.col2.y*D.y),E=H,R=O,N=1;N<this.m_vertexCount;++N){D=this.m_vertices[N];var S=z.position.x+(u.col1.x*
-D.x+u.col2.x*D.y);D=z.position.y+(u.col1.y*D.x+u.col2.y*D.y);H=H<S?H:S;O=O<D?O:D;E=E>S?E:S;R=R>D?R:D}k.lowerBound.x=H-this.m_radius;k.lowerBound.y=O-this.m_radius;k.upperBound.x=E+this.m_radius;k.upperBound.y=R+this.m_radius};A.prototype.ComputeMass=function(k,z){if(z===undefined)z=0;if(this.m_vertexCount==2){k.center.x=0.5*(this.m_vertices[0].x+this.m_vertices[1].x);k.center.y=0.5*(this.m_vertices[0].y+this.m_vertices[1].y);k.mass=0;k.I=0}else{for(var u=0,D=0,H=0,O=0,E=1/3,R=0;R<this.m_vertexCount;++R){var N=
-this.m_vertices[R],S=R+1<this.m_vertexCount?this.m_vertices[parseInt(R+1)]:this.m_vertices[0],aa=N.x-0,Z=N.y-0,d=S.x-0,h=S.y-0,l=aa*h-Z*d,j=0.5*l;H+=j;u+=j*E*(0+N.x+S.x);D+=j*E*(0+N.y+S.y);N=aa;Z=Z;d=d;h=h;O+=l*(E*(0.25*(N*N+d*N+d*d)+(0*N+0*d))+0+(E*(0.25*(Z*Z+h*Z+h*h)+(0*Z+0*h))+0))}k.mass=z*H;u*=1/H;D*=1/H;k.center.Set(u,D);k.I=z*O}};A.prototype.ComputeSubmergedArea=function(k,z,u,D){if(z===undefined)z=0;var H=B.MulTMV(u.R,k),O=z-B.Dot(k,u.position),E=new Vector_a2j_Number,R=0,N=parseInt(-1);z=
-parseInt(-1);var S=false;for(k=k=0;k<this.m_vertexCount;++k){E[k]=B.Dot(H,this.m_vertices[k])-O;var aa=E[k]<-Number.MIN_VALUE;if(k>0)if(aa){if(!S){N=k-1;R++}}else if(S){z=k-1;R++}S=aa}switch(R){case 0:if(S){k=new w;this.ComputeMass(k,1);D.SetV(B.MulX(u,k.center));return k.mass}else return 0;case 1:if(N==-1)N=this.m_vertexCount-1;else z=this.m_vertexCount-1}k=parseInt((N+1)%this.m_vertexCount);H=parseInt((z+1)%this.m_vertexCount);O=(0-E[N])/(E[k]-E[N]);E=(0-E[z])/(E[H]-E[z]);N=new V(this.m_vertices[N].x*
-(1-O)+this.m_vertices[k].x*O,this.m_vertices[N].y*(1-O)+this.m_vertices[k].y*O);z=new V(this.m_vertices[z].x*(1-E)+this.m_vertices[H].x*E,this.m_vertices[z].y*(1-E)+this.m_vertices[H].y*E);E=0;O=new V;R=this.m_vertices[k];for(k=k;k!=H;){k=(k+1)%this.m_vertexCount;S=k==H?z:this.m_vertices[k];aa=0.5*((R.x-N.x)*(S.y-N.y)-(R.y-N.y)*(S.x-N.x));E+=aa;O.x+=aa*(N.x+R.x+S.x)/3;O.y+=aa*(N.y+R.y+S.y)/3;R=S}O.Multiply(1/E);D.SetV(B.MulX(u,O));return E};A.prototype.GetVertexCount=function(){return this.m_vertexCount};
-A.prototype.GetVertices=function(){return this.m_vertices};A.prototype.GetNormals=function(){return this.m_normals};A.prototype.GetSupport=function(k){for(var z=0,u=this.m_vertices[0].x*k.x+this.m_vertices[0].y*k.y,D=1;D<this.m_vertexCount;++D){var H=this.m_vertices[D].x*k.x+this.m_vertices[D].y*k.y;if(H>u){z=D;u=H}}return z};A.prototype.GetSupportVertex=function(k){for(var z=0,u=this.m_vertices[0].x*k.x+this.m_vertices[0].y*k.y,D=1;D<this.m_vertexCount;++D){var H=this.m_vertices[D].x*k.x+this.m_vertices[D].y*
-k.y;if(H>u){z=D;u=H}}return this.m_vertices[z]};A.prototype.Validate=function(){return false};A.prototype.b2PolygonShape=function(){this.__super.b2Shape.call(this);this.m_type=U.e_polygonShape;this.m_centroid=new V;this.m_vertices=new Vector;this.m_normals=new Vector};A.prototype.Reserve=function(k){if(k===undefined)k=0;for(var z=parseInt(this.m_vertices.length);z<k;z++){this.m_vertices[z]=new V;this.m_normals[z]=new V}};A.ComputeCentroid=function(k,z){if(z===undefined)z=0;for(var u=new V,D=0,H=1/
-3,O=0;O<z;++O){var E=k[O],R=O+1<z?k[parseInt(O+1)]:k[0],N=0.5*((E.x-0)*(R.y-0)-(E.y-0)*(R.x-0));D+=N;u.x+=N*H*(0+E.x+R.x);u.y+=N*H*(0+E.y+R.y)}u.x*=1/D;u.y*=1/D;return u};A.ComputeOBB=function(k,z,u){if(u===undefined)u=0;var D=0,H=new Vector(u+1);for(D=0;D<u;++D)H[D]=z[D];H[u]=H[0];z=Number.MAX_VALUE;for(D=1;D<=u;++D){var O=H[parseInt(D-1)],E=H[D].x-O.x,R=H[D].y-O.y,N=Math.sqrt(E*E+R*R);E/=N;R/=N;for(var S=-R,aa=E,Z=N=Number.MAX_VALUE,d=-Number.MAX_VALUE,h=-Number.MAX_VALUE,l=0;l<u;++l){var j=H[l].x-
-O.x,o=H[l].y-O.y,q=E*j+R*o;j=S*j+aa*o;if(q<N)N=q;if(j<Z)Z=j;if(q>d)d=q;if(j>h)h=j}l=(d-N)*(h-Z);if(l<0.95*z){z=l;k.R.col1.x=E;k.R.col1.y=R;k.R.col2.x=S;k.R.col2.y=aa;E=0.5*(N+d);R=0.5*(Z+h);S=k.R;k.center.x=O.x+(S.col1.x*E+S.col2.x*R);k.center.y=O.y+(S.col1.y*E+S.col2.y*R);k.extents.x=0.5*(d-N);k.extents.y=0.5*(h-Z)}}};Box2D.postDefs.push(function(){Box2D.Collision.Shapes.b2PolygonShape.s_mat=new p});U.b2Shape=function(){};U.prototype.Copy=function(){return null};U.prototype.Set=function(k){this.m_radius=
-k.m_radius};U.prototype.GetType=function(){return this.m_type};U.prototype.TestPoint=function(){return false};U.prototype.RayCast=function(){return false};U.prototype.ComputeAABB=function(){};U.prototype.ComputeMass=function(){};U.prototype.ComputeSubmergedArea=function(){return 0};U.TestOverlap=function(k,z,u,D){var H=new L;H.proxyA=new W;H.proxyA.Set(k);H.proxyB=new W;H.proxyB.Set(u);H.transformA=z;H.transformB=D;H.useRadii=true;k=new Y;k.count=0;z=new I;M.Distance(z,k,H);return z.distance<10*Number.MIN_VALUE};
-U.prototype.b2Shape=function(){this.m_type=U.e_unknownShape;this.m_radius=F.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Collision.Shapes.b2Shape.e_unknownShape=parseInt(-1);Box2D.Collision.Shapes.b2Shape.e_circleShape=0;Box2D.Collision.Shapes.b2Shape.e_polygonShape=1;Box2D.Collision.Shapes.b2Shape.e_edgeShape=2;Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount=3;Box2D.Collision.Shapes.b2Shape.e_hitCollide=1;Box2D.Collision.Shapes.b2Shape.e_missCollide=0;Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide=
-parseInt(-1)})})();
-(function(){var F=Box2D.Common.b2Color,G=Box2D.Common.b2Settings,K=Box2D.Common.Math.b2Math;F.b2Color=function(){this._b=this._g=this._r=0};F.prototype.b2Color=function(y,w,A){if(y===undefined)y=0;if(w===undefined)w=0;if(A===undefined)A=0;this._r=Box2D.parseUInt(255*K.Clamp(y,0,1));this._g=Box2D.parseUInt(255*K.Clamp(w,0,1));this._b=Box2D.parseUInt(255*K.Clamp(A,0,1))};F.prototype.Set=function(y,w,A){if(y===undefined)y=0;if(w===undefined)w=0;if(A===undefined)A=0;this._r=Box2D.parseUInt(255*K.Clamp(y,
-0,1));this._g=Box2D.parseUInt(255*K.Clamp(w,0,1));this._b=Box2D.parseUInt(255*K.Clamp(A,0,1))};Object.defineProperty(F.prototype,"r",{enumerable:false,configurable:true,set:function(y){if(y===undefined)y=0;this._r=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"g",{enumerable:false,configurable:true,set:function(y){if(y===undefined)y=0;this._g=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"b",{enumerable:false,configurable:true,set:function(y){if(y===
-undefined)y=0;this._b=Box2D.parseUInt(255*K.Clamp(y,0,1))}});Object.defineProperty(F.prototype,"color",{enumerable:false,configurable:true,get:function(){return this._r<<16|this._g<<8|this._b}});G.b2Settings=function(){};G.b2MixFriction=function(y,w){if(y===undefined)y=0;if(w===undefined)w=0;return Math.sqrt(y*w)};G.b2MixRestitution=function(y,w){if(y===undefined)y=0;if(w===undefined)w=0;return y>w?y:w};G.b2Assert=function(y){if(!y)throw"Assertion Failed";};Box2D.postDefs.push(function(){Box2D.Common.b2Settings.VERSION=
-"2.1alpha";Box2D.Common.b2Settings.USHRT_MAX=65535;Box2D.Common.b2Settings.b2_pi=Math.PI;Box2D.Common.b2Settings.b2_maxManifoldPoints=2;Box2D.Common.b2Settings.b2_aabbExtension=0.1;Box2D.Common.b2Settings.b2_aabbMultiplier=2;Box2D.Common.b2Settings.b2_polygonRadius=2*G.b2_linearSlop;Box2D.Common.b2Settings.b2_linearSlop=0.0050;Box2D.Common.b2Settings.b2_angularSlop=2/180*G.b2_pi;Box2D.Common.b2Settings.b2_toiSlop=8*G.b2_linearSlop;Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland=32;Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland=
-32;Box2D.Common.b2Settings.b2_velocityThreshold=1;Box2D.Common.b2Settings.b2_maxLinearCorrection=0.2;Box2D.Common.b2Settings.b2_maxAngularCorrection=8/180*G.b2_pi;Box2D.Common.b2Settings.b2_maxTranslation=2;Box2D.Common.b2Settings.b2_maxTranslationSquared=G.b2_maxTranslation*G.b2_maxTranslation;Box2D.Common.b2Settings.b2_maxRotation=0.5*G.b2_pi;Box2D.Common.b2Settings.b2_maxRotationSquared=G.b2_maxRotation*G.b2_maxRotation;Box2D.Common.b2Settings.b2_contactBaumgarte=0.2;Box2D.Common.b2Settings.b2_timeToSleep=
-0.5;Box2D.Common.b2Settings.b2_linearSleepTolerance=0.01;Box2D.Common.b2Settings.b2_angularSleepTolerance=2/180*G.b2_pi})})();
-(function(){var F=Box2D.Common.Math.b2Mat22,G=Box2D.Common.Math.b2Mat33,K=Box2D.Common.Math.b2Math,y=Box2D.Common.Math.b2Sweep,w=Box2D.Common.Math.b2Transform,A=Box2D.Common.Math.b2Vec2,U=Box2D.Common.Math.b2Vec3;F.b2Mat22=function(){this.col1=new A;this.col2=new A};F.prototype.b2Mat22=function(){this.SetIdentity()};F.FromAngle=function(p){if(p===undefined)p=0;var B=new F;B.Set(p);return B};F.FromVV=function(p,B){var Q=new F;Q.SetVV(p,B);return Q};F.prototype.Set=function(p){if(p===undefined)p=0;
-var B=Math.cos(p);p=Math.sin(p);this.col1.x=B;this.col2.x=-p;this.col1.y=p;this.col2.y=B};F.prototype.SetVV=function(p,B){this.col1.SetV(p);this.col2.SetV(B)};F.prototype.Copy=function(){var p=new F;p.SetM(this);return p};F.prototype.SetM=function(p){this.col1.SetV(p.col1);this.col2.SetV(p.col2)};F.prototype.AddM=function(p){this.col1.x+=p.col1.x;this.col1.y+=p.col1.y;this.col2.x+=p.col2.x;this.col2.y+=p.col2.y};F.prototype.SetIdentity=function(){this.col1.x=1;this.col2.x=0;this.col1.y=0;this.col2.y=
-1};F.prototype.SetZero=function(){this.col1.x=0;this.col2.x=0;this.col1.y=0;this.col2.y=0};F.prototype.GetAngle=function(){return Math.atan2(this.col1.y,this.col1.x)};F.prototype.GetInverse=function(p){var B=this.col1.x,Q=this.col2.x,V=this.col1.y,M=this.col2.y,L=B*M-Q*V;if(L!=0)L=1/L;p.col1.x=L*M;p.col2.x=-L*Q;p.col1.y=-L*V;p.col2.y=L*B;return p};F.prototype.Solve=function(p,B,Q){if(B===undefined)B=0;if(Q===undefined)Q=0;var V=this.col1.x,M=this.col2.x,L=this.col1.y,I=this.col2.y,W=V*I-M*L;if(W!=
-0)W=1/W;p.x=W*(I*B-M*Q);p.y=W*(V*Q-L*B);return p};F.prototype.Abs=function(){this.col1.Abs();this.col2.Abs()};G.b2Mat33=function(){this.col1=new U;this.col2=new U;this.col3=new U};G.prototype.b2Mat33=function(p,B,Q){if(p===undefined)p=null;if(B===undefined)B=null;if(Q===undefined)Q=null;if(!p&&!B&&!Q){this.col1.SetZero();this.col2.SetZero();this.col3.SetZero()}else{this.col1.SetV(p);this.col2.SetV(B);this.col3.SetV(Q)}};G.prototype.SetVVV=function(p,B,Q){this.col1.SetV(p);this.col2.SetV(B);this.col3.SetV(Q)};
-G.prototype.Copy=function(){return new G(this.col1,this.col2,this.col3)};G.prototype.SetM=function(p){this.col1.SetV(p.col1);this.col2.SetV(p.col2);this.col3.SetV(p.col3)};G.prototype.AddM=function(p){this.col1.x+=p.col1.x;this.col1.y+=p.col1.y;this.col1.z+=p.col1.z;this.col2.x+=p.col2.x;this.col2.y+=p.col2.y;this.col2.z+=p.col2.z;this.col3.x+=p.col3.x;this.col3.y+=p.col3.y;this.col3.z+=p.col3.z};G.prototype.SetIdentity=function(){this.col1.x=1;this.col2.x=0;this.col3.x=0;this.col1.y=0;this.col2.y=
-1;this.col3.y=0;this.col1.z=0;this.col2.z=0;this.col3.z=1};G.prototype.SetZero=function(){this.col1.x=0;this.col2.x=0;this.col3.x=0;this.col1.y=0;this.col2.y=0;this.col3.y=0;this.col1.z=0;this.col2.z=0;this.col3.z=0};G.prototype.Solve22=function(p,B,Q){if(B===undefined)B=0;if(Q===undefined)Q=0;var V=this.col1.x,M=this.col2.x,L=this.col1.y,I=this.col2.y,W=V*I-M*L;if(W!=0)W=1/W;p.x=W*(I*B-M*Q);p.y=W*(V*Q-L*B);return p};G.prototype.Solve33=function(p,B,Q,V){if(B===undefined)B=0;if(Q===undefined)Q=0;
-if(V===undefined)V=0;var M=this.col1.x,L=this.col1.y,I=this.col1.z,W=this.col2.x,Y=this.col2.y,k=this.col2.z,z=this.col3.x,u=this.col3.y,D=this.col3.z,H=M*(Y*D-k*u)+L*(k*z-W*D)+I*(W*u-Y*z);if(H!=0)H=1/H;p.x=H*(B*(Y*D-k*u)+Q*(k*z-W*D)+V*(W*u-Y*z));p.y=H*(M*(Q*D-V*u)+L*(V*z-B*D)+I*(B*u-Q*z));p.z=H*(M*(Y*V-k*Q)+L*(k*B-W*V)+I*(W*Q-Y*B));return p};K.b2Math=function(){};K.IsValid=function(p){if(p===undefined)p=0;return isFinite(p)};K.Dot=function(p,B){return p.x*B.x+p.y*B.y};K.CrossVV=function(p,B){return p.x*
-B.y-p.y*B.x};K.CrossVF=function(p,B){if(B===undefined)B=0;return new A(B*p.y,-B*p.x)};K.CrossFV=function(p,B){if(p===undefined)p=0;return new A(-p*B.y,p*B.x)};K.MulMV=function(p,B){return new A(p.col1.x*B.x+p.col2.x*B.y,p.col1.y*B.x+p.col2.y*B.y)};K.MulTMV=function(p,B){return new A(K.Dot(B,p.col1),K.Dot(B,p.col2))};K.MulX=function(p,B){var Q=K.MulMV(p.R,B);Q.x+=p.position.x;Q.y+=p.position.y;return Q};K.MulXT=function(p,B){var Q=K.SubtractVV(B,p.position),V=Q.x*p.R.col1.x+Q.y*p.R.col1.y;Q.y=Q.x*
-p.R.col2.x+Q.y*p.R.col2.y;Q.x=V;return Q};K.AddVV=function(p,B){return new A(p.x+B.x,p.y+B.y)};K.SubtractVV=function(p,B){return new A(p.x-B.x,p.y-B.y)};K.Distance=function(p,B){var Q=p.x-B.x,V=p.y-B.y;return Math.sqrt(Q*Q+V*V)};K.DistanceSquared=function(p,B){var Q=p.x-B.x,V=p.y-B.y;return Q*Q+V*V};K.MulFV=function(p,B){if(p===undefined)p=0;return new A(p*B.x,p*B.y)};K.AddMM=function(p,B){return F.FromVV(K.AddVV(p.col1,B.col1),K.AddVV(p.col2,B.col2))};K.MulMM=function(p,B){return F.FromVV(K.MulMV(p,
-B.col1),K.MulMV(p,B.col2))};K.MulTMM=function(p,B){var Q=new A(K.Dot(p.col1,B.col1),K.Dot(p.col2,B.col1)),V=new A(K.Dot(p.col1,B.col2),K.Dot(p.col2,B.col2));return F.FromVV(Q,V)};K.Abs=function(p){if(p===undefined)p=0;return p>0?p:-p};K.AbsV=function(p){return new A(K.Abs(p.x),K.Abs(p.y))};K.AbsM=function(p){return F.FromVV(K.AbsV(p.col1),K.AbsV(p.col2))};K.Min=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return p<B?p:B};K.MinV=function(p,B){return new A(K.Min(p.x,B.x),K.Min(p.y,B.y))};
-K.Max=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return p>B?p:B};K.MaxV=function(p,B){return new A(K.Max(p.x,B.x),K.Max(p.y,B.y))};K.Clamp=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;return p<B?B:p>Q?Q:p};K.ClampV=function(p,B,Q){return K.MaxV(B,K.MinV(p,Q))};K.Swap=function(p,B){var Q=p[0];p[0]=B[0];B[0]=Q};K.Random=function(){return Math.random()*2-1};K.RandomRange=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;var Q=Math.random();return Q=
-(B-p)*Q+p};K.NextPowerOfTwo=function(p){if(p===undefined)p=0;p|=p>>1&2147483647;p|=p>>2&1073741823;p|=p>>4&268435455;p|=p>>8&16777215;p|=p>>16&65535;return p+1};K.IsPowerOfTwo=function(p){if(p===undefined)p=0;return p>0&&(p&p-1)==0};Box2D.postDefs.push(function(){Box2D.Common.Math.b2Math.b2Vec2_zero=new A(0,0);Box2D.Common.Math.b2Math.b2Mat22_identity=F.FromVV(new A(1,0),new A(0,1));Box2D.Common.Math.b2Math.b2Transform_identity=new w(K.b2Vec2_zero,K.b2Mat22_identity)});y.b2Sweep=function(){this.localCenter=
-new A;this.c0=new A;this.c=new A};y.prototype.Set=function(p){this.localCenter.SetV(p.localCenter);this.c0.SetV(p.c0);this.c.SetV(p.c);this.a0=p.a0;this.a=p.a;this.t0=p.t0};y.prototype.Copy=function(){var p=new y;p.localCenter.SetV(this.localCenter);p.c0.SetV(this.c0);p.c.SetV(this.c);p.a0=this.a0;p.a=this.a;p.t0=this.t0;return p};y.prototype.GetTransform=function(p,B){if(B===undefined)B=0;p.position.x=(1-B)*this.c0.x+B*this.c.x;p.position.y=(1-B)*this.c0.y+B*this.c.y;p.R.Set((1-B)*this.a0+B*this.a);
-var Q=p.R;p.position.x-=Q.col1.x*this.localCenter.x+Q.col2.x*this.localCenter.y;p.position.y-=Q.col1.y*this.localCenter.x+Q.col2.y*this.localCenter.y};y.prototype.Advance=function(p){if(p===undefined)p=0;if(this.t0<p&&1-this.t0>Number.MIN_VALUE){var B=(p-this.t0)/(1-this.t0);this.c0.x=(1-B)*this.c0.x+B*this.c.x;this.c0.y=(1-B)*this.c0.y+B*this.c.y;this.a0=(1-B)*this.a0+B*this.a;this.t0=p}};w.b2Transform=function(){this.position=new A;this.R=new F};w.prototype.b2Transform=function(p,B){if(p===undefined)p=
-null;if(B===undefined)B=null;if(p){this.position.SetV(p);this.R.SetM(B)}};w.prototype.Initialize=function(p,B){this.position.SetV(p);this.R.SetM(B)};w.prototype.SetIdentity=function(){this.position.SetZero();this.R.SetIdentity()};w.prototype.Set=function(p){this.position.SetV(p.position);this.R.SetM(p.R)};w.prototype.GetAngle=function(){return Math.atan2(this.R.col1.y,this.R.col1.x)};A.b2Vec2=function(){};A.prototype.b2Vec2=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;this.x=p;this.y=B};
-A.prototype.SetZero=function(){this.y=this.x=0};A.prototype.Set=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;this.x=p;this.y=B};A.prototype.SetV=function(p){this.x=p.x;this.y=p.y};A.prototype.GetNegative=function(){return new A(-this.x,-this.y)};A.prototype.NegativeSelf=function(){this.x=-this.x;this.y=-this.y};A.Make=function(p,B){if(p===undefined)p=0;if(B===undefined)B=0;return new A(p,B)};A.prototype.Copy=function(){return new A(this.x,this.y)};A.prototype.Add=function(p){this.x+=p.x;
-this.y+=p.y};A.prototype.Subtract=function(p){this.x-=p.x;this.y-=p.y};A.prototype.Multiply=function(p){if(p===undefined)p=0;this.x*=p;this.y*=p};A.prototype.MulM=function(p){var B=this.x;this.x=p.col1.x*B+p.col2.x*this.y;this.y=p.col1.y*B+p.col2.y*this.y};A.prototype.MulTM=function(p){var B=K.Dot(this,p.col1);this.y=K.Dot(this,p.col2);this.x=B};A.prototype.CrossVF=function(p){if(p===undefined)p=0;var B=this.x;this.x=p*this.y;this.y=-p*B};A.prototype.CrossFV=function(p){if(p===undefined)p=0;var B=
-this.x;this.x=-p*this.y;this.y=p*B};A.prototype.MinV=function(p){this.x=this.x<p.x?this.x:p.x;this.y=this.y<p.y?this.y:p.y};A.prototype.MaxV=function(p){this.x=this.x>p.x?this.x:p.x;this.y=this.y>p.y?this.y:p.y};A.prototype.Abs=function(){if(this.x<0)this.x=-this.x;if(this.y<0)this.y=-this.y};A.prototype.Length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};A.prototype.LengthSquared=function(){return this.x*this.x+this.y*this.y};A.prototype.Normalize=function(){var p=Math.sqrt(this.x*this.x+
-this.y*this.y);if(p<Number.MIN_VALUE)return 0;var B=1/p;this.x*=B;this.y*=B;return p};A.prototype.IsValid=function(){return K.IsValid(this.x)&&K.IsValid(this.y)};U.b2Vec3=function(){};U.prototype.b2Vec3=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;this.x=p;this.y=B;this.z=Q};U.prototype.SetZero=function(){this.x=this.y=this.z=0};U.prototype.Set=function(p,B,Q){if(p===undefined)p=0;if(B===undefined)B=0;if(Q===undefined)Q=0;this.x=p;this.y=B;this.z=Q};U.prototype.SetV=
-function(p){this.x=p.x;this.y=p.y;this.z=p.z};U.prototype.GetNegative=function(){return new U(-this.x,-this.y,-this.z)};U.prototype.NegativeSelf=function(){this.x=-this.x;this.y=-this.y;this.z=-this.z};U.prototype.Copy=function(){return new U(this.x,this.y,this.z)};U.prototype.Add=function(p){this.x+=p.x;this.y+=p.y;this.z+=p.z};U.prototype.Subtract=function(p){this.x-=p.x;this.y-=p.y;this.z-=p.z};U.prototype.Multiply=function(p){if(p===undefined)p=0;this.x*=p;this.y*=p;this.z*=p}})();
-(function(){var F=Box2D.Common.Math.b2Math,G=Box2D.Common.Math.b2Sweep,K=Box2D.Common.Math.b2Transform,y=Box2D.Common.Math.b2Vec2,w=Box2D.Common.b2Color,A=Box2D.Common.b2Settings,U=Box2D.Collision.b2AABB,p=Box2D.Collision.b2ContactPoint,B=Box2D.Collision.b2DynamicTreeBroadPhase,Q=Box2D.Collision.b2RayCastInput,V=Box2D.Collision.b2RayCastOutput,M=Box2D.Collision.Shapes.b2CircleShape,L=Box2D.Collision.Shapes.b2EdgeShape,I=Box2D.Collision.Shapes.b2MassData,W=Box2D.Collision.Shapes.b2PolygonShape,Y=Box2D.Collision.Shapes.b2Shape,
-k=Box2D.Dynamics.b2Body,z=Box2D.Dynamics.b2BodyDef,u=Box2D.Dynamics.b2ContactFilter,D=Box2D.Dynamics.b2ContactImpulse,H=Box2D.Dynamics.b2ContactListener,O=Box2D.Dynamics.b2ContactManager,E=Box2D.Dynamics.b2DebugDraw,R=Box2D.Dynamics.b2DestructionListener,N=Box2D.Dynamics.b2FilterData,S=Box2D.Dynamics.b2Fixture,aa=Box2D.Dynamics.b2FixtureDef,Z=Box2D.Dynamics.b2Island,d=Box2D.Dynamics.b2TimeStep,h=Box2D.Dynamics.b2World,l=Box2D.Dynamics.Contacts.b2Contact,j=Box2D.Dynamics.Contacts.b2ContactFactory,
-o=Box2D.Dynamics.Contacts.b2ContactSolver,q=Box2D.Dynamics.Joints.b2Joint,n=Box2D.Dynamics.Joints.b2PulleyJoint;k.b2Body=function(){this.m_xf=new K;this.m_sweep=new G;this.m_linearVelocity=new y;this.m_force=new y};k.prototype.connectEdges=function(a,c,g){if(g===undefined)g=0;var b=Math.atan2(c.GetDirectionVector().y,c.GetDirectionVector().x);g=F.MulFV(Math.tan((b-g)*0.5),c.GetDirectionVector());g=F.SubtractVV(g,c.GetNormalVector());g=F.MulFV(A.b2_toiSlop,g);g=F.AddVV(g,c.GetVertex1());var e=F.AddVV(a.GetDirectionVector(),
-c.GetDirectionVector());e.Normalize();var f=F.Dot(a.GetDirectionVector(),c.GetNormalVector())>0;a.SetNextEdge(c,g,e,f);c.SetPrevEdge(a,g,e,f);return b};k.prototype.CreateFixture=function(a){if(this.m_world.IsLocked()==true)return null;var c=new S;c.Create(this,this.m_xf,a);this.m_flags&k.e_activeFlag&&c.CreateProxy(this.m_world.m_contactManager.m_broadPhase,this.m_xf);c.m_next=this.m_fixtureList;this.m_fixtureList=c;++this.m_fixtureCount;c.m_body=this;c.m_density>0&&this.ResetMassData();this.m_world.m_flags|=
-h.e_newFixture;return c};k.prototype.CreateFixture2=function(a,c){if(c===undefined)c=0;var g=new aa;g.shape=a;g.density=c;return this.CreateFixture(g)};k.prototype.DestroyFixture=function(a){if(this.m_world.IsLocked()!=true){for(var c=this.m_fixtureList,g=null;c!=null;){if(c==a){if(g)g.m_next=a.m_next;else this.m_fixtureList=a.m_next;break}g=c;c=c.m_next}for(c=this.m_contactList;c;){g=c.contact;c=c.next;var b=g.GetFixtureA(),e=g.GetFixtureB();if(a==b||a==e)this.m_world.m_contactManager.Destroy(g)}this.m_flags&
-k.e_activeFlag&&a.DestroyProxy(this.m_world.m_contactManager.m_broadPhase);a.Destroy();a.m_body=null;a.m_next=null;--this.m_fixtureCount;this.ResetMassData()}};k.prototype.SetPositionAndAngle=function(a,c){if(c===undefined)c=0;var g;if(this.m_world.IsLocked()!=true){this.m_xf.R.Set(c);this.m_xf.position.SetV(a);g=this.m_xf.R;var b=this.m_sweep.localCenter;this.m_sweep.c.x=g.col1.x*b.x+g.col2.x*b.y;this.m_sweep.c.y=g.col1.y*b.x+g.col2.y*b.y;this.m_sweep.c.x+=this.m_xf.position.x;this.m_sweep.c.y+=
-this.m_xf.position.y;this.m_sweep.c0.SetV(this.m_sweep.c);this.m_sweep.a0=this.m_sweep.a=c;b=this.m_world.m_contactManager.m_broadPhase;for(g=this.m_fixtureList;g;g=g.m_next)g.Synchronize(b,this.m_xf,this.m_xf);this.m_world.m_contactManager.FindNewContacts()}};k.prototype.SetTransform=function(a){this.SetPositionAndAngle(a.position,a.GetAngle())};k.prototype.GetTransform=function(){return this.m_xf};k.prototype.GetPosition=function(){return this.m_xf.position};k.prototype.SetPosition=function(a){this.SetPositionAndAngle(a,
-this.GetAngle())};k.prototype.GetAngle=function(){return this.m_sweep.a};k.prototype.SetAngle=function(a){if(a===undefined)a=0;this.SetPositionAndAngle(this.GetPosition(),a)};k.prototype.GetWorldCenter=function(){return this.m_sweep.c};k.prototype.GetLocalCenter=function(){return this.m_sweep.localCenter};k.prototype.SetLinearVelocity=function(a){this.m_type!=k.b2_staticBody&&this.m_linearVelocity.SetV(a)};k.prototype.GetLinearVelocity=function(){return this.m_linearVelocity};k.prototype.SetAngularVelocity=
-function(a){if(a===undefined)a=0;if(this.m_type!=k.b2_staticBody)this.m_angularVelocity=a};k.prototype.GetAngularVelocity=function(){return this.m_angularVelocity};k.prototype.GetDefinition=function(){var a=new z;a.type=this.GetType();a.allowSleep=(this.m_flags&k.e_allowSleepFlag)==k.e_allowSleepFlag;a.angle=this.GetAngle();a.angularDamping=this.m_angularDamping;a.angularVelocity=this.m_angularVelocity;a.fixedRotation=(this.m_flags&k.e_fixedRotationFlag)==k.e_fixedRotationFlag;a.bullet=(this.m_flags&
-k.e_bulletFlag)==k.e_bulletFlag;a.awake=(this.m_flags&k.e_awakeFlag)==k.e_awakeFlag;a.linearDamping=this.m_linearDamping;a.linearVelocity.SetV(this.GetLinearVelocity());a.position=this.GetPosition();a.userData=this.GetUserData();return a};k.prototype.ApplyForce=function(a,c){if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_force.x+=a.x;this.m_force.y+=a.y;this.m_torque+=(c.x-this.m_sweep.c.x)*a.y-(c.y-this.m_sweep.c.y)*a.x}};k.prototype.ApplyTorque=function(a){if(a===
-undefined)a=0;if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_torque+=a}};k.prototype.ApplyImpulse=function(a,c){if(this.m_type==k.b2_dynamicBody){this.IsAwake()==false&&this.SetAwake(true);this.m_linearVelocity.x+=this.m_invMass*a.x;this.m_linearVelocity.y+=this.m_invMass*a.y;this.m_angularVelocity+=this.m_invI*((c.x-this.m_sweep.c.x)*a.y-(c.y-this.m_sweep.c.y)*a.x)}};k.prototype.Split=function(a){for(var c=this.GetLinearVelocity().Copy(),g=this.GetAngularVelocity(),
-b=this.GetWorldCenter(),e=this.m_world.CreateBody(this.GetDefinition()),f,m=this.m_fixtureList;m;)if(a(m)){var r=m.m_next;if(f)f.m_next=r;else this.m_fixtureList=r;this.m_fixtureCount--;m.m_next=e.m_fixtureList;e.m_fixtureList=m;e.m_fixtureCount++;m.m_body=e;m=r}else{f=m;m=m.m_next}this.ResetMassData();e.ResetMassData();f=this.GetWorldCenter();a=e.GetWorldCenter();f=F.AddVV(c,F.CrossFV(g,F.SubtractVV(f,b)));c=F.AddVV(c,F.CrossFV(g,F.SubtractVV(a,b)));this.SetLinearVelocity(f);e.SetLinearVelocity(c);
-this.SetAngularVelocity(g);e.SetAngularVelocity(g);this.SynchronizeFixtures();e.SynchronizeFixtures();return e};k.prototype.Merge=function(a){var c;for(c=a.m_fixtureList;c;){var g=c.m_next;a.m_fixtureCount--;c.m_next=this.m_fixtureList;this.m_fixtureList=c;this.m_fixtureCount++;c.m_body=e;c=g}b.m_fixtureCount=0;var b=this,e=a;b.GetWorldCenter();e.GetWorldCenter();b.GetLinearVelocity().Copy();e.GetLinearVelocity().Copy();b.GetAngularVelocity();e.GetAngularVelocity();b.ResetMassData();this.SynchronizeFixtures()};
-k.prototype.GetMass=function(){return this.m_mass};k.prototype.GetInertia=function(){return this.m_I};k.prototype.GetMassData=function(a){a.mass=this.m_mass;a.I=this.m_I;a.center.SetV(this.m_sweep.localCenter)};k.prototype.SetMassData=function(a){A.b2Assert(this.m_world.IsLocked()==false);if(this.m_world.IsLocked()!=true)if(this.m_type==k.b2_dynamicBody){this.m_invI=this.m_I=this.m_invMass=0;this.m_mass=a.mass;if(this.m_mass<=0)this.m_mass=1;this.m_invMass=1/this.m_mass;if(a.I>0&&(this.m_flags&k.e_fixedRotationFlag)==
-0){this.m_I=a.I-this.m_mass*(a.center.x*a.center.x+a.center.y*a.center.y);this.m_invI=1/this.m_I}var c=this.m_sweep.c.Copy();this.m_sweep.localCenter.SetV(a.center);this.m_sweep.c0.SetV(F.MulX(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.SetV(this.m_sweep.c0);this.m_linearVelocity.x+=this.m_angularVelocity*-(this.m_sweep.c.y-c.y);this.m_linearVelocity.y+=this.m_angularVelocity*+(this.m_sweep.c.x-c.x)}};k.prototype.ResetMassData=function(){this.m_invI=this.m_I=this.m_invMass=this.m_mass=0;this.m_sweep.localCenter.SetZero();
-if(!(this.m_type==k.b2_staticBody||this.m_type==k.b2_kinematicBody)){for(var a=y.Make(0,0),c=this.m_fixtureList;c;c=c.m_next)if(c.m_density!=0){var g=c.GetMassData();this.m_mass+=g.mass;a.x+=g.center.x*g.mass;a.y+=g.center.y*g.mass;this.m_I+=g.I}if(this.m_mass>0){this.m_invMass=1/this.m_mass;a.x*=this.m_invMass;a.y*=this.m_invMass}else this.m_invMass=this.m_mass=1;if(this.m_I>0&&(this.m_flags&k.e_fixedRotationFlag)==0){this.m_I-=this.m_mass*(a.x*a.x+a.y*a.y);this.m_I*=this.m_inertiaScale;A.b2Assert(this.m_I>
-0);this.m_invI=1/this.m_I}else this.m_invI=this.m_I=0;c=this.m_sweep.c.Copy();this.m_sweep.localCenter.SetV(a);this.m_sweep.c0.SetV(F.MulX(this.m_xf,this.m_sweep.localCenter));this.m_sweep.c.SetV(this.m_sweep.c0);this.m_linearVelocity.x+=this.m_angularVelocity*-(this.m_sweep.c.y-c.y);this.m_linearVelocity.y+=this.m_angularVelocity*+(this.m_sweep.c.x-c.x)}};k.prototype.GetWorldPoint=function(a){var c=this.m_xf.R;a=new y(c.col1.x*a.x+c.col2.x*a.y,c.col1.y*a.x+c.col2.y*a.y);a.x+=this.m_xf.position.x;
-a.y+=this.m_xf.position.y;return a};k.prototype.GetWorldVector=function(a){return F.MulMV(this.m_xf.R,a)};k.prototype.GetLocalPoint=function(a){return F.MulXT(this.m_xf,a)};k.prototype.GetLocalVector=function(a){return F.MulTMV(this.m_xf.R,a)};k.prototype.GetLinearVelocityFromWorldPoint=function(a){return new y(this.m_linearVelocity.x-this.m_angularVelocity*(a.y-this.m_sweep.c.y),this.m_linearVelocity.y+this.m_angularVelocity*(a.x-this.m_sweep.c.x))};k.prototype.GetLinearVelocityFromLocalPoint=function(a){var c=
-this.m_xf.R;a=new y(c.col1.x*a.x+c.col2.x*a.y,c.col1.y*a.x+c.col2.y*a.y);a.x+=this.m_xf.position.x;a.y+=this.m_xf.position.y;return new y(this.m_linearVelocity.x-this.m_angularVelocity*(a.y-this.m_sweep.c.y),this.m_linearVelocity.y+this.m_angularVelocity*(a.x-this.m_sweep.c.x))};k.prototype.GetLinearDamping=function(){return this.m_linearDamping};k.prototype.SetLinearDamping=function(a){if(a===undefined)a=0;this.m_linearDamping=a};k.prototype.GetAngularDamping=function(){return this.m_angularDamping};
-k.prototype.SetAngularDamping=function(a){if(a===undefined)a=0;this.m_angularDamping=a};k.prototype.SetType=function(a){if(a===undefined)a=0;if(this.m_type!=a){this.m_type=a;this.ResetMassData();if(this.m_type==k.b2_staticBody){this.m_linearVelocity.SetZero();this.m_angularVelocity=0}this.SetAwake(true);this.m_force.SetZero();this.m_torque=0;for(a=this.m_contactList;a;a=a.next)a.contact.FlagForFiltering()}};k.prototype.GetType=function(){return this.m_type};k.prototype.SetBullet=function(a){if(a)this.m_flags|=
-k.e_bulletFlag;else this.m_flags&=~k.e_bulletFlag};k.prototype.IsBullet=function(){return(this.m_flags&k.e_bulletFlag)==k.e_bulletFlag};k.prototype.SetSleepingAllowed=function(a){if(a)this.m_flags|=k.e_allowSleepFlag;else{this.m_flags&=~k.e_allowSleepFlag;this.SetAwake(true)}};k.prototype.SetAwake=function(a){if(a){this.m_flags|=k.e_awakeFlag;this.m_sleepTime=0}else{this.m_flags&=~k.e_awakeFlag;this.m_sleepTime=0;this.m_linearVelocity.SetZero();this.m_angularVelocity=0;this.m_force.SetZero();this.m_torque=
-0}};k.prototype.IsAwake=function(){return(this.m_flags&k.e_awakeFlag)==k.e_awakeFlag};k.prototype.SetFixedRotation=function(a){if(a)this.m_flags|=k.e_fixedRotationFlag;else this.m_flags&=~k.e_fixedRotationFlag;this.ResetMassData()};k.prototype.IsFixedRotation=function(){return(this.m_flags&k.e_fixedRotationFlag)==k.e_fixedRotationFlag};k.prototype.SetActive=function(a){if(a!=this.IsActive()){var c;if(a){this.m_flags|=k.e_activeFlag;a=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=
-c.m_next)c.CreateProxy(a,this.m_xf)}else{this.m_flags&=~k.e_activeFlag;a=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=c.m_next)c.DestroyProxy(a);for(a=this.m_contactList;a;){c=a;a=a.next;this.m_world.m_contactManager.Destroy(c.contact)}this.m_contactList=null}}};k.prototype.IsActive=function(){return(this.m_flags&k.e_activeFlag)==k.e_activeFlag};k.prototype.IsSleepingAllowed=function(){return(this.m_flags&k.e_allowSleepFlag)==k.e_allowSleepFlag};k.prototype.GetFixtureList=
-function(){return this.m_fixtureList};k.prototype.GetJointList=function(){return this.m_jointList};k.prototype.GetControllerList=function(){return this.m_controllerList};k.prototype.GetContactList=function(){return this.m_contactList};k.prototype.GetNext=function(){return this.m_next};k.prototype.GetUserData=function(){return this.m_userData};k.prototype.SetUserData=function(a){this.m_userData=a};k.prototype.GetWorld=function(){return this.m_world};k.prototype.b2Body=function(a,c){this.m_flags=0;
-if(a.bullet)this.m_flags|=k.e_bulletFlag;if(a.fixedRotation)this.m_flags|=k.e_fixedRotationFlag;if(a.allowSleep)this.m_flags|=k.e_allowSleepFlag;if(a.awake)this.m_flags|=k.e_awakeFlag;if(a.active)this.m_flags|=k.e_activeFlag;this.m_world=c;this.m_xf.position.SetV(a.position);this.m_xf.R.Set(a.angle);this.m_sweep.localCenter.SetZero();this.m_sweep.t0=1;this.m_sweep.a0=this.m_sweep.a=a.angle;var g=this.m_xf.R,b=this.m_sweep.localCenter;this.m_sweep.c.x=g.col1.x*b.x+g.col2.x*b.y;this.m_sweep.c.y=g.col1.y*
-b.x+g.col2.y*b.y;this.m_sweep.c.x+=this.m_xf.position.x;this.m_sweep.c.y+=this.m_xf.position.y;this.m_sweep.c0.SetV(this.m_sweep.c);this.m_contactList=this.m_controllerList=this.m_jointList=null;this.m_controllerCount=0;this.m_next=this.m_prev=null;this.m_linearVelocity.SetV(a.linearVelocity);this.m_angularVelocity=a.angularVelocity;this.m_linearDamping=a.linearDamping;this.m_angularDamping=a.angularDamping;this.m_force.Set(0,0);this.m_sleepTime=this.m_torque=0;this.m_type=a.type;if(this.m_type==
-k.b2_dynamicBody)this.m_invMass=this.m_mass=1;else this.m_invMass=this.m_mass=0;this.m_invI=this.m_I=0;this.m_inertiaScale=a.inertiaScale;this.m_userData=a.userData;this.m_fixtureList=null;this.m_fixtureCount=0};k.prototype.SynchronizeFixtures=function(){var a=k.s_xf1;a.R.Set(this.m_sweep.a0);var c=a.R,g=this.m_sweep.localCenter;a.position.x=this.m_sweep.c0.x-(c.col1.x*g.x+c.col2.x*g.y);a.position.y=this.m_sweep.c0.y-(c.col1.y*g.x+c.col2.y*g.y);g=this.m_world.m_contactManager.m_broadPhase;for(c=this.m_fixtureList;c;c=
-c.m_next)c.Synchronize(g,a,this.m_xf)};k.prototype.SynchronizeTransform=function(){this.m_xf.R.Set(this.m_sweep.a);var a=this.m_xf.R,c=this.m_sweep.localCenter;this.m_xf.position.x=this.m_sweep.c.x-(a.col1.x*c.x+a.col2.x*c.y);this.m_xf.position.y=this.m_sweep.c.y-(a.col1.y*c.x+a.col2.y*c.y)};k.prototype.ShouldCollide=function(a){if(this.m_type!=k.b2_dynamicBody&&a.m_type!=k.b2_dynamicBody)return false;for(var c=this.m_jointList;c;c=c.next)if(c.other==a)if(c.joint.m_collideConnected==false)return false;
-return true};k.prototype.Advance=function(a){if(a===undefined)a=0;this.m_sweep.Advance(a);this.m_sweep.c.SetV(this.m_sweep.c0);this.m_sweep.a=this.m_sweep.a0;this.SynchronizeTransform()};Box2D.postDefs.push(function(){Box2D.Dynamics.b2Body.s_xf1=new K;Box2D.Dynamics.b2Body.e_islandFlag=1;Box2D.Dynamics.b2Body.e_awakeFlag=2;Box2D.Dynamics.b2Body.e_allowSleepFlag=4;Box2D.Dynamics.b2Body.e_bulletFlag=8;Box2D.Dynamics.b2Body.e_fixedRotationFlag=16;Box2D.Dynamics.b2Body.e_activeFlag=32;Box2D.Dynamics.b2Body.b2_staticBody=
-0;Box2D.Dynamics.b2Body.b2_kinematicBody=1;Box2D.Dynamics.b2Body.b2_dynamicBody=2});z.b2BodyDef=function(){this.position=new y;this.linearVelocity=new y};z.prototype.b2BodyDef=function(){this.userData=null;this.position.Set(0,0);this.angle=0;this.linearVelocity.Set(0,0);this.angularDamping=this.linearDamping=this.angularVelocity=0;this.awake=this.allowSleep=true;this.bullet=this.fixedRotation=false;this.type=k.b2_staticBody;this.active=true;this.inertiaScale=1};u.b2ContactFilter=function(){};u.prototype.ShouldCollide=
-function(a,c){var g=a.GetFilterData(),b=c.GetFilterData();if(g.groupIndex==b.groupIndex&&g.groupIndex!=0)return g.groupIndex>0;return(g.maskBits&b.categoryBits)!=0&&(g.categoryBits&b.maskBits)!=0};u.prototype.RayCollide=function(a,c){if(!a)return true;return this.ShouldCollide(a instanceof S?a:null,c)};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactFilter.b2_defaultFilter=new u});D.b2ContactImpulse=function(){this.normalImpulses=new Vector_a2j_Number(A.b2_maxManifoldPoints);this.tangentImpulses=
-new Vector_a2j_Number(A.b2_maxManifoldPoints)};H.b2ContactListener=function(){};H.prototype.BeginContact=function(){};H.prototype.EndContact=function(){};H.prototype.PreSolve=function(){};H.prototype.PostSolve=function(){};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactListener.b2_defaultListener=new H});O.b2ContactManager=function(){};O.prototype.b2ContactManager=function(){this.m_world=null;this.m_contactCount=0;this.m_contactFilter=u.b2_defaultFilter;this.m_contactListener=H.b2_defaultListener;
-this.m_contactFactory=new j(this.m_allocator);this.m_broadPhase=new B};O.prototype.AddPair=function(a,c){var g=a instanceof S?a:null,b=c instanceof S?c:null,e=g.GetBody(),f=b.GetBody();if(e!=f){for(var m=f.GetContactList();m;){if(m.other==e){var r=m.contact.GetFixtureA(),s=m.contact.GetFixtureB();if(r==g&&s==b)return;if(r==b&&s==g)return}m=m.next}if(f.ShouldCollide(e)!=false)if(this.m_contactFilter.ShouldCollide(g,b)!=false){m=this.m_contactFactory.Create(g,b);g=m.GetFixtureA();b=m.GetFixtureB();
-e=g.m_body;f=b.m_body;m.m_prev=null;m.m_next=this.m_world.m_contactList;if(this.m_world.m_contactList!=null)this.m_world.m_contactList.m_prev=m;this.m_world.m_contactList=m;m.m_nodeA.contact=m;m.m_nodeA.other=f;m.m_nodeA.prev=null;m.m_nodeA.next=e.m_contactList;if(e.m_contactList!=null)e.m_contactList.prev=m.m_nodeA;e.m_contactList=m.m_nodeA;m.m_nodeB.contact=m;m.m_nodeB.other=e;m.m_nodeB.prev=null;m.m_nodeB.next=f.m_contactList;if(f.m_contactList!=null)f.m_contactList.prev=m.m_nodeB;f.m_contactList=
-m.m_nodeB;++this.m_world.m_contactCount}}};O.prototype.FindNewContacts=function(){this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this,this.AddPair))};O.prototype.Destroy=function(a){var c=a.GetFixtureA(),g=a.GetFixtureB();c=c.GetBody();g=g.GetBody();a.IsTouching()&&this.m_contactListener.EndContact(a);if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_world.m_contactList)this.m_world.m_contactList=a.m_next;if(a.m_nodeA.prev)a.m_nodeA.prev.next=a.m_nodeA.next;
-if(a.m_nodeA.next)a.m_nodeA.next.prev=a.m_nodeA.prev;if(a.m_nodeA==c.m_contactList)c.m_contactList=a.m_nodeA.next;if(a.m_nodeB.prev)a.m_nodeB.prev.next=a.m_nodeB.next;if(a.m_nodeB.next)a.m_nodeB.next.prev=a.m_nodeB.prev;if(a.m_nodeB==g.m_contactList)g.m_contactList=a.m_nodeB.next;this.m_contactFactory.Destroy(a);--this.m_contactCount};O.prototype.Collide=function(){for(var a=this.m_world.m_contactList;a;){var c=a.GetFixtureA(),g=a.GetFixtureB(),b=c.GetBody(),e=g.GetBody();if(b.IsAwake()==false&&e.IsAwake()==
-false)a=a.GetNext();else{if(a.m_flags&l.e_filterFlag){if(e.ShouldCollide(b)==false){c=a;a=c.GetNext();this.Destroy(c);continue}if(this.m_contactFilter.ShouldCollide(c,g)==false){c=a;a=c.GetNext();this.Destroy(c);continue}a.m_flags&=~l.e_filterFlag}if(this.m_broadPhase.TestOverlap(c.m_proxy,g.m_proxy)==false){c=a;a=c.GetNext();this.Destroy(c)}else{a.Update(this.m_contactListener);a=a.GetNext()}}}};Box2D.postDefs.push(function(){Box2D.Dynamics.b2ContactManager.s_evalCP=new p});E.b2DebugDraw=function(){};
-E.prototype.b2DebugDraw=function(){};E.prototype.SetFlags=function(){};E.prototype.GetFlags=function(){};E.prototype.AppendFlags=function(){};E.prototype.ClearFlags=function(){};E.prototype.SetSprite=function(){};E.prototype.GetSprite=function(){};E.prototype.SetDrawScale=function(){};E.prototype.GetDrawScale=function(){};E.prototype.SetLineThickness=function(){};E.prototype.GetLineThickness=function(){};E.prototype.SetAlpha=function(){};E.prototype.GetAlpha=function(){};E.prototype.SetFillAlpha=
-function(){};E.prototype.GetFillAlpha=function(){};E.prototype.SetXFormScale=function(){};E.prototype.GetXFormScale=function(){};E.prototype.DrawPolygon=function(){};E.prototype.DrawSolidPolygon=function(){};E.prototype.DrawCircle=function(){};E.prototype.DrawSolidCircle=function(){};E.prototype.DrawSegment=function(){};E.prototype.DrawTransform=function(){};Box2D.postDefs.push(function(){Box2D.Dynamics.b2DebugDraw.e_shapeBit=1;Box2D.Dynamics.b2DebugDraw.e_jointBit=2;Box2D.Dynamics.b2DebugDraw.e_aabbBit=
-4;Box2D.Dynamics.b2DebugDraw.e_pairBit=8;Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit=16;Box2D.Dynamics.b2DebugDraw.e_controllerBit=32});R.b2DestructionListener=function(){};R.prototype.SayGoodbyeJoint=function(){};R.prototype.SayGoodbyeFixture=function(){};N.b2FilterData=function(){this.categoryBits=1;this.maskBits=65535;this.groupIndex=0};N.prototype.Copy=function(){var a=new N;a.categoryBits=this.categoryBits;a.maskBits=this.maskBits;a.groupIndex=this.groupIndex;return a};S.b2Fixture=function(){this.m_filter=
-new N};S.prototype.GetType=function(){return this.m_shape.GetType()};S.prototype.GetShape=function(){return this.m_shape};S.prototype.SetSensor=function(a){if(this.m_isSensor!=a){this.m_isSensor=a;if(this.m_body!=null)for(a=this.m_body.GetContactList();a;){var c=a.contact,g=c.GetFixtureA(),b=c.GetFixtureB();if(g==this||b==this)c.SetSensor(g.IsSensor()||b.IsSensor());a=a.next}}};S.prototype.IsSensor=function(){return this.m_isSensor};S.prototype.SetFilterData=function(a){this.m_filter=a.Copy();if(!this.m_body)for(a=
-this.m_body.GetContactList();a;){var c=a.contact,g=c.GetFixtureA(),b=c.GetFixtureB();if(g==this||b==this)c.FlagForFiltering();a=a.next}};S.prototype.GetFilterData=function(){return this.m_filter.Copy()};S.prototype.GetBody=function(){return this.m_body};S.prototype.GetNext=function(){return this.m_next};S.prototype.GetUserData=function(){return this.m_userData};S.prototype.SetUserData=function(a){this.m_userData=a};S.prototype.TestPoint=function(a){return this.m_shape.TestPoint(this.m_body.GetTransform(),
-a)};S.prototype.RayCast=function(a,c){return this.m_shape.RayCast(a,c,this.m_body.GetTransform())};S.prototype.GetMassData=function(a){if(a===undefined)a=null;if(a==null)a=new I;this.m_shape.ComputeMass(a,this.m_density);return a};S.prototype.SetDensity=function(a){if(a===undefined)a=0;this.m_density=a};S.prototype.GetDensity=function(){return this.m_density};S.prototype.GetFriction=function(){return this.m_friction};S.prototype.SetFriction=function(a){if(a===undefined)a=0;this.m_friction=a};S.prototype.GetRestitution=
-function(){return this.m_restitution};S.prototype.SetRestitution=function(a){if(a===undefined)a=0;this.m_restitution=a};S.prototype.GetAABB=function(){return this.m_aabb};S.prototype.b2Fixture=function(){this.m_aabb=new U;this.m_shape=this.m_next=this.m_body=this.m_userData=null;this.m_restitution=this.m_friction=this.m_density=0};S.prototype.Create=function(a,c,g){this.m_userData=g.userData;this.m_friction=g.friction;this.m_restitution=g.restitution;this.m_body=a;this.m_next=null;this.m_filter=g.filter.Copy();
-this.m_isSensor=g.isSensor;this.m_shape=g.shape.Copy();this.m_density=g.density};S.prototype.Destroy=function(){this.m_shape=null};S.prototype.CreateProxy=function(a,c){this.m_shape.ComputeAABB(this.m_aabb,c);this.m_proxy=a.CreateProxy(this.m_aabb,this)};S.prototype.DestroyProxy=function(a){if(this.m_proxy!=null){a.DestroyProxy(this.m_proxy);this.m_proxy=null}};S.prototype.Synchronize=function(a,c,g){if(this.m_proxy){var b=new U,e=new U;this.m_shape.ComputeAABB(b,c);this.m_shape.ComputeAABB(e,g);
-this.m_aabb.Combine(b,e);c=F.SubtractVV(g.position,c.position);a.MoveProxy(this.m_proxy,this.m_aabb,c)}};aa.b2FixtureDef=function(){this.filter=new N};aa.prototype.b2FixtureDef=function(){this.userData=this.shape=null;this.friction=0.2;this.density=this.restitution=0;this.filter.categoryBits=1;this.filter.maskBits=65535;this.filter.groupIndex=0;this.isSensor=false};Z.b2Island=function(){};Z.prototype.b2Island=function(){this.m_bodies=new Vector;this.m_contacts=new Vector;this.m_joints=new Vector};
-Z.prototype.Initialize=function(a,c,g,b,e,f){if(a===undefined)a=0;if(c===undefined)c=0;if(g===undefined)g=0;var m=0;this.m_bodyCapacity=a;this.m_contactCapacity=c;this.m_jointCapacity=g;this.m_jointCount=this.m_contactCount=this.m_bodyCount=0;this.m_allocator=b;this.m_listener=e;this.m_contactSolver=f;for(m=this.m_bodies.length;m<a;m++)this.m_bodies[m]=null;for(m=this.m_contacts.length;m<c;m++)this.m_contacts[m]=null;for(m=this.m_joints.length;m<g;m++)this.m_joints[m]=null};Z.prototype.Clear=function(){this.m_jointCount=
-this.m_contactCount=this.m_bodyCount=0};Z.prototype.Solve=function(a,c,g){var b=0,e=0,f;for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];if(e.GetType()==k.b2_dynamicBody){e.m_linearVelocity.x+=a.dt*(c.x+e.m_invMass*e.m_force.x);e.m_linearVelocity.y+=a.dt*(c.y+e.m_invMass*e.m_force.y);e.m_angularVelocity+=a.dt*e.m_invI*e.m_torque;e.m_linearVelocity.Multiply(F.Clamp(1-a.dt*e.m_linearDamping,0,1));e.m_angularVelocity*=F.Clamp(1-a.dt*e.m_angularDamping,0,1)}}this.m_contactSolver.Initialize(a,this.m_contacts,
-this.m_contactCount,this.m_allocator);c=this.m_contactSolver;c.InitVelocityConstraints(a);for(b=0;b<this.m_jointCount;++b){f=this.m_joints[b];f.InitVelocityConstraints(a)}for(b=0;b<a.velocityIterations;++b){for(e=0;e<this.m_jointCount;++e){f=this.m_joints[e];f.SolveVelocityConstraints(a)}c.SolveVelocityConstraints()}for(b=0;b<this.m_jointCount;++b){f=this.m_joints[b];f.FinalizeVelocityConstraints()}c.FinalizeVelocityConstraints();for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];if(e.GetType()!=
-k.b2_staticBody){var m=a.dt*e.m_linearVelocity.x,r=a.dt*e.m_linearVelocity.y;if(m*m+r*r>A.b2_maxTranslationSquared){e.m_linearVelocity.Normalize();e.m_linearVelocity.x*=A.b2_maxTranslation*a.inv_dt;e.m_linearVelocity.y*=A.b2_maxTranslation*a.inv_dt}m=a.dt*e.m_angularVelocity;if(m*m>A.b2_maxRotationSquared)e.m_angularVelocity=e.m_angularVelocity<0?-A.b2_maxRotation*a.inv_dt:A.b2_maxRotation*a.inv_dt;e.m_sweep.c0.SetV(e.m_sweep.c);e.m_sweep.a0=e.m_sweep.a;e.m_sweep.c.x+=a.dt*e.m_linearVelocity.x;e.m_sweep.c.y+=
-a.dt*e.m_linearVelocity.y;e.m_sweep.a+=a.dt*e.m_angularVelocity;e.SynchronizeTransform()}}for(b=0;b<a.positionIterations;++b){m=c.SolvePositionConstraints(A.b2_contactBaumgarte);r=true;for(e=0;e<this.m_jointCount;++e){f=this.m_joints[e];f=f.SolvePositionConstraints(A.b2_contactBaumgarte);r=r&&f}if(m&&r)break}this.Report(c.m_constraints);if(g){g=Number.MAX_VALUE;c=A.b2_linearSleepTolerance*A.b2_linearSleepTolerance;m=A.b2_angularSleepTolerance*A.b2_angularSleepTolerance;for(b=0;b<this.m_bodyCount;++b){e=
-this.m_bodies[b];if(e.GetType()!=k.b2_staticBody){if((e.m_flags&k.e_allowSleepFlag)==0)g=e.m_sleepTime=0;if((e.m_flags&k.e_allowSleepFlag)==0||e.m_angularVelocity*e.m_angularVelocity>m||F.Dot(e.m_linearVelocity,e.m_linearVelocity)>c)g=e.m_sleepTime=0;else{e.m_sleepTime+=a.dt;g=F.Min(g,e.m_sleepTime)}}}if(g>=A.b2_timeToSleep)for(b=0;b<this.m_bodyCount;++b){e=this.m_bodies[b];e.SetAwake(false)}}};Z.prototype.SolveTOI=function(a){var c=0,g=0;this.m_contactSolver.Initialize(a,this.m_contacts,this.m_contactCount,
-this.m_allocator);var b=this.m_contactSolver;for(c=0;c<this.m_jointCount;++c)this.m_joints[c].InitVelocityConstraints(a);for(c=0;c<a.velocityIterations;++c){b.SolveVelocityConstraints();for(g=0;g<this.m_jointCount;++g)this.m_joints[g].SolveVelocityConstraints(a)}for(c=0;c<this.m_bodyCount;++c){g=this.m_bodies[c];if(g.GetType()!=k.b2_staticBody){var e=a.dt*g.m_linearVelocity.x,f=a.dt*g.m_linearVelocity.y;if(e*e+f*f>A.b2_maxTranslationSquared){g.m_linearVelocity.Normalize();g.m_linearVelocity.x*=A.b2_maxTranslation*
-a.inv_dt;g.m_linearVelocity.y*=A.b2_maxTranslation*a.inv_dt}e=a.dt*g.m_angularVelocity;if(e*e>A.b2_maxRotationSquared)g.m_angularVelocity=g.m_angularVelocity<0?-A.b2_maxRotation*a.inv_dt:A.b2_maxRotation*a.inv_dt;g.m_sweep.c0.SetV(g.m_sweep.c);g.m_sweep.a0=g.m_sweep.a;g.m_sweep.c.x+=a.dt*g.m_linearVelocity.x;g.m_sweep.c.y+=a.dt*g.m_linearVelocity.y;g.m_sweep.a+=a.dt*g.m_angularVelocity;g.SynchronizeTransform()}}for(c=0;c<a.positionIterations;++c){e=b.SolvePositionConstraints(0.75);f=true;for(g=0;g<
-this.m_jointCount;++g){var m=this.m_joints[g].SolvePositionConstraints(A.b2_contactBaumgarte);f=f&&m}if(e&&f)break}this.Report(b.m_constraints)};Z.prototype.Report=function(a){if(this.m_listener!=null)for(var c=0;c<this.m_contactCount;++c){for(var g=this.m_contacts[c],b=a[c],e=0;e<b.pointCount;++e){Z.s_impulse.normalImpulses[e]=b.points[e].normalImpulse;Z.s_impulse.tangentImpulses[e]=b.points[e].tangentImpulse}this.m_listener.PostSolve(g,Z.s_impulse)}};Z.prototype.AddBody=function(a){a.m_islandIndex=
-this.m_bodyCount;this.m_bodies[this.m_bodyCount++]=a};Z.prototype.AddContact=function(a){this.m_contacts[this.m_contactCount++]=a};Z.prototype.AddJoint=function(a){this.m_joints[this.m_jointCount++]=a};Box2D.postDefs.push(function(){Box2D.Dynamics.b2Island.s_impulse=new D});d.b2TimeStep=function(){};d.prototype.Set=function(a){this.dt=a.dt;this.inv_dt=a.inv_dt;this.positionIterations=a.positionIterations;this.velocityIterations=a.velocityIterations;this.warmStarting=a.warmStarting};h.b2World=function(){this.s_stack=
-new Vector;this.m_contactManager=new O;this.m_contactSolver=new o;this.m_island=new Z};h.prototype.b2World=function(a,c){this.m_controllerList=this.m_jointList=this.m_contactList=this.m_bodyList=this.m_debugDraw=this.m_destructionListener=null;this.m_controllerCount=this.m_jointCount=this.m_contactCount=this.m_bodyCount=0;h.m_warmStarting=true;h.m_continuousPhysics=true;this.m_allowSleep=c;this.m_gravity=a;this.m_inv_dt0=0;this.m_contactManager.m_world=this;this.m_groundBody=this.CreateBody(new z)};
-h.prototype.SetDestructionListener=function(a){this.m_destructionListener=a};h.prototype.SetContactFilter=function(a){this.m_contactManager.m_contactFilter=a};h.prototype.SetContactListener=function(a){this.m_contactManager.m_contactListener=a};h.prototype.SetDebugDraw=function(a){this.m_debugDraw=a};h.prototype.SetBroadPhase=function(a){var c=this.m_contactManager.m_broadPhase;this.m_contactManager.m_broadPhase=a;for(var g=this.m_bodyList;g;g=g.m_next)for(var b=g.m_fixtureList;b;b=b.m_next)b.m_proxy=
-a.CreateProxy(c.GetFatAABB(b.m_proxy),b)};h.prototype.Validate=function(){this.m_contactManager.m_broadPhase.Validate()};h.prototype.GetProxyCount=function(){return this.m_contactManager.m_broadPhase.GetProxyCount()};h.prototype.CreateBody=function(a){if(this.IsLocked()==true)return null;a=new k(a,this);a.m_prev=null;if(a.m_next=this.m_bodyList)this.m_bodyList.m_prev=a;this.m_bodyList=a;++this.m_bodyCount;return a};h.prototype.DestroyBody=function(a){if(this.IsLocked()!=true){for(var c=a.m_jointList;c;){var g=
-c;c=c.next;this.m_destructionListener&&this.m_destructionListener.SayGoodbyeJoint(g.joint);this.DestroyJoint(g.joint)}for(c=a.m_controllerList;c;){g=c;c=c.nextController;g.controller.RemoveBody(a)}for(c=a.m_contactList;c;){g=c;c=c.next;this.m_contactManager.Destroy(g.contact)}a.m_contactList=null;for(c=a.m_fixtureList;c;){g=c;c=c.m_next;this.m_destructionListener&&this.m_destructionListener.SayGoodbyeFixture(g);g.DestroyProxy(this.m_contactManager.m_broadPhase);g.Destroy()}a.m_fixtureList=null;a.m_fixtureCount=
-0;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_bodyList)this.m_bodyList=a.m_next;--this.m_bodyCount}};h.prototype.CreateJoint=function(a){var c=q.Create(a,null);c.m_prev=null;if(c.m_next=this.m_jointList)this.m_jointList.m_prev=c;this.m_jointList=c;++this.m_jointCount;c.m_edgeA.joint=c;c.m_edgeA.other=c.m_bodyB;c.m_edgeA.prev=null;if(c.m_edgeA.next=c.m_bodyA.m_jointList)c.m_bodyA.m_jointList.prev=c.m_edgeA;c.m_bodyA.m_jointList=c.m_edgeA;c.m_edgeB.joint=c;
-c.m_edgeB.other=c.m_bodyA;c.m_edgeB.prev=null;if(c.m_edgeB.next=c.m_bodyB.m_jointList)c.m_bodyB.m_jointList.prev=c.m_edgeB;c.m_bodyB.m_jointList=c.m_edgeB;var g=a.bodyA,b=a.bodyB;if(a.collideConnected==false)for(a=b.GetContactList();a;){a.other==g&&a.contact.FlagForFiltering();a=a.next}return c};h.prototype.DestroyJoint=function(a){var c=a.m_collideConnected;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(a==this.m_jointList)this.m_jointList=a.m_next;var g=a.m_bodyA,b=
-a.m_bodyB;g.SetAwake(true);b.SetAwake(true);if(a.m_edgeA.prev)a.m_edgeA.prev.next=a.m_edgeA.next;if(a.m_edgeA.next)a.m_edgeA.next.prev=a.m_edgeA.prev;if(a.m_edgeA==g.m_jointList)g.m_jointList=a.m_edgeA.next;a.m_edgeA.prev=null;a.m_edgeA.next=null;if(a.m_edgeB.prev)a.m_edgeB.prev.next=a.m_edgeB.next;if(a.m_edgeB.next)a.m_edgeB.next.prev=a.m_edgeB.prev;if(a.m_edgeB==b.m_jointList)b.m_jointList=a.m_edgeB.next;a.m_edgeB.prev=null;a.m_edgeB.next=null;q.Destroy(a,null);--this.m_jointCount;if(c==false)for(a=
-b.GetContactList();a;){a.other==g&&a.contact.FlagForFiltering();a=a.next}};h.prototype.AddController=function(a){a.m_next=this.m_controllerList;a.m_prev=null;this.m_controllerList=a;a.m_world=this;this.m_controllerCount++;return a};h.prototype.RemoveController=function(a){if(a.m_prev)a.m_prev.m_next=a.m_next;if(a.m_next)a.m_next.m_prev=a.m_prev;if(this.m_controllerList==a)this.m_controllerList=a.m_next;this.m_controllerCount--};h.prototype.CreateController=function(a){if(a.m_world!=this)throw Error("Controller can only be a member of one world");
-a.m_next=this.m_controllerList;a.m_prev=null;if(this.m_controllerList)this.m_controllerList.m_prev=a;this.m_controllerList=a;++this.m_controllerCount;a.m_world=this;return a};h.prototype.DestroyController=function(a){a.Clear();if(a.m_next)a.m_next.m_prev=a.m_prev;if(a.m_prev)a.m_prev.m_next=a.m_next;if(a==this.m_controllerList)this.m_controllerList=a.m_next;--this.m_controllerCount};h.prototype.SetWarmStarting=function(a){h.m_warmStarting=a};h.prototype.SetContinuousPhysics=function(a){h.m_continuousPhysics=
-a};h.prototype.GetBodyCount=function(){return this.m_bodyCount};h.prototype.GetJointCount=function(){return this.m_jointCount};h.prototype.GetContactCount=function(){return this.m_contactCount};h.prototype.SetGravity=function(a){this.m_gravity=a};h.prototype.GetGravity=function(){return this.m_gravity};h.prototype.GetGroundBody=function(){return this.m_groundBody};h.prototype.Step=function(a,c,g){if(a===undefined)a=0;if(c===undefined)c=0;if(g===undefined)g=0;if(this.m_flags&h.e_newFixture){this.m_contactManager.FindNewContacts();
-this.m_flags&=~h.e_newFixture}this.m_flags|=h.e_locked;var b=h.s_timestep2;b.dt=a;b.velocityIterations=c;b.positionIterations=g;b.inv_dt=a>0?1/a:0;b.dtRatio=this.m_inv_dt0*a;b.warmStarting=h.m_warmStarting;this.m_contactManager.Collide();b.dt>0&&this.Solve(b);h.m_continuousPhysics&&b.dt>0&&this.SolveTOI(b);if(b.dt>0)this.m_inv_dt0=b.inv_dt;this.m_flags&=~h.e_locked};h.prototype.ClearForces=function(){for(var a=this.m_bodyList;a;a=a.m_next){a.m_force.SetZero();a.m_torque=0}};h.prototype.DrawDebugData=
-function(){if(this.m_debugDraw!=null){this.m_debugDraw.m_sprite.graphics.clear();var a=this.m_debugDraw.GetFlags(),c,g,b;new y;new y;new y;var e;new U;new U;e=[new y,new y,new y,new y];var f=new w(0,0,0);if(a&E.e_shapeBit)for(c=this.m_bodyList;c;c=c.m_next){e=c.m_xf;for(g=c.GetFixtureList();g;g=g.m_next){b=g.GetShape();if(c.IsActive()==false)f.Set(0.5,0.5,0.3);else if(c.GetType()==k.b2_staticBody)f.Set(0.5,0.9,0.5);else if(c.GetType()==k.b2_kinematicBody)f.Set(0.5,0.5,0.9);else c.IsAwake()==false?
-f.Set(0.6,0.6,0.6):f.Set(0.9,0.7,0.7);this.DrawShape(b,e,f)}}if(a&E.e_jointBit)for(c=this.m_jointList;c;c=c.m_next)this.DrawJoint(c);if(a&E.e_controllerBit)for(c=this.m_controllerList;c;c=c.m_next)c.Draw(this.m_debugDraw);if(a&E.e_pairBit){f.Set(0.3,0.9,0.9);for(c=this.m_contactManager.m_contactList;c;c=c.GetNext()){b=c.GetFixtureA();g=c.GetFixtureB();b=b.GetAABB().GetCenter();g=g.GetAABB().GetCenter();this.m_debugDraw.DrawSegment(b,g,f)}}if(a&E.e_aabbBit){b=this.m_contactManager.m_broadPhase;e=[new y,
-new y,new y,new y];for(c=this.m_bodyList;c;c=c.GetNext())if(c.IsActive()!=false)for(g=c.GetFixtureList();g;g=g.GetNext()){var m=b.GetFatAABB(g.m_proxy);e[0].Set(m.lowerBound.x,m.lowerBound.y);e[1].Set(m.upperBound.x,m.lowerBound.y);e[2].Set(m.upperBound.x,m.upperBound.y);e[3].Set(m.lowerBound.x,m.upperBound.y);this.m_debugDraw.DrawPolygon(e,4,f)}}if(a&E.e_centerOfMassBit)for(c=this.m_bodyList;c;c=c.m_next){e=h.s_xf;e.R=c.m_xf.R;e.position=c.GetWorldCenter();this.m_debugDraw.DrawTransform(e)}}};h.prototype.QueryAABB=
-function(a,c){var g=this.m_contactManager.m_broadPhase;g.Query(function(b){return a(g.GetUserData(b))},c)};h.prototype.QueryShape=function(a,c,g){if(g===undefined)g=null;if(g==null){g=new K;g.SetIdentity()}var b=this.m_contactManager.m_broadPhase,e=new U;c.ComputeAABB(e,g);b.Query(function(f){f=b.GetUserData(f)instanceof S?b.GetUserData(f):null;if(Y.TestOverlap(c,g,f.GetShape(),f.GetBody().GetTransform()))return a(f);return true},e)};h.prototype.QueryPoint=function(a,c){var g=this.m_contactManager.m_broadPhase,
-b=new U;b.lowerBound.Set(c.x-A.b2_linearSlop,c.y-A.b2_linearSlop);b.upperBound.Set(c.x+A.b2_linearSlop,c.y+A.b2_linearSlop);g.Query(function(e){e=g.GetUserData(e)instanceof S?g.GetUserData(e):null;if(e.TestPoint(c))return a(e);return true},b)};h.prototype.RayCast=function(a,c,g){var b=this.m_contactManager.m_broadPhase,e=new V,f=new Q(c,g);b.RayCast(function(m,r){var s=b.GetUserData(r);s=s instanceof S?s:null;if(s.RayCast(e,m)){var v=e.fraction,t=new y((1-v)*c.x+v*g.x,(1-v)*c.y+v*g.y);return a(s,
-t,e.normal,v)}return m.maxFraction},f)};h.prototype.RayCastOne=function(a,c){var g;this.RayCast(function(b,e,f,m){if(m===undefined)m=0;g=b;return m},a,c);return g};h.prototype.RayCastAll=function(a,c){var g=new Vector;this.RayCast(function(b){g[g.length]=b;return 1},a,c);return g};h.prototype.GetBodyList=function(){return this.m_bodyList};h.prototype.GetJointList=function(){return this.m_jointList};h.prototype.GetContactList=function(){return this.m_contactList};h.prototype.IsLocked=function(){return(this.m_flags&
-h.e_locked)>0};h.prototype.Solve=function(a){for(var c,g=this.m_controllerList;g;g=g.m_next)g.Step(a);g=this.m_island;g.Initialize(this.m_bodyCount,this.m_contactCount,this.m_jointCount,null,this.m_contactManager.m_contactListener,this.m_contactSolver);for(c=this.m_bodyList;c;c=c.m_next)c.m_flags&=~k.e_islandFlag;for(var b=this.m_contactList;b;b=b.m_next)b.m_flags&=~l.e_islandFlag;for(b=this.m_jointList;b;b=b.m_next)b.m_islandFlag=false;parseInt(this.m_bodyCount);b=this.s_stack;for(var e=this.m_bodyList;e;e=
-e.m_next)if(!(e.m_flags&k.e_islandFlag))if(!(e.IsAwake()==false||e.IsActive()==false))if(e.GetType()!=k.b2_staticBody){g.Clear();var f=0;b[f++]=e;for(e.m_flags|=k.e_islandFlag;f>0;){c=b[--f];g.AddBody(c);c.IsAwake()==false&&c.SetAwake(true);if(c.GetType()!=k.b2_staticBody){for(var m,r=c.m_contactList;r;r=r.next)if(!(r.contact.m_flags&l.e_islandFlag))if(!(r.contact.IsSensor()==true||r.contact.IsEnabled()==false||r.contact.IsTouching()==false)){g.AddContact(r.contact);r.contact.m_flags|=l.e_islandFlag;
-m=r.other;if(!(m.m_flags&k.e_islandFlag)){b[f++]=m;m.m_flags|=k.e_islandFlag}}for(c=c.m_jointList;c;c=c.next)if(c.joint.m_islandFlag!=true){m=c.other;if(m.IsActive()!=false){g.AddJoint(c.joint);c.joint.m_islandFlag=true;if(!(m.m_flags&k.e_islandFlag)){b[f++]=m;m.m_flags|=k.e_islandFlag}}}}}g.Solve(a,this.m_gravity,this.m_allowSleep);for(f=0;f<g.m_bodyCount;++f){c=g.m_bodies[f];if(c.GetType()==k.b2_staticBody)c.m_flags&=~k.e_islandFlag}}for(f=0;f<b.length;++f){if(!b[f])break;b[f]=null}for(c=this.m_bodyList;c;c=
-c.m_next)c.IsAwake()==false||c.IsActive()==false||c.GetType()!=k.b2_staticBody&&c.SynchronizeFixtures();this.m_contactManager.FindNewContacts()};h.prototype.SolveTOI=function(a){var c,g,b,e=this.m_island;e.Initialize(this.m_bodyCount,A.b2_maxTOIContactsPerIsland,A.b2_maxTOIJointsPerIsland,null,this.m_contactManager.m_contactListener,this.m_contactSolver);var f=h.s_queue;for(c=this.m_bodyList;c;c=c.m_next){c.m_flags&=~k.e_islandFlag;c.m_sweep.t0=0}for(b=this.m_contactList;b;b=b.m_next)b.m_flags&=~(l.e_toiFlag|
-l.e_islandFlag);for(b=this.m_jointList;b;b=b.m_next)b.m_islandFlag=false;for(;;){var m=null,r=1;for(b=this.m_contactList;b;b=b.m_next)if(!(b.IsSensor()==true||b.IsEnabled()==false||b.IsContinuous()==false)){c=1;if(b.m_flags&l.e_toiFlag)c=b.m_toi;else{c=b.m_fixtureA;g=b.m_fixtureB;c=c.m_body;g=g.m_body;if((c.GetType()!=k.b2_dynamicBody||c.IsAwake()==false)&&(g.GetType()!=k.b2_dynamicBody||g.IsAwake()==false))continue;var s=c.m_sweep.t0;if(c.m_sweep.t0<g.m_sweep.t0){s=g.m_sweep.t0;c.m_sweep.Advance(s)}else if(g.m_sweep.t0<
-c.m_sweep.t0){s=c.m_sweep.t0;g.m_sweep.Advance(s)}c=b.ComputeTOI(c.m_sweep,g.m_sweep);A.b2Assert(0<=c&&c<=1);if(c>0&&c<1){c=(1-c)*s+c;if(c>1)c=1}b.m_toi=c;b.m_flags|=l.e_toiFlag}if(Number.MIN_VALUE<c&&c<r){m=b;r=c}}if(m==null||1-100*Number.MIN_VALUE<r)break;c=m.m_fixtureA;g=m.m_fixtureB;c=c.m_body;g=g.m_body;h.s_backupA.Set(c.m_sweep);h.s_backupB.Set(g.m_sweep);c.Advance(r);g.Advance(r);m.Update(this.m_contactManager.m_contactListener);m.m_flags&=~l.e_toiFlag;if(m.IsSensor()==true||m.IsEnabled()==
-false){c.m_sweep.Set(h.s_backupA);g.m_sweep.Set(h.s_backupB);c.SynchronizeTransform();g.SynchronizeTransform()}else if(m.IsTouching()!=false){c=c;if(c.GetType()!=k.b2_dynamicBody)c=g;e.Clear();m=b=0;f[b+m++]=c;for(c.m_flags|=k.e_islandFlag;m>0;){c=f[b++];--m;e.AddBody(c);c.IsAwake()==false&&c.SetAwake(true);if(c.GetType()==k.b2_dynamicBody){for(g=c.m_contactList;g;g=g.next){if(e.m_contactCount==e.m_contactCapacity)break;if(!(g.contact.m_flags&l.e_islandFlag))if(!(g.contact.IsSensor()==true||g.contact.IsEnabled()==
-false||g.contact.IsTouching()==false)){e.AddContact(g.contact);g.contact.m_flags|=l.e_islandFlag;s=g.other;if(!(s.m_flags&k.e_islandFlag)){if(s.GetType()!=k.b2_staticBody){s.Advance(r);s.SetAwake(true)}f[b+m]=s;++m;s.m_flags|=k.e_islandFlag}}}for(c=c.m_jointList;c;c=c.next)if(e.m_jointCount!=e.m_jointCapacity)if(c.joint.m_islandFlag!=true){s=c.other;if(s.IsActive()!=false){e.AddJoint(c.joint);c.joint.m_islandFlag=true;if(!(s.m_flags&k.e_islandFlag)){if(s.GetType()!=k.b2_staticBody){s.Advance(r);s.SetAwake(true)}f[b+
-m]=s;++m;s.m_flags|=k.e_islandFlag}}}}}b=h.s_timestep;b.warmStarting=false;b.dt=(1-r)*a.dt;b.inv_dt=1/b.dt;b.dtRatio=0;b.velocityIterations=a.velocityIterations;b.positionIterations=a.positionIterations;e.SolveTOI(b);for(r=r=0;r<e.m_bodyCount;++r){c=e.m_bodies[r];c.m_flags&=~k.e_islandFlag;if(c.IsAwake()!=false)if(c.GetType()==k.b2_dynamicBody){c.SynchronizeFixtures();for(g=c.m_contactList;g;g=g.next)g.contact.m_flags&=~l.e_toiFlag}}for(r=0;r<e.m_contactCount;++r){b=e.m_contacts[r];b.m_flags&=~(l.e_toiFlag|
-l.e_islandFlag)}for(r=0;r<e.m_jointCount;++r){b=e.m_joints[r];b.m_islandFlag=false}this.m_contactManager.FindNewContacts()}}};h.prototype.DrawJoint=function(a){var c=a.GetBodyA(),g=a.GetBodyB(),b=c.m_xf.position,e=g.m_xf.position,f=a.GetAnchorA(),m=a.GetAnchorB(),r=h.s_jointColor;switch(a.m_type){case q.e_distanceJoint:this.m_debugDraw.DrawSegment(f,m,r);break;case q.e_pulleyJoint:c=a instanceof n?a:null;a=c.GetGroundAnchorA();c=c.GetGroundAnchorB();this.m_debugDraw.DrawSegment(a,f,r);this.m_debugDraw.DrawSegment(c,
-m,r);this.m_debugDraw.DrawSegment(a,c,r);break;case q.e_mouseJoint:this.m_debugDraw.DrawSegment(f,m,r);break;default:c!=this.m_groundBody&&this.m_debugDraw.DrawSegment(b,f,r);this.m_debugDraw.DrawSegment(f,m,r);g!=this.m_groundBody&&this.m_debugDraw.DrawSegment(e,m,r)}};h.prototype.DrawShape=function(a,c,g){switch(a.m_type){case Y.e_circleShape:var b=a instanceof M?a:null;this.m_debugDraw.DrawSolidCircle(F.MulX(c,b.m_p),b.m_radius,c.R.col1,g);break;case Y.e_polygonShape:b=0;b=a instanceof W?a:null;
-a=parseInt(b.GetVertexCount());var e=b.GetVertices(),f=new Vector(a);for(b=0;b<a;++b)f[b]=F.MulX(c,e[b]);this.m_debugDraw.DrawSolidPolygon(f,a,g);break;case Y.e_edgeShape:b=a instanceof L?a:null;this.m_debugDraw.DrawSegment(F.MulX(c,b.GetVertex1()),F.MulX(c,b.GetVertex2()),g)}};Box2D.postDefs.push(function(){Box2D.Dynamics.b2World.s_timestep2=new d;Box2D.Dynamics.b2World.s_xf=new K;Box2D.Dynamics.b2World.s_backupA=new G;Box2D.Dynamics.b2World.s_backupB=new G;Box2D.Dynamics.b2World.s_timestep=new d;
-Box2D.Dynamics.b2World.s_queue=new Vector;Box2D.Dynamics.b2World.s_jointColor=new w(0.5,0.8,0.8);Box2D.Dynamics.b2World.e_newFixture=1;Box2D.Dynamics.b2World.e_locked=2})})();
-(function(){var F=Box2D.Collision.Shapes.b2CircleShape,G=Box2D.Collision.Shapes.b2EdgeShape,K=Box2D.Collision.Shapes.b2PolygonShape,y=Box2D.Collision.Shapes.b2Shape,w=Box2D.Dynamics.Contacts.b2CircleContact,A=Box2D.Dynamics.Contacts.b2Contact,U=Box2D.Dynamics.Contacts.b2ContactConstraint,p=Box2D.Dynamics.Contacts.b2ContactConstraintPoint,B=Box2D.Dynamics.Contacts.b2ContactEdge,Q=Box2D.Dynamics.Contacts.b2ContactFactory,V=Box2D.Dynamics.Contacts.b2ContactRegister,M=Box2D.Dynamics.Contacts.b2ContactResult,
-L=Box2D.Dynamics.Contacts.b2ContactSolver,I=Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,W=Box2D.Dynamics.Contacts.b2NullContact,Y=Box2D.Dynamics.Contacts.b2PolyAndCircleContact,k=Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,z=Box2D.Dynamics.Contacts.b2PolygonContact,u=Box2D.Dynamics.Contacts.b2PositionSolverManifold,D=Box2D.Dynamics.b2Body,H=Box2D.Dynamics.b2TimeStep,O=Box2D.Common.b2Settings,E=Box2D.Common.Math.b2Mat22,R=Box2D.Common.Math.b2Math,N=Box2D.Common.Math.b2Vec2,S=Box2D.Collision.b2Collision,
-aa=Box2D.Collision.b2ContactID,Z=Box2D.Collision.b2Manifold,d=Box2D.Collision.b2TimeOfImpact,h=Box2D.Collision.b2TOIInput,l=Box2D.Collision.b2WorldManifold;Box2D.inherit(w,Box2D.Dynamics.Contacts.b2Contact);w.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;w.b2CircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};w.Create=function(){return new w};w.Destroy=function(){};w.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};w.prototype.Evaluate=
-function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();S.CollideCircles(this.m_manifold,this.m_fixtureA.GetShape()instanceof F?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};A.b2Contact=function(){this.m_nodeA=new B;this.m_nodeB=new B;this.m_manifold=new Z;this.m_oldManifold=new Z};A.prototype.GetManifold=function(){return this.m_manifold};A.prototype.GetWorldManifold=function(j){var o=this.m_fixtureA.GetBody(),
-q=this.m_fixtureB.GetBody(),n=this.m_fixtureA.GetShape(),a=this.m_fixtureB.GetShape();j.Initialize(this.m_manifold,o.GetTransform(),n.m_radius,q.GetTransform(),a.m_radius)};A.prototype.IsTouching=function(){return(this.m_flags&A.e_touchingFlag)==A.e_touchingFlag};A.prototype.IsContinuous=function(){return(this.m_flags&A.e_continuousFlag)==A.e_continuousFlag};A.prototype.SetSensor=function(j){if(j)this.m_flags|=A.e_sensorFlag;else this.m_flags&=~A.e_sensorFlag};A.prototype.IsSensor=function(){return(this.m_flags&
-A.e_sensorFlag)==A.e_sensorFlag};A.prototype.SetEnabled=function(j){if(j)this.m_flags|=A.e_enabledFlag;else this.m_flags&=~A.e_enabledFlag};A.prototype.IsEnabled=function(){return(this.m_flags&A.e_enabledFlag)==A.e_enabledFlag};A.prototype.GetNext=function(){return this.m_next};A.prototype.GetFixtureA=function(){return this.m_fixtureA};A.prototype.GetFixtureB=function(){return this.m_fixtureB};A.prototype.FlagForFiltering=function(){this.m_flags|=A.e_filterFlag};A.prototype.b2Contact=function(){};
-A.prototype.Reset=function(j,o){if(j===undefined)j=null;if(o===undefined)o=null;this.m_flags=A.e_enabledFlag;if(!j||!o)this.m_fixtureB=this.m_fixtureA=null;else{if(j.IsSensor()||o.IsSensor())this.m_flags|=A.e_sensorFlag;var q=j.GetBody(),n=o.GetBody();if(q.GetType()!=D.b2_dynamicBody||q.IsBullet()||n.GetType()!=D.b2_dynamicBody||n.IsBullet())this.m_flags|=A.e_continuousFlag;this.m_fixtureA=j;this.m_fixtureB=o;this.m_manifold.m_pointCount=0;this.m_next=this.m_prev=null;this.m_nodeA.contact=null;this.m_nodeA.prev=
-null;this.m_nodeA.next=null;this.m_nodeA.other=null;this.m_nodeB.contact=null;this.m_nodeB.prev=null;this.m_nodeB.next=null;this.m_nodeB.other=null}};A.prototype.Update=function(j){var o=this.m_oldManifold;this.m_oldManifold=this.m_manifold;this.m_manifold=o;this.m_flags|=A.e_enabledFlag;var q=false;o=(this.m_flags&A.e_touchingFlag)==A.e_touchingFlag;var n=this.m_fixtureA.m_body,a=this.m_fixtureB.m_body,c=this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb);if(this.m_flags&A.e_sensorFlag){if(c){q=
-this.m_fixtureA.GetShape();c=this.m_fixtureB.GetShape();n=n.GetTransform();a=a.GetTransform();q=y.TestOverlap(q,n,c,a)}this.m_manifold.m_pointCount=0}else{if(n.GetType()!=D.b2_dynamicBody||n.IsBullet()||a.GetType()!=D.b2_dynamicBody||a.IsBullet())this.m_flags|=A.e_continuousFlag;else this.m_flags&=~A.e_continuousFlag;if(c){this.Evaluate();q=this.m_manifold.m_pointCount>0;for(c=0;c<this.m_manifold.m_pointCount;++c){var g=this.m_manifold.m_points[c];g.m_normalImpulse=0;g.m_tangentImpulse=0;for(var b=
-g.m_id,e=0;e<this.m_oldManifold.m_pointCount;++e){var f=this.m_oldManifold.m_points[e];if(f.m_id.key==b.key){g.m_normalImpulse=f.m_normalImpulse;g.m_tangentImpulse=f.m_tangentImpulse;break}}}}else this.m_manifold.m_pointCount=0;if(q!=o){n.SetAwake(true);a.SetAwake(true)}}if(q)this.m_flags|=A.e_touchingFlag;else this.m_flags&=~A.e_touchingFlag;o==false&&q==true&&j.BeginContact(this);o==true&&q==false&&j.EndContact(this);(this.m_flags&A.e_sensorFlag)==0&&j.PreSolve(this,this.m_oldManifold)};A.prototype.Evaluate=
-function(){};A.prototype.ComputeTOI=function(j,o){A.s_input.proxyA.Set(this.m_fixtureA.GetShape());A.s_input.proxyB.Set(this.m_fixtureB.GetShape());A.s_input.sweepA=j;A.s_input.sweepB=o;A.s_input.tolerance=O.b2_linearSlop;return d.TimeOfImpact(A.s_input)};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag=1;Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag=2;Box2D.Dynamics.Contacts.b2Contact.e_islandFlag=4;Box2D.Dynamics.Contacts.b2Contact.e_toiFlag=8;Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag=
-16;Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag=32;Box2D.Dynamics.Contacts.b2Contact.e_filterFlag=64;Box2D.Dynamics.Contacts.b2Contact.s_input=new h});U.b2ContactConstraint=function(){this.localPlaneNormal=new N;this.localPoint=new N;this.normal=new N;this.normalMass=new E;this.K=new E};U.prototype.b2ContactConstraint=function(){this.points=new Vector(O.b2_maxManifoldPoints);for(var j=0;j<O.b2_maxManifoldPoints;j++)this.points[j]=new p};p.b2ContactConstraintPoint=function(){this.localPoint=new N;
-this.rA=new N;this.rB=new N};B.b2ContactEdge=function(){};Q.b2ContactFactory=function(){};Q.prototype.b2ContactFactory=function(j){this.m_allocator=j;this.InitializeRegisters()};Q.prototype.AddType=function(j,o,q,n){if(q===undefined)q=0;if(n===undefined)n=0;this.m_registers[q][n].createFcn=j;this.m_registers[q][n].destroyFcn=o;this.m_registers[q][n].primary=true;if(q!=n){this.m_registers[n][q].createFcn=j;this.m_registers[n][q].destroyFcn=o;this.m_registers[n][q].primary=false}};Q.prototype.InitializeRegisters=
-function(){this.m_registers=new Vector(y.e_shapeTypeCount);for(var j=0;j<y.e_shapeTypeCount;j++){this.m_registers[j]=new Vector(y.e_shapeTypeCount);for(var o=0;o<y.e_shapeTypeCount;o++)this.m_registers[j][o]=new V}this.AddType(w.Create,w.Destroy,y.e_circleShape,y.e_circleShape);this.AddType(Y.Create,Y.Destroy,y.e_polygonShape,y.e_circleShape);this.AddType(z.Create,z.Destroy,y.e_polygonShape,y.e_polygonShape);this.AddType(I.Create,I.Destroy,y.e_edgeShape,y.e_circleShape);this.AddType(k.Create,k.Destroy,
-y.e_polygonShape,y.e_edgeShape)};Q.prototype.Create=function(j,o){var q=parseInt(j.GetType()),n=parseInt(o.GetType());q=this.m_registers[q][n];if(q.pool){n=q.pool;q.pool=n.m_next;q.poolCount--;n.Reset(j,o);return n}n=q.createFcn;if(n!=null){if(q.primary){n=n(this.m_allocator);n.Reset(j,o)}else{n=n(this.m_allocator);n.Reset(o,j)}return n}else return null};Q.prototype.Destroy=function(j){if(j.m_manifold.m_pointCount>0){j.m_fixtureA.m_body.SetAwake(true);j.m_fixtureB.m_body.SetAwake(true)}var o=parseInt(j.m_fixtureA.GetType()),
-q=parseInt(j.m_fixtureB.GetType());o=this.m_registers[o][q];o.poolCount++;j.m_next=o.pool;o.pool=j;o=o.destroyFcn;o(j,this.m_allocator)};V.b2ContactRegister=function(){};M.b2ContactResult=function(){this.position=new N;this.normal=new N;this.id=new aa};L.b2ContactSolver=function(){this.m_step=new H;this.m_constraints=new Vector};L.prototype.b2ContactSolver=function(){};L.prototype.Initialize=function(j,o,q,n){if(q===undefined)q=0;var a;this.m_step.Set(j);this.m_allocator=n;j=0;for(this.m_constraintCount=
-q;this.m_constraints.length<this.m_constraintCount;)this.m_constraints[this.m_constraints.length]=new U;for(j=0;j<q;++j){a=o[j];n=a.m_fixtureA;var c=a.m_fixtureB,g=n.m_shape.m_radius,b=c.m_shape.m_radius,e=n.m_body,f=c.m_body,m=a.GetManifold(),r=O.b2MixFriction(n.GetFriction(),c.GetFriction()),s=O.b2MixRestitution(n.GetRestitution(),c.GetRestitution()),v=e.m_linearVelocity.x,t=e.m_linearVelocity.y,x=f.m_linearVelocity.x,C=f.m_linearVelocity.y,J=e.m_angularVelocity,T=f.m_angularVelocity;O.b2Assert(m.m_pointCount>
-0);L.s_worldManifold.Initialize(m,e.m_xf,g,f.m_xf,b);c=L.s_worldManifold.m_normal.x;a=L.s_worldManifold.m_normal.y;n=this.m_constraints[j];n.bodyA=e;n.bodyB=f;n.manifold=m;n.normal.x=c;n.normal.y=a;n.pointCount=m.m_pointCount;n.friction=r;n.restitution=s;n.localPlaneNormal.x=m.m_localPlaneNormal.x;n.localPlaneNormal.y=m.m_localPlaneNormal.y;n.localPoint.x=m.m_localPoint.x;n.localPoint.y=m.m_localPoint.y;n.radius=g+b;n.type=m.m_type;for(g=0;g<n.pointCount;++g){r=m.m_points[g];b=n.points[g];b.normalImpulse=
-r.m_normalImpulse;b.tangentImpulse=r.m_tangentImpulse;b.localPoint.SetV(r.m_localPoint);r=b.rA.x=L.s_worldManifold.m_points[g].x-e.m_sweep.c.x;s=b.rA.y=L.s_worldManifold.m_points[g].y-e.m_sweep.c.y;var P=b.rB.x=L.s_worldManifold.m_points[g].x-f.m_sweep.c.x,X=b.rB.y=L.s_worldManifold.m_points[g].y-f.m_sweep.c.y,$=r*a-s*c,ba=P*a-X*c;$*=$;ba*=ba;b.normalMass=1/(e.m_invMass+f.m_invMass+e.m_invI*$+f.m_invI*ba);var ca=e.m_mass*e.m_invMass+f.m_mass*f.m_invMass;ca+=e.m_mass*e.m_invI*$+f.m_mass*f.m_invI*ba;
-b.equalizedMass=1/ca;ba=a;ca=-c;$=r*ca-s*ba;ba=P*ca-X*ba;$*=$;ba*=ba;b.tangentMass=1/(e.m_invMass+f.m_invMass+e.m_invI*$+f.m_invI*ba);b.velocityBias=0;r=n.normal.x*(x+-T*X-v- -J*s)+n.normal.y*(C+T*P-t-J*r);if(r<-O.b2_velocityThreshold)b.velocityBias+=-n.restitution*r}if(n.pointCount==2){C=n.points[0];x=n.points[1];m=e.m_invMass;e=e.m_invI;v=f.m_invMass;f=f.m_invI;t=C.rA.x*a-C.rA.y*c;C=C.rB.x*a-C.rB.y*c;J=x.rA.x*a-x.rA.y*c;x=x.rB.x*a-x.rB.y*c;c=m+v+e*t*t+f*C*C;a=m+v+e*J*J+f*x*x;f=m+v+e*t*J+f*C*x;if(c*
-c<100*(c*a-f*f)){n.K.col1.Set(c,f);n.K.col2.Set(f,a);n.K.GetInverse(n.normalMass)}else n.pointCount=1}}};L.prototype.InitVelocityConstraints=function(j){for(var o=0;o<this.m_constraintCount;++o){var q=this.m_constraints[o],n=q.bodyA,a=q.bodyB,c=n.m_invMass,g=n.m_invI,b=a.m_invMass,e=a.m_invI,f=q.normal.x,m=q.normal.y,r=m,s=-f,v=0,t=0;if(j.warmStarting){t=q.pointCount;for(v=0;v<t;++v){var x=q.points[v];x.normalImpulse*=j.dtRatio;x.tangentImpulse*=j.dtRatio;var C=x.normalImpulse*f+x.tangentImpulse*
-r,J=x.normalImpulse*m+x.tangentImpulse*s;n.m_angularVelocity-=g*(x.rA.x*J-x.rA.y*C);n.m_linearVelocity.x-=c*C;n.m_linearVelocity.y-=c*J;a.m_angularVelocity+=e*(x.rB.x*J-x.rB.y*C);a.m_linearVelocity.x+=b*C;a.m_linearVelocity.y+=b*J}}else{t=q.pointCount;for(v=0;v<t;++v){n=q.points[v];n.normalImpulse=0;n.tangentImpulse=0}}}};L.prototype.SolveVelocityConstraints=function(){for(var j=0,o,q=0,n=0,a=0,c=n=n=q=q=0,g=q=q=0,b=q=a=0,e=0,f,m=0;m<this.m_constraintCount;++m){a=this.m_constraints[m];var r=a.bodyA,
-s=a.bodyB,v=r.m_angularVelocity,t=s.m_angularVelocity,x=r.m_linearVelocity,C=s.m_linearVelocity,J=r.m_invMass,T=r.m_invI,P=s.m_invMass,X=s.m_invI;b=a.normal.x;var $=e=a.normal.y;f=-b;g=a.friction;for(j=0;j<a.pointCount;j++){o=a.points[j];q=C.x-t*o.rB.y-x.x+v*o.rA.y;n=C.y+t*o.rB.x-x.y-v*o.rA.x;q=q*$+n*f;q=o.tangentMass*-q;n=g*o.normalImpulse;n=R.Clamp(o.tangentImpulse+q,-n,n);q=n-o.tangentImpulse;c=q*$;q=q*f;x.x-=J*c;x.y-=J*q;v-=T*(o.rA.x*q-o.rA.y*c);C.x+=P*c;C.y+=P*q;t+=X*(o.rB.x*q-o.rB.y*c);o.tangentImpulse=
-n}parseInt(a.pointCount);if(a.pointCount==1){o=a.points[0];q=C.x+-t*o.rB.y-x.x- -v*o.rA.y;n=C.y+t*o.rB.x-x.y-v*o.rA.x;a=q*b+n*e;q=-o.normalMass*(a-o.velocityBias);n=o.normalImpulse+q;n=n>0?n:0;q=n-o.normalImpulse;c=q*b;q=q*e;x.x-=J*c;x.y-=J*q;v-=T*(o.rA.x*q-o.rA.y*c);C.x+=P*c;C.y+=P*q;t+=X*(o.rB.x*q-o.rB.y*c);o.normalImpulse=n}else{o=a.points[0];j=a.points[1];q=o.normalImpulse;g=j.normalImpulse;var ba=(C.x-t*o.rB.y-x.x+v*o.rA.y)*b+(C.y+t*o.rB.x-x.y-v*o.rA.x)*e,ca=(C.x-t*j.rB.y-x.x+v*j.rA.y)*b+(C.y+
-t*j.rB.x-x.y-v*j.rA.x)*e;n=ba-o.velocityBias;c=ca-j.velocityBias;f=a.K;n-=f.col1.x*q+f.col2.x*g;for(c-=f.col1.y*q+f.col2.y*g;;){f=a.normalMass;$=-(f.col1.x*n+f.col2.x*c);f=-(f.col1.y*n+f.col2.y*c);if($>=0&&f>=0){q=$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}$=-o.normalMass*n;f=0;ca=a.K.col1.y*$+c;if($>=0&&ca>=0){q=$-q;g=f-g;a=q*b;
-q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}$=0;f=-j.normalMass*c;ba=a.K.col2.x*f+n;if(f>=0&&ba>=0){q=$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}f=$=0;ba=n;ca=c;if(ba>=0&&ca>=0){q=
-$-q;g=f-g;a=q*b;q=q*e;b=g*b;e=g*e;x.x-=J*(a+b);x.y-=J*(q+e);v-=T*(o.rA.x*q-o.rA.y*a+j.rA.x*e-j.rA.y*b);C.x+=P*(a+b);C.y+=P*(q+e);t+=X*(o.rB.x*q-o.rB.y*a+j.rB.x*e-j.rB.y*b);o.normalImpulse=$;j.normalImpulse=f;break}break}}r.m_angularVelocity=v;s.m_angularVelocity=t}};L.prototype.FinalizeVelocityConstraints=function(){for(var j=0;j<this.m_constraintCount;++j)for(var o=this.m_constraints[j],q=o.manifold,n=0;n<o.pointCount;++n){var a=q.m_points[n],c=o.points[n];a.m_normalImpulse=c.normalImpulse;a.m_tangentImpulse=
-c.tangentImpulse}};L.prototype.SolvePositionConstraints=function(j){if(j===undefined)j=0;for(var o=0,q=0;q<this.m_constraintCount;q++){var n=this.m_constraints[q],a=n.bodyA,c=n.bodyB,g=a.m_mass*a.m_invMass,b=a.m_mass*a.m_invI,e=c.m_mass*c.m_invMass,f=c.m_mass*c.m_invI;L.s_psm.Initialize(n);for(var m=L.s_psm.m_normal,r=0;r<n.pointCount;r++){var s=n.points[r],v=L.s_psm.m_points[r],t=L.s_psm.m_separations[r],x=v.x-a.m_sweep.c.x,C=v.y-a.m_sweep.c.y,J=v.x-c.m_sweep.c.x;v=v.y-c.m_sweep.c.y;o=o<t?o:t;t=
-R.Clamp(j*(t+O.b2_linearSlop),-O.b2_maxLinearCorrection,0);t=-s.equalizedMass*t;s=t*m.x;t=t*m.y;a.m_sweep.c.x-=g*s;a.m_sweep.c.y-=g*t;a.m_sweep.a-=b*(x*t-C*s);a.SynchronizeTransform();c.m_sweep.c.x+=e*s;c.m_sweep.c.y+=e*t;c.m_sweep.a+=f*(J*t-v*s);c.SynchronizeTransform()}}return o>-1.5*O.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold=new l;Box2D.Dynamics.Contacts.b2ContactSolver.s_psm=new u});Box2D.inherit(I,Box2D.Dynamics.Contacts.b2Contact);
-I.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;I.b2EdgeAndCircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};I.Create=function(){return new I};I.Destroy=function(){};I.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};I.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();this.b2CollideEdgeAndCircle(this.m_manifold,this.m_fixtureA.GetShape()instanceof G?this.m_fixtureA.GetShape():null,j.m_xf,
-this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};I.prototype.b2CollideEdgeAndCircle=function(){};Box2D.inherit(W,Box2D.Dynamics.Contacts.b2Contact);W.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;W.b2NullContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};W.prototype.b2NullContact=function(){this.__super.b2Contact.call(this)};W.prototype.Evaluate=function(){};Box2D.inherit(Y,Box2D.Dynamics.Contacts.b2Contact);Y.prototype.__super=
-Box2D.Dynamics.Contacts.b2Contact.prototype;Y.b2PolyAndCircleContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};Y.Create=function(){return new Y};Y.Destroy=function(){};Y.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o);O.b2Assert(j.GetType()==y.e_polygonShape);O.b2Assert(o.GetType()==y.e_circleShape)};Y.prototype.Evaluate=function(){var j=this.m_fixtureA.m_body,o=this.m_fixtureB.m_body;S.CollidePolygonAndCircle(this.m_manifold,this.m_fixtureA.GetShape()instanceof
-K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof F?this.m_fixtureB.GetShape():null,o.m_xf)};Box2D.inherit(k,Box2D.Dynamics.Contacts.b2Contact);k.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;k.b2PolyAndEdgeContact=function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};k.Create=function(){return new k};k.Destroy=function(){};k.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o);O.b2Assert(j.GetType()==y.e_polygonShape);
-O.b2Assert(o.GetType()==y.e_edgeShape)};k.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();this.b2CollidePolyAndEdge(this.m_manifold,this.m_fixtureA.GetShape()instanceof K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof G?this.m_fixtureB.GetShape():null,o.m_xf)};k.prototype.b2CollidePolyAndEdge=function(){};Box2D.inherit(z,Box2D.Dynamics.Contacts.b2Contact);z.prototype.__super=Box2D.Dynamics.Contacts.b2Contact.prototype;z.b2PolygonContact=
-function(){Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this,arguments)};z.Create=function(){return new z};z.Destroy=function(){};z.prototype.Reset=function(j,o){this.__super.Reset.call(this,j,o)};z.prototype.Evaluate=function(){var j=this.m_fixtureA.GetBody(),o=this.m_fixtureB.GetBody();S.CollidePolygons(this.m_manifold,this.m_fixtureA.GetShape()instanceof K?this.m_fixtureA.GetShape():null,j.m_xf,this.m_fixtureB.GetShape()instanceof K?this.m_fixtureB.GetShape():null,o.m_xf)};u.b2PositionSolverManifold=
-function(){};u.prototype.b2PositionSolverManifold=function(){this.m_normal=new N;this.m_separations=new Vector_a2j_Number(O.b2_maxManifoldPoints);this.m_points=new Vector(O.b2_maxManifoldPoints);for(var j=0;j<O.b2_maxManifoldPoints;j++)this.m_points[j]=new N};u.prototype.Initialize=function(j){O.b2Assert(j.pointCount>0);var o=0,q=0,n=0,a,c=0,g=0;switch(j.type){case Z.e_circles:a=j.bodyA.m_xf.R;n=j.localPoint;o=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);q=j.bodyA.m_xf.position.y+(a.col1.y*
-n.x+a.col2.y*n.y);a=j.bodyB.m_xf.R;n=j.points[0].localPoint;c=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);a=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);n=c-o;g=a-q;var b=n*n+g*g;if(b>Number.MIN_VALUE*Number.MIN_VALUE){b=Math.sqrt(b);this.m_normal.x=n/b;this.m_normal.y=g/b}else{this.m_normal.x=1;this.m_normal.y=0}this.m_points[0].x=0.5*(o+c);this.m_points[0].y=0.5*(q+a);this.m_separations[0]=n*this.m_normal.x+g*this.m_normal.y-j.radius;break;case Z.e_faceA:a=j.bodyA.m_xf.R;n=j.localPlaneNormal;
-this.m_normal.x=a.col1.x*n.x+a.col2.x*n.y;this.m_normal.y=a.col1.y*n.x+a.col2.y*n.y;a=j.bodyA.m_xf.R;n=j.localPoint;c=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);g=j.bodyA.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);a=j.bodyB.m_xf.R;for(o=0;o<j.pointCount;++o){n=j.points[o].localPoint;q=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);n=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);this.m_separations[o]=(q-c)*this.m_normal.x+(n-g)*this.m_normal.y-j.radius;this.m_points[o].x=q;this.m_points[o].y=
-n}break;case Z.e_faceB:a=j.bodyB.m_xf.R;n=j.localPlaneNormal;this.m_normal.x=a.col1.x*n.x+a.col2.x*n.y;this.m_normal.y=a.col1.y*n.x+a.col2.y*n.y;a=j.bodyB.m_xf.R;n=j.localPoint;c=j.bodyB.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);g=j.bodyB.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);a=j.bodyA.m_xf.R;for(o=0;o<j.pointCount;++o){n=j.points[o].localPoint;q=j.bodyA.m_xf.position.x+(a.col1.x*n.x+a.col2.x*n.y);n=j.bodyA.m_xf.position.y+(a.col1.y*n.x+a.col2.y*n.y);this.m_separations[o]=(q-c)*this.m_normal.x+
-(n-g)*this.m_normal.y-j.radius;this.m_points[o].Set(q,n)}this.m_normal.x*=-1;this.m_normal.y*=-1}};Box2D.postDefs.push(function(){Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA=new N;Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB=new N})})();
-(function(){var F=Box2D.Common.Math.b2Mat22,G=Box2D.Common.Math.b2Math,K=Box2D.Common.Math.b2Vec2,y=Box2D.Common.b2Color,w=Box2D.Dynamics.Controllers.b2BuoyancyController,A=Box2D.Dynamics.Controllers.b2ConstantAccelController,U=Box2D.Dynamics.Controllers.b2ConstantForceController,p=Box2D.Dynamics.Controllers.b2Controller,B=Box2D.Dynamics.Controllers.b2ControllerEdge,Q=Box2D.Dynamics.Controllers.b2GravityController,V=Box2D.Dynamics.Controllers.b2TensorDampingController;Box2D.inherit(w,Box2D.Dynamics.Controllers.b2Controller);
-w.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;w.b2BuoyancyController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.normal=new K(0,-1);this.density=this.offset=0;this.velocity=new K(0,0);this.linearDrag=2;this.angularDrag=1;this.useDensity=false;this.useWorldGravity=true;this.gravity=null};w.prototype.Step=function(){if(this.m_bodyList){if(this.useWorldGravity)this.gravity=this.GetWorld().GetGravity().Copy();for(var M=this.m_bodyList;M;M=
-M.nextBody){var L=M.body;if(L.IsAwake()!=false){for(var I=new K,W=new K,Y=0,k=0,z=L.GetFixtureList();z;z=z.GetNext()){var u=new K,D=z.GetShape().ComputeSubmergedArea(this.normal,this.offset,L.GetTransform(),u);Y+=D;I.x+=D*u.x;I.y+=D*u.y;var H=0;H=1;k+=D*H;W.x+=D*u.x*H;W.y+=D*u.y*H}I.x/=Y;I.y/=Y;W.x/=k;W.y/=k;if(!(Y<Number.MIN_VALUE)){k=this.gravity.GetNegative();k.Multiply(this.density*Y);L.ApplyForce(k,W);W=L.GetLinearVelocityFromWorldPoint(I);W.Subtract(this.velocity);W.Multiply(-this.linearDrag*
-Y);L.ApplyForce(W,I);L.ApplyTorque(-L.GetInertia()/L.GetMass()*Y*L.GetAngularVelocity()*this.angularDrag)}}}}};w.prototype.Draw=function(M){var L=new K,I=new K;L.x=this.normal.x*this.offset+this.normal.y*1E3;L.y=this.normal.y*this.offset-this.normal.x*1E3;I.x=this.normal.x*this.offset-this.normal.y*1E3;I.y=this.normal.y*this.offset+this.normal.x*1E3;var W=new y(0,0,1);M.DrawSegment(L,I,W)};Box2D.inherit(A,Box2D.Dynamics.Controllers.b2Controller);A.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;
-A.b2ConstantAccelController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.A=new K(0,0)};A.prototype.Step=function(M){M=new K(this.A.x*M.dt,this.A.y*M.dt);for(var L=this.m_bodyList;L;L=L.nextBody){var I=L.body;I.IsAwake()&&I.SetLinearVelocity(new K(I.GetLinearVelocity().x+M.x,I.GetLinearVelocity().y+M.y))}};Box2D.inherit(U,Box2D.Dynamics.Controllers.b2Controller);U.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;U.b2ConstantForceController=
-function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.F=new K(0,0)};U.prototype.Step=function(){for(var M=this.m_bodyList;M;M=M.nextBody){var L=M.body;L.IsAwake()&&L.ApplyForce(this.F,L.GetWorldCenter())}};p.b2Controller=function(){};p.prototype.Step=function(){};p.prototype.Draw=function(){};p.prototype.AddBody=function(M){var L=new B;L.controller=this;L.body=M;L.nextBody=this.m_bodyList;L.prevBody=null;this.m_bodyList=L;if(L.nextBody)L.nextBody.prevBody=L;this.m_bodyCount++;
-L.nextController=M.m_controllerList;L.prevController=null;M.m_controllerList=L;if(L.nextController)L.nextController.prevController=L;M.m_controllerCount++};p.prototype.RemoveBody=function(M){for(var L=M.m_controllerList;L&&L.controller!=this;)L=L.nextController;if(L.prevBody)L.prevBody.nextBody=L.nextBody;if(L.nextBody)L.nextBody.prevBody=L.prevBody;if(L.nextController)L.nextController.prevController=L.prevController;if(L.prevController)L.prevController.nextController=L.nextController;if(this.m_bodyList==
-L)this.m_bodyList=L.nextBody;if(M.m_controllerList==L)M.m_controllerList=L.nextController;M.m_controllerCount--;this.m_bodyCount--};p.prototype.Clear=function(){for(;this.m_bodyList;)this.RemoveBody(this.m_bodyList.body)};p.prototype.GetNext=function(){return this.m_next};p.prototype.GetWorld=function(){return this.m_world};p.prototype.GetBodyList=function(){return this.m_bodyList};B.b2ControllerEdge=function(){};Box2D.inherit(Q,Box2D.Dynamics.Controllers.b2Controller);Q.prototype.__super=Box2D.Dynamics.Controllers.b2Controller.prototype;
-Q.b2GravityController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.G=1;this.invSqr=true};Q.prototype.Step=function(){var M=null,L=null,I=null,W=0,Y=null,k=null,z=null,u=0,D=0,H=0;u=null;if(this.invSqr)for(M=this.m_bodyList;M;M=M.nextBody){L=M.body;I=L.GetWorldCenter();W=L.GetMass();for(Y=this.m_bodyList;Y!=M;Y=Y.nextBody){k=Y.body;z=k.GetWorldCenter();u=z.x-I.x;D=z.y-I.y;H=u*u+D*D;if(!(H<Number.MIN_VALUE)){u=new K(u,D);u.Multiply(this.G/H/Math.sqrt(H)*
-W*k.GetMass());L.IsAwake()&&L.ApplyForce(u,I);u.Multiply(-1);k.IsAwake()&&k.ApplyForce(u,z)}}}else for(M=this.m_bodyList;M;M=M.nextBody){L=M.body;I=L.GetWorldCenter();W=L.GetMass();for(Y=this.m_bodyList;Y!=M;Y=Y.nextBody){k=Y.body;z=k.GetWorldCenter();u=z.x-I.x;D=z.y-I.y;H=u*u+D*D;if(!(H<Number.MIN_VALUE)){u=new K(u,D);u.Multiply(this.G/H*W*k.GetMass());L.IsAwake()&&L.ApplyForce(u,I);u.Multiply(-1);k.IsAwake()&&k.ApplyForce(u,z)}}}};Box2D.inherit(V,Box2D.Dynamics.Controllers.b2Controller);V.prototype.__super=
-Box2D.Dynamics.Controllers.b2Controller.prototype;V.b2TensorDampingController=function(){Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this,arguments);this.T=new F;this.maxTimestep=0};V.prototype.SetAxisAligned=function(M,L){if(M===undefined)M=0;if(L===undefined)L=0;this.T.col1.x=-M;this.T.col1.y=0;this.T.col2.x=0;this.T.col2.y=-L;this.maxTimestep=M>0||L>0?1/Math.max(M,L):0};V.prototype.Step=function(M){M=M.dt;if(!(M<=Number.MIN_VALUE)){if(M>this.maxTimestep&&this.maxTimestep>0)M=this.maxTimestep;
-for(var L=this.m_bodyList;L;L=L.nextBody){var I=L.body;if(I.IsAwake()){var W=I.GetWorldVector(G.MulMV(this.T,I.GetLocalVector(I.GetLinearVelocity())));I.SetLinearVelocity(new K(I.GetLinearVelocity().x+W.x*M,I.GetLinearVelocity().y+W.y*M))}}}}})();
-(function(){var F=Box2D.Common.b2Settings,G=Box2D.Common.Math.b2Mat22,K=Box2D.Common.Math.b2Mat33,y=Box2D.Common.Math.b2Math,w=Box2D.Common.Math.b2Vec2,A=Box2D.Common.Math.b2Vec3,U=Box2D.Dynamics.Joints.b2DistanceJoint,p=Box2D.Dynamics.Joints.b2DistanceJointDef,B=Box2D.Dynamics.Joints.b2FrictionJoint,Q=Box2D.Dynamics.Joints.b2FrictionJointDef,V=Box2D.Dynamics.Joints.b2GearJoint,M=Box2D.Dynamics.Joints.b2GearJointDef,L=Box2D.Dynamics.Joints.b2Jacobian,I=Box2D.Dynamics.Joints.b2Joint,W=Box2D.Dynamics.Joints.b2JointDef,
-Y=Box2D.Dynamics.Joints.b2JointEdge,k=Box2D.Dynamics.Joints.b2LineJoint,z=Box2D.Dynamics.Joints.b2LineJointDef,u=Box2D.Dynamics.Joints.b2MouseJoint,D=Box2D.Dynamics.Joints.b2MouseJointDef,H=Box2D.Dynamics.Joints.b2PrismaticJoint,O=Box2D.Dynamics.Joints.b2PrismaticJointDef,E=Box2D.Dynamics.Joints.b2PulleyJoint,R=Box2D.Dynamics.Joints.b2PulleyJointDef,N=Box2D.Dynamics.Joints.b2RevoluteJoint,S=Box2D.Dynamics.Joints.b2RevoluteJointDef,aa=Box2D.Dynamics.Joints.b2WeldJoint,Z=Box2D.Dynamics.Joints.b2WeldJointDef;
-Box2D.inherit(U,Box2D.Dynamics.Joints.b2Joint);U.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;U.b2DistanceJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_u=new w};U.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};U.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};U.prototype.GetReactionForce=function(d){if(d===undefined)d=
-0;return new w(d*this.m_impulse*this.m_u.x,d*this.m_impulse*this.m_u.y)};U.prototype.GetReactionTorque=function(){return 0};U.prototype.GetLength=function(){return this.m_length};U.prototype.SetLength=function(d){if(d===undefined)d=0;this.m_length=d};U.prototype.GetFrequency=function(){return this.m_frequencyHz};U.prototype.SetFrequency=function(d){if(d===undefined)d=0;this.m_frequencyHz=d};U.prototype.GetDampingRatio=function(){return this.m_dampingRatio};U.prototype.SetDampingRatio=function(d){if(d===
-undefined)d=0;this.m_dampingRatio=d};U.prototype.b2DistanceJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_length=d.length;this.m_frequencyHz=d.frequencyHz;this.m_dampingRatio=d.dampingRatio;this.m_bias=this.m_gamma=this.m_impulse=0};U.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;h=j.m_xf.R;var q=this.m_localAnchor1.x-j.m_sweep.localCenter.x,n=this.m_localAnchor1.y-
-j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchor2.x-o.m_sweep.localCenter.x,c=this.m_localAnchor2.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;this.m_u.x=o.m_sweep.c.x+a-j.m_sweep.c.x-q;this.m_u.y=o.m_sweep.c.y+c-j.m_sweep.c.y-n;l=Math.sqrt(this.m_u.x*this.m_u.x+this.m_u.y*this.m_u.y);l>F.b2_linearSlop?this.m_u.Multiply(1/l):this.m_u.SetZero();h=q*this.m_u.y-n*this.m_u.x;var g=a*this.m_u.y-c*this.m_u.x;
-h=j.m_invMass+j.m_invI*h*h+o.m_invMass+o.m_invI*g*g;this.m_mass=h!=0?1/h:0;if(this.m_frequencyHz>0){l=l-this.m_length;g=2*Math.PI*this.m_frequencyHz;var b=this.m_mass*g*g;this.m_gamma=d.dt*(2*this.m_mass*this.m_dampingRatio*g+d.dt*b);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_bias=l*d.dt*b*this.m_gamma;this.m_mass=h+this.m_gamma;this.m_mass=this.m_mass!=0?1/this.m_mass:0}if(d.warmStarting){this.m_impulse*=d.dtRatio;d=this.m_impulse*this.m_u.x;h=this.m_impulse*this.m_u.y;j.m_linearVelocity.x-=
-j.m_invMass*d;j.m_linearVelocity.y-=j.m_invMass*h;j.m_angularVelocity-=j.m_invI*(q*h-n*d);o.m_linearVelocity.x+=o.m_invMass*d;o.m_linearVelocity.y+=o.m_invMass*h;o.m_angularVelocity+=o.m_invI*(a*h-c*d)}else this.m_impulse=0};U.prototype.SolveVelocityConstraints=function(){var d,h=this.m_bodyA,l=this.m_bodyB;d=h.m_xf.R;var j=this.m_localAnchor1.x-h.m_sweep.localCenter.x,o=this.m_localAnchor1.y-h.m_sweep.localCenter.y,q=d.col1.x*j+d.col2.x*o;o=d.col1.y*j+d.col2.y*o;j=q;d=l.m_xf.R;var n=this.m_localAnchor2.x-
-l.m_sweep.localCenter.x,a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;q=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=q;q=-this.m_mass*(this.m_u.x*(l.m_linearVelocity.x+-l.m_angularVelocity*a-(h.m_linearVelocity.x+-h.m_angularVelocity*o))+this.m_u.y*(l.m_linearVelocity.y+l.m_angularVelocity*n-(h.m_linearVelocity.y+h.m_angularVelocity*j))+this.m_bias+this.m_gamma*this.m_impulse);this.m_impulse+=q;d=q*this.m_u.x;q=q*this.m_u.y;h.m_linearVelocity.x-=h.m_invMass*d;h.m_linearVelocity.y-=h.m_invMass*
-q;h.m_angularVelocity-=h.m_invI*(j*q-o*d);l.m_linearVelocity.x+=l.m_invMass*d;l.m_linearVelocity.y+=l.m_invMass*q;l.m_angularVelocity+=l.m_invI*(n*q-a*d)};U.prototype.SolvePositionConstraints=function(){var d;if(this.m_frequencyHz>0)return true;var h=this.m_bodyA,l=this.m_bodyB;d=h.m_xf.R;var j=this.m_localAnchor1.x-h.m_sweep.localCenter.x,o=this.m_localAnchor1.y-h.m_sweep.localCenter.y,q=d.col1.x*j+d.col2.x*o;o=d.col1.y*j+d.col2.y*o;j=q;d=l.m_xf.R;var n=this.m_localAnchor2.x-l.m_sweep.localCenter.x,
-a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;q=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=q;q=l.m_sweep.c.x+n-h.m_sweep.c.x-j;var c=l.m_sweep.c.y+a-h.m_sweep.c.y-o;d=Math.sqrt(q*q+c*c);q/=d;c/=d;d=d-this.m_length;d=y.Clamp(d,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);var g=-this.m_mass*d;this.m_u.Set(q,c);q=g*this.m_u.x;c=g*this.m_u.y;h.m_sweep.c.x-=h.m_invMass*q;h.m_sweep.c.y-=h.m_invMass*c;h.m_sweep.a-=h.m_invI*(j*c-o*q);l.m_sweep.c.x+=l.m_invMass*q;l.m_sweep.c.y+=l.m_invMass*c;
-l.m_sweep.a+=l.m_invI*(n*c-a*q);h.SynchronizeTransform();l.SynchronizeTransform();return y.Abs(d)<F.b2_linearSlop};Box2D.inherit(p,Box2D.Dynamics.Joints.b2JointDef);p.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;p.b2DistanceJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};p.prototype.b2DistanceJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_distanceJoint;this.length=1;this.dampingRatio=
-this.frequencyHz=0};p.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(j));d=j.x-l.x;l=j.y-l.y;this.length=Math.sqrt(d*d+l*l);this.dampingRatio=this.frequencyHz=0};Box2D.inherit(B,Box2D.Dynamics.Joints.b2Joint);B.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;B.b2FrictionJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchorA=new w;
-this.m_localAnchorB=new w;this.m_linearMass=new G;this.m_linearImpulse=new w};B.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)};B.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)};B.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_linearImpulse.x,d*this.m_linearImpulse.y)};B.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_angularImpulse};B.prototype.SetMaxForce=
-function(d){if(d===undefined)d=0;this.m_maxForce=d};B.prototype.GetMaxForce=function(){return this.m_maxForce};B.prototype.SetMaxTorque=function(d){if(d===undefined)d=0;this.m_maxTorque=d};B.prototype.GetMaxTorque=function(){return this.m_maxTorque};B.prototype.b2FrictionJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchorA.SetV(d.localAnchorA);this.m_localAnchorB.SetV(d.localAnchorB);this.m_linearMass.SetZero();this.m_angularMass=0;this.m_linearImpulse.SetZero();this.m_angularImpulse=
-0;this.m_maxForce=d.maxForce;this.m_maxTorque=d.maxTorque};B.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;h=j.m_xf.R;var q=this.m_localAnchorA.x-j.m_sweep.localCenter.x,n=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchorB.x-o.m_sweep.localCenter.x,c=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;h=j.m_invMass;l=o.m_invMass;
-var g=j.m_invI,b=o.m_invI,e=new G;e.col1.x=h+l;e.col2.x=0;e.col1.y=0;e.col2.y=h+l;e.col1.x+=g*n*n;e.col2.x+=-g*q*n;e.col1.y+=-g*q*n;e.col2.y+=g*q*q;e.col1.x+=b*c*c;e.col2.x+=-b*a*c;e.col1.y+=-b*a*c;e.col2.y+=b*a*a;e.GetInverse(this.m_linearMass);this.m_angularMass=g+b;if(this.m_angularMass>0)this.m_angularMass=1/this.m_angularMass;if(d.warmStarting){this.m_linearImpulse.x*=d.dtRatio;this.m_linearImpulse.y*=d.dtRatio;this.m_angularImpulse*=d.dtRatio;d=this.m_linearImpulse;j.m_linearVelocity.x-=h*d.x;
-j.m_linearVelocity.y-=h*d.y;j.m_angularVelocity-=g*(q*d.y-n*d.x+this.m_angularImpulse);o.m_linearVelocity.x+=l*d.x;o.m_linearVelocity.y+=l*d.y;o.m_angularVelocity+=b*(a*d.y-c*d.x+this.m_angularImpulse)}else{this.m_linearImpulse.SetZero();this.m_angularImpulse=0}};B.prototype.SolveVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB,q=j.m_linearVelocity,n=j.m_angularVelocity,a=o.m_linearVelocity,c=o.m_angularVelocity,g=j.m_invMass,b=o.m_invMass,e=j.m_invI,f=o.m_invI;h=j.m_xf.R;var m=
-this.m_localAnchorA.x-j.m_sweep.localCenter.x,r=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*m+h.col2.x*r;r=h.col1.y*m+h.col2.y*r;m=l;h=o.m_xf.R;var s=this.m_localAnchorB.x-o.m_sweep.localCenter.x,v=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*s+h.col2.x*v;v=h.col1.y*s+h.col2.y*v;s=l;h=0;l=-this.m_angularMass*(c-n);var t=this.m_angularImpulse;h=d.dt*this.m_maxTorque;this.m_angularImpulse=y.Clamp(this.m_angularImpulse+l,-h,h);l=this.m_angularImpulse-t;n-=e*l;c+=f*l;h=y.MulMV(this.m_linearMass,
-new w(-(a.x-c*v-q.x+n*r),-(a.y+c*s-q.y-n*m)));l=this.m_linearImpulse.Copy();this.m_linearImpulse.Add(h);h=d.dt*this.m_maxForce;if(this.m_linearImpulse.LengthSquared()>h*h){this.m_linearImpulse.Normalize();this.m_linearImpulse.Multiply(h)}h=y.SubtractVV(this.m_linearImpulse,l);q.x-=g*h.x;q.y-=g*h.y;n-=e*(m*h.y-r*h.x);a.x+=b*h.x;a.y+=b*h.y;c+=f*(s*h.y-v*h.x);j.m_angularVelocity=n;o.m_angularVelocity=c};B.prototype.SolvePositionConstraints=function(){return true};Box2D.inherit(Q,Box2D.Dynamics.Joints.b2JointDef);
-Q.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;Q.b2FrictionJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};Q.prototype.b2FrictionJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_frictionJoint;this.maxTorque=this.maxForce=0};Q.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l))};
-Box2D.inherit(V,Box2D.Dynamics.Joints.b2Joint);V.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;V.b2GearJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_groundAnchor1=new w;this.m_groundAnchor2=new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_J=new L};V.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};V.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};V.prototype.GetReactionForce=
-function(d){if(d===undefined)d=0;return new w(d*this.m_impulse*this.m_J.linearB.x,d*this.m_impulse*this.m_J.linearB.y)};V.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;var h=this.m_bodyB.m_xf.R,l=this.m_localAnchor1.x-this.m_bodyB.m_sweep.localCenter.x,j=this.m_localAnchor1.y-this.m_bodyB.m_sweep.localCenter.y,o=h.col1.x*l+h.col2.x*j;j=h.col1.y*l+h.col2.y*j;l=o;return d*(this.m_impulse*this.m_J.angularB-l*this.m_impulse*this.m_J.linearB.y+j*this.m_impulse*this.m_J.linearB.x)};V.prototype.GetRatio=
-function(){return this.m_ratio};V.prototype.SetRatio=function(d){if(d===undefined)d=0;this.m_ratio=d};V.prototype.b2GearJoint=function(d){this.__super.b2Joint.call(this,d);var h=parseInt(d.joint1.m_type),l=parseInt(d.joint2.m_type);this.m_prismatic2=this.m_revolute2=this.m_prismatic1=this.m_revolute1=null;var j=0,o=0;this.m_ground1=d.joint1.GetBodyA();this.m_bodyA=d.joint1.GetBodyB();if(h==I.e_revoluteJoint){this.m_revolute1=d.joint1 instanceof N?d.joint1:null;this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1);
-this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2);j=this.m_revolute1.GetJointAngle()}else{this.m_prismatic1=d.joint1 instanceof H?d.joint1:null;this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1);this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2);j=this.m_prismatic1.GetJointTranslation()}this.m_ground2=d.joint2.GetBodyA();this.m_bodyB=d.joint2.GetBodyB();if(l==I.e_revoluteJoint){this.m_revolute2=d.joint2 instanceof N?d.joint2:null;this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1);
-this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2);o=this.m_revolute2.GetJointAngle()}else{this.m_prismatic2=d.joint2 instanceof H?d.joint2:null;this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1);this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2);o=this.m_prismatic2.GetJointTranslation()}this.m_ratio=d.ratio;this.m_constant=j+this.m_ratio*o;this.m_impulse=0};V.prototype.InitVelocityConstraints=function(d){var h=this.m_ground1,l=this.m_ground2,j=this.m_bodyA,o=this.m_bodyB,
-q=0,n=0,a=0,c=0,g=a=0,b=0;this.m_J.SetZero();if(this.m_revolute1){this.m_J.angularA=-1;b+=j.m_invI}else{h=h.m_xf.R;n=this.m_prismatic1.m_localXAxis1;q=h.col1.x*n.x+h.col2.x*n.y;n=h.col1.y*n.x+h.col2.y*n.y;h=j.m_xf.R;a=this.m_localAnchor1.x-j.m_sweep.localCenter.x;c=this.m_localAnchor1.y-j.m_sweep.localCenter.y;g=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=g;a=a*n-c*q;this.m_J.linearA.Set(-q,-n);this.m_J.angularA=-a;b+=j.m_invMass+j.m_invI*a*a}if(this.m_revolute2){this.m_J.angularB=-this.m_ratio;
-b+=this.m_ratio*this.m_ratio*o.m_invI}else{h=l.m_xf.R;n=this.m_prismatic2.m_localXAxis1;q=h.col1.x*n.x+h.col2.x*n.y;n=h.col1.y*n.x+h.col2.y*n.y;h=o.m_xf.R;a=this.m_localAnchor2.x-o.m_sweep.localCenter.x;c=this.m_localAnchor2.y-o.m_sweep.localCenter.y;g=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=g;a=a*n-c*q;this.m_J.linearB.Set(-this.m_ratio*q,-this.m_ratio*n);this.m_J.angularB=-this.m_ratio*a;b+=this.m_ratio*this.m_ratio*(o.m_invMass+o.m_invI*a*a)}this.m_mass=b>0?1/b:0;if(d.warmStarting){j.m_linearVelocity.x+=
-j.m_invMass*this.m_impulse*this.m_J.linearA.x;j.m_linearVelocity.y+=j.m_invMass*this.m_impulse*this.m_J.linearA.y;j.m_angularVelocity+=j.m_invI*this.m_impulse*this.m_J.angularA;o.m_linearVelocity.x+=o.m_invMass*this.m_impulse*this.m_J.linearB.x;o.m_linearVelocity.y+=o.m_invMass*this.m_impulse*this.m_J.linearB.y;o.m_angularVelocity+=o.m_invI*this.m_impulse*this.m_J.angularB}else this.m_impulse=0};V.prototype.SolveVelocityConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=-this.m_mass*this.m_J.Compute(d.m_linearVelocity,
-d.m_angularVelocity,h.m_linearVelocity,h.m_angularVelocity);this.m_impulse+=l;d.m_linearVelocity.x+=d.m_invMass*l*this.m_J.linearA.x;d.m_linearVelocity.y+=d.m_invMass*l*this.m_J.linearA.y;d.m_angularVelocity+=d.m_invI*l*this.m_J.angularA;h.m_linearVelocity.x+=h.m_invMass*l*this.m_J.linearB.x;h.m_linearVelocity.y+=h.m_invMass*l*this.m_J.linearB.y;h.m_angularVelocity+=h.m_invI*l*this.m_J.angularB};V.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=0,j=0;l=this.m_revolute1?
-this.m_revolute1.GetJointAngle():this.m_prismatic1.GetJointTranslation();j=this.m_revolute2?this.m_revolute2.GetJointAngle():this.m_prismatic2.GetJointTranslation();l=-this.m_mass*(this.m_constant-(l+this.m_ratio*j));d.m_sweep.c.x+=d.m_invMass*l*this.m_J.linearA.x;d.m_sweep.c.y+=d.m_invMass*l*this.m_J.linearA.y;d.m_sweep.a+=d.m_invI*l*this.m_J.angularA;h.m_sweep.c.x+=h.m_invMass*l*this.m_J.linearB.x;h.m_sweep.c.y+=h.m_invMass*l*this.m_J.linearB.y;h.m_sweep.a+=h.m_invI*l*this.m_J.angularB;d.SynchronizeTransform();
-h.SynchronizeTransform();return 0<F.b2_linearSlop};Box2D.inherit(M,Box2D.Dynamics.Joints.b2JointDef);M.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;M.b2GearJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments)};M.prototype.b2GearJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_gearJoint;this.joint2=this.joint1=null;this.ratio=1};L.b2Jacobian=function(){this.linearA=new w;this.linearB=new w};L.prototype.SetZero=function(){this.linearA.SetZero();
-this.angularA=0;this.linearB.SetZero();this.angularB=0};L.prototype.Set=function(d,h,l,j){if(h===undefined)h=0;if(j===undefined)j=0;this.linearA.SetV(d);this.angularA=h;this.linearB.SetV(l);this.angularB=j};L.prototype.Compute=function(d,h,l,j){if(h===undefined)h=0;if(j===undefined)j=0;return this.linearA.x*d.x+this.linearA.y*d.y+this.angularA*h+(this.linearB.x*l.x+this.linearB.y*l.y)+this.angularB*j};I.b2Joint=function(){this.m_edgeA=new Y;this.m_edgeB=new Y;this.m_localCenterA=new w;this.m_localCenterB=
-new w};I.prototype.GetType=function(){return this.m_type};I.prototype.GetAnchorA=function(){return null};I.prototype.GetAnchorB=function(){return null};I.prototype.GetReactionForce=function(){return null};I.prototype.GetReactionTorque=function(){return 0};I.prototype.GetBodyA=function(){return this.m_bodyA};I.prototype.GetBodyB=function(){return this.m_bodyB};I.prototype.GetNext=function(){return this.m_next};I.prototype.GetUserData=function(){return this.m_userData};I.prototype.SetUserData=function(d){this.m_userData=
-d};I.prototype.IsActive=function(){return this.m_bodyA.IsActive()&&this.m_bodyB.IsActive()};I.Create=function(d){var h=null;switch(d.type){case I.e_distanceJoint:h=new U(d instanceof p?d:null);break;case I.e_mouseJoint:h=new u(d instanceof D?d:null);break;case I.e_prismaticJoint:h=new H(d instanceof O?d:null);break;case I.e_revoluteJoint:h=new N(d instanceof S?d:null);break;case I.e_pulleyJoint:h=new E(d instanceof R?d:null);break;case I.e_gearJoint:h=new V(d instanceof M?d:null);break;case I.e_lineJoint:h=
-new k(d instanceof z?d:null);break;case I.e_weldJoint:h=new aa(d instanceof Z?d:null);break;case I.e_frictionJoint:h=new B(d instanceof Q?d:null)}return h};I.Destroy=function(){};I.prototype.b2Joint=function(d){F.b2Assert(d.bodyA!=d.bodyB);this.m_type=d.type;this.m_next=this.m_prev=null;this.m_bodyA=d.bodyA;this.m_bodyB=d.bodyB;this.m_collideConnected=d.collideConnected;this.m_islandFlag=false;this.m_userData=d.userData};I.prototype.InitVelocityConstraints=function(){};I.prototype.SolveVelocityConstraints=
-function(){};I.prototype.FinalizeVelocityConstraints=function(){};I.prototype.SolvePositionConstraints=function(){return false};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2Joint.e_unknownJoint=0;Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint=1;Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint=2;Box2D.Dynamics.Joints.b2Joint.e_distanceJoint=3;Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint=4;Box2D.Dynamics.Joints.b2Joint.e_mouseJoint=5;Box2D.Dynamics.Joints.b2Joint.e_gearJoint=6;Box2D.Dynamics.Joints.b2Joint.e_lineJoint=
-7;Box2D.Dynamics.Joints.b2Joint.e_weldJoint=8;Box2D.Dynamics.Joints.b2Joint.e_frictionJoint=9;Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit=0;Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit=1;Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit=2;Box2D.Dynamics.Joints.b2Joint.e_equalLimits=3});W.b2JointDef=function(){};W.prototype.b2JointDef=function(){this.type=I.e_unknownJoint;this.bodyB=this.bodyA=this.userData=null;this.collideConnected=false};Y.b2JointEdge=function(){};Box2D.inherit(k,Box2D.Dynamics.Joints.b2Joint);
-k.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;k.b2LineJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_localXAxis1=new w;this.m_localYAxis1=new w;this.m_axis=new w;this.m_perp=new w;this.m_K=new G;this.m_impulse=new w};k.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};k.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};k.prototype.GetReactionForce=
-function(d){if(d===undefined)d=0;return new w(d*(this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.x),d*(this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.y))};k.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.y};k.prototype.GetJointTranslation=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.GetWorldPoint(this.m_localAnchor1),j=h.GetWorldPoint(this.m_localAnchor2);h=j.x-l.x;l=j.y-l.y;d=d.GetWorldVector(this.m_localXAxis1);
-return d.x*h+d.y*l};k.prototype.GetJointSpeed=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;l=h.m_sweep.c.x+n-(d.m_sweep.c.x+j);q=h.m_sweep.c.y+a-(d.m_sweep.c.y+o);var c=d.GetWorldVector(this.m_localXAxis1),
-g=d.m_linearVelocity,b=h.m_linearVelocity;d=d.m_angularVelocity;h=h.m_angularVelocity;return l*-d*c.y+q*d*c.x+(c.x*(b.x+-h*a-g.x- -d*o)+c.y*(b.y+h*n-g.y-d*j))};k.prototype.IsLimitEnabled=function(){return this.m_enableLimit};k.prototype.EnableLimit=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableLimit=d};k.prototype.GetLowerLimit=function(){return this.m_lowerTranslation};k.prototype.GetUpperLimit=function(){return this.m_upperTranslation};k.prototype.SetLimits=function(d,
-h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_lowerTranslation=d;this.m_upperTranslation=h};k.prototype.IsMotorEnabled=function(){return this.m_enableMotor};k.prototype.EnableMotor=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableMotor=d};k.prototype.SetMotorSpeed=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};k.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};
-k.prototype.SetMaxMotorForce=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_maxMotorForce=d};k.prototype.GetMaxMotorForce=function(){return this.m_maxMotorForce};k.prototype.GetMotorForce=function(){return this.m_motorImpulse};k.prototype.b2LineJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_localXAxis1.SetV(d.localAxisA);this.m_localYAxis1.x=-this.m_localXAxis1.y;
-this.m_localYAxis1.y=this.m_localXAxis1.x;this.m_impulse.SetZero();this.m_motorImpulse=this.m_motorMass=0;this.m_lowerTranslation=d.lowerTranslation;this.m_upperTranslation=d.upperTranslation;this.m_maxMotorForce=d.maxMotorForce;this.m_motorSpeed=d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit;this.m_axis.SetZero();this.m_perp.SetZero()};k.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;this.m_localCenterA.SetV(h.GetLocalCenter());
-this.m_localCenterB.SetV(l.GetLocalCenter());var q=h.GetTransform();l.GetTransform();j=h.m_xf.R;var n=this.m_localAnchor1.x-this.m_localCenterA.x,a=this.m_localAnchor1.y-this.m_localCenterA.y;o=j.col1.x*n+j.col2.x*a;a=j.col1.y*n+j.col2.y*a;n=o;j=l.m_xf.R;var c=this.m_localAnchor2.x-this.m_localCenterB.x,g=this.m_localAnchor2.y-this.m_localCenterB.y;o=j.col1.x*c+j.col2.x*g;g=j.col1.y*c+j.col2.y*g;c=o;j=l.m_sweep.c.x+c-h.m_sweep.c.x-n;o=l.m_sweep.c.y+g-h.m_sweep.c.y-a;this.m_invMassA=h.m_invMass;this.m_invMassB=
-l.m_invMass;this.m_invIA=h.m_invI;this.m_invIB=l.m_invI;this.m_axis.SetV(y.MulMV(q.R,this.m_localXAxis1));this.m_a1=(j+n)*this.m_axis.y-(o+a)*this.m_axis.x;this.m_a2=c*this.m_axis.y-g*this.m_axis.x;this.m_motorMass=this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_a1*this.m_a1+this.m_invIB*this.m_a2*this.m_a2;this.m_motorMass=this.m_motorMass>Number.MIN_VALUE?1/this.m_motorMass:0;this.m_perp.SetV(y.MulMV(q.R,this.m_localYAxis1));this.m_s1=(j+n)*this.m_perp.y-(o+a)*this.m_perp.x;this.m_s2=c*this.m_perp.y-
-g*this.m_perp.x;q=this.m_invMassA;n=this.m_invMassB;a=this.m_invIA;c=this.m_invIB;this.m_K.col1.x=q+n+a*this.m_s1*this.m_s1+c*this.m_s2*this.m_s2;this.m_K.col1.y=a*this.m_s1*this.m_a1+c*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=q+n+a*this.m_a1*this.m_a1+c*this.m_a2*this.m_a2;if(this.m_enableLimit){j=this.m_axis.x*j+this.m_axis.y*o;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop)this.m_limitState=I.e_equalLimits;else if(j<=this.m_lowerTranslation){if(this.m_limitState!=
-I.e_atLowerLimit){this.m_limitState=I.e_atLowerLimit;this.m_impulse.y=0}}else if(j>=this.m_upperTranslation){if(this.m_limitState!=I.e_atUpperLimit){this.m_limitState=I.e_atUpperLimit;this.m_impulse.y=0}}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.y=0}}else this.m_limitState=I.e_inactiveLimit;if(this.m_enableMotor==false)this.m_motorImpulse=0;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+
-this.m_impulse.y)*this.m_axis.x;j=this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.y)*this.m_axis.y;o=this.m_impulse.x*this.m_s1+(this.m_motorImpulse+this.m_impulse.y)*this.m_a1;q=this.m_impulse.x*this.m_s2+(this.m_motorImpulse+this.m_impulse.y)*this.m_a2;h.m_linearVelocity.x-=this.m_invMassA*d;h.m_linearVelocity.y-=this.m_invMassA*j;h.m_angularVelocity-=this.m_invIA*o;l.m_linearVelocity.x+=this.m_invMassB*d;l.m_linearVelocity.y+=this.m_invMassB*j;l.m_angularVelocity+=this.m_invIB*
-q}else{this.m_impulse.SetZero();this.m_motorImpulse=0}};k.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=h.m_linearVelocity,o=h.m_angularVelocity,q=l.m_linearVelocity,n=l.m_angularVelocity,a=0,c=0,g=0,b=0;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){b=this.m_motorMass*(this.m_motorSpeed-(this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o));a=this.m_motorImpulse;c=d.dt*this.m_maxMotorForce;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+
-b,-c,c);b=this.m_motorImpulse-a;a=b*this.m_axis.x;c=b*this.m_axis.y;g=b*this.m_a1;b=b*this.m_a2;j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b}c=this.m_perp.x*(q.x-j.x)+this.m_perp.y*(q.y-j.y)+this.m_s2*n-this.m_s1*o;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){g=this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o;a=this.m_impulse.Copy();d=this.m_K.Solve(new w,-c,-g);this.m_impulse.Add(d);
-if(this.m_limitState==I.e_atLowerLimit)this.m_impulse.y=y.Max(this.m_impulse.y,0);else if(this.m_limitState==I.e_atUpperLimit)this.m_impulse.y=y.Min(this.m_impulse.y,0);c=-c-(this.m_impulse.y-a.y)*this.m_K.col2.x;g=0;g=this.m_K.col1.x!=0?c/this.m_K.col1.x+a.x:a.x;this.m_impulse.x=g;d.x=this.m_impulse.x-a.x;d.y=this.m_impulse.y-a.y;a=d.x*this.m_perp.x+d.y*this.m_axis.x;c=d.x*this.m_perp.y+d.y*this.m_axis.y;g=d.x*this.m_s1+d.y*this.m_a1;b=d.x*this.m_s2+d.y*this.m_a2}else{d=0;d=this.m_K.col1.x!=0?-c/
-this.m_K.col1.x:0;this.m_impulse.x+=d;a=d*this.m_perp.x;c=d*this.m_perp.y;g=d*this.m_s1;b=d*this.m_s2}j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b;h.m_linearVelocity.SetV(j);h.m_angularVelocity=o;l.m_linearVelocity.SetV(q);l.m_angularVelocity=n};k.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.m_sweep.c,j=d.m_sweep.a,o=h.m_sweep.c,q=h.m_sweep.a,n,a=0,c=0,g=0,b=0,e=n=0,f=0;c=false;
-var m=0,r=G.FromAngle(j);g=G.FromAngle(q);n=r;f=this.m_localAnchor1.x-this.m_localCenterA.x;var s=this.m_localAnchor1.y-this.m_localCenterA.y;a=n.col1.x*f+n.col2.x*s;s=n.col1.y*f+n.col2.y*s;f=a;n=g;g=this.m_localAnchor2.x-this.m_localCenterB.x;b=this.m_localAnchor2.y-this.m_localCenterB.y;a=n.col1.x*g+n.col2.x*b;b=n.col1.y*g+n.col2.y*b;g=a;n=o.x+g-l.x-f;a=o.y+b-l.y-s;if(this.m_enableLimit){this.m_axis=y.MulMV(r,this.m_localXAxis1);this.m_a1=(n+f)*this.m_axis.y-(a+s)*this.m_axis.x;this.m_a2=g*this.m_axis.y-
-b*this.m_axis.x;var v=this.m_axis.x*n+this.m_axis.y*a;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop){m=y.Clamp(v,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);e=y.Abs(v);c=true}else if(v<=this.m_lowerTranslation){m=y.Clamp(v-this.m_lowerTranslation+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);e=this.m_lowerTranslation-v;c=true}else if(v>=this.m_upperTranslation){m=y.Clamp(v-this.m_upperTranslation+F.b2_linearSlop,0,F.b2_maxLinearCorrection);e=v-this.m_upperTranslation;
-c=true}}this.m_perp=y.MulMV(r,this.m_localYAxis1);this.m_s1=(n+f)*this.m_perp.y-(a+s)*this.m_perp.x;this.m_s2=g*this.m_perp.y-b*this.m_perp.x;r=new w;s=this.m_perp.x*n+this.m_perp.y*a;e=y.Max(e,y.Abs(s));f=0;if(c){c=this.m_invMassA;g=this.m_invMassB;b=this.m_invIA;n=this.m_invIB;this.m_K.col1.x=c+g+b*this.m_s1*this.m_s1+n*this.m_s2*this.m_s2;this.m_K.col1.y=b*this.m_s1*this.m_a1+n*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=c+g+b*this.m_a1*this.m_a1+n*this.m_a2*this.m_a2;this.m_K.Solve(r,
--s,-m)}else{c=this.m_invMassA;g=this.m_invMassB;b=this.m_invIA;n=this.m_invIB;m=c+g+b*this.m_s1*this.m_s1+n*this.m_s2*this.m_s2;c=0;c=m!=0?-s/m:0;r.x=c;r.y=0}m=r.x*this.m_perp.x+r.y*this.m_axis.x;c=r.x*this.m_perp.y+r.y*this.m_axis.y;s=r.x*this.m_s1+r.y*this.m_a1;r=r.x*this.m_s2+r.y*this.m_a2;l.x-=this.m_invMassA*m;l.y-=this.m_invMassA*c;j-=this.m_invIA*s;o.x+=this.m_invMassB*m;o.y+=this.m_invMassB*c;q+=this.m_invIB*r;d.m_sweep.a=j;h.m_sweep.a=q;d.SynchronizeTransform();h.SynchronizeTransform();return e<=
-F.b2_linearSlop&&f<=F.b2_angularSlop};Box2D.inherit(z,Box2D.Dynamics.Joints.b2JointDef);z.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;z.b2LineJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w;this.localAxisA=new w};z.prototype.b2LineJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_lineJoint;this.localAxisA.Set(1,0);this.enableLimit=false;this.upperTranslation=this.lowerTranslation=
-0;this.enableMotor=false;this.motorSpeed=this.maxMotorForce=0};z.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.localAxisA=this.bodyA.GetLocalVector(j)};Box2D.inherit(u,Box2D.Dynamics.Joints.b2Joint);u.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;u.b2MouseJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.K=new G;this.K1=new G;this.K2=new G;
-this.m_localAnchor=new w;this.m_target=new w;this.m_impulse=new w;this.m_mass=new G;this.m_C=new w};u.prototype.GetAnchorA=function(){return this.m_target};u.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor)};u.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};u.prototype.GetReactionTorque=function(){return 0};u.prototype.GetTarget=function(){return this.m_target};u.prototype.SetTarget=function(d){this.m_bodyB.IsAwake()==
-false&&this.m_bodyB.SetAwake(true);this.m_target=d};u.prototype.GetMaxForce=function(){return this.m_maxForce};u.prototype.SetMaxForce=function(d){if(d===undefined)d=0;this.m_maxForce=d};u.prototype.GetFrequency=function(){return this.m_frequencyHz};u.prototype.SetFrequency=function(d){if(d===undefined)d=0;this.m_frequencyHz=d};u.prototype.GetDampingRatio=function(){return this.m_dampingRatio};u.prototype.SetDampingRatio=function(d){if(d===undefined)d=0;this.m_dampingRatio=d};u.prototype.b2MouseJoint=
-function(d){this.__super.b2Joint.call(this,d);this.m_target.SetV(d.target);var h=this.m_target.x-this.m_bodyB.m_xf.position.x,l=this.m_target.y-this.m_bodyB.m_xf.position.y,j=this.m_bodyB.m_xf.R;this.m_localAnchor.x=h*j.col1.x+l*j.col1.y;this.m_localAnchor.y=h*j.col2.x+l*j.col2.y;this.m_maxForce=d.maxForce;this.m_impulse.SetZero();this.m_frequencyHz=d.frequencyHz;this.m_dampingRatio=d.dampingRatio;this.m_gamma=this.m_beta=0};u.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyB,l=h.GetMass(),
-j=2*Math.PI*this.m_frequencyHz,o=l*j*j;this.m_gamma=d.dt*(2*l*this.m_dampingRatio*j+d.dt*o);this.m_gamma=this.m_gamma!=0?1/this.m_gamma:0;this.m_beta=d.dt*o*this.m_gamma;o=h.m_xf.R;l=this.m_localAnchor.x-h.m_sweep.localCenter.x;j=this.m_localAnchor.y-h.m_sweep.localCenter.y;var q=o.col1.x*l+o.col2.x*j;j=o.col1.y*l+o.col2.y*j;l=q;o=h.m_invMass;q=h.m_invI;this.K1.col1.x=o;this.K1.col2.x=0;this.K1.col1.y=0;this.K1.col2.y=o;this.K2.col1.x=q*j*j;this.K2.col2.x=-q*l*j;this.K2.col1.y=-q*l*j;this.K2.col2.y=
-q*l*l;this.K.SetM(this.K1);this.K.AddM(this.K2);this.K.col1.x+=this.m_gamma;this.K.col2.y+=this.m_gamma;this.K.GetInverse(this.m_mass);this.m_C.x=h.m_sweep.c.x+l-this.m_target.x;this.m_C.y=h.m_sweep.c.y+j-this.m_target.y;h.m_angularVelocity*=0.98;this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;h.m_linearVelocity.x+=o*this.m_impulse.x;h.m_linearVelocity.y+=o*this.m_impulse.y;h.m_angularVelocity+=q*(l*this.m_impulse.y-j*this.m_impulse.x)};u.prototype.SolveVelocityConstraints=function(d){var h=
-this.m_bodyB,l,j=0,o=0;l=h.m_xf.R;var q=this.m_localAnchor.x-h.m_sweep.localCenter.x,n=this.m_localAnchor.y-h.m_sweep.localCenter.y;j=l.col1.x*q+l.col2.x*n;n=l.col1.y*q+l.col2.y*n;q=j;j=h.m_linearVelocity.x+-h.m_angularVelocity*n;var a=h.m_linearVelocity.y+h.m_angularVelocity*q;l=this.m_mass;j=j+this.m_beta*this.m_C.x+this.m_gamma*this.m_impulse.x;o=a+this.m_beta*this.m_C.y+this.m_gamma*this.m_impulse.y;a=-(l.col1.x*j+l.col2.x*o);o=-(l.col1.y*j+l.col2.y*o);l=this.m_impulse.x;j=this.m_impulse.y;this.m_impulse.x+=
-a;this.m_impulse.y+=o;d=d.dt*this.m_maxForce;this.m_impulse.LengthSquared()>d*d&&this.m_impulse.Multiply(d/this.m_impulse.Length());a=this.m_impulse.x-l;o=this.m_impulse.y-j;h.m_linearVelocity.x+=h.m_invMass*a;h.m_linearVelocity.y+=h.m_invMass*o;h.m_angularVelocity+=h.m_invI*(q*o-n*a)};u.prototype.SolvePositionConstraints=function(){return true};Box2D.inherit(D,Box2D.Dynamics.Joints.b2JointDef);D.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;D.b2MouseJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,
-arguments);this.target=new w};D.prototype.b2MouseJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_mouseJoint;this.maxForce=0;this.frequencyHz=5;this.dampingRatio=0.7};Box2D.inherit(H,Box2D.Dynamics.Joints.b2Joint);H.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;H.b2PrismaticJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_localXAxis1=new w;this.m_localYAxis1=new w;this.m_axis=new w;
-this.m_perp=new w;this.m_K=new K;this.m_impulse=new A};H.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};H.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};H.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*(this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.x),d*(this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.y))};H.prototype.GetReactionTorque=
-function(d){if(d===undefined)d=0;return d*this.m_impulse.y};H.prototype.GetJointTranslation=function(){var d=this.m_bodyA,h=this.m_bodyB,l=d.GetWorldPoint(this.m_localAnchor1),j=h.GetWorldPoint(this.m_localAnchor2);h=j.x-l.x;l=j.y-l.y;d=d.GetWorldVector(this.m_localXAxis1);return d.x*h+d.y*l};H.prototype.GetJointSpeed=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;
-o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;l=h.m_sweep.c.x+n-(d.m_sweep.c.x+j);q=h.m_sweep.c.y+a-(d.m_sweep.c.y+o);var c=d.GetWorldVector(this.m_localXAxis1),g=d.m_linearVelocity,b=h.m_linearVelocity;d=d.m_angularVelocity;h=h.m_angularVelocity;return l*-d*c.y+q*d*c.x+(c.x*(b.x+-h*a-g.x- -d*o)+c.y*(b.y+h*n-g.y-d*j))};H.prototype.IsLimitEnabled=function(){return this.m_enableLimit};
-H.prototype.EnableLimit=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableLimit=d};H.prototype.GetLowerLimit=function(){return this.m_lowerTranslation};H.prototype.GetUpperLimit=function(){return this.m_upperTranslation};H.prototype.SetLimits=function(d,h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_lowerTranslation=d;this.m_upperTranslation=h};H.prototype.IsMotorEnabled=function(){return this.m_enableMotor};
-H.prototype.EnableMotor=function(d){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_enableMotor=d};H.prototype.SetMotorSpeed=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};H.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};H.prototype.SetMaxMotorForce=function(d){if(d===undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_maxMotorForce=d};H.prototype.GetMotorForce=function(){return this.m_motorImpulse};
-H.prototype.b2PrismaticJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_localXAxis1.SetV(d.localAxisA);this.m_localYAxis1.x=-this.m_localXAxis1.y;this.m_localYAxis1.y=this.m_localXAxis1.x;this.m_refAngle=d.referenceAngle;this.m_impulse.SetZero();this.m_motorImpulse=this.m_motorMass=0;this.m_lowerTranslation=d.lowerTranslation;this.m_upperTranslation=d.upperTranslation;this.m_maxMotorForce=d.maxMotorForce;this.m_motorSpeed=
-d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit;this.m_axis.SetZero();this.m_perp.SetZero()};H.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;this.m_localCenterA.SetV(h.GetLocalCenter());this.m_localCenterB.SetV(l.GetLocalCenter());var q=h.GetTransform();l.GetTransform();j=h.m_xf.R;var n=this.m_localAnchor1.x-this.m_localCenterA.x,a=this.m_localAnchor1.y-this.m_localCenterA.y;o=j.col1.x*n+j.col2.x*
-a;a=j.col1.y*n+j.col2.y*a;n=o;j=l.m_xf.R;var c=this.m_localAnchor2.x-this.m_localCenterB.x,g=this.m_localAnchor2.y-this.m_localCenterB.y;o=j.col1.x*c+j.col2.x*g;g=j.col1.y*c+j.col2.y*g;c=o;j=l.m_sweep.c.x+c-h.m_sweep.c.x-n;o=l.m_sweep.c.y+g-h.m_sweep.c.y-a;this.m_invMassA=h.m_invMass;this.m_invMassB=l.m_invMass;this.m_invIA=h.m_invI;this.m_invIB=l.m_invI;this.m_axis.SetV(y.MulMV(q.R,this.m_localXAxis1));this.m_a1=(j+n)*this.m_axis.y-(o+a)*this.m_axis.x;this.m_a2=c*this.m_axis.y-g*this.m_axis.x;this.m_motorMass=
-this.m_invMassA+this.m_invMassB+this.m_invIA*this.m_a1*this.m_a1+this.m_invIB*this.m_a2*this.m_a2;if(this.m_motorMass>Number.MIN_VALUE)this.m_motorMass=1/this.m_motorMass;this.m_perp.SetV(y.MulMV(q.R,this.m_localYAxis1));this.m_s1=(j+n)*this.m_perp.y-(o+a)*this.m_perp.x;this.m_s2=c*this.m_perp.y-g*this.m_perp.x;q=this.m_invMassA;n=this.m_invMassB;a=this.m_invIA;c=this.m_invIB;this.m_K.col1.x=q+n+a*this.m_s1*this.m_s1+c*this.m_s2*this.m_s2;this.m_K.col1.y=a*this.m_s1+c*this.m_s2;this.m_K.col1.z=a*
-this.m_s1*this.m_a1+c*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=a+c;this.m_K.col2.z=a*this.m_a1+c*this.m_a2;this.m_K.col3.x=this.m_K.col1.z;this.m_K.col3.y=this.m_K.col2.z;this.m_K.col3.z=q+n+a*this.m_a1*this.m_a1+c*this.m_a2*this.m_a2;if(this.m_enableLimit){j=this.m_axis.x*j+this.m_axis.y*o;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop)this.m_limitState=I.e_equalLimits;else if(j<=this.m_lowerTranslation){if(this.m_limitState!=I.e_atLowerLimit){this.m_limitState=
-I.e_atLowerLimit;this.m_impulse.z=0}}else if(j>=this.m_upperTranslation){if(this.m_limitState!=I.e_atUpperLimit){this.m_limitState=I.e_atUpperLimit;this.m_impulse.z=0}}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.z=0}}else this.m_limitState=I.e_inactiveLimit;if(this.m_enableMotor==false)this.m_motorImpulse=0;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x*this.m_perp.x+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.x;
-j=this.m_impulse.x*this.m_perp.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_axis.y;o=this.m_impulse.x*this.m_s1+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a1;q=this.m_impulse.x*this.m_s2+this.m_impulse.y+(this.m_motorImpulse+this.m_impulse.z)*this.m_a2;h.m_linearVelocity.x-=this.m_invMassA*d;h.m_linearVelocity.y-=this.m_invMassA*j;h.m_angularVelocity-=this.m_invIA*o;l.m_linearVelocity.x+=this.m_invMassB*d;l.m_linearVelocity.y+=this.m_invMassB*j;l.m_angularVelocity+=this.m_invIB*
-q}else{this.m_impulse.SetZero();this.m_motorImpulse=0}};H.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=h.m_linearVelocity,o=h.m_angularVelocity,q=l.m_linearVelocity,n=l.m_angularVelocity,a=0,c=0,g=0,b=0;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){b=this.m_motorMass*(this.m_motorSpeed-(this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o));a=this.m_motorImpulse;d=d.dt*this.m_maxMotorForce;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+
-b,-d,d);b=this.m_motorImpulse-a;a=b*this.m_axis.x;c=b*this.m_axis.y;g=b*this.m_a1;b=b*this.m_a2;j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b}g=this.m_perp.x*(q.x-j.x)+this.m_perp.y*(q.y-j.y)+this.m_s2*n-this.m_s1*o;c=n-o;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=this.m_axis.x*(q.x-j.x)+this.m_axis.y*(q.y-j.y)+this.m_a2*n-this.m_a1*o;a=this.m_impulse.Copy();d=this.m_K.Solve33(new A,-g,-c,-d);this.m_impulse.Add(d);
-if(this.m_limitState==I.e_atLowerLimit)this.m_impulse.z=y.Max(this.m_impulse.z,0);else if(this.m_limitState==I.e_atUpperLimit)this.m_impulse.z=y.Min(this.m_impulse.z,0);g=-g-(this.m_impulse.z-a.z)*this.m_K.col3.x;c=-c-(this.m_impulse.z-a.z)*this.m_K.col3.y;c=this.m_K.Solve22(new w,g,c);c.x+=a.x;c.y+=a.y;this.m_impulse.x=c.x;this.m_impulse.y=c.y;d.x=this.m_impulse.x-a.x;d.y=this.m_impulse.y-a.y;d.z=this.m_impulse.z-a.z;a=d.x*this.m_perp.x+d.z*this.m_axis.x;c=d.x*this.m_perp.y+d.z*this.m_axis.y;g=d.x*
-this.m_s1+d.y+d.z*this.m_a1;b=d.x*this.m_s2+d.y+d.z*this.m_a2}else{d=this.m_K.Solve22(new w,-g,-c);this.m_impulse.x+=d.x;this.m_impulse.y+=d.y;a=d.x*this.m_perp.x;c=d.x*this.m_perp.y;g=d.x*this.m_s1+d.y;b=d.x*this.m_s2+d.y}j.x-=this.m_invMassA*a;j.y-=this.m_invMassA*c;o-=this.m_invIA*g;q.x+=this.m_invMassB*a;q.y+=this.m_invMassB*c;n+=this.m_invIB*b;h.m_linearVelocity.SetV(j);h.m_angularVelocity=o;l.m_linearVelocity.SetV(q);l.m_angularVelocity=n};H.prototype.SolvePositionConstraints=function(){var d=
-this.m_bodyA,h=this.m_bodyB,l=d.m_sweep.c,j=d.m_sweep.a,o=h.m_sweep.c,q=h.m_sweep.a,n,a=0,c=0,g=0,b=a=n=0,e=0;c=false;var f=0,m=G.FromAngle(j),r=G.FromAngle(q);n=m;e=this.m_localAnchor1.x-this.m_localCenterA.x;var s=this.m_localAnchor1.y-this.m_localCenterA.y;a=n.col1.x*e+n.col2.x*s;s=n.col1.y*e+n.col2.y*s;e=a;n=r;r=this.m_localAnchor2.x-this.m_localCenterB.x;g=this.m_localAnchor2.y-this.m_localCenterB.y;a=n.col1.x*r+n.col2.x*g;g=n.col1.y*r+n.col2.y*g;r=a;n=o.x+r-l.x-e;a=o.y+g-l.y-s;if(this.m_enableLimit){this.m_axis=
-y.MulMV(m,this.m_localXAxis1);this.m_a1=(n+e)*this.m_axis.y-(a+s)*this.m_axis.x;this.m_a2=r*this.m_axis.y-g*this.m_axis.x;var v=this.m_axis.x*n+this.m_axis.y*a;if(y.Abs(this.m_upperTranslation-this.m_lowerTranslation)<2*F.b2_linearSlop){f=y.Clamp(v,-F.b2_maxLinearCorrection,F.b2_maxLinearCorrection);b=y.Abs(v);c=true}else if(v<=this.m_lowerTranslation){f=y.Clamp(v-this.m_lowerTranslation+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);b=this.m_lowerTranslation-v;c=true}else if(v>=this.m_upperTranslation){f=
-y.Clamp(v-this.m_upperTranslation+F.b2_linearSlop,0,F.b2_maxLinearCorrection);b=v-this.m_upperTranslation;c=true}}this.m_perp=y.MulMV(m,this.m_localYAxis1);this.m_s1=(n+e)*this.m_perp.y-(a+s)*this.m_perp.x;this.m_s2=r*this.m_perp.y-g*this.m_perp.x;m=new A;s=this.m_perp.x*n+this.m_perp.y*a;r=q-j-this.m_refAngle;b=y.Max(b,y.Abs(s));e=y.Abs(r);if(c){c=this.m_invMassA;g=this.m_invMassB;n=this.m_invIA;a=this.m_invIB;this.m_K.col1.x=c+g+n*this.m_s1*this.m_s1+a*this.m_s2*this.m_s2;this.m_K.col1.y=n*this.m_s1+
-a*this.m_s2;this.m_K.col1.z=n*this.m_s1*this.m_a1+a*this.m_s2*this.m_a2;this.m_K.col2.x=this.m_K.col1.y;this.m_K.col2.y=n+a;this.m_K.col2.z=n*this.m_a1+a*this.m_a2;this.m_K.col3.x=this.m_K.col1.z;this.m_K.col3.y=this.m_K.col2.z;this.m_K.col3.z=c+g+n*this.m_a1*this.m_a1+a*this.m_a2*this.m_a2;this.m_K.Solve33(m,-s,-r,-f)}else{c=this.m_invMassA;g=this.m_invMassB;n=this.m_invIA;a=this.m_invIB;f=n*this.m_s1+a*this.m_s2;v=n+a;this.m_K.col1.Set(c+g+n*this.m_s1*this.m_s1+a*this.m_s2*this.m_s2,f,0);this.m_K.col2.Set(f,
-v,0);f=this.m_K.Solve22(new w,-s,-r);m.x=f.x;m.y=f.y;m.z=0}f=m.x*this.m_perp.x+m.z*this.m_axis.x;c=m.x*this.m_perp.y+m.z*this.m_axis.y;s=m.x*this.m_s1+m.y+m.z*this.m_a1;m=m.x*this.m_s2+m.y+m.z*this.m_a2;l.x-=this.m_invMassA*f;l.y-=this.m_invMassA*c;j-=this.m_invIA*s;o.x+=this.m_invMassB*f;o.y+=this.m_invMassB*c;q+=this.m_invIB*m;d.m_sweep.a=j;h.m_sweep.a=q;d.SynchronizeTransform();h.SynchronizeTransform();return b<=F.b2_linearSlop&&e<=F.b2_angularSlop};Box2D.inherit(O,Box2D.Dynamics.Joints.b2JointDef);
-O.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;O.b2PrismaticJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w;this.localAxisA=new w};O.prototype.b2PrismaticJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_prismaticJoint;this.localAxisA.Set(1,0);this.referenceAngle=0;this.enableLimit=false;this.upperTranslation=this.lowerTranslation=0;this.enableMotor=false;this.motorSpeed=this.maxMotorForce=
-0};O.prototype.Initialize=function(d,h,l,j){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.localAxisA=this.bodyA.GetLocalVector(j);this.referenceAngle=this.bodyB.GetAngle()-this.bodyA.GetAngle()};Box2D.inherit(E,Box2D.Dynamics.Joints.b2Joint);E.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;E.b2PulleyJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_groundAnchor1=new w;this.m_groundAnchor2=
-new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_u1=new w;this.m_u2=new w};E.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};E.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};E.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse*this.m_u2.x,d*this.m_impulse*this.m_u2.y)};E.prototype.GetReactionTorque=function(){return 0};E.prototype.GetGroundAnchorA=function(){var d=
-this.m_ground.m_xf.position.Copy();d.Add(this.m_groundAnchor1);return d};E.prototype.GetGroundAnchorB=function(){var d=this.m_ground.m_xf.position.Copy();d.Add(this.m_groundAnchor2);return d};E.prototype.GetLength1=function(){var d=this.m_bodyA.GetWorldPoint(this.m_localAnchor1),h=d.x-(this.m_ground.m_xf.position.x+this.m_groundAnchor1.x);d=d.y-(this.m_ground.m_xf.position.y+this.m_groundAnchor1.y);return Math.sqrt(h*h+d*d)};E.prototype.GetLength2=function(){var d=this.m_bodyB.GetWorldPoint(this.m_localAnchor2),
-h=d.x-(this.m_ground.m_xf.position.x+this.m_groundAnchor2.x);d=d.y-(this.m_ground.m_xf.position.y+this.m_groundAnchor2.y);return Math.sqrt(h*h+d*d)};E.prototype.GetRatio=function(){return this.m_ratio};E.prototype.b2PulleyJoint=function(d){this.__super.b2Joint.call(this,d);this.m_ground=this.m_bodyA.m_world.m_groundBody;this.m_groundAnchor1.x=d.groundAnchorA.x-this.m_ground.m_xf.position.x;this.m_groundAnchor1.y=d.groundAnchorA.y-this.m_ground.m_xf.position.y;this.m_groundAnchor2.x=d.groundAnchorB.x-
-this.m_ground.m_xf.position.x;this.m_groundAnchor2.y=d.groundAnchorB.y-this.m_ground.m_xf.position.y;this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_ratio=d.ratio;this.m_constant=d.lengthA+this.m_ratio*d.lengthB;this.m_maxLength1=y.Min(d.maxLengthA,this.m_constant-this.m_ratio*E.b2_minPulleyLength);this.m_maxLength2=y.Min(d.maxLengthB,(this.m_constant-E.b2_minPulleyLength)/this.m_ratio);this.m_limitImpulse2=this.m_limitImpulse1=this.m_impulse=0};E.prototype.InitVelocityConstraints=
-function(d){var h=this.m_bodyA,l=this.m_bodyB,j;j=h.m_xf.R;var o=this.m_localAnchor1.x-h.m_sweep.localCenter.x,q=this.m_localAnchor1.y-h.m_sweep.localCenter.y,n=j.col1.x*o+j.col2.x*q;q=j.col1.y*o+j.col2.y*q;o=n;j=l.m_xf.R;var a=this.m_localAnchor2.x-l.m_sweep.localCenter.x,c=this.m_localAnchor2.y-l.m_sweep.localCenter.y;n=j.col1.x*a+j.col2.x*c;c=j.col1.y*a+j.col2.y*c;a=n;j=l.m_sweep.c.x+a;n=l.m_sweep.c.y+c;var g=this.m_ground.m_xf.position.x+this.m_groundAnchor2.x,b=this.m_ground.m_xf.position.y+
-this.m_groundAnchor2.y;this.m_u1.Set(h.m_sweep.c.x+o-(this.m_ground.m_xf.position.x+this.m_groundAnchor1.x),h.m_sweep.c.y+q-(this.m_ground.m_xf.position.y+this.m_groundAnchor1.y));this.m_u2.Set(j-g,n-b);j=this.m_u1.Length();n=this.m_u2.Length();j>F.b2_linearSlop?this.m_u1.Multiply(1/j):this.m_u1.SetZero();n>F.b2_linearSlop?this.m_u2.Multiply(1/n):this.m_u2.SetZero();if(this.m_constant-j-this.m_ratio*n>0){this.m_state=I.e_inactiveLimit;this.m_impulse=0}else this.m_state=I.e_atUpperLimit;if(j<this.m_maxLength1){this.m_limitState1=
-I.e_inactiveLimit;this.m_limitImpulse1=0}else this.m_limitState1=I.e_atUpperLimit;if(n<this.m_maxLength2){this.m_limitState2=I.e_inactiveLimit;this.m_limitImpulse2=0}else this.m_limitState2=I.e_atUpperLimit;j=o*this.m_u1.y-q*this.m_u1.x;n=a*this.m_u2.y-c*this.m_u2.x;this.m_limitMass1=h.m_invMass+h.m_invI*j*j;this.m_limitMass2=l.m_invMass+l.m_invI*n*n;this.m_pulleyMass=this.m_limitMass1+this.m_ratio*this.m_ratio*this.m_limitMass2;this.m_limitMass1=1/this.m_limitMass1;this.m_limitMass2=1/this.m_limitMass2;
-this.m_pulleyMass=1/this.m_pulleyMass;if(d.warmStarting){this.m_impulse*=d.dtRatio;this.m_limitImpulse1*=d.dtRatio;this.m_limitImpulse2*=d.dtRatio;d=(-this.m_impulse-this.m_limitImpulse1)*this.m_u1.x;j=(-this.m_impulse-this.m_limitImpulse1)*this.m_u1.y;n=(-this.m_ratio*this.m_impulse-this.m_limitImpulse2)*this.m_u2.x;g=(-this.m_ratio*this.m_impulse-this.m_limitImpulse2)*this.m_u2.y;h.m_linearVelocity.x+=h.m_invMass*d;h.m_linearVelocity.y+=h.m_invMass*j;h.m_angularVelocity+=h.m_invI*(o*j-q*d);l.m_linearVelocity.x+=
-l.m_invMass*n;l.m_linearVelocity.y+=l.m_invMass*g;l.m_angularVelocity+=l.m_invI*(a*g-c*n)}else this.m_limitImpulse2=this.m_limitImpulse1=this.m_impulse=0};E.prototype.SolveVelocityConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l;l=d.m_xf.R;var j=this.m_localAnchor1.x-d.m_sweep.localCenter.x,o=this.m_localAnchor1.y-d.m_sweep.localCenter.y,q=l.col1.x*j+l.col2.x*o;o=l.col1.y*j+l.col2.y*o;j=q;l=h.m_xf.R;var n=this.m_localAnchor2.x-h.m_sweep.localCenter.x,a=this.m_localAnchor2.y-h.m_sweep.localCenter.y;
-q=l.col1.x*n+l.col2.x*a;a=l.col1.y*n+l.col2.y*a;n=q;var c=q=l=0,g=0;l=g=l=g=c=q=l=0;if(this.m_state==I.e_atUpperLimit){l=d.m_linearVelocity.x+-d.m_angularVelocity*o;q=d.m_linearVelocity.y+d.m_angularVelocity*j;c=h.m_linearVelocity.x+-h.m_angularVelocity*a;g=h.m_linearVelocity.y+h.m_angularVelocity*n;l=-(this.m_u1.x*l+this.m_u1.y*q)-this.m_ratio*(this.m_u2.x*c+this.m_u2.y*g);g=this.m_pulleyMass*-l;l=this.m_impulse;this.m_impulse=y.Max(0,this.m_impulse+g);g=this.m_impulse-l;l=-g*this.m_u1.x;q=-g*this.m_u1.y;
-c=-this.m_ratio*g*this.m_u2.x;g=-this.m_ratio*g*this.m_u2.y;d.m_linearVelocity.x+=d.m_invMass*l;d.m_linearVelocity.y+=d.m_invMass*q;d.m_angularVelocity+=d.m_invI*(j*q-o*l);h.m_linearVelocity.x+=h.m_invMass*c;h.m_linearVelocity.y+=h.m_invMass*g;h.m_angularVelocity+=h.m_invI*(n*g-a*c)}if(this.m_limitState1==I.e_atUpperLimit){l=d.m_linearVelocity.x+-d.m_angularVelocity*o;q=d.m_linearVelocity.y+d.m_angularVelocity*j;l=-(this.m_u1.x*l+this.m_u1.y*q);g=-this.m_limitMass1*l;l=this.m_limitImpulse1;this.m_limitImpulse1=
-y.Max(0,this.m_limitImpulse1+g);g=this.m_limitImpulse1-l;l=-g*this.m_u1.x;q=-g*this.m_u1.y;d.m_linearVelocity.x+=d.m_invMass*l;d.m_linearVelocity.y+=d.m_invMass*q;d.m_angularVelocity+=d.m_invI*(j*q-o*l)}if(this.m_limitState2==I.e_atUpperLimit){c=h.m_linearVelocity.x+-h.m_angularVelocity*a;g=h.m_linearVelocity.y+h.m_angularVelocity*n;l=-(this.m_u2.x*c+this.m_u2.y*g);g=-this.m_limitMass2*l;l=this.m_limitImpulse2;this.m_limitImpulse2=y.Max(0,this.m_limitImpulse2+g);g=this.m_limitImpulse2-l;c=-g*this.m_u2.x;
-g=-g*this.m_u2.y;h.m_linearVelocity.x+=h.m_invMass*c;h.m_linearVelocity.y+=h.m_invMass*g;h.m_angularVelocity+=h.m_invI*(n*g-a*c)}};E.prototype.SolvePositionConstraints=function(){var d=this.m_bodyA,h=this.m_bodyB,l,j=this.m_ground.m_xf.position.x+this.m_groundAnchor1.x,o=this.m_ground.m_xf.position.y+this.m_groundAnchor1.y,q=this.m_ground.m_xf.position.x+this.m_groundAnchor2.x,n=this.m_ground.m_xf.position.y+this.m_groundAnchor2.y,a=0,c=0,g=0,b=0,e=l=0,f=0,m=0,r=e=m=l=e=l=0;if(this.m_state==I.e_atUpperLimit){l=
-d.m_xf.R;a=this.m_localAnchor1.x-d.m_sweep.localCenter.x;c=this.m_localAnchor1.y-d.m_sweep.localCenter.y;e=l.col1.x*a+l.col2.x*c;c=l.col1.y*a+l.col2.y*c;a=e;l=h.m_xf.R;g=this.m_localAnchor2.x-h.m_sweep.localCenter.x;b=this.m_localAnchor2.y-h.m_sweep.localCenter.y;e=l.col1.x*g+l.col2.x*b;b=l.col1.y*g+l.col2.y*b;g=e;l=d.m_sweep.c.x+a;e=d.m_sweep.c.y+c;f=h.m_sweep.c.x+g;m=h.m_sweep.c.y+b;this.m_u1.Set(l-j,e-o);this.m_u2.Set(f-q,m-n);l=this.m_u1.Length();e=this.m_u2.Length();l>F.b2_linearSlop?this.m_u1.Multiply(1/
-l):this.m_u1.SetZero();e>F.b2_linearSlop?this.m_u2.Multiply(1/e):this.m_u2.SetZero();l=this.m_constant-l-this.m_ratio*e;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_pulleyMass*l;l=-m*this.m_u1.x;e=-m*this.m_u1.y;f=-this.m_ratio*m*this.m_u2.x;m=-this.m_ratio*m*this.m_u2.y;d.m_sweep.c.x+=d.m_invMass*l;d.m_sweep.c.y+=d.m_invMass*e;d.m_sweep.a+=d.m_invI*(a*e-c*l);h.m_sweep.c.x+=h.m_invMass*f;h.m_sweep.c.y+=h.m_invMass*m;h.m_sweep.a+=h.m_invI*(g*m-b*f);d.SynchronizeTransform();
-h.SynchronizeTransform()}if(this.m_limitState1==I.e_atUpperLimit){l=d.m_xf.R;a=this.m_localAnchor1.x-d.m_sweep.localCenter.x;c=this.m_localAnchor1.y-d.m_sweep.localCenter.y;e=l.col1.x*a+l.col2.x*c;c=l.col1.y*a+l.col2.y*c;a=e;l=d.m_sweep.c.x+a;e=d.m_sweep.c.y+c;this.m_u1.Set(l-j,e-o);l=this.m_u1.Length();if(l>F.b2_linearSlop){this.m_u1.x*=1/l;this.m_u1.y*=1/l}else this.m_u1.SetZero();l=this.m_maxLength1-l;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_limitMass1*l;
-l=-m*this.m_u1.x;e=-m*this.m_u1.y;d.m_sweep.c.x+=d.m_invMass*l;d.m_sweep.c.y+=d.m_invMass*e;d.m_sweep.a+=d.m_invI*(a*e-c*l);d.SynchronizeTransform()}if(this.m_limitState2==I.e_atUpperLimit){l=h.m_xf.R;g=this.m_localAnchor2.x-h.m_sweep.localCenter.x;b=this.m_localAnchor2.y-h.m_sweep.localCenter.y;e=l.col1.x*g+l.col2.x*b;b=l.col1.y*g+l.col2.y*b;g=e;f=h.m_sweep.c.x+g;m=h.m_sweep.c.y+b;this.m_u2.Set(f-q,m-n);e=this.m_u2.Length();if(e>F.b2_linearSlop){this.m_u2.x*=1/e;this.m_u2.y*=1/e}else this.m_u2.SetZero();
-l=this.m_maxLength2-e;r=y.Max(r,-l);l=y.Clamp(l+F.b2_linearSlop,-F.b2_maxLinearCorrection,0);m=-this.m_limitMass2*l;f=-m*this.m_u2.x;m=-m*this.m_u2.y;h.m_sweep.c.x+=h.m_invMass*f;h.m_sweep.c.y+=h.m_invMass*m;h.m_sweep.a+=h.m_invI*(g*m-b*f);h.SynchronizeTransform()}return r<F.b2_linearSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2PulleyJoint.b2_minPulleyLength=2});Box2D.inherit(R,Box2D.Dynamics.Joints.b2JointDef);R.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;R.b2PulleyJointDef=
-function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.groundAnchorA=new w;this.groundAnchorB=new w;this.localAnchorA=new w;this.localAnchorB=new w};R.prototype.b2PulleyJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_pulleyJoint;this.groundAnchorA.Set(-1,1);this.groundAnchorB.Set(1,1);this.localAnchorA.Set(-1,0);this.localAnchorB.Set(1,0);this.maxLengthB=this.lengthB=this.maxLengthA=this.lengthA=0;this.ratio=1;this.collideConnected=true};R.prototype.Initialize=
-function(d,h,l,j,o,q,n){if(n===undefined)n=0;this.bodyA=d;this.bodyB=h;this.groundAnchorA.SetV(l);this.groundAnchorB.SetV(j);this.localAnchorA=this.bodyA.GetLocalPoint(o);this.localAnchorB=this.bodyB.GetLocalPoint(q);d=o.x-l.x;l=o.y-l.y;this.lengthA=Math.sqrt(d*d+l*l);l=q.x-j.x;j=q.y-j.y;this.lengthB=Math.sqrt(l*l+j*j);this.ratio=n;n=this.lengthA+this.ratio*this.lengthB;this.maxLengthA=n-this.ratio*E.b2_minPulleyLength;this.maxLengthB=(n-E.b2_minPulleyLength)/this.ratio};Box2D.inherit(N,Box2D.Dynamics.Joints.b2Joint);
-N.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;N.b2RevoluteJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.K=new G;this.K1=new G;this.K2=new G;this.K3=new G;this.impulse3=new A;this.impulse2=new w;this.reduced=new w;this.m_localAnchor1=new w;this.m_localAnchor2=new w;this.m_impulse=new A;this.m_mass=new K};N.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)};N.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)};
-N.prototype.GetReactionForce=function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};N.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.z};N.prototype.GetJointAngle=function(){return this.m_bodyB.m_sweep.a-this.m_bodyA.m_sweep.a-this.m_referenceAngle};N.prototype.GetJointSpeed=function(){return this.m_bodyB.m_angularVelocity-this.m_bodyA.m_angularVelocity};N.prototype.IsLimitEnabled=function(){return this.m_enableLimit};N.prototype.EnableLimit=
-function(d){this.m_enableLimit=d};N.prototype.GetLowerLimit=function(){return this.m_lowerAngle};N.prototype.GetUpperLimit=function(){return this.m_upperAngle};N.prototype.SetLimits=function(d,h){if(d===undefined)d=0;if(h===undefined)h=0;this.m_lowerAngle=d;this.m_upperAngle=h};N.prototype.IsMotorEnabled=function(){this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);return this.m_enableMotor};N.prototype.EnableMotor=function(d){this.m_enableMotor=d};N.prototype.SetMotorSpeed=function(d){if(d===
-undefined)d=0;this.m_bodyA.SetAwake(true);this.m_bodyB.SetAwake(true);this.m_motorSpeed=d};N.prototype.GetMotorSpeed=function(){return this.m_motorSpeed};N.prototype.SetMaxMotorTorque=function(d){if(d===undefined)d=0;this.m_maxMotorTorque=d};N.prototype.GetMotorTorque=function(){return this.m_maxMotorTorque};N.prototype.b2RevoluteJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchor1.SetV(d.localAnchorA);this.m_localAnchor2.SetV(d.localAnchorB);this.m_referenceAngle=d.referenceAngle;
-this.m_impulse.SetZero();this.m_motorImpulse=0;this.m_lowerAngle=d.lowerAngle;this.m_upperAngle=d.upperAngle;this.m_maxMotorTorque=d.maxMotorTorque;this.m_motorSpeed=d.motorSpeed;this.m_enableLimit=d.enableLimit;this.m_enableMotor=d.enableMotor;this.m_limitState=I.e_inactiveLimit};N.prototype.InitVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j,o=0;j=h.m_xf.R;var q=this.m_localAnchor1.x-h.m_sweep.localCenter.x,n=this.m_localAnchor1.y-h.m_sweep.localCenter.y;o=j.col1.x*q+j.col2.x*
-n;n=j.col1.y*q+j.col2.y*n;q=o;j=l.m_xf.R;var a=this.m_localAnchor2.x-l.m_sweep.localCenter.x,c=this.m_localAnchor2.y-l.m_sweep.localCenter.y;o=j.col1.x*a+j.col2.x*c;c=j.col1.y*a+j.col2.y*c;a=o;j=h.m_invMass;o=l.m_invMass;var g=h.m_invI,b=l.m_invI;this.m_mass.col1.x=j+o+n*n*g+c*c*b;this.m_mass.col2.x=-n*q*g-c*a*b;this.m_mass.col3.x=-n*g-c*b;this.m_mass.col1.y=this.m_mass.col2.x;this.m_mass.col2.y=j+o+q*q*g+a*a*b;this.m_mass.col3.y=q*g+a*b;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;
-this.m_mass.col3.z=g+b;this.m_motorMass=1/(g+b);if(this.m_enableMotor==false)this.m_motorImpulse=0;if(this.m_enableLimit){var e=l.m_sweep.a-h.m_sweep.a-this.m_referenceAngle;if(y.Abs(this.m_upperAngle-this.m_lowerAngle)<2*F.b2_angularSlop)this.m_limitState=I.e_equalLimits;else if(e<=this.m_lowerAngle){if(this.m_limitState!=I.e_atLowerLimit)this.m_impulse.z=0;this.m_limitState=I.e_atLowerLimit}else if(e>=this.m_upperAngle){if(this.m_limitState!=I.e_atUpperLimit)this.m_impulse.z=0;this.m_limitState=
-I.e_atUpperLimit}else{this.m_limitState=I.e_inactiveLimit;this.m_impulse.z=0}}else this.m_limitState=I.e_inactiveLimit;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_motorImpulse*=d.dtRatio;d=this.m_impulse.x;e=this.m_impulse.y;h.m_linearVelocity.x-=j*d;h.m_linearVelocity.y-=j*e;h.m_angularVelocity-=g*(q*e-n*d+this.m_motorImpulse+this.m_impulse.z);l.m_linearVelocity.x+=o*d;l.m_linearVelocity.y+=o*e;l.m_angularVelocity+=b*(a*e-c*d+this.m_motorImpulse+this.m_impulse.z)}else{this.m_impulse.SetZero();
-this.m_motorImpulse=0}};N.prototype.SolveVelocityConstraints=function(d){var h=this.m_bodyA,l=this.m_bodyB,j=0,o=j=0,q=0,n=0,a=0,c=h.m_linearVelocity,g=h.m_angularVelocity,b=l.m_linearVelocity,e=l.m_angularVelocity,f=h.m_invMass,m=l.m_invMass,r=h.m_invI,s=l.m_invI;if(this.m_enableMotor&&this.m_limitState!=I.e_equalLimits){o=this.m_motorMass*-(e-g-this.m_motorSpeed);q=this.m_motorImpulse;n=d.dt*this.m_maxMotorTorque;this.m_motorImpulse=y.Clamp(this.m_motorImpulse+o,-n,n);o=this.m_motorImpulse-q;g-=
-r*o;e+=s*o}if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=h.m_xf.R;o=this.m_localAnchor1.x-h.m_sweep.localCenter.x;q=this.m_localAnchor1.y-h.m_sweep.localCenter.y;j=d.col1.x*o+d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=j;d=l.m_xf.R;n=this.m_localAnchor2.x-l.m_sweep.localCenter.x;a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;j=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=j;d=b.x+-e*a-c.x- -g*q;var v=b.y+e*n-c.y-g*o;this.m_mass.Solve33(this.impulse3,-d,-v,-(e-g));if(this.m_limitState==
-I.e_equalLimits)this.m_impulse.Add(this.impulse3);else if(this.m_limitState==I.e_atLowerLimit){j=this.m_impulse.z+this.impulse3.z;if(j<0){this.m_mass.Solve22(this.reduced,-d,-v);this.impulse3.x=this.reduced.x;this.impulse3.y=this.reduced.y;this.impulse3.z=-this.m_impulse.z;this.m_impulse.x+=this.reduced.x;this.m_impulse.y+=this.reduced.y;this.m_impulse.z=0}}else if(this.m_limitState==I.e_atUpperLimit){j=this.m_impulse.z+this.impulse3.z;if(j>0){this.m_mass.Solve22(this.reduced,-d,-v);this.impulse3.x=
-this.reduced.x;this.impulse3.y=this.reduced.y;this.impulse3.z=-this.m_impulse.z;this.m_impulse.x+=this.reduced.x;this.m_impulse.y+=this.reduced.y;this.m_impulse.z=0}}c.x-=f*this.impulse3.x;c.y-=f*this.impulse3.y;g-=r*(o*this.impulse3.y-q*this.impulse3.x+this.impulse3.z);b.x+=m*this.impulse3.x;b.y+=m*this.impulse3.y;e+=s*(n*this.impulse3.y-a*this.impulse3.x+this.impulse3.z)}else{d=h.m_xf.R;o=this.m_localAnchor1.x-h.m_sweep.localCenter.x;q=this.m_localAnchor1.y-h.m_sweep.localCenter.y;j=d.col1.x*o+
-d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=j;d=l.m_xf.R;n=this.m_localAnchor2.x-l.m_sweep.localCenter.x;a=this.m_localAnchor2.y-l.m_sweep.localCenter.y;j=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=j;this.m_mass.Solve22(this.impulse2,-(b.x+-e*a-c.x- -g*q),-(b.y+e*n-c.y-g*o));this.m_impulse.x+=this.impulse2.x;this.m_impulse.y+=this.impulse2.y;c.x-=f*this.impulse2.x;c.y-=f*this.impulse2.y;g-=r*(o*this.impulse2.y-q*this.impulse2.x);b.x+=m*this.impulse2.x;b.y+=m*this.impulse2.y;e+=s*(n*this.impulse2.y-
-a*this.impulse2.x)}h.m_linearVelocity.SetV(c);h.m_angularVelocity=g;l.m_linearVelocity.SetV(b);l.m_angularVelocity=e};N.prototype.SolvePositionConstraints=function(){var d=0,h,l=this.m_bodyA,j=this.m_bodyB,o=0,q=h=0,n=0,a=0;if(this.m_enableLimit&&this.m_limitState!=I.e_inactiveLimit){d=j.m_sweep.a-l.m_sweep.a-this.m_referenceAngle;var c=0;if(this.m_limitState==I.e_equalLimits){d=y.Clamp(d-this.m_lowerAngle,-F.b2_maxAngularCorrection,F.b2_maxAngularCorrection);c=-this.m_motorMass*d;o=y.Abs(d)}else if(this.m_limitState==
-I.e_atLowerLimit){d=d-this.m_lowerAngle;o=-d;d=y.Clamp(d+F.b2_angularSlop,-F.b2_maxAngularCorrection,0);c=-this.m_motorMass*d}else if(this.m_limitState==I.e_atUpperLimit){o=d=d-this.m_upperAngle;d=y.Clamp(d-F.b2_angularSlop,0,F.b2_maxAngularCorrection);c=-this.m_motorMass*d}l.m_sweep.a-=l.m_invI*c;j.m_sweep.a+=j.m_invI*c;l.SynchronizeTransform();j.SynchronizeTransform()}h=l.m_xf.R;c=this.m_localAnchor1.x-l.m_sweep.localCenter.x;d=this.m_localAnchor1.y-l.m_sweep.localCenter.y;q=h.col1.x*c+h.col2.x*
-d;d=h.col1.y*c+h.col2.y*d;c=q;h=j.m_xf.R;var g=this.m_localAnchor2.x-j.m_sweep.localCenter.x,b=this.m_localAnchor2.y-j.m_sweep.localCenter.y;q=h.col1.x*g+h.col2.x*b;b=h.col1.y*g+h.col2.y*b;g=q;n=j.m_sweep.c.x+g-l.m_sweep.c.x-c;a=j.m_sweep.c.y+b-l.m_sweep.c.y-d;var e=n*n+a*a;h=Math.sqrt(e);q=l.m_invMass;var f=j.m_invMass,m=l.m_invI,r=j.m_invI,s=10*F.b2_linearSlop;if(e>s*s){e=1/(q+f);n=e*-n;a=e*-a;l.m_sweep.c.x-=0.5*q*n;l.m_sweep.c.y-=0.5*q*a;j.m_sweep.c.x+=0.5*f*n;j.m_sweep.c.y+=0.5*f*a;n=j.m_sweep.c.x+
-g-l.m_sweep.c.x-c;a=j.m_sweep.c.y+b-l.m_sweep.c.y-d}this.K1.col1.x=q+f;this.K1.col2.x=0;this.K1.col1.y=0;this.K1.col2.y=q+f;this.K2.col1.x=m*d*d;this.K2.col2.x=-m*c*d;this.K2.col1.y=-m*c*d;this.K2.col2.y=m*c*c;this.K3.col1.x=r*b*b;this.K3.col2.x=-r*g*b;this.K3.col1.y=-r*g*b;this.K3.col2.y=r*g*g;this.K.SetM(this.K1);this.K.AddM(this.K2);this.K.AddM(this.K3);this.K.Solve(N.tImpulse,-n,-a);n=N.tImpulse.x;a=N.tImpulse.y;l.m_sweep.c.x-=l.m_invMass*n;l.m_sweep.c.y-=l.m_invMass*a;l.m_sweep.a-=l.m_invI*(c*
-a-d*n);j.m_sweep.c.x+=j.m_invMass*n;j.m_sweep.c.y+=j.m_invMass*a;j.m_sweep.a+=j.m_invI*(g*a-b*n);l.SynchronizeTransform();j.SynchronizeTransform();return h<=F.b2_linearSlop&&o<=F.b2_angularSlop};Box2D.postDefs.push(function(){Box2D.Dynamics.Joints.b2RevoluteJoint.tImpulse=new w});Box2D.inherit(S,Box2D.Dynamics.Joints.b2JointDef);S.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;S.b2RevoluteJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=
-new w;this.localAnchorB=new w};S.prototype.b2RevoluteJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_revoluteJoint;this.localAnchorA.Set(0,0);this.localAnchorB.Set(0,0);this.motorSpeed=this.maxMotorTorque=this.upperAngle=this.lowerAngle=this.referenceAngle=0;this.enableMotor=this.enableLimit=false};S.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA=this.bodyA.GetLocalPoint(l);this.localAnchorB=this.bodyB.GetLocalPoint(l);this.referenceAngle=this.bodyB.GetAngle()-
-this.bodyA.GetAngle()};Box2D.inherit(aa,Box2D.Dynamics.Joints.b2Joint);aa.prototype.__super=Box2D.Dynamics.Joints.b2Joint.prototype;aa.b2WeldJoint=function(){Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this,arguments);this.m_localAnchorA=new w;this.m_localAnchorB=new w;this.m_impulse=new A;this.m_mass=new K};aa.prototype.GetAnchorA=function(){return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)};aa.prototype.GetAnchorB=function(){return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)};aa.prototype.GetReactionForce=
-function(d){if(d===undefined)d=0;return new w(d*this.m_impulse.x,d*this.m_impulse.y)};aa.prototype.GetReactionTorque=function(d){if(d===undefined)d=0;return d*this.m_impulse.z};aa.prototype.b2WeldJoint=function(d){this.__super.b2Joint.call(this,d);this.m_localAnchorA.SetV(d.localAnchorA);this.m_localAnchorB.SetV(d.localAnchorB);this.m_referenceAngle=d.referenceAngle;this.m_impulse.SetZero();this.m_mass=new K};aa.prototype.InitVelocityConstraints=function(d){var h,l=0,j=this.m_bodyA,o=this.m_bodyB;
-h=j.m_xf.R;var q=this.m_localAnchorA.x-j.m_sweep.localCenter.x,n=this.m_localAnchorA.y-j.m_sweep.localCenter.y;l=h.col1.x*q+h.col2.x*n;n=h.col1.y*q+h.col2.y*n;q=l;h=o.m_xf.R;var a=this.m_localAnchorB.x-o.m_sweep.localCenter.x,c=this.m_localAnchorB.y-o.m_sweep.localCenter.y;l=h.col1.x*a+h.col2.x*c;c=h.col1.y*a+h.col2.y*c;a=l;h=j.m_invMass;l=o.m_invMass;var g=j.m_invI,b=o.m_invI;this.m_mass.col1.x=h+l+n*n*g+c*c*b;this.m_mass.col2.x=-n*q*g-c*a*b;this.m_mass.col3.x=-n*g-c*b;this.m_mass.col1.y=this.m_mass.col2.x;
-this.m_mass.col2.y=h+l+q*q*g+a*a*b;this.m_mass.col3.y=q*g+a*b;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;this.m_mass.col3.z=g+b;if(d.warmStarting){this.m_impulse.x*=d.dtRatio;this.m_impulse.y*=d.dtRatio;this.m_impulse.z*=d.dtRatio;j.m_linearVelocity.x-=h*this.m_impulse.x;j.m_linearVelocity.y-=h*this.m_impulse.y;j.m_angularVelocity-=g*(q*this.m_impulse.y-n*this.m_impulse.x+this.m_impulse.z);o.m_linearVelocity.x+=l*this.m_impulse.x;o.m_linearVelocity.y+=l*this.m_impulse.y;
-o.m_angularVelocity+=b*(a*this.m_impulse.y-c*this.m_impulse.x+this.m_impulse.z)}else this.m_impulse.SetZero()};aa.prototype.SolveVelocityConstraints=function(){var d,h=0,l=this.m_bodyA,j=this.m_bodyB,o=l.m_linearVelocity,q=l.m_angularVelocity,n=j.m_linearVelocity,a=j.m_angularVelocity,c=l.m_invMass,g=j.m_invMass,b=l.m_invI,e=j.m_invI;d=l.m_xf.R;var f=this.m_localAnchorA.x-l.m_sweep.localCenter.x,m=this.m_localAnchorA.y-l.m_sweep.localCenter.y;h=d.col1.x*f+d.col2.x*m;m=d.col1.y*f+d.col2.y*m;f=h;d=
-j.m_xf.R;var r=this.m_localAnchorB.x-j.m_sweep.localCenter.x,s=this.m_localAnchorB.y-j.m_sweep.localCenter.y;h=d.col1.x*r+d.col2.x*s;s=d.col1.y*r+d.col2.y*s;r=h;d=n.x-a*s-o.x+q*m;h=n.y+a*r-o.y-q*f;var v=a-q,t=new A;this.m_mass.Solve33(t,-d,-h,-v);this.m_impulse.Add(t);o.x-=c*t.x;o.y-=c*t.y;q-=b*(f*t.y-m*t.x+t.z);n.x+=g*t.x;n.y+=g*t.y;a+=e*(r*t.y-s*t.x+t.z);l.m_angularVelocity=q;j.m_angularVelocity=a};aa.prototype.SolvePositionConstraints=function(){var d,h=0,l=this.m_bodyA,j=this.m_bodyB;d=l.m_xf.R;
-var o=this.m_localAnchorA.x-l.m_sweep.localCenter.x,q=this.m_localAnchorA.y-l.m_sweep.localCenter.y;h=d.col1.x*o+d.col2.x*q;q=d.col1.y*o+d.col2.y*q;o=h;d=j.m_xf.R;var n=this.m_localAnchorB.x-j.m_sweep.localCenter.x,a=this.m_localAnchorB.y-j.m_sweep.localCenter.y;h=d.col1.x*n+d.col2.x*a;a=d.col1.y*n+d.col2.y*a;n=h;d=l.m_invMass;h=j.m_invMass;var c=l.m_invI,g=j.m_invI,b=j.m_sweep.c.x+n-l.m_sweep.c.x-o,e=j.m_sweep.c.y+a-l.m_sweep.c.y-q,f=j.m_sweep.a-l.m_sweep.a-this.m_referenceAngle,m=10*F.b2_linearSlop,
-r=Math.sqrt(b*b+e*e),s=y.Abs(f);if(r>m){c*=1;g*=1}this.m_mass.col1.x=d+h+q*q*c+a*a*g;this.m_mass.col2.x=-q*o*c-a*n*g;this.m_mass.col3.x=-q*c-a*g;this.m_mass.col1.y=this.m_mass.col2.x;this.m_mass.col2.y=d+h+o*o*c+n*n*g;this.m_mass.col3.y=o*c+n*g;this.m_mass.col1.z=this.m_mass.col3.x;this.m_mass.col2.z=this.m_mass.col3.y;this.m_mass.col3.z=c+g;m=new A;this.m_mass.Solve33(m,-b,-e,-f);l.m_sweep.c.x-=d*m.x;l.m_sweep.c.y-=d*m.y;l.m_sweep.a-=c*(o*m.y-q*m.x+m.z);j.m_sweep.c.x+=h*m.x;j.m_sweep.c.y+=h*m.y;
-j.m_sweep.a+=g*(n*m.y-a*m.x+m.z);l.SynchronizeTransform();j.SynchronizeTransform();return r<=F.b2_linearSlop&&s<=F.b2_angularSlop};Box2D.inherit(Z,Box2D.Dynamics.Joints.b2JointDef);Z.prototype.__super=Box2D.Dynamics.Joints.b2JointDef.prototype;Z.b2WeldJointDef=function(){Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,arguments);this.localAnchorA=new w;this.localAnchorB=new w};Z.prototype.b2WeldJointDef=function(){this.__super.b2JointDef.call(this);this.type=I.e_weldJoint;this.referenceAngle=
-0};Z.prototype.Initialize=function(d,h,l){this.bodyA=d;this.bodyB=h;this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l));this.referenceAngle=this.bodyB.GetAngle()-this.bodyA.GetAngle()}})();
-(function(){var F=Box2D.Dynamics.b2DebugDraw;F.b2DebugDraw=function(){this.m_xformScale=this.m_fillAlpha=this.m_alpha=this.m_lineThickness=this.m_drawScale=1;var G=this;this.m_sprite={graphics:{clear:function(){G.m_ctx.clearRect(0,0,G.m_ctx.canvas.width,G.m_ctx.canvas.height)}}}};F.prototype._color=function(G,K){return"rgba("+((G&16711680)>>16)+","+((G&65280)>>8)+","+(G&255)+","+K+")"};F.prototype.b2DebugDraw=function(){this.m_drawFlags=0};F.prototype.SetFlags=function(G){if(G===undefined)G=0;this.m_drawFlags=
-G};F.prototype.GetFlags=function(){return this.m_drawFlags};F.prototype.AppendFlags=function(G){if(G===undefined)G=0;this.m_drawFlags|=G};F.prototype.ClearFlags=function(G){if(G===undefined)G=0;this.m_drawFlags&=~G};F.prototype.SetSprite=function(G){this.m_ctx=G};F.prototype.GetSprite=function(){return this.m_ctx};F.prototype.SetDrawScale=function(G){if(G===undefined)G=0;this.m_drawScale=G};F.prototype.GetDrawScale=function(){return this.m_drawScale};F.prototype.SetLineThickness=function(G){if(G===
-undefined)G=0;this.m_lineThickness=G;this.m_ctx.strokeWidth=G};F.prototype.GetLineThickness=function(){return this.m_lineThickness};F.prototype.SetAlpha=function(G){if(G===undefined)G=0;this.m_alpha=G};F.prototype.GetAlpha=function(){return this.m_alpha};F.prototype.SetFillAlpha=function(G){if(G===undefined)G=0;this.m_fillAlpha=G};F.prototype.GetFillAlpha=function(){return this.m_fillAlpha};F.prototype.SetXFormScale=function(G){if(G===undefined)G=0;this.m_xformScale=G};F.prototype.GetXFormScale=function(){return this.m_xformScale};
-F.prototype.DrawPolygon=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.moveTo(G[0].x*A,G[0].y*A);for(y=1;y<K;y++)w.lineTo(G[y].x*A,G[y].y*A);w.lineTo(G[0].x*A,G[0].y*A);w.closePath();w.stroke()}};F.prototype.DrawSolidPolygon=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.fillStyle=this._color(y.color,this.m_fillAlpha);w.moveTo(G[0].x*A,G[0].y*A);for(y=
-1;y<K;y++)w.lineTo(G[y].x*A,G[y].y*A);w.lineTo(G[0].x*A,G[0].y*A);w.closePath();w.fill();w.stroke()}};F.prototype.DrawCircle=function(G,K,y){if(K){var w=this.m_ctx,A=this.m_drawScale;w.beginPath();w.strokeStyle=this._color(y.color,this.m_alpha);w.arc(G.x*A,G.y*A,K*A,0,Math.PI*2,true);w.closePath();w.stroke()}};F.prototype.DrawSolidCircle=function(G,K,y,w){if(K){var A=this.m_ctx,U=this.m_drawScale,p=G.x*U,B=G.y*U;A.moveTo(0,0);A.beginPath();A.strokeStyle=this._color(w.color,this.m_alpha);A.fillStyle=
-this._color(w.color,this.m_fillAlpha);A.arc(p,B,K*U,0,Math.PI*2,true);A.moveTo(p,B);A.lineTo((G.x+y.x*K)*U,(G.y+y.y*K)*U);A.closePath();A.fill();A.stroke()}};F.prototype.DrawSegment=function(G,K,y){var w=this.m_ctx,A=this.m_drawScale;w.strokeStyle=this._color(y.color,this.m_alpha);w.beginPath();w.moveTo(G.x*A,G.y*A);w.lineTo(K.x*A,K.y*A);w.closePath();w.stroke()};F.prototype.DrawTransform=function(G){var K=this.m_ctx,y=this.m_drawScale;K.beginPath();K.strokeStyle=this._color(16711680,this.m_alpha);
-K.moveTo(G.position.x*y,G.position.y*y);K.lineTo((G.position.x+this.m_xformScale*G.R.col1.x)*y,(G.position.y+this.m_xformScale*G.R.col1.y)*y);K.strokeStyle=this._color(65280,this.m_alpha);K.moveTo(G.position.x*y,G.position.y*y);K.lineTo((G.position.x+this.m_xformScale*G.R.col2.x)*y,(G.position.y+this.m_xformScale*G.R.col2.y)*y);K.closePath();K.stroke()}})();var i;for(i=0;i<Box2D.postDefs.length;++i)Box2D.postDefs[i]();delete Box2D.postDefs;
-
-// Copyright 2013 the V8 project authors. All rights reserved.
-
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-function MakeNewWorld () {
-  var Vec2 = Box2D.Common.Math.b2Vec2,
-      BodyDef = Box2D.Dynamics.b2BodyDef,
-      Body = Box2D.Dynamics.b2Body,
-      FixtureDef = Box2D.Dynamics.b2FixtureDef,
-      Fixture = Box2D.Dynamics.b2Fixture,
-      World = Box2D.Dynamics.b2World,
-      MassData = Box2D.Collision.Shapes.b2MassData,
-      PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
-      CircleShape = Box2D.Collision.Shapes.b2CircleShape;
-
-  var gravity = new Vec2(0, -10);
-  var world = new World(gravity, true);
-
-  var shape = new PolygonShape();
-  shape.SetAsEdge(new Vec2(-40.0, 0), new Vec2(40.0, 0));
-
-  var fd = new FixtureDef();
-  fd.density = 0.0;
-  fd.shape = shape;
-  var bd = new BodyDef();
-  var ground = world.CreateBody(bd);
-  ground.CreateFixture(fd);
-
-  var a = .5;
-  var shape = new PolygonShape();
-  shape.SetAsBox(a, a);
-
-  var x = new Vec2(-7.0, 0.75);
-  var y = new Vec2();
-  var deltaX = new Vec2(0.5625, 1);
-  var deltaY = new Vec2(1.125, 0.0);
-
-  for (var i = 0; i < 10; ++i) {
-    y.Set(x.x, x.y);
-
-    for (var j = 0; j < 5; ++j) {
-      var fd = new FixtureDef();
-      fd.density = 5.0;
-      fd.shape = shape;
-
-      var bd = new BodyDef();
-      bd.type = Body.b2_dynamicBody;
-      bd.position.Set(y.x, y.y);
-      var body = world.CreateBody(bd);
-      body.CreateFixture(fd);
-      y.Add(deltaY);
-    }
-
-    x.Add(deltaX);
-  }
-
-  return world;
-}
-
-var world = null;
-
-function runBox2D() {
-  var world = MakeNewWorld();
-  for (var i = 0; i < 20; i++) {
-    world.Step(1 / 60, 10, 3);
-  }
-}
-
-function tearDownBox2D() {
-  world = null;
-  Box2D = null;
-}
-
-class Benchmark {
-    runIteration() {
-        runBox2D();
-    }
-}
diff --git a/Octane/code-first-load.js b/Octane/code-first-load.js
deleted file mode 100644
index 4e61c46..0000000
--- a/Octane/code-first-load.js
+++ /dev/null
@@ -1,1537 +0,0 @@
-// Copyright 2013 the Octane Benchmark project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-// The code in BASE_JS below:
-// Copyright 2012 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.
-
-
-// The code in JQUERY_JS below:
-// Copyright (c) 2012 John Resig, http://jquery.com/
-//
-// 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", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-function setupCodeLoad() {
-  salt = 0;
-  indirectEval = eval;
-}
-
-function tearDownCodeLoad() {
-  salt = null;
-  indirectEval = null;
-}
-
-function runCodeLoadClosure() {
-  runClosure();
-  salt++;
-}
-
-function runCodeLoadJQuery() {
-  runJQuery();
-  salt++;
-}
-
-/*
- * BASE_JS is a compiled and formatted version of:
- * http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/base.js
- * JQUERY_JS is a formatted copy of:
- * http://code.jquery.com/jquery.min.js
- * The following Python script generates both variables:
-
-#!/usr/bin/env python
-
-import urllib
-import urllib2
-
-def escape_and_format(data, varname):
-  data = data.replace("\n", " ").replace("; ", ";")
-  data = data.replace("\\", "\\\\").replace("\"", "\\\"")
-  data = "var " + varname + " = \"" + data + "\""
-  while len(data) > 0:
-    cutoff = min(79, len(data))
-    while data[cutoff-1] == '\\':
-      cutoff -= 1
-    line = data[0:cutoff]
-    data = data[cutoff:]
-    if len(data) > 0:
-      line += '\\'
-    print line
-
-url = "http://closure-compiler.appspot.com/compile"
-request_params = {"output_format": "text",
-                  "compilation_level": "SIMPLE_OPTIMIZATIONS",
-                  "use_closure_library": "true",
-                  "js_code": "",
-                  "output_info": "compiled_code"}
-result = urllib2.urlopen(url, urllib.urlencode(request_params))
-escape_and_format(result.read(), "BASE_JS")
-
-print "\n\n"
-
-url = "http://code.jquery.com/jquery.min.js"
-result = urllib2.urlopen(url)
-escape_and_format(result.read(), "JQUERY_JS")
-
-*/
-var BASE_JS = "var COMPILED=!0,goog=goog||{};goog.global=this;goog.DEBUG=!0;goo\
-g.LOCALE=\"en\";goog.provide=function(a){if(!COMPILED){if(goog.isProvided_(a))t\
-hrow Error('Namespace \"'+a+'\" already declared.');delete goog.implicitNamespa\
-ces_[a];for(var b=a;(b=b.substring(0,b.lastIndexOf(\".\")))&&!goog.getObjectByN\
-ame(b);)goog.implicitNamespaces_[b]=!0}goog.exportPath_(a)};goog.setTestOnly=fu\
-nction(a){if(COMPILED&&!goog.DEBUG)throw a=a||\"\",Error(\"Importing test-only \
-code into non-debug environment\"+a?\": \"+a:\".\");};COMPILED||(goog.isProvide\
-d_=function(a){return!goog.implicitNamespaces_[a]&&!!goog.getObjectByName(a)},g\
-oog.implicitNamespaces_={});goog.exportPath_=function(a,b,c){a=a.split(\".\");c\
-=c||goog.global;!(a[0]in c)&&c.execScript&&c.execScript(\"var \"+a[0]);for(var \
-d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}\
-;goog.getObjectByName=function(a,b){for(var c=a.split(\".\"),d=b||goog.global,e\
-;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};g\
-oog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]};goog.a\
-ddDependency=function(a,b,c){if(!COMPILED){for(var d,a=a.replace(/\\\\/g,\"/\")\
-,e=goog.dependencies_,g=0;d=b[g];g++){e.nameToPath[d]=a;a in e.pathToNames||(e.\
-pathToNames[a]={});e.pathToNames[a][d]=true}for(d=0;b=c[d];d++){a in e.requires\
-||(e.requires[a]={});e.requires[a][b]=true}}};goog.ENABLE_DEBUG_LOADER=!0;goog.\
-require=function(a){if(!COMPILED&&!goog.isProvided_(a)){if(goog.ENABLE_DEBUG_LO\
-ADER){var b=goog.getPathFromDeps_(a);if(b){goog.included_[b]=true;goog.writeScr\
-ipts_();return}}a=\"goog.require could not find: \"+a;goog.global.console&&goog\
-.global.console.error(a);throw Error(a);}};goog.basePath=\"\";goog.nullFunction\
-=function(){};goog.identityFunction=function(a){return a};goog.abstractMethod=f\
-unction(){throw Error(\"unimplemented abstract method\");};goog.addSingletonGet\
-ter=function(a){a.getInstance=function(){return a.instance_||(a.instance_=new a\
-)}};!COMPILED&&goog.ENABLE_DEBUG_LOADER&&(goog.included_={},goog.dependencies_=\
-{pathToNames:{},nameToPath:{},requires:{},visited:{},written:{}},goog.inHtmlDoc\
-ument_=function(){var a=goog.global.document;return typeof a!=\"undefined\"&&\"\
-write\"in a},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goo\
-g.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var\
- a=goog.global.document.getElementsByTagName(\"script\"),b=a.length-1;b>=0;--b)\
-{var c=a[b].src,d=c.lastIndexOf(\"?\"), d=d==-1?c.length:d;if(c.substr(d-7,7)==\
-\"base.js\"){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function\
-(a){var b=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_;!goog.depende\
-ncies_.written[a]&&b(a)&&(goog.dependencies_.written[a]=true)},goog.writeScript\
-Tag_=function(a){if(goog.inHtmlDocument_()){goog.global.document.write('<script\
- type=\"text/javascript\" src=\"'+a+'\"><\\/script>');return true}return false}\
-,goog.writeScripts_=function(){function a(e){if(!(e in d.written)){if(!(e in d.\
-visited)){d.visited[e]=true;if(e in d.requires)for(var f in d.requires[e])if(!g\
-oog.isProvided_(f))if(f in d.nameToPath)a(d.nameToPath[f]);else throw Error(\"U\
-ndefined nameToPath for \"+f);}if(!(e in c)){c[e]=true;b.push(e)}}}var b=[],c={\
-},d=goog.dependencies_,e;for(e in goog.included_)d.written[e]||a(e);for(e=0;e<b\
-.length;e++)if(b[e])goog.importScript_(goog.basePath+b[e]);else throw Error(\"U\
-ndefined script input\");},goog.getPathFromDeps_=function(a){return a in goog.d\
-ependencies_.nameToPath?goog.dependencies_.nameToPath[a]: null},goog.findBasePa\
-th_(),goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+\"deps.js\"\
-));goog.typeOf=function(a){var b=typeof a;if(b==\"object\")if(a){if(a instanceo\
-f Array)return\"array\";if(a instanceof Object)return b;var c=Object.prototype.\
-toString.call(a);if(c==\"[object Window]\")return\"object\";if(c==\"[object Arr\
-ay]\"||typeof a.length==\"number\"&&typeof a.splice!=\"undefined\"&&typeof a.pr\
-opertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"splice\"))return\"\
-array\";if(c==\"[object Function]\"||typeof a.call!=\"undefined\"&&typeof a.pro\
-pertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"call\"))return\"fun\
-ction\"}else return\"null\";else if(b==\"function\"&&typeof a.call==\"undefined\
-\")return\"object\";return b};goog.isDef=function(a){return a!==void 0};goog.is\
-Null=function(a){return a===null};goog.isDefAndNotNull=function(a){return a!=nu\
-ll};goog.isArray=function(a){return goog.typeOf(a)==\"array\"};goog.isArrayLike\
-=function(a){var b=goog.typeOf(a);return b==\"array\"||b==\"object\"&&typeof a.\
-length==\"number\"};goog.isDateLike=function(a){return goog.isObject(a)&&typeof\
- a.getFullYear==\"function\"};goog.isString=function(a){return typeof a==\"stri\
-ng\"};goog.isBoolean=function(a){return typeof a==\"boolean\"};goog.isNumber=fu\
-nction(a){return typeof a==\"number\"};goog.isFunction=function(a){return goog.\
-typeOf(a)==\"function\"};goog.isObject=function(a){var b=typeof a;return b==\"o\
-bject\"&&a!=null||b==\"function\"};goog.getUid=function(a){return a[goog.UID_PR\
-OPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.removeUid=function(a\
-){\"removeAttribute\"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[g\
-oog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_=\"closure_uid_\"+Math.floor(2\
-147483648*Math.random()).toString(36);goog.uidCounter_=0;goog.getHashCode=goog.\
-getUid;goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=go\
-og.typeOf(a);if(b==\"object\"||b==\"array\"){if(a.clone)return a.clone();var b=\
-b==\"array\"?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};\
-goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)};goog.bi\
-ndJs_=function(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.pr\
-ototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.c\
-all(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f\
-unction(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){goog.bind=Fun\
-ction.prototype.bind&&Function.prototype.bind.toString().indexOf(\"native code\
-\")!=-1?goog.bindNative_:goog.bindJs_;return goog.bind.apply(null,arguments)};g\
-oog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return \
-function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,c);ret\
-urn a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.n\
-ow=Date.now||function(){return+new Date};goog.globalEval=function(a){if(goog.gl\
-obal.execScript)goog.global.execScript(a,\"JavaScript\");else if(goog.global.ev\
-al){if(goog.evalWorksForGlobals_==null){goog.global.eval(\"var _et_ = 1;\");if(\
-typeof goog.global._et_!=\"undefined\"){delete goog.global._et_;goog.evalWorksF\
-orGlobals_=true}else goog.evalWorksForGlobals_=false}if(goog.evalWorksForGlobal\
-s_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement(\"scri\
-pt\");c.type=\"text/javascript\";c.defer=false;c.appendChild(b.createTextNode(a\
-));b.body.appendChild(c);b.body.removeChild(c)}}else throw Error(\"goog.globalE\
-val not available\");};goog.evalWorksForGlobals_=null;goog.getCssName=function(\
-a,b){var c=function(a){return goog.cssNameMapping_[a]||a},d=function(a){for(var\
- a=a.split(\"-\"),b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join(\"-\")}\
-,d=goog.cssNameMapping_?goog.cssNameMappingStyle_==\"BY_WHOLE\"?c:d:function(a)\
-{return a};return b?a+\"-\"+d(b):d(a)};goog.setCssNameMapping=function(a,b){goo\
-g.cssNameMapping_=a;goog.cssNameMappingStyle_=b};!COMPILED&&goog.global.CLOSURE\
-_CSS_NAME_MAPPING&&(goog.cssNameMapping_=goog.global.CLOSURE_CSS_NAME_MAPPING);\
-goog.getMsg=function(a,b){var c=b||{},d;for(d in c)var e=(\"\"+c[d]).replace(/\
-\\$/g,\"$$$$\"),a=a.replace(RegExp(\"\\\\{\\\\$\"+d+\"\\\\}\",\"gi\"),e);return\
- a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};goog.exportPrope\
-rty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototy\
-pe=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.construc\
-tor=a};goog.base=function(a,b,c){var d=arguments.callee.caller;if(d.superClass_\
-)return d.superClass_.constructor.apply(a,Array.prototype.slice.call(arguments,\
-1));for(var e=Array.prototype.slice.call(arguments,2),g=false,f=a.constructor;f\
-;f=f.superClass_&&f.superClass_.constructor)if(f.prototype[b]===d)g=true;else i\
-f(g)return f.prototype[b].apply(a,e);if(a[b]===d)return a.constructor.prototype\
-[b].apply(a,e);throw Error(\"goog.base called from a method of one name to a me\
-thod of a different name\");};goog.scope=function(a){a.call(goog.global)};"
-
-var JQUERY_JS = "/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function\
-(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.par\
-entWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo\
-(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){ck||(ck=c.create\
-Element(\"iframe\"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!\
-cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.wri\
-te((f.support.boxModel?\"<!doctype html>\":\"\")+\"<html><body>\"),cl.close();d\
-=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,\"display\"),b.removeChil\
-d(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],\
-cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr()\
-{setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObjec\
-t(\"Microsoft.XMLHTTP\")}catch(b){}}function ch(){try{return new a.XMLHttpReque\
-st}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var\
- d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1\
-)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h\
-]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\
-\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=\
-e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\
-\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}\
-return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h\
-,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h\
-=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[\
-i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.\
-converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j\
-);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||b\
-D.test(a)?d(a,e):b_(a+\"[\"+(typeof e==\"object\"?b:\"\")+\"]\",e,c,d)});else i\
-f(!c&&f.type(b)===\"object\")for(var e in b)b_(a+\"[\"+e+\"]\",b[e],c,d);else d\
-(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]\
-!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g)\
-{f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;f\
-or(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataT\
-ypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=bZ(a,c,d,e,\"*\",g))\
-;return l}function bY(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\
-\");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;fo\
-r(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[\
-j?\"unshift\":\"push\"](c)}}}function bB(a,b,c){var d=b===\"width\"?a.offsetWid\
-th:a.offsetHeight,e=b===\"width\"?1:0,g=4;if(d>0){if(c!==\"border\")for(;e<g;e+\
-=2)c||(d-=parseFloat(f.css(a,\"padding\"+bx[e]))||0),c===\"margin\"?d+=parseFlo\
-at(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0;r\
-eturn d+\"px\"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=\
-parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,\"padding\"+bx[e]))||\
-0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0),c===\
-\"margin\"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+\"px\"}function bo(a)\
-{var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;retur\
-n b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"inpu\
-t\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(\
-a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||\
-a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.ge\
-tElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.queryS\
-electorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;b\
-.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mer\
-geAttributes(a),c=b.nodeName.toLowerCase(),c===\"object\"?b.outerHTML=a.outerHT\
-ML:c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"?c===\"option\"?b.se\
-lected=a.defaultSelected:c===\"input\"||c===\"textarea\"?b.defaultValue=a.defau\
-ltValue:c===\"script\"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.default\
-Checked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttr\
-ibute(f.expando),b.removeAttribute(\"_submit_attached\"),b.removeAttribute(\"_c\
-hange_attached\"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,\
-e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(\
-c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f\
-.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getEleme\
-ntsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\
-\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.cre\
-ateElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b\
-=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);re\
-turn e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(\
-typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.t\
-est(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){re\
-turn f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNod\
-e.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){v\
-ar d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!\
-f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,\
-e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b \
-in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!\
-1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replac\
-e(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d\
-===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?+d:j.test(d)?f\
-.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g\
-[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var\
- c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isRead\
-y){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.r\
-eady()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/\
-^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<\
-(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u\
-[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:\
-[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(\
-opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv\
-:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toU\
-pperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.\
-hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototyp\
-e.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:func\
-tion(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a\
-,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=\
-c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.cha\
-rAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,\
-null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d\
-:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a\
-,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable\
-?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElem\
-entById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1\
-,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f)\
-.find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.sel\
-ector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray\
-(a,this)},selector:\"\",jquery:\"1.7.2\",length:0,size:function(){return this.l\
-ength},toArray:function(){return F.call(this,0)},get:function(a){return a==null\
-?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var \
-d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d\
-.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \
-\":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:f\
-unction(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);\
-return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)}\
-,first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:\
-function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(argum\
-ents).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b\
-,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constr\
-uctor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.e\
-xtend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments\
-.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"ob\
-ject\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=argumen\
-ts[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject\
-(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)\
-?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:func\
-tion(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,rea\
-dyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){i\
-f(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.re\
-ady,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.tr\
-igger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e\
-.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.\
-ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.\
-addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"on\
-readystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameE\
-lement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:functio\
-n(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return\
- e.type(a)===\"array\"},isWindow:function(a){return a!=null&&a==a.window},isNum\
-eric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){ret\
-urn a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a\
-||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.construct\
-or&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\
-\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isE\
-mptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){thro\
-w new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b\
-=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o\
-,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))()\
-;e.error(\"Invalid JSON: \"+b)},parseXML:function(c){if(typeof c!=\"string\"||!\
-c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"\
-text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loa\
-dXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsere\
-rror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globa\
-lEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b\
-)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:fun\
-ction(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:\
-function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f\
- in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)br\
-eak}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c\
-.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\
-\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(\
-l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.leng\
-th==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.cal\
-l(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H\
-.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c\
-]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.len\
-gth==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d+\
-+]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=\
-0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a\
-,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"\
-&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=n\
-ull&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);ret\
-urn h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){v\
-ar d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=func\
-tion(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.g\
-uid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.\
-length;if(d&&typeof d==\"object\"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}el\
-se if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.cal\
-l(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(\
-a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(n\
-ew Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.ex\
-ec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1\
-]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.in\
-it(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.cons\
-tructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanc\
-eof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;va\
-r b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array D\
-ate RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowe\
-rCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=\
-z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\x\
-A0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventLis\
-tener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.read\
-yState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});re\
-turn e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,\
-l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h\
-===\"array\"?n(g):h===\"function\"&&(!a.unique||!p.has(g))&&c.push(g)},o=functi\
-on(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;\
-m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p\
-.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:funct\
-ion(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1\
-]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<\
-e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.spl\
-ice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.le\
-ngth;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return t\
-his},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock\
-:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return\
-!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));r\
-eturn this},fire:function(){p.fireWith(this,arguments);return this},fired:funct\
-ion(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b\
-=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"me\
-mory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,\
-progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired\
-,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:functio\
-n(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:functio\
-n(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"r\
-eject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunctio\
-n(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.pro\
-mise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i\
-[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h\
-)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]\
-=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(functio\
-n(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a)\
-{function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b\
-,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.\
-call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.\
-length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j\
-.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?\
-b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j\
-.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l\
-,m,n,o,p=c.createElement(\"div\"),q=c.documentElement;p.setAttribute(\"classNam\
-e\",\"t\"),p.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;f\
-loat:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=p.getElementsByTagNam\
-e(\"*\"),e=p.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.c\
-reateElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=p.getEl\
-ementsByTagName(\"input\")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tb\
-ody:!p.getElementsByTagName(\"tbody\").length,htmlSerialize:!!p.getElementsByTa\
-gName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormaliz\
-ed:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssF\
-loat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetA\
-ttribute:p.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5C\
-lone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submi\
-tBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0\
-,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMarg\
-in:!0},f.boxModel=b.boxModel=c.compatMode===\"CSS1Compat\",i.checked=!0,b.noClo\
-neChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{d\
-elete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.\
-fireEvent&&(p.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),p.cloneNod\
-e(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setA\
-ttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"chec\
-ked\",\"checked\"),i.setAttribute(\"name\",\"t\"),p.appendChild(i),j=c.createDo\
-cumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneN\
-ode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendCh\
-ild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=\"on\"+n,o=m in\
- p,o||(p.setAttribute(m,\"return;\"),o=typeof p[m]==\"function\"),b[n+\"Bubbles\
-\"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,\
-t,u=c.getElementsByTagName(\"body\")[0];!u||(m=1,t=\"padding:0;margin:0;border:\
-\",r=\"position:absolute;top:0;left:0;width:1px;height:1px;\",s=t+\"0;visibilit\
-y:hidden;\",n=\"style='\"+r+t+\"5px solid #000;\",q=\"<div \"+n+\"display:block\
-;'><div style='\"+t+\"0;display:block;overflow:hidden;'></div></div>\"+\"<table\
- \"+n+\"' cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",d=c\
-.createElement(\"div\"),d.style.cssText=s+\"width:0;height:0;position:static;to\
-p:0;margin-top:\"+m+\"px\",u.insertBefore(d,u.firstChild),p=c.createElement(\"d\
-iv\"),d.appendChild(p),p.innerHTML=\"<table><tr><td style='\"+t+\"0;display:non\
-e'></td><td>t</td></tr></table>\",k=p.getElementsByTagName(\"td\"),o=k[0].offse\
-tHeight===0,k[0].style.display=\"\",k[1].style.display=\"none\",b.reliableHidde\
-nOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML=\"\",l=c.cre\
-ateElement(\"div\"),l.style.width=\"0\",l.style.marginRight=\"0\",p.style.width\
-=\"2px\",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l\
-,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=\"undefi\
-ned\"&&(p.innerHTML=\"\",p.style.width=p.style.padding=\"1px\",p.style.border=0\
-,p.style.overflow=\"hidden\",p.style.display=\"inline\",p.style.zoom=1,b.inline\
-BlockNeedsLayout=p.offsetWidth===3,p.style.display=\"block\",p.style.overflow=\
-\"visible\",p.innerHTML=\"<div style='width:5px;'></div>\",b.shrinkWrapBlocks=p\
-.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChi\
-ld,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,do\
-esAddBorderForTableAndCells:i.offsetTop===5},g.style.position=\"fixed\",g.style\
-.top=\"20px\",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.positi\
-on=g.style.top=\"\",e.style.overflow=\"hidden\",e.style.position=\"relative\",j\
-.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginIn\
-BodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop=\"1%\",b.pixe\
-lMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==\"1%\"),typeof \
-d.style.zoom!=\"undefined\"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.ext\
-end(b,j))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({\
-cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\
-\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",ap\
-plet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];re\
-turn!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expa\
-ndo,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"\
-events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.u\
-uid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeo\
-f c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m\
-[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])\
-return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},remove\
-Data:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j\
-=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArra\
-y(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g\
-=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){de\
-lete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delet\
-e j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.re\
-moveAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},ac\
-ceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if\
-(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data\
-:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f\
-.data(j);if(j.nodeType===1&&!f._data(j,\"parsedAttrs\")){g=j.attributes;for(i=g\
-.length;k<i;k++)h=g[k].name,h.indexOf(\"data-\")===0&&(h=f.camelCase(h.substrin\
-g(5)),l(j,h,m[h]));f._data(j,\"parsedAttrs\",!0)}}return m}if(typeof a==\"objec\
-t\")return this.each(function(){f.data(this,a)});d=a.split(\".\",2),d[1]=d[1]?\
-\".\"+d[1]:\"\",e=d[1]+\"!\";return f.access(this,function(c){if(c===b){m=this.\
-triggerHandler(\"getData\"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));retur\
-n m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.tri\
-ggerHandler(\"setData\"+e,d),f.data(this,a,c),b.triggerHandler(\"changeData\"+e\
-,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.e\
-ach(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b\
-||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a\
-!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1\
-)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,\
-b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=\
-f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b\
-||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),\
-d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,func\
-tion(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0\
-),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=\"str\
-ing\"&&(c=a,a=\"fx\",d--);if(arguments.length<d)return f.queue(this[0],a);retur\
-n c===b?this:this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"\
-inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(functio\
-n(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"\
-fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){\
-clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},pro\
-mise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&\
-&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j\
-=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,\
-b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++\
-,l.add(m);m();return d.promise(c)}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/\
-^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea\
-)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|lo\
-op|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttrib\
-ute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,argum\
-ents.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr\
-(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length\
->1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{t\
-his[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if\
-(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,th\
-is.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length\
-;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className\
-=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b\
-[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:fu\
-nction(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(t\
-his).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a\
-===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeTy\
-pe===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,\
-j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}el\
-se g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=ty\
-peof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).tog\
-gleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c=\
-==\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasC\
-lass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"b\
-oolean\")this.className&&f._data(this,\"__className__\",this.className),this.cl\
-assName=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},ha\
-sClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c\
-].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)\
-return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){\
-e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType\
-===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\
-\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHo\
-oks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(\"set\"in c)||\
-c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHo\
-oks[g.nodeName.toLowerCase()];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)ret\
-urn d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}\
-}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!\
-b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selecte\
-dIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=\
-j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.di\
-sabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeNa\
-me(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.\
-length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeA\
-rray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).v\
-al(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,h\
-tml:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var\
- g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a\
-)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!\
-f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b\
-){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!\
-==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a\
-,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:funct\
-ion(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d\
-.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,\"\
-\"),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:funct\
-ion(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be c\
-hanged\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")\
-){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{ge\
-t:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?\
-a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a\
-,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\"\
-:\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cell\
-Spacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",u\
-semap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\
-\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=\
-i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\
-\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==nul\
-l?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabi\
-ndex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a\
-.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:fu\
-nction(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getA\
-ttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d\
-;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c\
-,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.butt\
-on={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue\
-!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNod\
-e(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\
-\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b)\
-{f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAt\
-tribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:f\
-unction(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized\
-||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f\
-.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===nu\
-ll?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style\
-.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f\
-.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:\
-function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.s\
-electedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\
-\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[th\
-is]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}})\
-,f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHook\
-s[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(\
-),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,\
-B=/(?:^|\\s)hover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(\
-?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/\
-,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&\
-new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var\
- c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.\
-id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function\
-(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};\
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===\
-3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.se\
-lector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(\
-h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!=\
-=a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).s\
-plit(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").sp\
-lit(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s\
-=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:\
-d.guid,selector:g,quick:g&&G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m\
-]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListen\
-er?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(\
-s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateC\
-ount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a\
-,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g\
-.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[\
-h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);conti\
-nue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.\
-length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\
-\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType\
-)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\
-\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p\
-.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a\
-,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.ha\
-ndle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent\
-:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeT\
-ype!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f\
-.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\
-\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[\
-h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Even\
-t(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\
-\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\
-\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.ca\
-che;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.ele\
-m,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.un\
-shift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)retur\
-n;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h\
-,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&\
-&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.\
-length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"e\
-vents\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acc\
-eptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrev\
-ented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\
-\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\
-\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.t\
-riggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:f\
-unction(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.typ\
-e]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namesp\
-ace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateT\
-arget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button\
-||c.type!==\"click\")){n=f(this),n.context=this.ownerDocument||this;for(m=c.tar\
-get;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k\
-<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&\
-r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,m\
-atches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c\
-.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStop\
-ped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.n\
-amespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s\
-.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(\
-c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(t\
-his,c);return c.result}},props:\"attrChange attrName relatedNode srcElement alt\
-Key bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget s\
-hiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\
-\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&\
-(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"\
-button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX \
-screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.\
-fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.do\
-cumentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-\
-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.s\
-crollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relat\
-edTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?\
-2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.\
-fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(\
-g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.\
-target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a\
-.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},l\
-oad:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusou\
-t\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload\
-=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)\
-}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated\
-:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e\
-.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.r\
-emoveEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.remov\
-eEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c\
-)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);\
-a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defa\
-ultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:\
-J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[\
-f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPreve\
-nted=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.retu\
-rnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.\
-originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},s\
-topImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.st\
-opPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropaga\
-tionStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},functi\
-on(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=\
-this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c\
-,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f\
-.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName\
-(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",fu\
-nction(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.\
-form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){a.\
-_submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submi\
-t_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simul\
-ate(\"submit\",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,\
-\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles\
-||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.t\
-ype===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._ch\
-ange\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_chan\
-ged=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a\
-.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});re\
-turn!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z\
-.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",funct\
-ion(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\
-\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a\
-.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\
-\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:functio\
-n(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support\
-.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var\
- d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.spec\
-ial[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function\
-(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,\
-g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=d||c,c=b);for(i in\
- a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typ\
-eof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this\
-;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.\
-guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)}\
-)},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a\
-.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.names\
-pace?e.origType+\".\"+e.namespace:e.origType,e.selector,e.handler);return this}\
-if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!\
-1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.e\
-vent.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unb\
-ind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.contex\
-t).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a\
-,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.o\
-n(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"\
-**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.even\
-t.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.t\
-rigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d\
-=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\
-\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)\
-||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:funct\
-ion(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focu\
-sin focusout load resize scroll unload click dblclick mousedown mouseup mousemo\
-ve mouseover mouseout mouseenter mouseleave change select submit keydown keypre\
-ss keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c\
-==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger\
-(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHook\
-s),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(\
-a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];w\
-hile(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset\
-=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).leng\
-th>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length\
-;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];\
-break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){\
-k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\
-\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~\
-])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\"\
-.\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\
-\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d|\
-|c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\
-\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.\
-exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>\
-1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.rela\
-tive[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.s\
-hift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0\
-])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter\
-(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.\
-length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.ex\
-pr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop()\
-,r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=\
-w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.a\
-pply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[\
-t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)\
-k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e\
-));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.\
-length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){ret\
-urn m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a])\
-.length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.or\
-der.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1\
-,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.f\
-ind[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.\
-getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{se\
-t:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&\
-&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].\
-exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.len\
-gth-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,\
-s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++\
-)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b\
-){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==nu\
-ll)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Sy\
-ntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c\
-,d=a.nodeType,e=\"\";if(d){if(d===1||d===9||d===11){if(typeof a.textContent==\"\
-string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerT\
-ext.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3|\
-|d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));ret\
-urn e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00\
-c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\
-\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\
-\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\
-\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\
-\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+\
-|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first\
-|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\
-\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:\
-{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:funct\
-ion(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\
-\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.te\
-st(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]\
-){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCas\
-e()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\
-\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a\
-[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(\
-;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}}\
-,\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.to\
-LowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f\
-=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"prev\
-iousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!\
-=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}\
-},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b\
-.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"nam\
-e\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typ\
-eof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}}\
-,preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f\
-)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.classNa\
-me+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1\
-));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){retu\
-rn a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2\
-]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\
-\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.te\
-st(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.er\
-ror(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace\
-(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(\
-j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,\
-e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]\
-=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);re\
-turn!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return\
- b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){retur\
-n a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled=\
-==!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentN\
-ode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){retu\
-rn!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){re\
-turn!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text\
-:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerC\
-ase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.\
-nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){re\
-turn a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function\
-(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:fu\
-nction(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},s\
-ubmit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"bu\
-tton\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()\
-===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCas\
-e();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(\
-a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b=\
-==\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.no\
-deName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilter\
-s:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length\
--1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:fun\
-ction(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(\
-a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO\
-:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"co\
-ntains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e\
-===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;retu\
-rn!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){cas\
-e\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if\
-(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===\
-1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g\
-=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.next\
-Sibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j\
-===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\
-\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&\
-a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.\
-getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=\
-m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttr\
-ibute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f=\
-==\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>\
-=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-\
-g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},\
-POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=\
-o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.matc\
-h[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.left\
-Match[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\
-\\\\(\\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slic\
-e.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slic\
-e.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var\
- c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);\
-else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);els\
-e for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumen\
-tPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition\
-||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.com\
-pareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.s\
-ourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],\
-g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)r\
-eturn 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parent\
-Node;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k\
-],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)retur\
-n c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),f\
-unction(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.\
-documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChi\
-ld),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!\
-=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e\
-.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[\
-e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefine\
-d\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.r\
-emoveChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChi\
-ld(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=f\
-unction(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(v\
-ar e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a\
- href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&\
-&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){re\
-turn a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var \
-a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'><\
-/p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=funct\
-ion(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\
-\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.\
-getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)retu\
-rn s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.bo\
-dy)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.pare\
-ntNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelect\
-orAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"obj\
-ect\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.tes\
-t(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentN\
-ode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r\
-){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e\
-]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.moz\
-MatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.ca\
-ll(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!\
-='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\
-\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.\
-test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.node\
-Type!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(\
-){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div c\
-lass='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"\
-e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\")\
-.length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){i\
-f(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClas\
-sName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){ret\
-urn a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosi\
-tion?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.cont\
-ains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).do\
-cumentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=\
-[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace\
-(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)\
-m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find\
-=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text\
-=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:pa\
-rents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=\
-f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend(\
-{find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(fun\
-ction(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=th\
-is.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f\
-.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]\
-){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filte\
-r(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})\
-},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:functio\
-n(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a\
-&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(\
-a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g\
-=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.\
-length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode\
-,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(\
-d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matches\
-Selector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g\
-.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"clos\
-est\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevA\
-ll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.\
-inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a\
-,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushSt\
-ack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.pr\
-evObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType\
-!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:\
-function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth\
-(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},\
-nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return\
- f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextS\
-ibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},s\
-iblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children\
-:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.node\
-Name(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.ch\
-ildNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)\
-||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.uni\
-que(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pus\
-hStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c\
-&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0\
-]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeT\
-ype!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];\
-return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&\
-&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)\
-a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|b\
-di|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|met\
-er|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|nu\
-ll)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:\
-]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style\
-)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")[\
-\\\\s/>]\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)sc\
-ript/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='mul\
-tiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<\
-table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<\
-table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><\
-colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\
-\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.capt\
-ion=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\
-\"</div>\"]),f.fn.extend({text:function(a){return f.access(this,function(a){ret\
-urn a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).\
-createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFuncti\
-on(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]\
-){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insert\
-Before(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.no\
-deType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:functi\
-on(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(\
-this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.\
-wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.ea\
-ch(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return \
-this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(th\
-is.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,fun\
-ction(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return th\
-is.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,thi\
-s.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.d\
-omManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(argu\
-ments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return t\
-his.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].pa\
-rentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBe\
-fore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"aft\
-er\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a\
-,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nod\
-eType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),f.cleanData([d])),d.pare\
-ntNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b\
-;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\
-\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function\
-(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(th\
-is,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},\
-d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,\"\"):nu\
-ll;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(\
-a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\
-\");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsBy\
-TagName(\"*\")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a\
-,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(\
-f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replace\
-With(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.ea\
-ch(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).\
-before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?\
-a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},do\
-mManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&argume\
-nts.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(\
-this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var \
-g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&\
-&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===t\
-his.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes\
-.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for\
-(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable\
-||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({t\
-ype:\"GET\",global:!1,url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.\
-text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b\
-.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var\
- e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment|\
-|(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\
-\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone|\
-|!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFr\
-agment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheabl\
-e:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBe\
-fore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b)\
-{f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g\
-&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return \
-this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[\
-h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clon\
-e:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(\"<\
-\"+a.nodeName+\">\")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.supp\
-ort.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h)\
-,d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(\
-a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,\
-b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerD\
-ocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof \
-l==\"number\"&&(l+=\"\");if(!l)continue;if(typeof l==\"string\")if(!_.test(l))l\
-=b.createTextNode(l);else{l=l.replace(Y,\"<$1></$2>\");var m=(Z.exec(l)||[\"\",\
-\"\"])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(\"div\"),\
-q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+\
-l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===\"tab\
-le\"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===\"<table>\"&&!s?p.childNo\
-des:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],\"tbody\")&&!t[i].childNodes.l\
-ength&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l\
-)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p\
-&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.\
-parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (\
-u=l.length)==\"number\")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l\
-):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[\
-k];k++){h=j[k];if(e&&f.nodeName(h,\"script\")&&(!h.type||be.test(h.type)))e.pus\
-h(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.g\
-rep(h.getElementsByTagName(\"script\"),g);j.splice.apply(j,[k+1,0].concat(v))}d\
-.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.s\
-pecial,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeNam\
-e&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b\
-&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.\
-handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&\
-&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\\([^)]*\\)/i,bq=/o\
-pacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\\-+]?(?:\\d*\\.)?\\d+$/i,bt=/^-?(?:\\d\
-*\\.)?\\d+(?!px)[^\\d\\s]+$/i,bu=/^([\\-+])=([\\-+.\\de]+)/,bv=/^margin/,bw={po\
-sition:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Top\",\"Righ\
-t\",\"Bottom\",\"Left\"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,f\
-unction(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)}\
-,f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,\"opacity\");r\
-eturn c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,font\
-Weight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssP\
-rops:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(\
-a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCa\
-se(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&\
-&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bu.ex\
-ec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h==\
-=\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k\
-||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d\
-){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&\
-&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return b\
-y(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]\
-=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defau\
-ltView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style\
-;b=b.replace(br,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.ge\
-tComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.owner\
-Document.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.te\
-st(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.docum\
-entElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.curren\
-tStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runti\
-meStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.lef\
-t=b===\"fontSize\"?\"1em\":f,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.l\
-eft=d));return f===\"\"?\"auto\":f}),by=bz||bA,f.each([\"height\",\"width\"],fu\
-nction(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB\
-(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.\
-test(b)?b+\"px\":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b\
-){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\"\
-)?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,\
-d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.fi\
-lter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,\"\"))===\"\"){c.rem\
-oveAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(b\
-p,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.margi\
-nRight={get:function(a,b){return f.swap(a,{display:\"inline-block\"},function()\
-{return b?by(a,\"margin-right\"):a.style.marginRight})}})}),f.expr&&f.expr.filt\
-ers&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;re\
-turn b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display|\
-|f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.\
-expr.filters.hidden(a)}),f.each({margin:\"\",padding:\"\",border:\"Width\"},fun\
-ction(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==\"string\"?c.s\
-plit(\" \"):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}\
-});var bC=/%20/g,bD=/\\[\\]$/,bE=/\\r?\\n/g,bF=/#.*$/,bG=/^(.*?):[ \\t]*([^\\r\
-\\n]*)\\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|nu\
-mber|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\\-s\
-torage|.+\\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\\/\\//,bL=/\
-\\?/,bM=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bN=/^(?:select\
-|textarea)/i,bO=/\\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\
-\\/?#:]*)(?::(\\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[\"*/\"]+[\"*\"];try\
-{bU=e.href}catch(bX){bU=c.createElement(\"a\"),bU.href=\"\",bU=bU.href}bV=bQ.ex\
-ec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"strin\
-g\"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.ind\
-exOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&\
-(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.tr\
-aditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:\
-c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a)\
-{c=a}),i.html(g?f(\"<div>\").append(c.replace(bM,\"\")).find(g):c)),d&&i.each(d\
-,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArr\
-ay())},serializeArray:function(){return this.map(function(){return this.element\
-s?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.d\
-isabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(funct\
-ion(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(\
-a,c){return{name:b.name,value:a.replace(bE,\"\\r\\n\")}}):{name:b.name,value:c.\
-replace(bE,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete aja\
-xError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){re\
-turn this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,\
-e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,succe\
-ss:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"scr\
-ipt\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:functio\
-n(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSett\
-ings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:\"GET\",contentType:\"applic\
-ation/x-www-form-urlencoded;charset=UTF-8\",processData:!0,async:!0,accepts:{xm\
-l:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"a\
-pplication/json, text/javascript\",\"*\":bW},contents:{xml:/xml/,html:/html/,js\
-on:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converter\
-s:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":\
-f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport\
-:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q)\
-,p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200\
-&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))\
-f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w\
-=\"notmodified\",o=!0;else try{r=cb(d,x),w=\"success\",o=!0}catch(A){w=\"parser\
-error\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\
-\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),\
-j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[\
-v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxS\
-top\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.co\
-ntext||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.\
-Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={\
-readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]\
-=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:nu\
-ll},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n\
-))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},override\
-MimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"ab\
-ort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=\
-v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)\
-j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\
-\"\").replace(bF,\"\").replace(bK,bV[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\
-\"*\").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCas\
-e()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]===\"http:\"?80:\
-443))==(bV[3]||(bV[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.da\
-ta!=\"string\"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)re\
-turn!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&\
-f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url\
-+=(bL.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){v\
-ar x=f.now(),y=d.url.replace(bP,\"$1_=\"+x);d.url=y+(y===d.url?(bL.test(d.url)?\
-\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.conte\
-ntType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k|\
-|d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModifi\
-ed[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequest\
-Header(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTyp\
-es[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bW+\";q=0.01\":\"\"):d.accepts[\"*\"]);fo\
-r(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeS\
-end.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,com\
-plete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readySta\
-te=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(funct\
-ion(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-\
-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.i\
-sFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b\
-)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainO\
-bject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g\
-,a[g],c,e);return d.join(\"&\").replace(bC,\"+\")}}),f.extend({active:0,lastMod\
-ified:{},etag:{}});var cc=f.now(),cd=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp\
-:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cc++}}),f.ajaxPre\
-filter(\"json jsonp\",function(b,c,d){var e=typeof b.data==\"string\"&&/^applic\
-ation\\/x\\-www\\-form\\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===\"\
-jsonp\"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCal\
-lback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=\
-b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e\
-&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"\
-+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.\
-isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error\
-(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}\
-),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, appli\
-cation/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecm\
-ascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),\
-f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&\
-&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.cro\
-ssDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElemen\
-t;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.s\
-criptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatech\
-ange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.\
-onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200\
-,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1\
-)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg\
-;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}\
-:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a}\
-)}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.cros\
-sDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.us\
-ername?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c\
-.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.o\
-verrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requeste\
-d-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setReq\
-uestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e)\
-{var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.\
-noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.get\
-AllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m\
-.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal\
-&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(\
-j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce\
-)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},\
-ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,co,c\
-p=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"]\
-,[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\
-\"opacity\"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return t\
-his.animate(ct(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d\
-.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style\
-.display=\"\"),(e===\"\"&&f.css(d,\"display\")===\"none\"||!f.contains(d.ownerD\
-ocument.documentElement,d))&&f._data(d,\"olddisplay\",cu(d.nodeName)));for(g=0;\
-g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.st\
-yle.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){\
-if(a||a===0)return this.animate(ct(\"hide\",3),a,b,c);var d,e,g=0,h=this.length\
-;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data\
-(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&\
-&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:funct\
-ion(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._t\
-oggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).i\
-s(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(ct(\"toggle\",3),a\
-,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css\
-(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c\
-,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeTy\
-pe===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties=\
-{};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks\
-[g])&&\"expand\"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i\
-])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):\
-b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\
-\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"\
-height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX\
-,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\
-\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)===\"inlin\
-e\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(\
-this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(\
-h)?(q=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),q?(f._\
-data(this,\"toggle\"+i,q===\"show\"?\"hide\":\"show\"),j[q]()):j[h]()):(m=cn.ex\
-ec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?\"\":\"px\"),p!==\
-\"px\"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&\
-&(o=(m[1]===\"-=\"?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,\"\"));return!0}var\
- e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.e\
-xtend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:functi\
-on(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[\
-]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0\
-),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==n\
-ull)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);e\
-lse g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===thi\
-s&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));\
-(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct(\"show\",1),slideUp:ct(\"\
-hide\",1),slideToggle:ct(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opaci\
-ty:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,\
-c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&t\
-ypeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,durat\
-ion:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.durat\
-ion==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.\
-fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.comple\
-te,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.deque\
-ue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){\
-return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:func\
-tion(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.pr\
-ototype={update:function(){this.options.step&&this.options.step.call(this.elem,\
-this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function()\
-{if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==\
-null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isN\
-aN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a\
-){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.no\
-w=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.\
-prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=func\
-tion(){f._data(e.elem,\"fxshow\"+e.prop)===b&&(e.options.hide?f._data(e.elem,\"\
-fxshow\"+e.prop,e.start):e.options.show&&f._data(e.elem,\"fxshow\"+e.prop,e.end\
-))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:funct\
-ion(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop\
-]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.c\
-ur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur(\
-)),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(th\
-is.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!\
-0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.\
-elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.\
-pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.an\
-imatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!\
-f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"o\
-verflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.a\
-nimatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.remo\
-veData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.\
-duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.\
-pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this\
-.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.exte\
-nd(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&\
-b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){cl\
-earInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:\
-function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.styl\
-e&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=\
-a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf(\"margin\")&&(f\
-.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&\
-f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,fun\
-ction(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body\
-|html)$/i;\"getBoundingClientRect\"in c.documentElement?cv=function(a,b,c,d){tr\
-y{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d\
-.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTo\
-p||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scr\
-ollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scroll\
-Left,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=\
-a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.cu\
-rrentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){i\
-f(f.support.fixedPosition&&j.position===\"fixed\")break;d=i?i.getComputedStyle(\
-a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+\
-=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndC\
-ells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(\
-d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverfl\
-owNotVisible&&d.overflow!==\"visible\"&&(k+=parseFloat(d.borderTopWidth)||0,l+=\
-parseFloat(d.borderLeftWidth)||0),j=d}if(j.position===\"relative\"||j.position=\
-==\"static\")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position\
-===\"fixed\"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.\
-scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)\
-return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=th\
-is[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.body\
-Offset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){va\
-r b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=\
-parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0\
-);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d\
-===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(\
-a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\
-\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFl\
-oat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(\
-k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.usi\
-ng.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return nul\
-l;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?\
-{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=\
-parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTop\
-Width\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:\
-c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(functi\
-on(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"p\
-osition\")===\"static\")a=a.offsetParent;return a})}}),f.each({scrollLeft:\"pag\
-eXOffset\",scrollTop:\"pageYOffset\"},function(a,c){var d=/Y/.test(c);f.fn[a]=f\
-unction(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c\
- in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e\
-]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arg\
-uments.length,null)}}),f.each({Height:\"height\",Width:\"width\"},function(a,c)\
-{var d=\"client\"+a,e=\"scroll\"+a,g=\"offset\"+a;f.fn[\"inner\"+a]=function(){\
-var a=this[0];return a?a.style?parseFloat(f.css(a,c,\"padding\")):this[c]():nul\
-l},f.fn[\"outer\"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.cs\
-s(b,c,a?\"margin\":\"border\")):this[c]():null},f.fn[c]=function(a){return f.ac\
-cess(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.docume\
-ntElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType==\
-=9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e\
-],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?\
-l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==\
-\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){re\
-turn f})})(windowmock);"
-
-// Jenkins hash function.
-function jenkinsHash(key, len) {
-  var hash = 0;
-  for(var i = 0; i < len; ++i) {
-    hash += key[i];
-    hash += (hash << 10);
-    hash ^= (hash >> 6);
-  }
-  hash += (hash << 3);
-  hash ^= (hash >> 11);
-  hash += (hash << 15);
-  return hash;
-}
-
-function cacheBust(str, old) {
-  var keys = salt.toString().split('').map(parseFloat);
-  var hash = Math.abs(jenkinsHash(keys, keys.length));
-  var replacement = old + hash.toString(36);
-  return str.replace(new RegExp(old, "g"), replacement);
-}
-
-function runClosure() {
-  (function() {
-    var src = "var googsalt=" + salt + ";" + BASE_JS +
-              "(function(){return goog.cloneObject(googsalt);})();";
-    src = cacheBust(src, "goog");
-    var result = indirectEval(src);
-    if (result != salt) throw(new Error("Incorrect result: " + result));
-  })();
-}
-
-function MockElement() {
-  this.appendChild = function(a) {};
-  this.createComment = function(a) {};
-  this.createDocumentFragment = function() { return new MockElement(); };
-  this.createElement = function(a) { return new MockElement(); };
-  this.documentElement = this;
-  this.getElementById = function(a) { return 0; };
-  this.getElementsByTagName = function(a) {return [0];};
-  this.insertBefore = function(a, b) {};
-  this.removeChild = function(a) {};
-  this.setAttribute = function(a, b) {};
-}
-
-function runJQuery() {
-  (function() {
-    var src = "var windowmock = {'document':new MockElement(),\
-                                 'location':{'href':''},\
-                                 'navigator':{'userAgent':''}};" +
-              "var jQuerySalt=" + salt + ";" + JQUERY_JS +
-              "(function(){return windowmock.jQuery.grep([jQuerySalt],\
-              function(a,b){return true;})[0];})();";
-    src = cacheBust(src, "jQuery");
-    var result = indirectEval(src);
-    if (result != salt) throw(new Error("Incorrect result: " + result));
-  })();
-}
-
-
-class Benchmark {
-    runIteration() {
-        runCodeLoadClosure();
-        runCodeLoadJQuery();
-    }
-}
-
-setupCodeLoad();
diff --git a/Octane/code-load.js b/Octane/code-load.js
new file mode 100644
index 0000000..24d7df1
--- /dev/null
+++ b/Octane/code-load.js
@@ -0,0 +1,1531 @@
+// Copyright 2012 the Octane Benchmark project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+//       notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+//       copyright notice, this list of conditions and the following
+//       disclaimer in the documentation and/or other materials provided
+//       with the distribution.
+//     * Neither the name of Google Inc. nor the names of its
+//       contributors may be used to endorse or promote products derived
+//       from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// The code in BASE_JS below:
+// Copyright 2012 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.
+
+
+// The code in JQUERY_JS below:
+// Copyright (c) 2012 John Resig, http://jquery.com/
+//
+// 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", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+var CodeLoad = new BenchmarkSuite('CodeLoad', 450000, [
+  new Benchmark('CodeLoadClosure',
+                runCodeLoadClosure,
+                setupCodeLoad,
+                tearDownCodeLoad,
+                16),
+  new Benchmark('CodeLoadJQuery',
+                runCodeLoadJQuery,
+                setupCodeLoad,
+                tearDownCodeLoad,
+                16)
+]);
+
+var salt;
+var indirectEval;
+
+function setupCodeLoad() {
+  salt = 0;
+  indirectEval = eval;
+}
+
+function tearDownCodeLoad() {
+  salt = null;
+  indirectEval = null;
+}
+
+function runCodeLoadClosure() {
+  runClosure();
+  salt++;
+}
+
+function runCodeLoadJQuery() {
+  runJQuery();
+  salt++;
+}
+
+/*
+ * BASE_JS is a compiled and formatted version of:
+ * http://code.google.com/p/closure-library/source/browse/trunk/closure/goog/base.js
+ * JQUERY_JS is a formatted copy of:
+ * http://code.jquery.com/jquery.min.js
+ * The following Python script generates both variables:
+
+#!/usr/bin/env python
+
+import urllib
+import urllib2
+
+def escape_and_format(data, varname):
+  data = data.replace("\n", " ").replace("; ", ";")
+  data = data.replace("\\", "\\\\").replace("\"", "\\\"")
+  data = "var " + varname + " = \"" + data + "\""
+  while len(data) > 0:
+    cutoff = min(79, len(data))
+    while data[cutoff-1] == '\\':
+      cutoff -= 1
+    line = data[0:cutoff]
+    data = data[cutoff:]
+    if len(data) > 0:
+      line += '\\'
+    print line
+
+url = "http://closure-compiler.appspot.com/compile"
+request_params = {"output_format": "text",
+                  "compilation_level": "SIMPLE_OPTIMIZATIONS",
+                  "use_closure_library": "true",
+                  "js_code": "",
+                  "output_info": "compiled_code"}
+result = urllib2.urlopen(url, urllib.urlencode(request_params))
+escape_and_format(result.read(), "BASE_JS")
+
+print "\n\n"
+
+url = "http://code.jquery.com/jquery.min.js"
+result = urllib2.urlopen(url)
+escape_and_format(result.read(), "JQUERY_JS")
+
+*/
+var BASE_JS = "var COMPILED=!0,goog=goog||{};goog.global=this;goog.DEBUG=!0;goo\
+g.LOCALE=\"en\";goog.provide=function(a){if(!COMPILED){if(goog.isProvided_(a))t\
+hrow Error('Namespace \"'+a+'\" already declared.');delete goog.implicitNamespa\
+ces_[a];for(var b=a;(b=b.substring(0,b.lastIndexOf(\".\")))&&!goog.getObjectByN\
+ame(b);)goog.implicitNamespaces_[b]=!0}goog.exportPath_(a)};goog.setTestOnly=fu\
+nction(a){if(COMPILED&&!goog.DEBUG)throw a=a||\"\",Error(\"Importing test-only \
+code into non-debug environment\"+a?\": \"+a:\".\");};COMPILED||(goog.isProvide\
+d_=function(a){return!goog.implicitNamespaces_[a]&&!!goog.getObjectByName(a)},g\
+oog.implicitNamespaces_={});goog.exportPath_=function(a,b,c){a=a.split(\".\");c\
+=c||goog.global;!(a[0]in c)&&c.execScript&&c.execScript(\"var \"+a[0]);for(var \
+d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]?c[d]:c[d]={}}\
+;goog.getObjectByName=function(a,b){for(var c=a.split(\".\"),d=b||goog.global,e\
+;e=c.shift();)if(goog.isDefAndNotNull(d[e]))d=d[e];else return null;return d};g\
+oog.globalize=function(a,b){var c=b||goog.global,d;for(d in a)c[d]=a[d]};goog.a\
+ddDependency=function(a,b,c){if(!COMPILED){for(var d,a=a.replace(/\\\\/g,\"/\")\
+,e=goog.dependencies_,g=0;d=b[g];g++){e.nameToPath[d]=a;a in e.pathToNames||(e.\
+pathToNames[a]={});e.pathToNames[a][d]=true}for(d=0;b=c[d];d++){a in e.requires\
+||(e.requires[a]={});e.requires[a][b]=true}}};goog.ENABLE_DEBUG_LOADER=!0;goog.\
+require=function(a){if(!COMPILED&&!goog.isProvided_(a)){if(goog.ENABLE_DEBUG_LO\
+ADER){var b=goog.getPathFromDeps_(a);if(b){goog.included_[b]=true;goog.writeScr\
+ipts_();return}}a=\"goog.require could not find: \"+a;goog.global.console&&goog\
+.global.console.error(a);throw Error(a);}};goog.basePath=\"\";goog.nullFunction\
+=function(){};goog.identityFunction=function(a){return a};goog.abstractMethod=f\
+unction(){throw Error(\"unimplemented abstract method\");};goog.addSingletonGet\
+ter=function(a){a.getInstance=function(){return a.instance_||(a.instance_=new a\
+)}};!COMPILED&&goog.ENABLE_DEBUG_LOADER&&(goog.included_={},goog.dependencies_=\
+{pathToNames:{},nameToPath:{},requires:{},visited:{},written:{}},goog.inHtmlDoc\
+ument_=function(){var a=goog.global.document;return typeof a!=\"undefined\"&&\"\
+write\"in a},goog.findBasePath_=function(){if(goog.global.CLOSURE_BASE_PATH)goo\
+g.basePath=goog.global.CLOSURE_BASE_PATH;else if(goog.inHtmlDocument_())for(var\
+ a=goog.global.document.getElementsByTagName(\"script\"),b=a.length-1;b>=0;--b)\
+{var c=a[b].src,d=c.lastIndexOf(\"?\"), d=d==-1?c.length:d;if(c.substr(d-7,7)==\
+\"base.js\"){goog.basePath=c.substr(0,d-7);break}}},goog.importScript_=function\
+(a){var b=goog.global.CLOSURE_IMPORT_SCRIPT||goog.writeScriptTag_;!goog.depende\
+ncies_.written[a]&&b(a)&&(goog.dependencies_.written[a]=true)},goog.writeScript\
+Tag_=function(a){if(goog.inHtmlDocument_()){goog.global.document.write('<script\
+ type=\"text/javascript\" src=\"'+a+'\"><\\/script>');return true}return false}\
+,goog.writeScripts_=function(){function a(e){if(!(e in d.written)){if(!(e in d.\
+visited)){d.visited[e]=true;if(e in d.requires)for(var f in d.requires[e])if(!g\
+oog.isProvided_(f))if(f in d.nameToPath)a(d.nameToPath[f]);else throw Error(\"U\
+ndefined nameToPath for \"+f);}if(!(e in c)){c[e]=true;b.push(e)}}}var b=[],c={\
+},d=goog.dependencies_,e;for(e in goog.included_)d.written[e]||a(e);for(e=0;e<b\
+.length;e++)if(b[e])goog.importScript_(goog.basePath+b[e]);else throw Error(\"U\
+ndefined script input\");},goog.getPathFromDeps_=function(a){return a in goog.d\
+ependencies_.nameToPath?goog.dependencies_.nameToPath[a]: null},goog.findBasePa\
+th_(),goog.global.CLOSURE_NO_DEPS||goog.importScript_(goog.basePath+\"deps.js\"\
+));goog.typeOf=function(a){var b=typeof a;if(b==\"object\")if(a){if(a instanceo\
+f Array)return\"array\";if(a instanceof Object)return b;var c=Object.prototype.\
+toString.call(a);if(c==\"[object Window]\")return\"object\";if(c==\"[object Arr\
+ay]\"||typeof a.length==\"number\"&&typeof a.splice!=\"undefined\"&&typeof a.pr\
+opertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"splice\"))return\"\
+array\";if(c==\"[object Function]\"||typeof a.call!=\"undefined\"&&typeof a.pro\
+pertyIsEnumerable!=\"undefined\"&&!a.propertyIsEnumerable(\"call\"))return\"fun\
+ction\"}else return\"null\";else if(b==\"function\"&&typeof a.call==\"undefined\
+\")return\"object\";return b};goog.isDef=function(a){return a!==void 0};goog.is\
+Null=function(a){return a===null};goog.isDefAndNotNull=function(a){return a!=nu\
+ll};goog.isArray=function(a){return goog.typeOf(a)==\"array\"};goog.isArrayLike\
+=function(a){var b=goog.typeOf(a);return b==\"array\"||b==\"object\"&&typeof a.\
+length==\"number\"};goog.isDateLike=function(a){return goog.isObject(a)&&typeof\
+ a.getFullYear==\"function\"};goog.isString=function(a){return typeof a==\"stri\
+ng\"};goog.isBoolean=function(a){return typeof a==\"boolean\"};goog.isNumber=fu\
+nction(a){return typeof a==\"number\"};goog.isFunction=function(a){return goog.\
+typeOf(a)==\"function\"};goog.isObject=function(a){var b=typeof a;return b==\"o\
+bject\"&&a!=null||b==\"function\"};goog.getUid=function(a){return a[goog.UID_PR\
+OPERTY_]||(a[goog.UID_PROPERTY_]=++goog.uidCounter_)};goog.removeUid=function(a\
+){\"removeAttribute\"in a&&a.removeAttribute(goog.UID_PROPERTY_);try{delete a[g\
+oog.UID_PROPERTY_]}catch(b){}};goog.UID_PROPERTY_=\"closure_uid_\"+Math.floor(2\
+147483648*Math.random()).toString(36);goog.uidCounter_=0;goog.getHashCode=goog.\
+getUid;goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=go\
+og.typeOf(a);if(b==\"object\"||b==\"array\"){if(a.clone)return a.clone();var b=\
+b==\"array\"?[]:{},c;for(c in a)b[c]=goog.cloneObject(a[c]);return b}return a};\
+goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)};goog.bi\
+ndJs_=function(a,b,c){if(!a)throw Error();if(arguments.length>2){var d=Array.pr\
+ototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.c\
+all(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return f\
+unction(){return a.apply(b,arguments)}};goog.bind=function(a,b,c){goog.bind=Fun\
+ction.prototype.bind&&Function.prototype.bind.toString().indexOf(\"native code\
+\")!=-1?goog.bindNative_:goog.bindJs_;return goog.bind.apply(null,arguments)};g\
+oog.partial=function(a,b){var c=Array.prototype.slice.call(arguments,1);return \
+function(){var b=Array.prototype.slice.call(arguments);b.unshift.apply(b,c);ret\
+urn a.apply(this,b)}};goog.mixin=function(a,b){for(var c in b)a[c]=b[c]};goog.n\
+ow=Date.now||function(){return+new Date};goog.globalEval=function(a){if(goog.gl\
+obal.execScript)goog.global.execScript(a,\"JavaScript\");else if(goog.global.ev\
+al){if(goog.evalWorksForGlobals_==null){goog.global.eval(\"var _et_ = 1;\");if(\
+typeof goog.global._et_!=\"undefined\"){delete goog.global._et_;goog.evalWorksF\
+orGlobals_=true}else goog.evalWorksForGlobals_=false}if(goog.evalWorksForGlobal\
+s_)goog.global.eval(a);else{var b=goog.global.document,c=b.createElement(\"scri\
+pt\");c.type=\"text/javascript\";c.defer=false;c.appendChild(b.createTextNode(a\
+));b.body.appendChild(c);b.body.removeChild(c)}}else throw Error(\"goog.globalE\
+val not available\");};goog.evalWorksForGlobals_=null;goog.getCssName=function(\
+a,b){var c=function(a){return goog.cssNameMapping_[a]||a},d=function(a){for(var\
+ a=a.split(\"-\"),b=[],d=0;d<a.length;d++)b.push(c(a[d]));return b.join(\"-\")}\
+,d=goog.cssNameMapping_?goog.cssNameMappingStyle_==\"BY_WHOLE\"?c:d:function(a)\
+{return a};return b?a+\"-\"+d(b):d(a)};goog.setCssNameMapping=function(a,b){goo\
+g.cssNameMapping_=a;goog.cssNameMappingStyle_=b};!COMPILED&&goog.global.CLOSURE\
+_CSS_NAME_MAPPING&&(goog.cssNameMapping_=goog.global.CLOSURE_CSS_NAME_MAPPING);\
+goog.getMsg=function(a,b){var c=b||{},d;for(d in c)var e=(\"\"+c[d]).replace(/\
+\\$/g,\"$$$$\"),a=a.replace(RegExp(\"\\\\{\\\\$\"+d+\"\\\\}\",\"gi\"),e);return\
+ a};goog.exportSymbol=function(a,b,c){goog.exportPath_(a,b,c)};goog.exportPrope\
+rty=function(a,b,c){a[b]=c};goog.inherits=function(a,b){function c(){}c.prototy\
+pe=b.prototype;a.superClass_=b.prototype;a.prototype=new c;a.prototype.construc\
+tor=a};goog.base=function(a,b,c){var d=arguments.callee.caller;if(d.superClass_\
+)return d.superClass_.constructor.apply(a,Array.prototype.slice.call(arguments,\
+1));for(var e=Array.prototype.slice.call(arguments,2),g=false,f=a.constructor;f\
+;f=f.superClass_&&f.superClass_.constructor)if(f.prototype[b]===d)g=true;else i\
+f(g)return f.prototype[b].apply(a,e);if(a[b]===d)return a.constructor.prototype\
+[b].apply(a,e);throw Error(\"goog.base called from a method of one name to a me\
+thod of a different name\");};goog.scope=function(a){a.call(goog.global)};"
+
+var JQUERY_JS = "/*! jQuery v1.7.2 jquery.com | jquery.org/license */ (function\
+(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.par\
+entWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f(\"<\"+a+\">\").appendTo\
+(b),e=d.css(\"display\");d.remove();if(e===\"none\"||e===\"\"){ck||(ck=c.create\
+Element(\"iframe\"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!\
+cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.wri\
+te((f.support.boxModel?\"<!doctype html>\":\"\")+\"<html><body>\"),cl.close();d\
+=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,\"display\"),b.removeChil\
+d(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],\
+cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr()\
+{setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObjec\
+t(\"Microsoft.XMLHTTP\")}catch(b){}}function ch(){try{return new a.XMLHttpReque\
+st}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var\
+ d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1\
+)for(h in a.converters)typeof h==\"string\"&&(e[h.toLowerCase()]=a.converters[h\
+]);l=k,k=d[g];if(k===\"*\")k=l;else if(l!==\"*\"&&l!==k){m=l+\" \"+k,n=e[m]||e[\
+\"* \"+k];if(!n){p=b;for(o in e){j=o.split(\" \");if(j[0]===l||j[0]===\"*\"){p=\
+e[j[1]+\" \"+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error(\
+\"No conversion from \"+m.replace(\" \",\" to \")),n!==!0&&(c=n?n(c):p(o(c)))}}\
+return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h\
+,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]===\"*\")f.shift(),h===b&&(h\
+=a.mimeType||c.getResponseHeader(\"content-type\"));if(h)for(i in e)if(e[i]&&e[\
+i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.\
+converters[i+\" \"+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j\
+);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||b\
+D.test(a)?d(a,e):b_(a+\"[\"+(typeof e==\"object\"?b:\"\")+\"]\",e,c,d)});else i\
+f(!c&&f.type(b)===\"object\")for(var e in b)b_(a+\"[\"+e+\"]\",b[e],c,d);else d\
+(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]\
+!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g)\
+{f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;f\
+or(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l==\"string\"&&(!k||g[l]?l=b:(c.dataT\
+ypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g[\"*\"]&&(l=bZ(a,c,d,e,\"*\",g))\
+;return l}function bY(a){return function(b,c){typeof b!=\"string\"&&(c=b,b=\"*\
+\");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;fo\
+r(;e<g;e++)h=d[e],j=/^\\+/.test(h),j&&(h=h.substr(1)||\"*\"),i=a[h]=a[h]||[],i[\
+j?\"unshift\":\"push\"](c)}}}function bB(a,b,c){var d=b===\"width\"?a.offsetWid\
+th:a.offsetHeight,e=b===\"width\"?1:0,g=4;if(d>0){if(c!==\"border\")for(;e<g;e+\
+=2)c||(d-=parseFloat(f.css(a,\"padding\"+bx[e]))||0),c===\"margin\"?d+=parseFlo\
+at(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0;r\
+eturn d+\"px\"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=\
+parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,\"padding\"+bx[e]))||\
+0,c!==\"padding\"&&(d+=parseFloat(f.css(a,\"border\"+bx[e]+\"Width\"))||0),c===\
+\"margin\"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+\"px\"}function bo(a)\
+{var b=c.createElement(\"div\");bh.appendChild(b),b.innerHTML=a.outerHTML;retur\
+n b.firstChild}function bn(a){var b=(a.nodeName||\"\").toLowerCase();b===\"inpu\
+t\"?bm(a):b!==\"script\"&&typeof a.getElementsByTagName!=\"undefined\"&&f.grep(\
+a.getElementsByTagName(\"input\"),bm)}function bm(a){if(a.type===\"checkbox\"||\
+a.type===\"radio\")a.defaultChecked=a.checked}function bl(a){return typeof a.ge\
+tElementsByTagName!=\"undefined\"?a.getElementsByTagName(\"*\"):typeof a.queryS\
+electorAll!=\"undefined\"?a.querySelectorAll(\"*\"):[]}function bk(a,b){var c;b\
+.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mer\
+geAttributes(a),c=b.nodeName.toLowerCase(),c===\"object\"?b.outerHTML=a.outerHT\
+ML:c!==\"input\"||a.type!==\"checkbox\"&&a.type!==\"radio\"?c===\"option\"?b.se\
+lected=a.defaultSelected:c===\"input\"||c===\"textarea\"?b.defaultValue=a.defau\
+ltValue:c===\"script\"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.default\
+Checked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttr\
+ibute(f.expando),b.removeAttribute(\"_submit_attached\"),b.removeAttribute(\"_c\
+hange_attached\"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,\
+e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(\
+c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f\
+.extend({},h.data))}}function bi(a,b){return f.nodeName(a,\"table\")?a.getEleme\
+ntsByTagName(\"tbody\")[0]||a.appendChild(a.ownerDocument.createElement(\"tbody\
+\")):a}function U(a){var b=V.split(\"|\"),c=a.createDocumentFragment();if(c.cre\
+ateElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b\
+=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);re\
+turn e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(\
+typeof b==\"string\"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.t\
+est(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){re\
+turn f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNod\
+e.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){v\
+ar d=b+\"defer\",e=b+\"queue\",g=b+\"mark\",h=f._data(a,d);h&&(c===\"queue\"||!\
+f._data(a,e))&&(c===\"mark\"||!f._data(a,g))&&setTimeout(function(){!f._data(a,\
+e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b \
+in a){if(b===\"data\"&&f.isEmptyObject(a[b]))continue;if(b!==\"toJSON\")return!\
+1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e=\"data-\"+c.replac\
+e(k,\"-$1\").toLowerCase();d=a.getAttribute(e);if(typeof d==\"string\"){try{d=d\
+===\"true\"?!0:d===\"false\"?!1:d===\"null\"?null:f.isNumeric(d)?+d:j.test(d)?f\
+.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g\
+[a]={},c,d;a=a.split(/\\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var\
+ c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isRead\
+y){try{c.documentElement.doScroll(\"left\")}catch(a){setTimeout(J,1);return}e.r\
+eady()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/\
+^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,j=/\\S/,k=/^\\s+/,l=/\\s+$/,m=/^<\
+(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,n=/^[\\],:{}\\s]*$/,o=/\\\\(?:[\"\\\\\\/bfnrt]|u\
+[0-9a-fA-F]{4})/g,p=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:\
+[eE][+\\-]?\\d+)?/g,q=/(?:^|:|,)(?:\\s*\\[)+/g,r=/(webkit)[ \\/]([\\w.]+)/,s=/(\
+opera)(?:.*version)?[ \\/]([\\w.]+)/,t=/(msie) ([\\w.]+)/,u=/(mozilla)(?:.*? rv\
+:([\\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+\"\").toU\
+pperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.\
+hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototyp\
+e.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:func\
+tion(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a\
+,this.length=1;return this}if(a===\"body\"&&!d&&c.body){this.context=c,this[0]=\
+c.body,this.selector=a,this.length=1;return this}if(typeof a==\"string\"){a.cha\
+rAt(0)!==\"<\"||a.charAt(a.length-1)!==\">\"||a.length<3?g=i.exec(a):g=[null,a,\
+null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d\
+:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a\
+,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable\
+?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElem\
+entById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1\
+,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f)\
+.find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.sel\
+ector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray\
+(a,this)},selector:\"\",jquery:\"1.7.2\",length:0,size:function(){return this.l\
+ength},toArray:function(){return F.call(this,0)},get:function(a){return a==null\
+?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var \
+d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d\
+.context=this.context,b===\"find\"?d.selector=this.selector+(this.selector?\" \
+\":\"\")+c:b&&(d.selector=this.selector+\".\"+b+\"(\"+c+\")\");return d},each:f\
+unction(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);\
+return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)}\
+,first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:\
+function(){return this.pushStack(F.apply(this,arguments),\"slice\",F.call(argum\
+ents).join(\",\"))},map:function(a){return this.pushStack(e.map(this,function(b\
+,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constr\
+uctor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.e\
+xtend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments\
+.length,l=!1;typeof i==\"boolean\"&&(l=i,i=arguments[1]||{},j=2),typeof i!=\"ob\
+ject\"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=argumen\
+ts[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject\
+(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)\
+?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:func\
+tion(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,rea\
+dyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){i\
+f(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.re\
+ady,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.tr\
+igger&&e(c).trigger(\"ready\").off(\"ready\")}},bindReady:function(){if(!A){A=e\
+.Callbacks(\"once memory\");if(c.readyState===\"complete\")return setTimeout(e.\
+ready,1);if(c.addEventListener)c.addEventListener(\"DOMContentLoaded\",B,!1),a.\
+addEventListener(\"load\",e.ready,!1);else if(c.attachEvent){c.attachEvent(\"on\
+readystatechange\",B),a.attachEvent(\"onload\",e.ready);var b=!1;try{b=a.frameE\
+lement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:functio\
+n(a){return e.type(a)===\"function\"},isArray:Array.isArray||function(a){return\
+ e.type(a)===\"array\"},isWindow:function(a){return a!=null&&a==a.window},isNum\
+eric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){ret\
+urn a==null?String(a):I[C.call(a)]||\"object\"},isPlainObject:function(a){if(!a\
+||e.type(a)!==\"object\"||a.nodeType||e.isWindow(a))return!1;try{if(a.construct\
+or&&!D.call(a,\"constructor\")&&!D.call(a.constructor.prototype,\"isPrototypeOf\
+\"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isE\
+mptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){thro\
+w new Error(a)},parseJSON:function(b){if(typeof b!=\"string\"||!b)return null;b\
+=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o\
+,\"@\").replace(p,\"]\").replace(q,\"\")))return(new Function(\"return \"+b))()\
+;e.error(\"Invalid JSON: \"+b)},parseXML:function(c){if(typeof c!=\"string\"||!\
+c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,\"\
+text/xml\")):(d=new ActiveXObject(\"Microsoft.XMLDOM\"),d.async=\"false\",d.loa\
+dXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName(\"parsere\
+rror\").length)&&e.error(\"Invalid XML: \"+c);return d},noop:function(){},globa\
+lEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b\
+)},camelCase:function(a){return a.replace(w,\"ms-\").replace(v,x)},nodeName:fun\
+ction(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:\
+function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f\
+ in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)br\
+eak}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c\
+.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?\"\
+\":G.call(a)}:function(a){return a==null?\"\":(a+\"\").replace(k,\"\").replace(\
+l,\"\")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.leng\
+th==null||d===\"string\"||d===\"function\"||d===\"regexp\"||e.isWindow(a)?E.cal\
+l(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H\
+.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c\
+]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.len\
+gth==\"number\")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d+\
++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=\
+0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a\
+,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j==\"number\"\
+&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=n\
+ull&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);ret\
+urn h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c==\"string\"){v\
+ar d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=func\
+tion(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.g\
+uid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.\
+length;if(d&&typeof d==\"object\"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}el\
+se if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.cal\
+l(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(\
+a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(n\
+ew Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.ex\
+ec(a)||t.exec(a)||a.indexOf(\"compatible\")<0&&u.exec(a)||[];return{browser:b[1\
+]||\"\",version:b[2]||\"0\"}},sub:function(){function a(b,c){return new a.fn.in\
+it(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.cons\
+tructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanc\
+eof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;va\
+r b=a(c);return a},browser:{}}),e.each(\"Boolean Number String Function Array D\
+ate RegExp Object\".split(\" \"),function(a,b){I[\"[object \"+b+\"]\"]=b.toLowe\
+rCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=\
+z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(\" \")&&(k=/^[\\s\\x\
+A0]+/,l=/[\\s\\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventLis\
+tener(\"DOMContentLoaded\",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.read\
+yState===\"complete\"&&(c.detachEvent(\"onreadystatechange\",B),e.ready())});re\
+turn e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,\
+l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h\
+===\"array\"?n(g):h===\"function\"&&(!a.unique||!p.has(g))&&c.push(g)},o=functi\
+on(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;\
+m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p\
+.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:funct\
+ion(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1\
+]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<\
+e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.spl\
+ice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.le\
+ngth;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return t\
+his},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock\
+:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return\
+!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));r\
+eturn this},fire:function(){p.fireWith(this,arguments);return this},fired:funct\
+ion(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b\
+=f.Callbacks(\"once memory\"),c=f.Callbacks(\"once memory\"),d=f.Callbacks(\"me\
+mory\"),e=\"pending\",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,\
+progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired\
+,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:functio\
+n(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:functio\
+n(a,b,c){return f.Deferred(function(d){f.each({done:[a,\"resolve\"],fail:[b,\"r\
+eject\"],progress:[c,\"notify\"]},function(a,b){var c=b[0],e=b[1],g;f.isFunctio\
+n(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.pro\
+mise().then(d.resolve,d.reject,d.notify):d[e+\"With\"](this===i?d:this,[g])}):i\
+[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h\
+)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+\"With\"]\
+=g[j].fireWith;i.done(function(){e=\"resolved\"},c.disable,d.lock).fail(functio\
+n(){e=\"rejected\"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a)\
+{function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b\
+,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.\
+call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.\
+length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j\
+.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?\
+b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j\
+.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l\
+,m,n,o,p=c.createElement(\"div\"),q=c.documentElement;p.setAttribute(\"classNam\
+e\",\"t\"),p.innerHTML=\"   <link/><table></table><a href='/a' style='top:1px;f\
+loat:left;opacity:.55;'>a</a><input type='checkbox'/>\",d=p.getElementsByTagNam\
+e(\"*\"),e=p.getElementsByTagName(\"a\")[0];if(!d||!d.length||!e)return{};g=c.c\
+reateElement(\"select\"),h=g.appendChild(c.createElement(\"option\")),i=p.getEl\
+ementsByTagName(\"input\")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tb\
+ody:!p.getElementsByTagName(\"tbody\").length,htmlSerialize:!!p.getElementsByTa\
+gName(\"link\").length,style:/top/.test(e.getAttribute(\"style\")),hrefNormaliz\
+ed:e.getAttribute(\"href\")===\"/a\",opacity:/^0.55/.test(e.style.opacity),cssF\
+loat:!!e.style.cssFloat,checkOn:i.value===\"on\",optSelected:h.selected,getSetA\
+ttribute:p.className!==\"t\",enctype:!!c.createElement(\"form\").enctype,html5C\
+lone:c.createElement(\"nav\").cloneNode(!0).outerHTML!==\"<:nav></:nav>\",submi\
+tBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0\
+,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMarg\
+in:!0},f.boxModel=b.boxModel=c.compatMode===\"CSS1Compat\",i.checked=!0,b.noClo\
+neChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{d\
+elete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.\
+fireEvent&&(p.attachEvent(\"onclick\",function(){b.noCloneEvent=!1}),p.cloneNod\
+e(!0).fireEvent(\"onclick\")),i=c.createElement(\"input\"),i.value=\"t\",i.setA\
+ttribute(\"type\",\"radio\"),b.radioValue=i.value===\"t\",i.setAttribute(\"chec\
+ked\",\"checked\"),i.setAttribute(\"name\",\"t\"),p.appendChild(i),j=c.createDo\
+cumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneN\
+ode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendCh\
+ild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m=\"on\"+n,o=m in\
+ p,o||(p.setAttribute(m,\"return;\"),o=typeof p[m]==\"function\"),b[n+\"Bubbles\
+\"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,\
+t,u=c.getElementsByTagName(\"body\")[0];!u||(m=1,t=\"padding:0;margin:0;border:\
+\",r=\"position:absolute;top:0;left:0;width:1px;height:1px;\",s=t+\"0;visibilit\
+y:hidden;\",n=\"style='\"+r+t+\"5px solid #000;\",q=\"<div \"+n+\"display:block\
+;'><div style='\"+t+\"0;display:block;overflow:hidden;'></div></div>\"+\"<table\
+ \"+n+\"' cellpadding='0' cellspacing='0'>\"+\"<tr><td></td></tr></table>\",d=c\
+.createElement(\"div\"),d.style.cssText=s+\"width:0;height:0;position:static;to\
+p:0;margin-top:\"+m+\"px\",u.insertBefore(d,u.firstChild),p=c.createElement(\"d\
+iv\"),d.appendChild(p),p.innerHTML=\"<table><tr><td style='\"+t+\"0;display:non\
+e'></td><td>t</td></tr></table>\",k=p.getElementsByTagName(\"td\"),o=k[0].offse\
+tHeight===0,k[0].style.display=\"\",k[1].style.display=\"none\",b.reliableHidde\
+nOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML=\"\",l=c.cre\
+ateElement(\"div\"),l.style.width=\"0\",l.style.marginRight=\"0\",p.style.width\
+=\"2px\",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l\
+,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!=\"undefi\
+ned\"&&(p.innerHTML=\"\",p.style.width=p.style.padding=\"1px\",p.style.border=0\
+,p.style.overflow=\"hidden\",p.style.display=\"inline\",p.style.zoom=1,b.inline\
+BlockNeedsLayout=p.offsetWidth===3,p.style.display=\"block\",p.style.overflow=\
+\"visible\",p.innerHTML=\"<div style='width:5px;'></div>\",b.shrinkWrapBlocks=p\
+.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChi\
+ld,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,do\
+esAddBorderForTableAndCells:i.offsetTop===5},g.style.position=\"fixed\",g.style\
+.top=\"20px\",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.positi\
+on=g.style.top=\"\",e.style.overflow=\"hidden\",e.style.position=\"relative\",j\
+.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginIn\
+BodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop=\"1%\",b.pixe\
+lMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!==\"1%\"),typeof \
+d.style.zoom!=\"undefined\"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.ext\
+end(b,j))});return b}();var j=/^(?:\\{.*\\}|\\[.*\\])$/,k=/([A-Z])/g;f.extend({\
+cache:{},uuid:0,expando:\"jQuery\"+(f.fn.jquery+Math.random()).replace(/\\D/g,\
+\"\"),noData:{embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",ap\
+plet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];re\
+turn!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expa\
+ndo,k=typeof c==\"string\",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c===\"\
+events\";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.u\
+uid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c==\"object\"||typeo\
+f c==\"function\")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m\
+[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])\
+return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},remove\
+Data:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j\
+=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArra\
+y(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(\" \")));for(e=0,g\
+=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){de\
+lete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delet\
+e j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.re\
+moveAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},ac\
+ceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if\
+(b)return b!==!0&&a.getAttribute(\"classid\")===b}return!0}}),f.fn.extend({data\
+:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f\
+.data(j);if(j.nodeType===1&&!f._data(j,\"parsedAttrs\")){g=j.attributes;for(i=g\
+.length;k<i;k++)h=g[k].name,h.indexOf(\"data-\")===0&&(h=f.camelCase(h.substrin\
+g(5)),l(j,h,m[h]));f._data(j,\"parsedAttrs\",!0)}}return m}if(typeof a==\"objec\
+t\")return this.each(function(){f.data(this,a)});d=a.split(\".\",2),d[1]=d[1]?\
+\".\"+d[1]:\"\",e=d[1]+\"!\";return f.access(this,function(c){if(c===b){m=this.\
+triggerHandler(\"getData\"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));retur\
+n m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.tri\
+ggerHandler(\"setData\"+e,d),f.data(this,a,c),b.triggerHandler(\"changeData\"+e\
+,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.e\
+ach(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b\
+||\"fx\")+\"mark\",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a\
+!==!0&&(c=b,b=a,a=!1);if(b){c=c||\"fx\";var d=c+\"mark\",e=a?0:(f._data(b,d)||1\
+)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,\"mark\"))}},queue:function(a,\
+b,c){var d;if(a){b=(b||\"fx\")+\"queue\",d=f._data(a,b),c&&(!d||f.isArray(c)?d=\
+f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b\
+||\"fx\";var c=f.queue(a,b),d=c.shift(),e={};d===\"inprogress\"&&(d=c.shift()),\
+d&&(b===\"fx\"&&c.unshift(\"inprogress\"),f._data(a,b+\".run\",e),d.call(a,func\
+tion(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+\"queue \"+b+\".run\",!0\
+),n(a,b,\"queue\"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!=\"str\
+ing\"&&(c=a,a=\"fx\",d--);if(arguments.length<d)return f.queue(this[0],a);retur\
+n c===b?this:this.each(function(){var b=f.queue(this,a,c);a===\"fx\"&&b[0]!==\"\
+inprogress\"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(functio\
+n(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||\"\
+fx\";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){\
+clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||\"fx\",[])},pro\
+mise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!=\"string\"&\
+&(c=a,a=b),a=a||\"fx\";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+\"defer\",j\
+=a+\"queue\",k=a+\"mark\",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,\
+b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks(\"once memory\"),!0))h++\
+,l.add(m);m();return d.promise(c)}});var o=/[\\n\\t\\r]/g,p=/\\s+/,q=/\\r/g,r=/\
+^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea\
+)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|lo\
+op|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttrib\
+ute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,argum\
+ents.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr\
+(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length\
+>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{t\
+his[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if\
+(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,th\
+is.className))});if(a&&typeof a==\"string\"){b=a.split(p);for(c=0,d=this.length\
+;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className\
+=a;else{g=\" \"+e.className+\" \";for(h=0,i=b.length;h<i;h++)~g.indexOf(\" \"+b\
+[h]+\" \")||(g+=b[h]+\" \");e.className=f.trim(g)}}}return this},removeClass:fu\
+nction(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(t\
+his).removeClass(a.call(this,b,this.className))});if(a&&typeof a==\"string\"||a\
+===b){c=(a||\"\").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeTy\
+pe===1&&g.className)if(a){h=(\" \"+g.className+\" \").replace(o,\" \");for(i=0,\
+j=c.length;i<j;i++)h=h.replace(\" \"+c[i]+\" \",\" \");g.className=f.trim(h)}el\
+se g.className=\"\"}}return this},toggleClass:function(a,b){var c=typeof a,d=ty\
+peof b==\"boolean\";if(f.isFunction(a))return this.each(function(c){f(this).tog\
+gleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c=\
+==\"string\"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasC\
+lass(e),h[i?\"addClass\":\"removeClass\"](e)}else if(c===\"undefined\"||c===\"b\
+oolean\")this.className&&f._data(this,\"__className__\",this.className),this.cl\
+assName=this.className||a===!1?\"\":f._data(this,\"__className__\")||\"\"})},ha\
+sClass:function(a){var b=\" \"+a+\" \",c=0,d=this.length;for(;c<d;c++)if(this[c\
+].nodeType===1&&(\" \"+this[c].className+\" \").replace(o,\" \").indexOf(b)>-1)\
+return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){\
+e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType\
+===1){e?h=a.call(this,d,g.val()):h=a,h==null?h=\"\":typeof h==\"number\"?h+=\"\
+\":f.isArray(h)&&(h=f.map(h,function(a){return a==null?\"\":a+\"\"})),c=f.valHo\
+oks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!(\"set\"in c)||\
+c.set(this,h,\"value\")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHo\
+oks[g.nodeName.toLowerCase()];if(c&&\"get\"in c&&(d=c.get(g,\"value\"))!==b)ret\
+urn d;d=g.value;return typeof d==\"string\"?d.replace(q,\"\"):d==null?\"\":d}}}\
+}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!\
+b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selecte\
+dIndex,h=[],i=a.options,j=a.type===\"select-one\";if(g<0)return null;c=j?g:0,d=\
+j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.di\
+sabled:e.getAttribute(\"disabled\")===null)&&(!e.parentNode.disabled||!f.nodeNa\
+me(e.parentNode,\"optgroup\"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.\
+length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeA\
+rray(b);f(a).find(\"option\").each(function(){this.selected=f.inArray(f(this).v\
+al(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,h\
+tml:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var\
+ g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a\
+)[c](d);if(typeof a.getAttribute==\"undefined\")return f.prop(a,c,d);i=j!==1||!\
+f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b\
+){if(d===null){f.removeAttr(a,c);return}if(h&&\"set\"in h&&i&&(g=h.set(a,d,c))!\
+==b)return g;a.setAttribute(c,\"\"+d);return d}if(h&&\"get\"in h&&i&&(g=h.get(a\
+,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:funct\
+ion(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d\
+.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,\"\
+\"),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:funct\
+ion(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error(\"type property can't be c\
+hanged\");else if(!f.support.radioValue&&b===\"radio\"&&f.nodeName(a,\"input\")\
+){var c=a.value;a.setAttribute(\"type\",b),c&&(a.value=c);return b}}},value:{ge\
+t:function(a,b){if(w&&f.nodeName(a,\"button\"))return w.get(a,b);return b in a?\
+a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,\"button\"))return w.set(a\
+,b,c);a.value=b}}},propFix:{tabindex:\"tabIndex\",readonly:\"readOnly\",\"for\"\
+:\"htmlFor\",\"class\":\"className\",maxlength:\"maxLength\",cellspacing:\"cell\
+Spacing\",cellpadding:\"cellPadding\",rowspan:\"rowSpan\",colspan:\"colSpan\",u\
+semap:\"useMap\",frameborder:\"frameBorder\",contenteditable:\"contentEditable\
+\"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=\
+i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&\
+\"set\"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&\"get\"in g&&(e=g.get(a,c))!==nul\
+l?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode(\"tabi\
+ndex\");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a\
+.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:fu\
+nction(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!=\"boolean\"&&(d=a.getA\
+ttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d\
+;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c\
+,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.butt\
+on={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue\
+!==\"\":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNod\
+e(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+\"\
+\"}},f.attrHooks.tabindex.set=w.set,f.each([\"width\",\"height\"],function(a,b)\
+{f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===\"\"){a.setAt\
+tribute(b,\"auto\");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:f\
+unction(a,b,c){b===\"\"&&(b=\"false\"),w.set(a,b,c)}}),f.support.hrefNormalized\
+||f.each([\"href\",\"src\",\"width\",\"height\"],function(a,c){f.attrHooks[c]=f\
+.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===nu\
+ll?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style\
+.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=\"\"+b}}),f\
+.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:\
+function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.s\
+electedIndex);return null}})),f.support.enctype||(f.propFix.enctype=\"encoding\
+\"),f.support.checkOn||f.each([\"radio\",\"checkbox\"],function(){f.valHooks[th\
+is]={get:function(a){return a.getAttribute(\"value\")===null?\"on\":a.value}}})\
+,f.each([\"radio\",\"checkbox\"],function(){f.valHooks[this]=f.extend(f.valHook\
+s[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(\
+),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\\.]*)?(?:\\.(.+))?$/,\
+B=/(?:^|\\s)hover(\\.\\S+)?\\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(\
+?:focusinfocus|focusoutblur)$/,F=/^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/\
+,G=function( a){var b=F.exec(a);b&&(b[1]=(b[1]||\"\").toLowerCase(),b[3]=b[3]&&\
+new RegExp(\"(?:^|\\\\s)\"+b[3]+\"(?:\\\\s|$)\"));return b},H=function(a,b){var\
+ c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.\
+id||{}).value===b[2])&&(!b[3]||b[3].test((c[\"class\"]||{}).value))},I=function\
+(a){return f.event.special.hover?a:a.replace(B,\"mouseenter$1 mouseleave$1\")};\
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===\
+3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.se\
+lector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(\
+h.handle=i=function(a){return typeof f!=\"undefined\"&&(!a||f.event.triggered!=\
+=a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).s\
+plit(\" \");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||\"\").sp\
+lit(\".\").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s\
+=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:\
+d.guid,selector:g,quick:g&&G(g),namespace:n.join(\".\")},p),r=j[m];if(!r){r=j[m\
+]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListen\
+er?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent(\"on\"+m,i)}s.add&&(\
+s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateC\
+ount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a\
+,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g\
+.events)){b=f.trim(I(b||\"\")).split(\" \");for(h=0;h<b.length;h++){i=A.exec(b[\
+h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);conti\
+nue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.\
+length,l=l?new RegExp(\"(^|\\\\.)\"+l.split(\".\").sort().join(\"\\\\.(?:.*\
+\\\\.)?\")+\"(\\\\.|$)\"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType\
+)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d===\
+\"**\"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p\
+.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a\
+,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.ha\
+ndle,q&&(q.elem=null),f.removeData(a,[\"events\",\"handle\"],!0))}},customEvent\
+:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeT\
+ype!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f\
+.event.triggered))return;h.indexOf(\"!\")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(\
+\".\")>=0&&(i=h.split(\".\"),h=i.shift(),i.sort());if((!e||f.event.customEvent[\
+h])&&!f.event.global[h])return;c=typeof c==\"object\"?c[f.expando]?c:new f.Even\
+t(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join(\
+\".\"),c.namespace_re=c.namespace?new RegExp(\"(^|\\\\.)\"+i.join(\"\\\\.(?:.*\
+\\\\.)?\")+\"(\\\\.|$)\"):null,o=h.indexOf(\":\")<0?\"on\"+h:\"\";if(!e){j=f.ca\
+che;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.ele\
+m,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.un\
+shift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)retur\
+n;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h\
+,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&\
+&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.\
+length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,\"e\
+vents\")||{})[c.type]&&f._data(m,\"handle\"),q&&q.apply(m,d),q=o&&m[o],q&&f.acc\
+eptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrev\
+ented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!==\"click\
+\"||!f.nodeName(e,\"a\"))&&f.acceptData(e)&&o&&e[h]&&(h!==\"focus\"&&h!==\"blur\
+\"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.t\
+riggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:f\
+unction(c){c=f.event.fix(c||a.event);var d=(f._data(this,\"events\")||{})[c.typ\
+e]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namesp\
+ace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateT\
+arget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button\
+||c.type!==\"click\")){n=f(this),n.context=this.ownerDocument||this;for(m=c.tar\
+get;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k\
+<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&\
+r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,m\
+atches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c\
+.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStop\
+ped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.n\
+amespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s\
+.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(\
+c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(t\
+his,c);return c.result}},props:\"attrChange attrName relatedNode srcElement alt\
+Key bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget s\
+hiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\
+\"char charCode key keyCode\".split(\" \"),filter:function(a,b){a.which==null&&\
+(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:\"\
+button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX \
+screenY toElement\".split(\" \"),filter:function(a,d){var e,f,g,h=d.button,i=d.\
+fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.do\
+cumentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-\
+(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.s\
+crollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relat\
+edTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?\
+2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.\
+fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(\
+g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.\
+target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a\
+.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},l\
+oad:{noBubble:!0},focus:{delegateType:\"focusin\"},blur:{delegateType:\"focusou\
+t\"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload\
+=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)\
+}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated\
+:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e\
+.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.r\
+emoveEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.remov\
+eEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent(\"on\"+b,c\
+)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);\
+a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defa\
+ultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:\
+J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[\
+f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPreve\
+nted=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.retu\
+rnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.\
+originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},s\
+topImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.st\
+opPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropaga\
+tionStopped:J},f.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},functi\
+on(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=\
+this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c\
+,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f\
+.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName\
+(this,\"form\"))return!1;f.event.add(this,\"click._submit keypress._submit\",fu\
+nction(a){var c=a.target,d=f.nodeName(c,\"input\")||f.nodeName(c,\"button\")?c.\
+form:b;d&&!d._submit_attached&&(f.event.add(d,\"submit._submit\",function(a){a.\
+_submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submi\
+t_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simul\
+ate(\"submit\",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,\
+\"form\"))return!1;f.event.remove(this,\"._submit\")}}),f.support.changeBubbles\
+||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.t\
+ype===\"checkbox\"||this.type===\"radio\")f.event.add(this,\"propertychange._ch\
+ange\",function(a){a.originalEvent.propertyName===\"checked\"&&(this._just_chan\
+ged=!0)}),f.event.add(this,\"click._change\",function(a){this._just_changed&&!a\
+.isTrigger&&(this._just_changed=!1,f.event.simulate(\"change\",this,a,!0))});re\
+turn!1}f.event.add(this,\"beforeactivate._change\",function(a){var b=a.target;z\
+.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,\"change._change\",funct\
+ion(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate(\"change\
+\",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a\
+.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!==\"radio\"&&b.type!==\
+\"checkbox\")return a.handleObj.handler.apply(this,arguments)},teardown:functio\
+n(){f.event.remove(this,\"._change\");return z.test(this.nodeName)}}),f.support\
+.focusinBubbles||f.each({focus:\"focusin\",blur:\"focusout\"},function(a,b){var\
+ d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.spec\
+ial[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function\
+(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,\
+g){var h,i;if(typeof a==\"object\"){typeof c!=\"string\"&&(d=d||c,c=b);for(i in\
+ a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typ\
+eof c==\"string\"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this\
+;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.\
+guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)}\
+)},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a\
+.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.names\
+pace?e.origType+\".\"+e.namespace:e.origType,e.selector,e.handler);return this}\
+if(typeof a==\"object\"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!\
+1||typeof c==\"function\")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.e\
+vent.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unb\
+ind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.contex\
+t).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a\
+,this.selector||\"**\",b);return this},delegate:function(a,b,c,d){return this.o\
+n(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,\"\
+**\"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.even\
+t.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.t\
+rigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d\
+=0,e=function(c){var e=(f._data(this,\"lastToggle\"+a.guid)||0)%d;f._data(this,\
+\"lastToggle\"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)\
+||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:funct\
+ion(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each(\"blur focus focu\
+sin focusout load resize scroll unload click dblclick mousedown mouseup mousemo\
+ve mouseover mouseout mouseenter mouseleave change select submit keydown keypre\
+ss keyup error contextmenu\".split(\" \"),function(a,b){f.fn[b]=function(a,c){c\
+==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger\
+(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHook\
+s),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(\
+a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];w\
+hile(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset\
+=h);if(typeof b!=\"string\"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).leng\
+th>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length\
+;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];\
+break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){\
+k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\
+\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~\
+])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=\"sizcache\"+(Math.random()+\"\").replace(\"\
+.\",\"\"),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\\\/g,k=/\\r\\n/g,l=/\
+\\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d|\
+|c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=\"string\
+\")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(\"\"),i=a.\
+exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>\
+1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.rela\
+tive[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.s\
+hift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0\
+])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter\
+(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.\
+length===1&&(w[0]===\"~\"||w[0]===\"+\")&&d.parentNode?d.parentNode:d,v),j=n.ex\
+pr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop()\
+,r=q,o.relative[q]?r=w.pop():q=\"\",r==null&&(r=d),o.relative[q](k,r,v)}else k=\
+w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)===\"[object Array]\")if(!u)e.push.a\
+pply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[\
+t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)\
+k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e\
+));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.\
+length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){ret\
+urn m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a])\
+.length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.or\
+der.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1\
+,1);if(i.substr(i.length-1)!==\"\\\\\"){g[1]=(g[1]||\"\").replace(j,\"\"),d=o.f\
+ind[h](g,b,c);if(d!=null){a=a.replace(o.match[h],\"\");break}}}}d||(d=typeof b.\
+getElementsByTagName!=\"undefined\"?b.getElementsByTagName(\"*\"):[]);return{se\
+t:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&\
+&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].\
+exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.len\
+gth-1)===\"\\\\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,\
+s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++\
+)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b\
+){d||(s=r),a=a.replace(o.match[h],\"\");if(!g)return[];break}}if(a===q)if(g==nu\
+ll)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error(\"Sy\
+ntax error, unrecognized expression: \"+a)};var n=m.getText=function(a){var b,c\
+,d=a.nodeType,e=\"\";if(d){if(d===1||d===9||d===11){if(typeof a.textContent==\"\
+string\")return a.textContent;if(typeof a.innerText==\"string\")return a.innerT\
+ext.replace(k,\"\");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3|\
+|d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));ret\
+urn e},o=m.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00\
+c0-\\uFFFF\\-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,NAME:/\
+\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\
+\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\
+\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\
+\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+\
+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,POS:/:(nth|eq|gt|lt|first\
+|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF\
+\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/},leftMatch:\
+{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:funct\
+ion(a){return a.getAttribute(\"href\")},type:function(a){return a.getAttribute(\
+\"type\")}},relative:{\"+\":function(a,b){var c=typeof b==\"string\",d=c&&!l.te\
+st(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]\
+){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCas\
+e()===b?h||!1:h===b}e&&m.filter(b,a,!0)},\">\":function(a,b){var c,d=typeof b==\
+\"string\",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a\
+[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(\
+;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}}\
+,\"\":function(a,b,c){var d,f=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.to\
+LowerCase(),d=b,g=w),g(\"parentNode\",b,f,a,d,c)},\"~\":function(a,b,c){var d,f\
+=e++,g=x;typeof b==\"string\"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g(\"prev\
+iousSibling\",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!\
+=\"undefined\"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}\
+},NAME:function(a,b){if(typeof b.getElementsByName!=\"undefined\"){var c=[],d=b\
+.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute(\"nam\
+e\")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typ\
+eof b.getElementsByTagName!=\"undefined\")return b.getElementsByTagName(a[1])}}\
+,preFilter:{CLASS:function(a,b,c,d,e,f){a=\" \"+a[1].replace(j,\"\")+\" \";if(f\
+)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(\" \"+h.classNa\
+me+\" \").replace(/[\\t\\n\\r]/g,\" \").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1\
+));return!1},ID:function(a){return a[1].replace(j,\"\")},TAG:function(a,b){retu\
+rn a[1].replace(j,\"\").toLowerCase()},CHILD:function(a){if(a[1]===\"nth\"){a[2\
+]||m.error(a[0]),a[2]=a[2].replace(/^\\+|\\s*/g,\"\");var b=/(-?)(\\d*)(?:n([+\
+\\-]?\\d*))?/.exec(a[2]===\"even\"&&\"2n\"||a[2]===\"odd\"&&\"2n+1\"||!/\\D/.te\
+st(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.er\
+ror(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace\
+(j,\"\");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||\"\").replace(\
+j,\"\"),a[2]===\"~=\"&&(a[4]=\" \"+a[4]+\" \");return a},PSEUDO:function(b,c,d,\
+e,f){if(b[1]===\"not\")if((a.exec(b[3])||\"\").length>1||/^\\w/.test(b[3]))b[3]\
+=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);re\
+turn!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return\
+ b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){retur\
+n a.disabled===!1&&a.type!==\"hidden\"},disabled:function(a){return a.disabled=\
+==!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentN\
+ode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){retu\
+rn!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){re\
+turn!!m(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text\
+:function(a){var b=a.getAttribute(\"type\"),c=a.type;return a.nodeName.toLowerC\
+ase()===\"input\"&&\"text\"===c&&(b===c||b===null)},radio:function(a){return a.\
+nodeName.toLowerCase()===\"input\"&&\"radio\"===a.type},checkbox:function(a){re\
+turn a.nodeName.toLowerCase()===\"input\"&&\"checkbox\"===a.type},file:function\
+(a){return a.nodeName.toLowerCase()===\"input\"&&\"file\"===a.type},password:fu\
+nction(a){return a.nodeName.toLowerCase()===\"input\"&&\"password\"===a.type},s\
+ubmit:function(a){var b=a.nodeName.toLowerCase();return(b===\"input\"||b===\"bu\
+tton\")&&\"submit\"===a.type},image:function(a){return a.nodeName.toLowerCase()\
+===\"input\"&&\"image\"===a.type},reset:function(a){var b=a.nodeName.toLowerCas\
+e();return(b===\"input\"||b===\"button\")&&\"reset\"===a.type},button:function(\
+a){var b=a.nodeName.toLowerCase();return b===\"input\"&&\"button\"===a.type||b=\
+==\"button\"},input:function(a){return/input|select|textarea|button/i.test(a.no\
+deName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilter\
+s:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length\
+-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:fun\
+ction(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(\
+a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO\
+:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e===\"co\
+ntains\")return(a.textContent||a.innerText||n([a])||\"\").indexOf(b[3])>=0;if(e\
+===\"not\"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;retu\
+rn!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){cas\
+e\"only\":case\"first\":while(l=l.previousSibling)if(l.nodeType===1)return!1;if\
+(k===\"first\")return!0;l=a;case\"last\":while(l=l.nextSibling)if(l.nodeType===\
+1)return!1;return!0;case\"nth\":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g\
+=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.next\
+Sibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j\
+===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute(\
+\"id\")===b},TAG:function(a,b){return b===\"*\"&&a.nodeType===1||!!a.nodeName&&\
+a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(\" \"+(a.className||a.\
+getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=\
+m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttr\
+ibute(c),e=d+\"\",f=b[2],g=b[4];return d==null?f===\"!=\":!f&&m.attr?d!=null:f=\
+==\"=\"?e===g:f===\"*=\"?e.indexOf(g)>=0:f===\"~=\"?(\" \"+e+\" \").indexOf(g)>\
+=0:g?f===\"!=\"?e!==g:f===\"^=\"?e.indexOf(g)===0:f===\"$=\"?e.substr(e.length-\
+g.length)===g:f===\"|=\"?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},\
+POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=\
+o.match.POS,q=function(a,b){return\"\\\\\"+(b-0+1)};for(var r in o.match)o.matc\
+h[r]=new RegExp(o.match[r].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),o.left\
+Match[r]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+o.match[r].source.replace(/\
+\\\\(\\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slic\
+e.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slic\
+e.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var\
+ c=0,d=b||[];if(g.call(a)===\"[object Array]\")Array.prototype.push.apply(d,a);\
+else if(typeof a.length==\"number\")for(var e=a.length;c<e;c++)d.push(a[c]);els\
+e for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumen\
+tPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition\
+||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.com\
+pareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.s\
+ourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],\
+g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)r\
+eturn 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parent\
+Node;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k\
+],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)retur\
+n c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),f\
+unction(){var a=c.createElement(\"div\"),d=\"script\"+(new Date).getTime(),e=c.\
+documentElement;a.innerHTML=\"<a name='\"+d+\"'/>\",e.insertBefore(a,e.firstChi\
+ld),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!\
+=\"undefined\"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e\
+.getAttributeNode!=\"undefined\"&&e.getAttributeNode(\"id\").nodeValue===a[1]?[\
+e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=\"undefine\
+d\"&&a.getAttributeNode(\"id\");return a.nodeType===1&&c&&c.nodeValue===b}),e.r\
+emoveChild(a),e=a=null}(),function(){var a=c.createElement(\"div\");a.appendChi\
+ld(c.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(o.find.TAG=f\
+unction(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]===\"*\"){var d=[];for(v\
+ar e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a\
+ href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!=\"undefined\"&\
+&a.firstChild.getAttribute(\"href\")!==\"#\"&&(o.attrHandle.href=function(a){re\
+turn a.getAttribute(\"href\",2)}),a=null}(),c.querySelectorAll&&function(){var \
+a=m,b=c.createElement(\"div\"),d=\"__sizzle__\";b.innerHTML=\"<p class='TEST'><\
+/p>\";if(!b.querySelectorAll||b.querySelectorAll(\".TEST\").length!==0){m=funct\
+ion(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\\w+$)|^\\.([\\w\\-]+$)|^#([\
+\\w\\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.\
+getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)retu\
+rn s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b===\"body\"&&e.bo\
+dy)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.pare\
+ntNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelect\
+orAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!==\"obj\
+ect\"){var k=e,l=e.getAttribute(\"id\"),n=l||d,p=e.parentNode,q=/^\\s*[+~]/.tes\
+t(b);l?n=n.replace(/'/g,\"\\\\$&\"):e.setAttribute(\"id\",n),q&&p&&(e=e.parentN\
+ode);try{if(!q||p)return s(e.querySelectorAll(\"[id='\"+n+\"'] \"+b),f)}catch(r\
+){}finally{l||k.removeAttribute(\"id\")}}}return a(b,e,f,g)};for(var e in a)m[e\
+]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.moz\
+MatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.ca\
+ll(c.createElement(\"div\"),\"div\"),e=!1;try{b.call(c.documentElement,\"[test!\
+='']:sizzle\")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\\=\
+\\s*([^'\"\\]]*)\\s*\\]/g,\"='$1']\");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.\
+test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.node\
+Type!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(\
+){var a=c.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div c\
+lass='test'></div>\";if(!!a.getElementsByClassName&&a.getElementsByClassName(\"\
+e\").length!==0){a.lastChild.className=\"e\";if(a.getElementsByClassName(\"e\")\
+.length===1)return;o.order.splice(1,0,\"CLASS\"),o.find.CLASS=function(a,b,c){i\
+f(typeof b.getElementsByClassName!=\"undefined\"&&!c)return b.getElementsByClas\
+sName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){ret\
+urn a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosi\
+tion?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.cont\
+ains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).do\
+cumentElement;return b?b.nodeName!==\"HTML\":!1};var y=function(a,b,c){var d,e=\
+[],f=\"\",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace\
+(o.match.PSEUDO,\"\");a=o.relative[a]?a+\"*\":a;for(var h=0,i=g.length;h<i;h++)\
+m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find\
+=m,f.expr=m.selectors,f.expr[\":\"]=f.expr.filters,f.unique=m.uniqueSort,f.text\
+=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:pa\
+rents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\\[\\.,]*$/,P=Array.prototype.slice,Q=\
+f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend(\
+{find:function(a){var b=this,c,d;if(typeof a!=\"string\")return f(a).filter(fun\
+ction(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=th\
+is.pushStack(\"\",\"find\",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f\
+.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]\
+){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filte\
+r(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})\
+},not:function(a){return this.pushStack(T(this,a,!1),\"not\",a)},filter:functio\
+n(a){return this.pushStack(T(this,a,!0),\"filter\",a)},is:function(a){return!!a\
+&&(typeof a==\"string\"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(\
+a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g\
+=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.\
+length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode\
+,h++}return c}var i=Q.test(a)||typeof a!=\"string\"?f(a,b||this.context):0;for(\
+d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matches\
+Selector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g\
+.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,\"clos\
+est\",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevA\
+ll().length:-1;if(typeof a==\"string\")return f.inArray(this[0],f(a));return f.\
+inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==\"string\"?f(a\
+,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushSt\
+ack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.pr\
+evObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType\
+!==11?b:null},parents:function(a){return f.dir(a,\"parentNode\")},parentsUntil:\
+function(a,b,c){return f.dir(a,\"parentNode\",c)},next:function(a){return f.nth\
+(a,2,\"nextSibling\")},prev:function(a){return f.nth(a,2,\"previousSibling\")},\
+nextAll:function(a){return f.dir(a,\"nextSibling\")},prevAll:function(a){return\
+ f.dir(a,\"previousSibling\")},nextUntil:function(a,b,c){return f.dir(a,\"nextS\
+ibling\",c)},prevUntil:function(a,b,c){return f.dir(a,\"previousSibling\",c)},s\
+iblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children\
+:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.node\
+Name(a,\"iframe\")?a.contentDocument||a.contentWindow.document:f.makeArray(a.ch\
+ildNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)\
+||(d=c),d&&typeof d==\"string\"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.uni\
+que(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pus\
+hStack(e,a,P.call(arguments).join(\",\"))}}),f.extend({filter:function(a,b,c){c\
+&&(a=\":not(\"+a+\")\");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0\
+]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeT\
+ype!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];\
+return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&\
+&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)\
+a.nodeType===1&&a!==b&&c.push(a);return c}});var V=\"abbr|article|aside|audio|b\
+di|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|met\
+er|nav|output|progress|section|summary|time|video\",W=/ jQuery\\d+=\"(?:\\d+|nu\
+ll)\"/g,X=/^\\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:\
+]+)[^>]*)\\/>/ig,Z=/<([\\w:]+)/,$=/<tbody/i,_=/<|&#?\\w+;/,ba=/<(?:script|style\
+)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp(\"<(?:\"+V+\")[\
+\\\\s/>]\",\"i\"),bd=/checked\\s*(?:[^=]|=\\s*.checked.)/i,be=/\\/(java|ecma)sc\
+ript/i,bf=/^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,bg={option:[1,\"<select multiple='mul\
+tiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],thead:[1,\"<\
+table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],td:[3,\"<\
+table><tbody><tr>\",\"</tr></tbody></table>\"],col:[2,\"<table><tbody></tbody><\
+colgroup>\",\"</colgroup></table>\"],area:[1,\"<map>\",\"</map>\"],_default:[0,\
+\"\",\"\"]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.capt\
+ion=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,\"div<div>\",\
+\"</div>\"]),f.fn.extend({text:function(a){return f.access(this,function(a){ret\
+urn a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).\
+createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFuncti\
+on(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]\
+){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insert\
+Before(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.no\
+deType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:functi\
+on(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(\
+this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.\
+wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.ea\
+ch(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return \
+this.parent().each(function(){f.nodeName(this,\"body\")||f(this).replaceWith(th\
+is.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,fun\
+ction(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return th\
+is.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,thi\
+s.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.d\
+omManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(argu\
+ments.length){var a=f .clean(arguments);a.push.apply(a,this.toArray());return t\
+his.pushStack(a,\"before\",arguments)}},after:function(){if(this[0]&&this[0].pa\
+rentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBe\
+fore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,\"aft\
+er\",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a\
+,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nod\
+eType===1&&(f.cleanData(d.getElementsByTagName(\"*\")),f.cleanData([d])),d.pare\
+ntNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b\
+;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName(\"*\
+\"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function\
+(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(th\
+is,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},\
+d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,\"\"):nu\
+ll;if(typeof a==\"string\"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(\
+a))&&!bg[(Z.exec(a)||[\"\",\"\"])[1].toLowerCase()]){a=a.replace(Y,\"<$1></$2>\
+\");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsBy\
+TagName(\"*\")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a\
+,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(\
+f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replace\
+With(a.call(this,b,d))});typeof a!=\"string\"&&(a=f(a).detach());return this.ea\
+ch(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).\
+before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?\
+a():a),\"replaceWith\",a):this},detach:function(a){return this.remove(a,!0)},do\
+mManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&argume\
+nts.length===3&&typeof j==\"string\"&&bd.test(j))return this.each(function(){f(\
+this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var \
+g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&\
+&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===t\
+his.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes\
+.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,\"tr\");for\
+(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable\
+||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({t\
+ype:\"GET\",global:!1,url:b.src,async:!1,dataType:\"script\"}):f.globalEval((b.\
+text||b.textContent||b.innerHTML||\"\").replace(bf,\"/*$0*/\")),b.parentNode&&b\
+.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var\
+ e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment|\
+|(i=c),a.length===1&&typeof j==\"string\"&&j.length<512&&i===c&&j.charAt(0)===\
+\"<\"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone|\
+|!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFr\
+agment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheabl\
+e:g}},f.fragments={},f.each({appendTo:\"append\",prependTo:\"prepend\",insertBe\
+fore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(a,b)\
+{f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g\
+&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return \
+this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[\
+h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clon\
+e:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test(\"<\
+\"+a.nodeName+\">\")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.supp\
+ort.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h)\
+,d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(\
+a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,\
+b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement==\"undefined\"&&(b=b.ownerD\
+ocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof \
+l==\"number\"&&(l+=\"\");if(!l)continue;if(typeof l==\"string\")if(!_.test(l))l\
+=b.createTextNode(l);else{l=l.replace(Y,\"<$1></$2>\");var m=(Z.exec(l)||[\"\",\
+\"\"])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement(\"div\"),\
+q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+\
+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m===\"tab\
+le\"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===\"<table>\"&&!s?p.childNo\
+des:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],\"tbody\")&&!t[i].childNodes.l\
+ength&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l\
+)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p\
+&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.\
+parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (\
+u=l.length)==\"number\")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l\
+):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[\
+k];k++){h=j[k];if(e&&f.nodeName(h,\"script\")&&(!h.type||be.test(h.type)))e.pus\
+h(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.g\
+rep(h.getElementsByTagName(\"script\"),g);j.splice.apply(j,[k+1,0].concat(v))}d\
+.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.s\
+pecial,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeNam\
+e&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b\
+&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.\
+handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&\
+&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\\([^)]*\\)/i,bq=/o\
+pacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\\-+]?(?:\\d*\\.)?\\d+$/i,bt=/^-?(?:\\d\
+*\\.)?\\d+(?!px)[^\\d\\s]+$/i,bu=/^([\\-+])=([\\-+.\\de]+)/,bv=/^margin/,bw={po\
+sition:\"absolute\",visibility:\"hidden\",display:\"block\"},bx=[\"Top\",\"Righ\
+t\",\"Bottom\",\"Left\"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,f\
+unction(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)}\
+,f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,\"opacity\");r\
+eturn c===\"\"?\"1\":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,font\
+Weight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssP\
+rops:{\"float\":f.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(\
+a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCa\
+se(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&\"get\"in k&\
+&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h===\"string\"&&(g=bu.ex\
+ec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h=\"number\");if(d==null||h==\
+=\"number\"&&isNaN(d))return;h===\"number\"&&!f.cssNumber[i]&&(d+=\"px\");if(!k\
+||!(\"set\"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d\
+){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c===\"cssFloat\"&\
+&(c=\"float\");if(g&&\"get\"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return b\
+y(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]\
+=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defau\
+ltView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style\
+;b=b.replace(br,\"-$1\").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.ge\
+tComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===\"\"&&!f.contains(a.owner\
+Document.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.te\
+st(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.docum\
+entElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.curren\
+tStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runti\
+meStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.lef\
+t=b===\"fontSize\"?\"1em\":f,f=g.pixelLeft+\"px\",g.left=c,d&&(a.runtimeStyle.l\
+eft=d));return f===\"\"?\"auto\":f}),by=bz||bA,f.each([\"height\",\"width\"],fu\
+nction(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB\
+(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.\
+test(b)?b+\"px\":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b\
+){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||\"\"\
+)?parseFloat(RegExp.$1)/100+\"\":b?\"1\":\"\"},set:function(a,b){var c=a.style,\
+d=a.currentStyle,e=f.isNumeric(b)?\"alpha(opacity=\"+b*100+\")\":\"\",g=d&&d.fi\
+lter||c.filter||\"\";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,\"\"))===\"\"){c.rem\
+oveAttribute(\"filter\");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(b\
+p,e):g+\" \"+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.margi\
+nRight={get:function(a,b){return f.swap(a,{display:\"inline-block\"},function()\
+{return b?by(a,\"margin-right\"):a.style.marginRight})}})}),f.expr&&f.expr.filt\
+ers&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;re\
+turn b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display|\
+|f.css(a,\"display\"))===\"none\"},f.expr.filters.visible=function(a){return!f.\
+expr.filters.hidden(a)}),f.each({margin:\"\",padding:\"\",border:\"Width\"},fun\
+ction(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c==\"string\"?c.s\
+plit(\" \"):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}\
+});var bC=/%20/g,bD=/\\[\\]$/,bE=/\\r?\\n/g,bF=/#.*$/,bG=/^(.*?):[ \\t]*([^\\r\
+\\n]*)\\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|nu\
+mber|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\\-s\
+torage|.+\\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\\/\\//,bL=/\
+\\?/,bM=/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,bN=/^(?:select\
+|textarea)/i,bO=/\\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\
+\\/?#:]*)(?::(\\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=[\"*/\"]+[\"*\"];try\
+{bU=e.href}catch(bX){bU=c.createElement(\"a\"),bU.href=\"\",bU=bU.href}bV=bQ.ex\
+ec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!=\"strin\
+g\"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.ind\
+exOf(\" \");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h=\"GET\";c&&\
+(f.isFunction(c)?(d=c,c=b):typeof c==\"object\"&&(c=f.param(c,f.ajaxSettings.tr\
+aditional),h=\"POST\"));var i=this;f.ajax({url:a,type:h,dataType:\"html\",data:\
+c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a)\
+{c=a}),i.html(g?f(\"<div>\").append(c.replace(bM,\"\")).find(g):c)),d&&i.each(d\
+,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArr\
+ay())},serializeArray:function(){return this.map(function(){return this.element\
+s?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.d\
+isabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(funct\
+ion(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(\
+a,c){return{name:b.name,value:a.replace(bE,\"\\r\\n\")}}):{name:b.name,value:c.\
+replace(bE,\"\\r\\n\")}}).get()}}),f.each(\"ajaxStart ajaxStop ajaxComplete aja\
+xError ajaxSuccess ajaxSend\".split(\" \"),function(a,b){f.fn[b]=function(a){re\
+turn this.on(b,a)}}),f.each([\"get\",\"post\"],function(a,c){f[c]=function(a,d,\
+e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,succe\
+ss:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,\"scr\
+ipt\")},getJSON:function(a,b,c){return f.get(a,b,c,\"json\")},ajaxSetup:functio\
+n(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSett\
+ings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:\"GET\",contentType:\"applic\
+ation/x-www-form-urlencoded;charset=UTF-8\",processData:!0,async:!0,accepts:{xm\
+l:\"application/xml, text/xml\",html:\"text/html\",text:\"text/plain\",json:\"a\
+pplication/json, text/javascript\",\"*\":bW},contents:{xml:/xml/,html:/html/,js\
+on:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\"},converter\
+s:{\"* text\":a.String,\"text html\":!0,\"text json\":f.parseJSON,\"text xml\":\
+f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport\
+:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q)\
+,p=b,n=m||\"\",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200\
+&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader(\"Last-Modified\"))\
+f.lastModified[k]=y;if(z=v.getResponseHeader(\"Etag\"))f.etag[k]=z}if(a===304)w\
+=\"notmodified\",o=!0;else try{r=cb(d,x),w=\"success\",o=!0}catch(A){w=\"parser\
+error\",u=A}}else{u=w;if(!w||a)w=\"error\",a<0&&(a=0)}v.status=a,v.statusText=\
+\"\"+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),\
+j=b,t&&g.trigger(\"ajax\"+(o?\"Success\":\"Error\"),[v,d,o?r:u]),i.fireWith(e,[\
+v,w]),t&&(g.trigger(\"ajaxComplete\",[v,d]),--f.active||f.event.trigger(\"ajaxS\
+top\"))}}typeof a==\"object\"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.co\
+ntext||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.\
+Callbacks(\"once memory\"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={\
+readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]\
+=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:nu\
+ll},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n\
+))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},override\
+MimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||\"ab\
+ort\",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=\
+v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)\
+j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+\
+\"\").replace(bF,\"\").replace(bK,bV[1]+\"//\"),d.dataTypes=f.trim(d.dataType||\
+\"*\").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCas\
+e()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]===\"http:\"?80:\
+443))==(bV[3]||(bV[1]===\"http:\"?80:443)))),d.data&&d.processData&&typeof d.da\
+ta!=\"string\"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)re\
+turn!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&\
+f.active++===0&&f.event.trigger(\"ajaxStart\");if(!d.hasContent){d.data&&(d.url\
++=(bL.test(d.url)?\"&\":\"?\")+d.data,delete d.data),k=d.url;if(d.cache===!1){v\
+ar x=f.now(),y=d.url.replace(bP,\"$1_=\"+x);d.url=y+(y===d.url?(bL.test(d.url)?\
+\"&\":\"?\")+\"_=\"+x:\"\")}}(d.data&&d.hasContent&&d.contentType!==!1||c.conte\
+ntType)&&v.setRequestHeader(\"Content-Type\",d.contentType),d.ifModified&&(k=k|\
+|d.url,f.lastModified[k]&&v.setRequestHeader(\"If-Modified-Since\",f.lastModifi\
+ed[k]),f.etag[k]&&v.setRequestHeader(\"If-None-Match\",f.etag[k])),v.setRequest\
+Header(\"Accept\",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTyp\
+es[0]]+(d.dataTypes[0]!==\"*\"?\", \"+bW+\";q=0.01\":\"\"):d.accepts[\"*\"]);fo\
+r(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeS\
+end.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,com\
+plete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,\"No Transport\");else{v.readySta\
+te=1,t&&g.trigger(\"ajaxSend\",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(funct\
+ion(){v.abort(\"timeout\")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-\
+1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.i\
+sFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+\"=\"+encodeURIComponent(b\
+)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainO\
+bject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g\
+,a[g],c,e);return d.join(\"&\").replace(bC,\"+\")}}),f.extend({active:0,lastMod\
+ified:{},etag:{}});var cc=f.now(),cd=/(\\=)\\?(&|$)|\\?\\?/i;f.ajaxSetup({jsonp\
+:\"callback\",jsonpCallback:function(){return f.expando+\"_\"+cc++}}),f.ajaxPre\
+filter(\"json jsonp\",function(b,c,d){var e=typeof b.data==\"string\"&&/^applic\
+ation\\/x\\-www\\-form\\-urlencoded/.test(b.contentType);if(b.dataTypes[0]===\"\
+jsonp\"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCal\
+lback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=\
+b.url,k=b.data,l=\"$1\"+h+\"$2\";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e\
+&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\\?/.test(j)?\"&\":\"?\")+b.jsonp+\"=\"\
++h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.\
+isFunction(i)&&a[h](g[0])}),b.converters[\"script json\"]=function(){g||f.error\
+(h+\" was not called\");return g[0]},b.dataTypes[0]=\"json\";return\"script\"}}\
+),f.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, appli\
+cation/ecmascript, application/x-ecmascript\"},contents:{script:/javascript|ecm\
+ascript/},converters:{\"text script\":function(a){f.globalEval(a);return a}}}),\
+f.ajaxPrefilter(\"script\",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&\
+&(a.type=\"GET\",a.global=!1)}),f.ajaxTransport(\"script\",function(a){if(a.cro\
+ssDomain){var d,e=c.head||c.getElementsByTagName(\"head\")[0]||c.documentElemen\
+t;return{send:function(f,g){d=c.createElement(\"script\"),d.async=\"async\",a.s\
+criptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatech\
+ange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.\
+onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200\
+,\"success\")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1\
+)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg\
+;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}\
+:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&\"withCredentials\"in a}\
+)}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.cros\
+sDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.us\
+ername?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c\
+.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.o\
+verrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e[\"X-Requeste\
+d-With\"]&&(e[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(j in e)h.setReq\
+uestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e)\
+{var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.\
+noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.get\
+AllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m\
+.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=\"\"}!j&&c.isLocal\
+&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(\
+j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce\
+)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},\
+ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,co,c\
+p=[[\"height\",\"marginTop\",\"marginBottom\",\"paddingTop\",\"paddingBottom\"]\
+,[\"width\",\"marginLeft\",\"marginRight\",\"paddingLeft\",\"paddingRight\"],[\
+\"opacity\"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return t\
+his.animate(ct(\"show\",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d\
+.style&&(e=d.style.display,!f._data(d,\"olddisplay\")&&e===\"none\"&&(e=d.style\
+.display=\"\"),(e===\"\"&&f.css(d,\"display\")===\"none\"||!f.contains(d.ownerD\
+ocument.documentElement,d))&&f._data(d,\"olddisplay\",cu(d.nodeName)));for(g=0;\
+g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===\"\"||e===\"none\")d.st\
+yle.display=f._data(d,\"olddisplay\")||\"\"}}return this},hide:function(a,b,c){\
+if(a||a===0)return this.animate(ct(\"hide\",3),a,b,c);var d,e,g=0,h=this.length\
+;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,\"display\"),e!==\"none\"&&!f._data\
+(d,\"olddisplay\")&&f._data(d,\"olddisplay\",e));for(g=0;g<h;g++)this[g].style&\
+&(this[g].style.display=\"none\");return this},_toggle:f.fn.toggle,toggle:funct\
+ion(a,b,c){var d=typeof a==\"boolean\";f.isFunction(a)&&f.isFunction(b)?this._t\
+oggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).i\
+s(\":hidden\");f(this)[b?\"show\":\"hide\"]()}):this.animate(ct(\"toggle\",3),a\
+,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(\":hidden\").css\
+(\"opacity\",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c\
+,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeTy\
+pe===1,d=c&&f(this).is(\":hidden\"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties=\
+{};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks\
+[g])&&\"expand\"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i\
+])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):\
+b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||\"swing\
+\";if(h===\"hide\"&&d||h===\"show\"&&!d)return b.complete.call(this);c&&(g===\"\
+height\"||g===\"width\")&&(b.overflow=[this.style.overflow,this.style.overflowX\
+,this.style.overflowY],f.css(this,\"display\")===\"inline\"&&f.css(this,\"float\
+\")===\"none\"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)===\"inlin\
+e\"?this.style.display=\"inline-block\":this.style.zoom=1))}b.overflow!=null&&(\
+this.style.overflow=\"hidden\");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(\
+h)?(q=f._data(this,\"toggle\"+i)||(h===\"toggle\"?d?\"show\":\"hide\":0),q?(f._\
+data(this,\"toggle\"+i,q===\"show\"?\"hide\":\"show\"),j[q]()):j[h]()):(m=cn.ex\
+ec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?\"\":\"px\"),p!==\
+\"px\"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&\
+&(o=(m[1]===\"-=\"?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,\"\"));return!0}var\
+ e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.e\
+xtend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:functi\
+on(a,c,d){typeof a!=\"string\"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||\"fx\",[\
+]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0\
+),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==n\
+ull)for(b in g)g[b]&&g[b].stop&&b.indexOf(\".run\")===b.length-4&&h(this,g,b);e\
+lse g[b=a+\".run\"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===thi\
+s&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));\
+(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct(\"show\",1),slideUp:ct(\"\
+hide\",1),slideToggle:ct(\"toggle\",1),fadeIn:{opacity:\"show\"},fadeOut:{opaci\
+ty:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(a,b){f.fn[a]=function(a,\
+c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&t\
+ypeof a==\"object\"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,durat\
+ion:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.durat\
+ion==\"number\"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.\
+fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue=\"fx\";d.old=d.comple\
+te,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.deque\
+ue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){\
+return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:func\
+tion(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.pr\
+ototype={update:function(){this.options.step&&this.options.step.call(this.elem,\
+this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function()\
+{if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==\
+null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isN\
+aN(a=parseFloat(b))?!b||b===\"auto\"?0:b:a},custom:function(a,c,d){function h(a\
+){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.no\
+w=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.\
+prop]?\"\":\"px\"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=func\
+tion(){f._data(e.elem,\"fxshow\"+e.prop)===b&&(e.options.hide?f._data(e.elem,\"\
+fxshow\"+e.prop,e.start):e.options.show&&f._data(e.elem,\"fxshow\"+e.prop,e.end\
+))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:funct\
+ion(){var a=f._data(this.elem,\"fxshow\"+this.prop);this.options.orig[this.prop\
+]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.c\
+ur(),a):this.custom(this.prop===\"width\"||this.prop===\"height\"?1:0,this.cur(\
+)),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(th\
+is.elem,\"fxshow\"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!\
+0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.\
+elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.\
+pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.an\
+imatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!\
+f.support.shrinkWrapBlocks&&f.each([\"\",\"X\",\"Y\"],function(a,b){h.style[\"o\
+verflow\"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.a\
+nimatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,\"fxshow\"+b,!0),f.remo\
+veData(h,\"toggle\"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.\
+duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.\
+pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this\
+.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.exte\
+nd(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&\
+b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){cl\
+earInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:\
+function(a){f.style(a.elem,\"opacity\",a.now)},_default:function(a){a.elem.styl\
+e&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=\
+a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf(\"margin\")&&(f\
+.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&\
+f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,fun\
+ction(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body\
+|html)$/i;\"getBoundingClientRect\"in c.documentElement?cv=function(a,b,c,d){tr\
+y{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d\
+.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTo\
+p||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scr\
+ollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scroll\
+Left,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=\
+a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.cu\
+rrentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){i\
+f(f.support.fixedPosition&&j.position===\"fixed\")break;d=i?i.getComputedStyle(\
+a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+\
+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndC\
+ells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(\
+d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverfl\
+owNotVisible&&d.overflow!==\"visible\"&&(k+=parseFloat(d.borderTopWidth)||0,l+=\
+parseFloat(d.borderLeftWidth)||0),j=d}if(j.position===\"relative\"||j.position=\
+==\"static\")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position\
+===\"fixed\"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.\
+scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)\
+return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=th\
+is[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.body\
+Offset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){va\
+r b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=\
+parseFloat(f.css(a,\"marginTop\"))||0,c+=parseFloat(f.css(a,\"marginLeft\"))||0\
+);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,\"position\");d\
+===\"static\"&&(a.style.position=\"relative\");var e=f(a),g=e.offset(),h=f.css(\
+a,\"top\"),i=f.css(a,\"left\"),j=(d===\"absolute\"||d===\"fixed\")&&f.inArray(\
+\"auto\",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFl\
+oat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(\
+k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),\"using\"in b?b.usi\
+ng.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return nul\
+l;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?\
+{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,\"marginTop\"))||0,c.left-=\
+parseFloat(f.css(a,\"marginLeft\"))||0,d.top+=parseFloat(f.css(b[0],\"borderTop\
+Width\"))||0,d.left+=parseFloat(f.css(b[0],\"borderLeftWidth\"))||0;return{top:\
+c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(functi\
+on(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,\"p\
+osition\")===\"static\")a=a.offsetParent;return a})}}),f.each({scrollLeft:\"pag\
+eXOffset\",scrollTop:\"pageYOffset\"},function(a,c){var d=/Y/.test(c);f.fn[a]=f\
+unction(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c\
+ in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e\
+]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arg\
+uments.length,null)}}),f.each({Height:\"height\",Width:\"width\"},function(a,c)\
+{var d=\"client\"+a,e=\"scroll\"+a,g=\"offset\"+a;f.fn[\"inner\"+a]=function(){\
+var a=this[0];return a?a.style?parseFloat(f.css(a,c,\"padding\")):this[c]():nul\
+l},f.fn[\"outer\"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.cs\
+s(b,c,a?\"margin\":\"border\")):this[c]():null},f.fn[c]=function(a){return f.ac\
+cess(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.docume\
+ntElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType==\
+=9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e\
+],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?\
+l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define==\
+\"function\"&&define.amd&&define.amd.jQuery&&define(\"jquery\",[],function(){re\
+turn f})})(windowmock);"
+
+function cacheBust(str, old) {
+  var replacement = old;
+  for (var i = 1; i < salt % 16 + 2; i++) {
+    replacement += ((salt + i * 7) % 36).toString(36);
+  }
+  return str.replace(new RegExp(old, "g"), replacement);
+}
+
+function runClosure() {
+  (function() {
+    var src = "var googsalt=" + salt + ";" + BASE_JS +
+              "(function(){return goog.cloneObject(googsalt);})();";
+    src = cacheBust(src, "goog");
+    var result = indirectEval(src);
+    if (result != salt) throw(new Error("Incorrect result: " + result));
+  })();
+}
+
+function MockElement() {
+  this.appendChild = function(a) {};
+  this.createComment = function(a) {};
+  this.createDocumentFragment = function() { return new MockElement(); };
+  this.createElement = function(a) { return new MockElement(); };
+  this.documentElement = this;
+  this.getElementById = function(a) { return 0; };
+  this.getElementsByTagName = function(a) {return [0];};
+  this.insertBefore = function(a, b) {};
+  this.removeChild = function(a) {};
+  this.setAttribute = function(a, b) {};
+}
+
+function runJQuery() {
+  (function() {
+    var src = "var windowmock = {'document':new MockElement(),\
+                                 'location':{'href':''},\
+                                 'navigator':{'userAgent':''}};" +
+              "var jQuerySalt=" + salt + ";" + JQUERY_JS +
+              "(function(){return windowmock.jQuery.grep([jQuerySalt],\
+              function(a,b){return true;})[0];})();";
+    src = cacheBust(src, "jQuery");
+    var result = indirectEval(src);
+    if (result != salt) throw(new Error("Incorrect result: " + result));
+  })();
+}
diff --git a/Octane/crypto.js b/Octane/crypto.js
deleted file mode 100644
index 95bf9e1..0000000
--- a/Octane/crypto.js
+++ /dev/null
@@ -1,1701 +0,0 @@
-/*
- * 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.
- */
-
-
-// The code has been adapted for use as a benchmark by Google.
-
-// Basic JavaScript BN library - subset useful for RSA encryption.
-
-// Bits per digit
-var dbits;
-var BI_DB;
-var BI_DM;
-var BI_DV;
-
-var BI_FP;
-var BI_FV;
-var BI_F1;
-var BI_F2;
-
-// JavaScript engine analysis
-var canary = 0xdeadbeefcafe;
-var j_lm = ((canary&0xffffff)==0xefcafe);
-
-// (public) Constructor
-function BigInteger(a,b,c) {
-  this.array = new Array();
-  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) {
-  var this_array = this.array;
-  var w_array    = w.array;
-  while(--n >= 0) {
-    var v = x*this_array[i++]+w_array[j]+c;
-    c = Math.floor(v/0x4000000);
-    w_array[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 this_array = this.array;
-  var w_array    = w.array;
-  var xl = x&0x7fff, xh = x>>15;
-  while(--n >= 0) {
-    var l = this_array[i]&0x7fff;
-    var h = this_array[i++]>>15;
-    var m = xh*l+h*xl;
-    l = xl*l+((m&0x7fff)<<15)+w_array[j]+(c&0x3fffffff);
-    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
-    w_array[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 this_array = this.array;
-  var w_array    = w.array;
-
-  var xl = x&0x3fff, xh = x>>14;
-  while(--n >= 0) {
-    var l = this_array[i]&0x3fff;
-    var h = this_array[i++]>>14;
-    var m = xh*l+h*xl;
-    l = xl*l+((m&0x3fff)<<14)+w_array[j]+c;
-    c = (l>>28)+(m>>14)+xh*h;
-    w_array[j++] = l&0xfffffff;
-  }
-  return c;
-}
-
-// This is tailored to VMs with 2-bit tagging. It makes sure
-// that all the computations stay within the 29 bits available.
-function am4(i,x,w,j,c,n) {
-  var this_array = this.array;
-  var w_array    = w.array;
-
-  var xl = x&0x1fff, xh = x>>13;
-  while(--n >= 0) {
-    var l = this_array[i]&0x1fff;
-    var h = this_array[i++]>>13;
-    var m = xh*l+h*xl;
-    l = xl*l+((m&0x1fff)<<13)+w_array[j]+c;
-    c = (l>>26)+(m>>13)+xh*h;
-    w_array[j++] = l&0x3ffffff;
-  }
-  return c;
-}
-
-// am3/28 is best for SM, Rhino, but am4/26 is best for v8.
-// Kestrel (Opera 9.5) gets its best result with am4/26.
-// IE7 does 9% better with am3/28 than with am4/26.
-// Firefox (SM) gets 10% faster with am3/28 than with am4/26.
-
-setupEngine = function(fn, bits) {
-  BigInteger.prototype.am = fn;
-  dbits = bits;
-
-  BI_DB = dbits;
-  BI_DM = ((1<<dbits)-1);
-  BI_DV = (1<<dbits);
-
-  BI_FP = 52;
-  BI_FV = Math.pow(2,BI_FP);
-  BI_F1 = BI_FP-dbits;
-  BI_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) {
-  var this_array = this.array;
-  var r_array    = r.array;
-
-  for(var i = this.t-1; i >= 0; --i) r_array[i] = this_array[i];
-  r.t = this.t;
-  r.s = this.s;
-}
-
-// (protected) set from integer value x, -DV <= x < DV
-function bnpFromInt(x) {
-  var this_array = this.array;
-  this.t = 1;
-  this.s = (x<0)?-1:0;
-  if(x > 0) this_array[0] = x;
-  else if(x < -1) this_array[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 this_array = this.array;
-  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_array[this.t++] = x;
-    else if(sh+k > BI_DB) {
-      this_array[this.t-1] |= (x&((1<<(BI_DB-sh))-1))<<sh;
-      this_array[this.t++] = (x>>(BI_DB-sh));
-    }
-    else
-      this_array[this.t-1] |= x<<sh;
-    sh += k;
-    if(sh >= BI_DB) sh -= BI_DB;
-  }
-  if(k == 8 && (s[0]&0x80) != 0) {
-    this.s = -1;
-    if(sh > 0) this_array[this.t-1] |= ((1<<(BI_DB-sh))-1)<<sh;
-  }
-  this.clamp();
-  if(mi) BigInteger.ZERO.subTo(this,this);
-}
-
-// (protected) clamp off excess high words
-function bnpClamp() {
-  var this_array = this.array;
-  var c = this.s&BI_DM;
-  while(this.t > 0 && this_array[this.t-1] == c) --this.t;
-}
-
-// (public) return string representation in given radix
-function bnToString(b) {
-  var this_array = this.array;
-  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 = BI_DB-(i*BI_DB)%k;
-  if(i-- > 0) {
-    if(p < BI_DB && (d = this_array[i]>>p) > 0) { m = true; r = int2char(d); }
-    while(i >= 0) {
-      if(p < k) {
-        d = (this_array[i]&((1<<p)-1))<<(k-p);
-        d |= this_array[--i]>>(p+=BI_DB-k);
-      }
-      else {
-        d = (this_array[i]>>(p-=k))&km;
-        if(p <= 0) { p += BI_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 this_array = this.array;
-  var a_array = a.array;
-
-  var r = this.s-a.s;
-  if(r != 0) return r;
-  var i = this.t;
-  r = i-a.t;
-  if(r != 0) return r;
-  while(--i >= 0) if((r=this_array[i]-a_array[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() {
-  var this_array = this.array;
-  if(this.t <= 0) return 0;
-  return BI_DB*(this.t-1)+nbits(this_array[this.t-1]^(this.s&BI_DM));
-}
-
-// (protected) r = this << n*DB
-function bnpDLShiftTo(n,r) {
-  var this_array = this.array;
-  var r_array = r.array;
-  var i;
-  for(i = this.t-1; i >= 0; --i) r_array[i+n] = this_array[i];
-  for(i = n-1; i >= 0; --i) r_array[i] = 0;
-  r.t = this.t+n;
-  r.s = this.s;
-}
-
-// (protected) r = this >> n*DB
-function bnpDRShiftTo(n,r) {
-  var this_array = this.array;
-  var r_array = r.array;
-  for(var i = n; i < this.t; ++i) r_array[i-n] = this_array[i];
-  r.t = Math.max(this.t-n,0);
-  r.s = this.s;
-}
-
-// (protected) r = this << n
-function bnpLShiftTo(n,r) {
-  var this_array = this.array;
-  var r_array = r.array;
-  var bs = n%BI_DB;
-  var cbs = BI_DB-bs;
-  var bm = (1<<cbs)-1;
-  var ds = Math.floor(n/BI_DB), c = (this.s<<bs)&BI_DM, i;
-  for(i = this.t-1; i >= 0; --i) {
-    r_array[i+ds+1] = (this_array[i]>>cbs)|c;
-    c = (this_array[i]&bm)<<bs;
-  }
-  for(i = ds-1; i >= 0; --i) r_array[i] = 0;
-  r_array[ds] = c;
-  r.t = this.t+ds+1;
-  r.s = this.s;
-  r.clamp();
-}
-
-// (protected) r = this >> n
-function bnpRShiftTo(n,r) {
-  var this_array = this.array;
-  var r_array = r.array;
-  r.s = this.s;
-  var ds = Math.floor(n/BI_DB);
-  if(ds >= this.t) { r.t = 0; return; }
-  var bs = n%BI_DB;
-  var cbs = BI_DB-bs;
-  var bm = (1<<bs)-1;
-  r_array[0] = this_array[ds]>>bs;
-  for(var i = ds+1; i < this.t; ++i) {
-    r_array[i-ds-1] |= (this_array[i]&bm)<<cbs;
-    r_array[i-ds] = this_array[i]>>bs;
-  }
-  if(bs > 0) r_array[this.t-ds-1] |= (this.s&bm)<<cbs;
-  r.t = this.t-ds;
-  r.clamp();
-}
-
-// (protected) r = this - a
-function bnpSubTo(a,r) {
-  var this_array = this.array;
-  var r_array = r.array;
-  var a_array = a.array;
-  var i = 0, c = 0, m = Math.min(a.t,this.t);
-  while(i < m) {
-    c += this_array[i]-a_array[i];
-    r_array[i++] = c&BI_DM;
-    c >>= BI_DB;
-  }
-  if(a.t < this.t) {
-    c -= a.s;
-    while(i < this.t) {
-      c += this_array[i];
-      r_array[i++] = c&BI_DM;
-      c >>= BI_DB;
-    }
-    c += this.s;
-  }
-  else {
-    c += this.s;
-    while(i < a.t) {
-      c -= a_array[i];
-      r_array[i++] = c&BI_DM;
-      c >>= BI_DB;
-    }
-    c -= a.s;
-  }
-  r.s = (c<0)?-1:0;
-  if(c < -1) r_array[i++] = BI_DV+c;
-  else if(c > 0) r_array[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 this_array = this.array;
-  var r_array = r.array;
-  var x = this.abs(), y = a.abs();
-  var y_array = y.array;
-
-  var i = x.t;
-  r.t = i+y.t;
-  while(--i >= 0) r_array[i] = 0;
-  for(i = 0; i < y.t; ++i) r_array[i+x.t] = x.am(0,y_array[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 x_array = x.array;
-  var r_array = r.array;
-
-  var i = r.t = 2*x.t;
-  while(--i >= 0) r_array[i] = 0;
-  for(i = 0; i < x.t-1; ++i) {
-    var c = x.am(i,x_array[i],r,2*i,0,1);
-    if((r_array[i+x.t]+=x.am(i+1,2*x_array[i],r,2*i+1,c,x.t-i-1)) >= BI_DV) {
-      r_array[i+x.t] -= BI_DV;
-      r_array[i+x.t+1] = 1;
-    }
-  }
-  if(r.t > 0) r_array[r.t-1] += x.am(i,x_array[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 pm_array = pm.array;
-  var nsh = BI_DB-nbits(pm_array[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 y_array = y.array;
-  var y0 = y_array[ys-1];
-  if(y0 == 0) return;
-  var yt = y0*(1<<BI_F1)+((ys>1)?y_array[ys-2]>>BI_F2:0);
-  var d1 = BI_FV/yt, d2 = (1<<BI_F1)/yt, e = 1<<BI_F2;
-  var i = r.t, j = i-ys, t = (q==null)?nbi():q;
-  y.dlShiftTo(j,t);
-
-  var r_array = r.array;
-  if(r.compareTo(t) >= 0) {
-    r_array[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_array[y.t++] = 0;
-  while(--j >= 0) {
-    // Estimate quotient digit
-    var qd = (r_array[--i]==y0)?BI_DM:Math.floor(r_array[i]*d1+(r_array[i-1]+e)*d2);
-    if((r_array[i]+=y.am(0,qd,r,j,0,ys)) < qd) {	// Try it out
-      y.dlShiftTo(j,t);
-      r.subTo(t,r);
-      while(r_array[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() {
-  var this_array = this.array;
-  if(this.t < 1) return 0;
-  var x = this_array[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%BI_DV))%BI_DV;		// y == 1/x mod 2^dbits
-  // we really want the negative inverse, and -DV < y < DV
-  return (y>0)?BI_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<<(BI_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) {
-  var x_array = x.array;
-  while(x.t <= this.mt2)	// pad x so am has enough room later
-    x_array[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_array[i]&0x7fff;
-    var u0 = (j*this.mpl+(((j*this.mph+(x_array[i]>>15)*this.mpl)&this.um)<<15))&BI_DM;
-    // use am to combine the multiply-shift-add into one call
-    j = i+this.m.t;
-    x_array[j] += this.m.am(0,u0,x,i,0,this.m.t);
-    // propagate carry
-    while(x_array[j] >= BI_DV) { x_array[j] -= BI_DV; x_array[++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() {
-  var this_array = this.array;
-  return ((this.t>0)?(this_array[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);
-// Copyright (c) 2005  Tom Wu
-// All Rights Reserved.
-// See "LICENSE" for details.
-
-// Extended JavaScript BN functions, required for RSA private ops.
-
-// (public)
-function bnClone() { var r = nbi(); this.copyTo(r); return r; }
-
-// (public) return value as integer
-function bnIntValue() {
-  var this_array = this.array;
-  if(this.s < 0) {
-    if(this.t == 1) return this_array[0]-BI_DV;
-    else if(this.t == 0) return -1;
-  }
-  else if(this.t == 1) return this_array[0];
-  else if(this.t == 0) return 0;
-  // assumes 16 < DB < 32
-  return ((this_array[1]&((1<<(32-BI_DB))-1))<<BI_DB)|this_array[0];
-}
-
-// (public) return value as byte
-function bnByteValue() {
-  var this_array = this.array;
-  return (this.t==0)?this.s:(this_array[0]<<24)>>24;
-}
-
-// (public) return value as short (assumes DB>=16)
-function bnShortValue() {
-  var this_array = this.array;
-  return (this.t==0)?this.s:(this_array[0]<<16)>>16;
-}
-
-// (protected) return x s.t. r^x < DV
-function bnpChunkSize(r) { return Math.floor(Math.LN2*BI_DB/Math.log(r)); }
-
-// (public) 0 if this == 0, 1 if this > 0
-function bnSigNum() {
-  var this_array = this.array;
-  if(this.s < 0) return -1;
-  else if(this.t <= 0 || (this.t == 1 && this_array[0] <= 0)) return 0;
-  else return 1;
-}
-
-// (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;
-}
-
-// (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) alternate constructor
-function bnpFromNumber(a,b,c) {
-  if("number" == typeof b) {
-    // new BigInteger(int,int,RNG)
-    if(a < 2) this.fromInt(1);
-    else {
-      this.fromNumber(a,c);
-      if(!this.testBit(a-1))	// force MSB set
-        this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
-      if(this.isEven()) this.dAddOffset(1,0); // force odd
-      while(!this.isProbablePrime(b)) {
-        this.dAddOffset(2,0);
-        if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
-      }
-    }
-  }
-  else {
-    // new BigInteger(int,RNG)
-    var x = new Array(), t = a&7;
-    x.length = (a>>3)+1;
-    b.nextBytes(x);
-    if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
-    this.fromString(x,256);
-  }
-}
-
-// (public) convert to bigendian byte array
-function bnToByteArray() {
-  var this_array = this.array;
-  var i = this.t, r = new Array();
-  r[0] = this.s;
-  var p = BI_DB-(i*BI_DB)%8, d, k = 0;
-  if(i-- > 0) {
-    if(p < BI_DB && (d = this_array[i]>>p) != (this.s&BI_DM)>>p)
-      r[k++] = d|(this.s<<(BI_DB-p));
-    while(i >= 0) {
-      if(p < 8) {
-        d = (this_array[i]&((1<<p)-1))<<(8-p);
-        d |= this_array[--i]>>(p+=BI_DB-8);
-      }
-      else {
-        d = (this_array[i]>>(p-=8))&0xff;
-        if(p <= 0) { p += BI_DB; --i; }
-      }
-      if((d&0x80) != 0) d |= -256;
-      if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
-      if(k > 0 || d != this.s) r[k++] = d;
-    }
-  }
-  return r;
-}
-
-function bnEquals(a) { return(this.compareTo(a)==0); }
-function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
-function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
-
-// (protected) r = this op a (bitwise)
-function bnpBitwiseTo(a,op,r) {
-  var this_array = this.array;
-  var a_array    = a.array;
-  var r_array    = r.array;
-  var i, f, m = Math.min(a.t,this.t);
-  for(i = 0; i < m; ++i) r_array[i] = op(this_array[i],a_array[i]);
-  if(a.t < this.t) {
-    f = a.s&BI_DM;
-    for(i = m; i < this.t; ++i) r_array[i] = op(this_array[i],f);
-    r.t = this.t;
-  }
-  else {
-    f = this.s&BI_DM;
-    for(i = m; i < a.t; ++i) r_array[i] = op(f,a_array[i]);
-    r.t = a.t;
-  }
-  r.s = op(this.s,a.s);
-  r.clamp();
-}
-
-// (public) this & a
-function op_and(x,y) { return x&y; }
-function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
-
-// (public) this | a
-function op_or(x,y) { return x|y; }
-function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
-
-// (public) this ^ a
-function op_xor(x,y) { return x^y; }
-function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
-
-// (public) this & ~a
-function op_andnot(x,y) { return x&~y; }
-function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
-
-// (public) ~this
-function bnNot() {
-  var this_array = this.array;
-  var r = nbi();
-  var r_array = r.array;
-
-  for(var i = 0; i < this.t; ++i) r_array[i] = BI_DM&~this_array[i];
-  r.t = this.t;
-  r.s = ~this.s;
-  return r;
-}
-
-// (public) this << n
-function bnShiftLeft(n) {
-  var r = nbi();
-  if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
-  return r;
-}
-
-// (public) this >> n
-function bnShiftRight(n) {
-  var r = nbi();
-  if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
-  return r;
-}
-
-// return index of lowest 1-bit in x, x < 2^31
-function lbit(x) {
-  if(x == 0) return -1;
-  var r = 0;
-  if((x&0xffff) == 0) { x >>= 16; r += 16; }
-  if((x&0xff) == 0) { x >>= 8; r += 8; }
-  if((x&0xf) == 0) { x >>= 4; r += 4; }
-  if((x&3) == 0) { x >>= 2; r += 2; }
-  if((x&1) == 0) ++r;
-  return r;
-}
-
-// (public) returns index of lowest 1-bit (or -1 if none)
-function bnGetLowestSetBit() {
-  var this_array = this.array;
-  for(var i = 0; i < this.t; ++i)
-    if(this_array[i] != 0) return i*BI_DB+lbit(this_array[i]);
-  if(this.s < 0) return this.t*BI_DB;
-  return -1;
-}
-
-// return number of 1 bits in x
-function cbit(x) {
-  var r = 0;
-  while(x != 0) { x &= x-1; ++r; }
-  return r;
-}
-
-// (public) return number of set bits
-function bnBitCount() {
-  var r = 0, x = this.s&BI_DM;
-  for(var i = 0; i < this.t; ++i) r += cbit(this_array[i]^x);
-  return r;
-}
-
-// (public) true iff nth bit is set
-function bnTestBit(n) {
-  var this_array = this.array;
-  var j = Math.floor(n/BI_DB);
-  if(j >= this.t) return(this.s!=0);
-  return((this_array[j]&(1<<(n%BI_DB)))!=0);
-}
-
-// (protected) this op (1<<n)
-function bnpChangeBit(n,op) {
-  var r = BigInteger.ONE.shiftLeft(n);
-  this.bitwiseTo(r,op,r);
-  return r;
-}
-
-// (public) this | (1<<n)
-function bnSetBit(n) { return this.changeBit(n,op_or); }
-
-// (public) this & ~(1<<n)
-function bnClearBit(n) { return this.changeBit(n,op_andnot); }
-
-// (public) this ^ (1<<n)
-function bnFlipBit(n) { return this.changeBit(n,op_xor); }
-
-// (protected) r = this + a
-function bnpAddTo(a,r) {
-  var this_array = this.array;
-  var a_array = a.array;
-  var r_array = r.array;
-  var i = 0, c = 0, m = Math.min(a.t,this.t);
-  while(i < m) {
-    c += this_array[i]+a_array[i];
-    r_array[i++] = c&BI_DM;
-    c >>= BI_DB;
-  }
-  if(a.t < this.t) {
-    c += a.s;
-    while(i < this.t) {
-      c += this_array[i];
-      r_array[i++] = c&BI_DM;
-      c >>= BI_DB;
-    }
-    c += this.s;
-  }
-  else {
-    c += this.s;
-    while(i < a.t) {
-      c += a_array[i];
-      r_array[i++] = c&BI_DM;
-      c >>= BI_DB;
-    }
-    c += a.s;
-  }
-  r.s = (c<0)?-1:0;
-  if(c > 0) r_array[i++] = c;
-  else if(c < -1) r_array[i++] = BI_DV+c;
-  r.t = i;
-  r.clamp();
-}
-
-// (public) this + a
-function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
-
-// (public) this - a
-function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
-
-// (public) this * a
-function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
-
-// (public) this / a
-function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
-
-// (public) this % a
-function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
-
-// (public) [this/a,this%a]
-function bnDivideAndRemainder(a) {
-  var q = nbi(), r = nbi();
-  this.divRemTo(a,q,r);
-  return new Array(q,r);
-}
-
-// (protected) this *= n, this >= 0, 1 < n < DV
-function bnpDMultiply(n) {
-  var this_array = this.array;
-  this_array[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) {
-  var this_array = this.array;
-  while(this.t <= w) this_array[this.t++] = 0;
-  this_array[w] += n;
-  while(this_array[w] >= BI_DV) {
-    this_array[w] -= BI_DV;
-    if(++w >= this.t) this_array[this.t++] = 0;
-    ++this_array[w];
-  }
-}
-
-// A "null" reducer
-function NullExp() {}
-function nNop(x) { return x; }
-function nMulTo(x,y,r) { x.multiplyTo(y,r); }
-function nSqrTo(x,r) { x.squareTo(r); }
-
-NullExp.prototype.convert = nNop;
-NullExp.prototype.revert = nNop;
-NullExp.prototype.mulTo = nMulTo;
-NullExp.prototype.sqrTo = nSqrTo;
-
-// (public) this^e
-function bnPow(e) { return this.exp(e,new NullExp()); }
-
-// (protected) r = lower n words of "this * a", a.t <= n
-// "this" should be the larger one if appropriate.
-function bnpMultiplyLowerTo(a,n,r) {
-  var r_array = r.array;
-  var a_array = a.array;
-  var i = Math.min(this.t+a.t,n);
-  r.s = 0; // assumes a,this >= 0
-  r.t = i;
-  while(i > 0) r_array[--i] = 0;
-  var j;
-  for(j = r.t-this.t; i < j; ++i) r_array[i+this.t] = this.am(0,a_array[i],r,i,0,this.t);
-  for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a_array[i],r,i,0,n-i);
-  r.clamp();
-}
-
-// (protected) r = "this * a" without lower n words, n > 0
-// "this" should be the larger one if appropriate.
-function bnpMultiplyUpperTo(a,n,r) {
-  var r_array = r.array;
-  var a_array = a.array;
-  --n;
-  var i = r.t = this.t+a.t-n;
-  r.s = 0; // assumes a,this >= 0
-  while(--i >= 0) r_array[i] = 0;
-  for(i = Math.max(n-this.t,0); i < a.t; ++i)
-    r_array[this.t+i-n] = this.am(n-i,a_array[i],r,0,0,this.t+i-n);
-  r.clamp();
-  r.drShiftTo(1,r);
-}
-
-// Barrett modular reduction
-function Barrett(m) {
-  // setup Barrett
-  this.r2 = nbi();
-  this.q3 = nbi();
-  BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
-  this.mu = this.r2.divide(m);
-  this.m = m;
-}
-
-function barrettConvert(x) {
-  if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
-  else if(x.compareTo(this.m) < 0) return x;
-  else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
-}
-
-function barrettRevert(x) { return x; }
-
-// x = x mod m (HAC 14.42)
-function barrettReduce(x) {
-  x.drShiftTo(this.m.t-1,this.r2);
-  if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
-  this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
-  this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
-  while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
-  x.subTo(this.r2,x);
-  while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
-}
-
-// r = x^2 mod m; x != r
-function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-
-// r = x*y mod m; x,y != r
-function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-
-Barrett.prototype.convert = barrettConvert;
-Barrett.prototype.revert = barrettRevert;
-Barrett.prototype.reduce = barrettReduce;
-Barrett.prototype.mulTo = barrettMulTo;
-Barrett.prototype.sqrTo = barrettSqrTo;
-
-// (public) this^e % m (HAC 14.85)
-function bnModPow(e,m) {
-  var e_array = e.array;
-  var i = e.bitLength(), k, r = nbv(1), z;
-  if(i <= 0) return r;
-  else if(i < 18) k = 1;
-  else if(i < 48) k = 3;
-  else if(i < 144) k = 4;
-  else if(i < 768) k = 5;
-  else k = 6;
-  if(i < 8)
-    z = new Classic(m);
-  else if(m.isEven())
-    z = new Barrett(m);
-  else
-    z = new Montgomery(m);
-
-  // precomputation
-  var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
-  g[1] = z.convert(this);
-  if(k > 1) {
-    var g2 = nbi();
-    z.sqrTo(g[1],g2);
-    while(n <= km) {
-      g[n] = nbi();
-      z.mulTo(g2,g[n-2],g[n]);
-      n += 2;
-    }
-  }
-
-  var j = e.t-1, w, is1 = true, r2 = nbi(), t;
-  i = nbits(e_array[j])-1;
-  while(j >= 0) {
-    if(i >= k1) w = (e_array[j]>>(i-k1))&km;
-    else {
-      w = (e_array[j]&((1<<(i+1))-1))<<(k1-i);
-      if(j > 0) w |= e_array[j-1]>>(BI_DB+i-k1);
-    }
-
-    n = k;
-    while((w&1) == 0) { w >>= 1; --n; }
-    if((i -= n) < 0) { i += BI_DB; --j; }
-    if(is1) {	// ret == 1, don't bother squaring or multiplying it
-      g[w].copyTo(r);
-      is1 = false;
-    }
-    else {
-      while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
-      if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
-      z.mulTo(r2,g[w],r);
-    }
-
-    while(j >= 0 && (e_array[j]&(1<<i)) == 0) {
-      z.sqrTo(r,r2); t = r; r = r2; r2 = t;
-      if(--i < 0) { i = BI_DB-1; --j; }
-    }
-  }
-  return z.revert(r);
-}
-
-// (public) gcd(this,a) (HAC 14.54)
-function bnGCD(a) {
-  var x = (this.s<0)?this.negate():this.clone();
-  var y = (a.s<0)?a.negate():a.clone();
-  if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
-  var i = x.getLowestSetBit(), g = y.getLowestSetBit();
-  if(g < 0) return x;
-  if(i < g) g = i;
-  if(g > 0) {
-    x.rShiftTo(g,x);
-    y.rShiftTo(g,y);
-  }
-  while(x.signum() > 0) {
-    if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
-    if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
-    if(x.compareTo(y) >= 0) {
-      x.subTo(y,x);
-      x.rShiftTo(1,x);
-    }
-    else {
-      y.subTo(x,y);
-      y.rShiftTo(1,y);
-    }
-  }
-  if(g > 0) y.lShiftTo(g,y);
-  return y;
-}
-
-// (protected) this % n, n < 2^26
-function bnpModInt(n) {
-  var this_array = this.array;
-  if(n <= 0) return 0;
-  var d = BI_DV%n, r = (this.s<0)?n-1:0;
-  if(this.t > 0)
-    if(d == 0) r = this_array[0]%n;
-    else for(var i = this.t-1; i >= 0; --i) r = (d*r+this_array[i])%n;
-  return r;
-}
-
-// (public) 1/this % m (HAC 14.61)
-function bnModInverse(m) {
-  var ac = m.isEven();
-  if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
-  var u = m.clone(), v = this.clone();
-  var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
-  while(u.signum() != 0) {
-    while(u.isEven()) {
-      u.rShiftTo(1,u);
-      if(ac) {
-        if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
-        a.rShiftTo(1,a);
-      }
-      else if(!b.isEven()) b.subTo(m,b);
-      b.rShiftTo(1,b);
-    }
-    while(v.isEven()) {
-      v.rShiftTo(1,v);
-      if(ac) {
-        if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
-        c.rShiftTo(1,c);
-      }
-      else if(!d.isEven()) d.subTo(m,d);
-      d.rShiftTo(1,d);
-    }
-    if(u.compareTo(v) >= 0) {
-      u.subTo(v,u);
-      if(ac) a.subTo(c,a);
-      b.subTo(d,b);
-    }
-    else {
-      v.subTo(u,v);
-      if(ac) c.subTo(a,c);
-      d.subTo(b,d);
-    }
-  }
-  if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
-  if(d.compareTo(m) >= 0) return d.subtract(m);
-  if(d.signum() < 0) d.addTo(m,d); else return d;
-  if(d.signum() < 0) return d.add(m); else return d;
-}
-
-var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];
-var lplim = (1<<26)/lowprimes[lowprimes.length-1];
-
-// (public) test primality with certainty >= 1-.5^t
-function bnIsProbablePrime(t) {
-  var i, x = this.abs();
-  var x_array = x.array;
-  if(x.t == 1 && x_array[0] <= lowprimes[lowprimes.length-1]) {
-    for(i = 0; i < lowprimes.length; ++i)
-      if(x_array[0] == lowprimes[i]) return true;
-    return false;
-  }
-  if(x.isEven()) return false;
-  i = 1;
-  while(i < lowprimes.length) {
-    var m = lowprimes[i], j = i+1;
-    while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
-    m = x.modInt(m);
-    while(i < j) if(m%lowprimes[i++] == 0) return false;
-  }
-  return x.millerRabin(t);
-}
-
-// (protected) true if probably prime (HAC 4.24, Miller-Rabin)
-function bnpMillerRabin(t) {
-  var n1 = this.subtract(BigInteger.ONE);
-  var k = n1.getLowestSetBit();
-  if(k <= 0) return false;
-  var r = n1.shiftRight(k);
-  t = (t+1)>>1;
-  if(t > lowprimes.length) t = lowprimes.length;
-  var a = nbi();
-  for(var i = 0; i < t; ++i) {
-    a.fromInt(lowprimes[i]);
-    var y = a.modPow(r,this);
-    if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
-      var j = 1;
-      while(j++ < k && y.compareTo(n1) != 0) {
-        y = y.modPowInt(2,this);
-        if(y.compareTo(BigInteger.ONE) == 0) return false;
-      }
-      if(y.compareTo(n1) != 0) return false;
-    }
-  }
-  return true;
-}
-
-// protected
-BigInteger.prototype.chunkSize = bnpChunkSize;
-BigInteger.prototype.toRadix = bnpToRadix;
-BigInteger.prototype.fromRadix = bnpFromRadix;
-BigInteger.prototype.fromNumber = bnpFromNumber;
-BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
-BigInteger.prototype.changeBit = bnpChangeBit;
-BigInteger.prototype.addTo = bnpAddTo;
-BigInteger.prototype.dMultiply = bnpDMultiply;
-BigInteger.prototype.dAddOffset = bnpDAddOffset;
-BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
-BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
-BigInteger.prototype.modInt = bnpModInt;
-BigInteger.prototype.millerRabin = bnpMillerRabin;
-
-// public
-BigInteger.prototype.clone = bnClone;
-BigInteger.prototype.intValue = bnIntValue;
-BigInteger.prototype.byteValue = bnByteValue;
-BigInteger.prototype.shortValue = bnShortValue;
-BigInteger.prototype.signum = bnSigNum;
-BigInteger.prototype.toByteArray = bnToByteArray;
-BigInteger.prototype.equals = bnEquals;
-BigInteger.prototype.min = bnMin;
-BigInteger.prototype.max = bnMax;
-BigInteger.prototype.and = bnAnd;
-BigInteger.prototype.or = bnOr;
-BigInteger.prototype.xor = bnXor;
-BigInteger.prototype.andNot = bnAndNot;
-BigInteger.prototype.not = bnNot;
-BigInteger.prototype.shiftLeft = bnShiftLeft;
-BigInteger.prototype.shiftRight = bnShiftRight;
-BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
-BigInteger.prototype.bitCount = bnBitCount;
-BigInteger.prototype.testBit = bnTestBit;
-BigInteger.prototype.setBit = bnSetBit;
-BigInteger.prototype.clearBit = bnClearBit;
-BigInteger.prototype.flipBit = bnFlipBit;
-BigInteger.prototype.add = bnAdd;
-BigInteger.prototype.subtract = bnSubtract;
-BigInteger.prototype.multiply = bnMultiply;
-BigInteger.prototype.divide = bnDivide;
-BigInteger.prototype.remainder = bnRemainder;
-BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
-BigInteger.prototype.modPow = bnModPow;
-BigInteger.prototype.modInverse = bnModInverse;
-BigInteger.prototype.pow = bnPow;
-BigInteger.prototype.gcd = bnGCD;
-BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
-
-// BigInteger interfaces not implemented in jsbn:
-
-// BigInteger(int signum, byte[] magnitude)
-// double doubleValue()
-// float floatValue()
-// int hashCode()
-// long longValue()
-// static BigInteger valueOf(long val)
-// prng4.js - uses Arcfour as a PRNG
-
-function Arcfour() {
-  this.i = 0;
-  this.j = 0;
-  this.S = new Array();
-}
-
-// Initialize arcfour context from key, an array of ints, each from [0..255]
-function ARC4init(key) {
-  var i, j, t;
-  for(i = 0; i < 256; ++i)
-    this.S[i] = i;
-  j = 0;
-  for(i = 0; i < 256; ++i) {
-    j = (j + this.S[i] + key[i % key.length]) & 255;
-    t = this.S[i];
-    this.S[i] = this.S[j];
-    this.S[j] = t;
-  }
-  this.i = 0;
-  this.j = 0;
-}
-
-function ARC4next() {
-  var t;
-  this.i = (this.i + 1) & 255;
-  this.j = (this.j + this.S[this.i]) & 255;
-  t = this.S[this.i];
-  this.S[this.i] = this.S[this.j];
-  this.S[this.j] = t;
-  return this.S[(t + this.S[this.i]) & 255];
-}
-
-Arcfour.prototype.init = ARC4init;
-Arcfour.prototype.next = ARC4next;
-
-// Plug in your RNG constructor here
-function prng_newstate() {
-  return new Arcfour();
-}
-
-// Pool size must be a multiple of 4 and greater than 32.
-// An array of bytes the size of the pool will be passed to init()
-var rng_psize = 256;
-// Random number generator - requires a PRNG backend, e.g. prng4.js
-
-// For best results, put code like
-// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
-// in your main HTML document.
-
-var rng_state;
-var rng_pool;
-var rng_pptr;
-
-// Mix in a 32-bit integer into the pool
-function rng_seed_int(x) {
-  rng_pool[rng_pptr++] ^= x & 255;
-  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
-  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
-  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
-  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
-}
-
-// Mix in the current time (w/milliseconds) into the pool
-function rng_seed_time() {
-  // Use pre-computed date to avoid making the benchmark
-  // results dependent on the current date.
-  rng_seed_int(1122926989487);
-}
-
-// Initialize the pool with junk if needed.
-if(rng_pool == null) {
-  rng_pool = new Array();
-  rng_pptr = 0;
-  var t;
-  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
-    t = Math.floor(65536 * Math.random());
-    rng_pool[rng_pptr++] = t >>> 8;
-    rng_pool[rng_pptr++] = t & 255;
-  }
-  rng_pptr = 0;
-  rng_seed_time();
-  //rng_seed_int(window.screenX);
-  //rng_seed_int(window.screenY);
-}
-
-function rng_get_byte() {
-  if(rng_state == null) {
-    rng_seed_time();
-    rng_state = prng_newstate();
-    rng_state.init(rng_pool);
-    for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
-      rng_pool[rng_pptr] = 0;
-    rng_pptr = 0;
-    //rng_pool = null;
-  }
-  // TODO: allow reseeding after first request
-  return rng_state.next();
-}
-
-function rng_get_bytes(ba) {
-  var i;
-  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
-}
-
-function SecureRandom() {}
-
-SecureRandom.prototype.nextBytes = rng_get_bytes;
-// Depends on jsbn.js and rng.js
-
-// convert a (hex) string to a bignum object
-function parseBigInt(str,r) {
-  return new BigInteger(str,r);
-}
-
-function linebrk(s,n) {
-  var ret = "";
-  var i = 0;
-  while(i + n < s.length) {
-    ret += s.substring(i,i+n) + "\n";
-    i += n;
-  }
-  return ret + s.substring(i,s.length);
-}
-
-function byte2Hex(b) {
-  if(b < 0x10)
-    return "0" + b.toString(16);
-  else
-    return b.toString(16);
-}
-
-// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
-function pkcs1pad2(s,n) {
-  if(n < s.length + 11) {
-    alert("Message too long for RSA");
-    return null;
-  }
-  var ba = new Array();
-  var i = s.length - 1;
-  while(i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--);
-  ba[--n] = 0;
-  var rng = new SecureRandom();
-  var x = new Array();
-  while(n > 2) { // random non-zero pad
-    x[0] = 0;
-    while(x[0] == 0) rng.nextBytes(x);
-    ba[--n] = x[0];
-  }
-  ba[--n] = 2;
-  ba[--n] = 0;
-  return new BigInteger(ba);
-}
-
-// "empty" RSA key constructor
-function RSAKey() {
-  this.n = null;
-  this.e = 0;
-  this.d = null;
-  this.p = null;
-  this.q = null;
-  this.dmp1 = null;
-  this.dmq1 = null;
-  this.coeff = null;
-}
-
-// Set the public key fields N and e from hex strings
-function RSASetPublic(N,E) {
-  if(N != null && E != null && N.length > 0 && E.length > 0) {
-    this.n = parseBigInt(N,16);
-    this.e = parseInt(E,16);
-  }
-  else
-    alert("Invalid RSA public key");
-}
-
-// Perform raw public operation on "x": return x^e (mod n)
-function RSADoPublic(x) {
-  return x.modPowInt(this.e, this.n);
-}
-
-// Return the PKCS#1 RSA encryption of "text" as an even-length hex string
-function RSAEncrypt(text) {
-  var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
-  if(m == null) return null;
-  var c = this.doPublic(m);
-  if(c == null) return null;
-  var h = c.toString(16);
-  if((h.length & 1) == 0) return h; else return "0" + h;
-}
-
-// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
-//function RSAEncryptB64(text) {
-//  var h = this.encrypt(text);
-//  if(h) return hex2b64(h); else return null;
-//}
-
-// protected
-RSAKey.prototype.doPublic = RSADoPublic;
-
-// public
-RSAKey.prototype.setPublic = RSASetPublic;
-RSAKey.prototype.encrypt = RSAEncrypt;
-//RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
-// Depends on rsa.js and jsbn2.js
-
-// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
-function pkcs1unpad2(d,n) {
-  var b = d.toByteArray();
-  var i = 0;
-  while(i < b.length && b[i] == 0) ++i;
-  if(b.length-i != n-1 || b[i] != 2)
-    return null;
-  ++i;
-  while(b[i] != 0)
-    if(++i >= b.length) return null;
-  var ret = "";
-  while(++i < b.length)
-    ret += String.fromCharCode(b[i]);
-  return ret;
-}
-
-// Set the private key fields N, e, and d from hex strings
-function RSASetPrivate(N,E,D) {
-  if(N != null && E != null && N.length > 0 && E.length > 0) {
-    this.n = parseBigInt(N,16);
-    this.e = parseInt(E,16);
-    this.d = parseBigInt(D,16);
-  }
-  else
-    alert("Invalid RSA private key");
-}
-
-// Set the private key fields N, e, d and CRT params from hex strings
-function RSASetPrivateEx(N,E,D,P,Q,DP,DQ,C) {
-  if(N != null && E != null && N.length > 0 && E.length > 0) {
-    this.n = parseBigInt(N,16);
-    this.e = parseInt(E,16);
-    this.d = parseBigInt(D,16);
-    this.p = parseBigInt(P,16);
-    this.q = parseBigInt(Q,16);
-    this.dmp1 = parseBigInt(DP,16);
-    this.dmq1 = parseBigInt(DQ,16);
-    this.coeff = parseBigInt(C,16);
-  }
-  else
-    alert("Invalid RSA private key");
-}
-
-// Generate a new random private key B bits long, using public expt E
-function RSAGenerate(B,E) {
-  var rng = new SecureRandom();
-  var qs = B>>1;
-  this.e = parseInt(E,16);
-  var ee = new BigInteger(E,16);
-  for(;;) {
-    for(;;) {
-      this.p = new BigInteger(B-qs,1,rng);
-      if(this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
-    }
-    for(;;) {
-      this.q = new BigInteger(qs,1,rng);
-      if(this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) break;
-    }
-    if(this.p.compareTo(this.q) <= 0) {
-      var t = this.p;
-      this.p = this.q;
-      this.q = t;
-    }
-    var p1 = this.p.subtract(BigInteger.ONE);
-    var q1 = this.q.subtract(BigInteger.ONE);
-    var phi = p1.multiply(q1);
-    if(phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
-      this.n = this.p.multiply(this.q);
-      this.d = ee.modInverse(phi);
-      this.dmp1 = this.d.mod(p1);
-      this.dmq1 = this.d.mod(q1);
-      this.coeff = this.q.modInverse(this.p);
-      break;
-    }
-  }
-}
-
-// Perform raw private operation on "x": return x^d (mod n)
-function RSADoPrivate(x) {
-  if(this.p == null || this.q == null)
-    return x.modPow(this.d, this.n);
-
-  // TODO: re-calculate any missing CRT params
-  var xp = x.mod(this.p).modPow(this.dmp1, this.p);
-  var xq = x.mod(this.q).modPow(this.dmq1, this.q);
-
-  while(xp.compareTo(xq) < 0)
-    xp = xp.add(this.p);
-  return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
-}
-
-// Return the PKCS#1 RSA decryption of "ctext".
-// "ctext" is an even-length hex string and the output is a plain string.
-function RSADecrypt(ctext) {
-  var c = parseBigInt(ctext, 16);
-  var m = this.doPrivate(c);
-  if(m == null) return null;
-  return pkcs1unpad2(m, (this.n.bitLength()+7)>>3);
-}
-
-// Return the PKCS#1 RSA decryption of "ctext".
-// "ctext" is a Base64-encoded string and the output is a plain string.
-//function RSAB64Decrypt(ctext) {
-//  var h = b64tohex(ctext);
-//  if(h) return this.decrypt(h); else return null;
-//}
-
-// protected
-RSAKey.prototype.doPrivate = RSADoPrivate;
-
-// public
-RSAKey.prototype.setPrivate = RSASetPrivate;
-RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
-RSAKey.prototype.generate = RSAGenerate;
-RSAKey.prototype.decrypt = RSADecrypt;
-//RSAKey.prototype.b64_decrypt = RSAB64Decrypt;
-
-
-nValue="a5261939975948bb7a58dffe5ff54e65f0498f9175f5a09288810b8975871e99af3b5dd94057b0fc07535f5f97444504fa35169d461d0d30cf0192e307727c065168c788771c561a9400fb49175e9e6aa4e23fe11af69e9412dd23b0cb6684c4c2429bce139e848ab26d0829073351f4acd36074eafd036a5eb83359d2a698d3";
-eValue="10001";
-dValue="8e9912f6d3645894e8d38cb58c0db81ff516cf4c7e5a14c7f1eddb1459d2cded4d8d293fc97aee6aefb861859c8b6a3d1dfe710463e1f9ddc72048c09751971c4a580aa51eb523357a3cc48d31cfad1d4a165066ed92d4748fb6571211da5cb14bc11b6e2df7c1a559e6d5ac1cd5c94703a22891464fba23d0d965086277a161";
-pValue="d090ce58a92c75233a6486cb0a9209bf3583b64f540c76f5294bb97d285eed33aec220bde14b2417951178ac152ceab6da7090905b478195498b352048f15e7d";
-qValue="cab575dc652bb66df15a0359609d51d1db184750c00c6698b90ef3465c99655103edbf0d54c56aec0ce3c4d22592338092a126a0cc49f65a4a30d222b411e58f";
-dmp1Value="1a24bca8e273df2f0e47c199bbf678604e7df7215480c77c8db39f49b000ce2cf7500038acfff5433b7d582a01f1826e6f4d42e1c57f5e1fef7b12aabc59fd25";
-dmq1Value="3d06982efbbe47339e1f6d36b1216b8a741d410b0c662f54f7118b27b9a4ec9d914337eb39841d8666f3034408cf94f5b62f11c402fc994fe15a05493150d9fd";
-coeffValue="3a3e731acd8960b7ff9eb81a7ff93bd1cfa74cbd56987db58b4594fb09c09084db1734c8143f98b602b981aaa9243ca28deb69b5b280ee8dcee0fd2625e53250";
-
-setupEngine(am3, 28);
-
-var TEXT = "The quick brown fox jumped over the extremely lazy frog! " +
-    "Now is the time for all good men to come to the party.";
-var encrypted;
-
-function encrypt() {
-  var RSA = new RSAKey();
-  RSA.setPublic(nValue, eValue);
-  RSA.setPrivateEx(nValue, eValue, dValue, pValue, qValue, dmp1Value, dmq1Value, coeffValue);
-  encrypted = RSA.encrypt(TEXT);
-}
-
-function decrypt() {
-  var RSA = new RSAKey();
-  RSA.setPublic(nValue, eValue);
-  RSA.setPrivateEx(nValue, eValue, dValue, pValue, qValue, dmp1Value, dmq1Value, coeffValue);
-  var decrypted = RSA.decrypt(encrypted);
-  if (decrypted != TEXT) {
-    throw new Error("Crypto operation failed");
-  }
-}
-
-class Benchmark {
-    runIteration() {
-        encrypt();
-        decrypt();
-    }
-}
-
diff --git a/Octane/deltablue.js b/Octane/deltablue.js
deleted file mode 100644
index 1169e32..0000000
--- a/Octane/deltablue.js
+++ /dev/null
@@ -1,886 +0,0 @@
-// Copyright 2008 the V8 project authors. All rights reserved.
-// Copyright 1996 John Maloney and Mario Wolczko.
-
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation; either version 2 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-// This implementation of the DeltaBlue benchmark is derived
-// from the Smalltalk implementation by John Maloney and Mario
-// Wolczko. Some parts have been translated directly, whereas
-// others have been modified more aggresively to make it feel
-// more like a JavaScript program.
-
-
-
-/**
- * A JavaScript implementation of the DeltaBlue constraint-solving
- * algorithm, as described in:
- *
- * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
- *   Bjorn N. Freeman-Benson and John Maloney
- *   January 1990 Communications of the ACM,
- *   also available as University of Washington TR 89-08-06.
- *
- * Beware: this benchmark is written in a grotesque style where
- * the constraint model is built by side-effects from constructors.
- * I've kept it this way to avoid deviating too much from the original
- * implementation.
- */
-
-
-/* --- O b j e c t   M o d e l --- */
-
-Object.defineProperty(Object.prototype, "inheritsFrom", {
-  
-  value: function (shuper) {
-    function Inheriter() { }
-    Inheriter.prototype = shuper.prototype;
-    this.prototype = new Inheriter();
-    this.superConstructor = shuper;
-  }
-});
-
-function OrderedCollection() {
-  this.elms = new Array();
-}
-
-OrderedCollection.prototype.add = function (elm) {
-  this.elms.push(elm);
-}
-
-OrderedCollection.prototype.at = function (index) {
-  return this.elms[index];
-}
-
-OrderedCollection.prototype.size = function () {
-  return this.elms.length;
-}
-
-OrderedCollection.prototype.removeFirst = function () {
-  return this.elms.pop();
-}
-
-OrderedCollection.prototype.remove = function (elm) {
-  var index = 0, skipped = 0;
-  for (var i = 0; i < this.elms.length; i++) {
-    var value = this.elms[i];
-    if (value != elm) {
-      this.elms[index] = value;
-      index++;
-    } else {
-      skipped++;
-    }
-  }
-  for (var i = 0; i < skipped; i++)
-    this.elms.pop();
-}
-
-/* --- *
- * S t r e n g t h
- * --- */
-
-/**
- * Strengths are used to measure the relative importance of constraints.
- * New strengths may be inserted in the strength hierarchy without
- * disrupting current constraints.  Strengths cannot be created outside
- * this class, so pointer comparison can be used for value comparison.
- */
-function Strength(strengthValue, name) {
-  this.strengthValue = strengthValue;
-  this.name = name;
-}
-
-Strength.stronger = function (s1, s2) {
-  return s1.strengthValue < s2.strengthValue;
-}
-
-Strength.weaker = function (s1, s2) {
-  return s1.strengthValue > s2.strengthValue;
-}
-
-Strength.weakestOf = function (s1, s2) {
-  return this.weaker(s1, s2) ? s1 : s2;
-}
-
-Strength.strongest = function (s1, s2) {
-  return this.stronger(s1, s2) ? s1 : s2;
-}
-
-Strength.prototype.nextWeaker = function () {
-  switch (this.strengthValue) {
-    case 0: return Strength.WEAKEST;
-    case 1: return Strength.WEAK_DEFAULT;
-    case 2: return Strength.NORMAL;
-    case 3: return Strength.STRONG_DEFAULT;
-    case 4: return Strength.PREFERRED;
-    case 5: return Strength.REQUIRED;
-  }
-}
-
-// Strength constants.
-Strength.REQUIRED        = new Strength(0, "required");
-Strength.STONG_PREFERRED = new Strength(1, "strongPreferred");
-Strength.PREFERRED       = new Strength(2, "preferred");
-Strength.STRONG_DEFAULT  = new Strength(3, "strongDefault");
-Strength.NORMAL          = new Strength(4, "normal");
-Strength.WEAK_DEFAULT    = new Strength(5, "weakDefault");
-Strength.WEAKEST         = new Strength(6, "weakest");
-
-/* --- *
- * C o n s t r a i n t
- * --- */
-
-/**
- * An abstract class representing a system-maintainable relationship
- * (or "constraint") between a set of variables. A constraint supplies
- * a strength instance variable; concrete subclasses provide a means
- * of storing the constrained variables and other information required
- * to represent a constraint.
- */
-function Constraint(strength) {
-  this.strength = strength;
-}
-
-/**
- * Activate this constraint and attempt to satisfy it.
- */
-Constraint.prototype.addConstraint = function () {
-  this.addToGraph();
-  planner.incrementalAdd(this);
-}
-
-/**
- * Attempt to find a way to enforce this constraint. If successful,
- * record the solution, perhaps modifying the current dataflow
- * graph. Answer the constraint that this constraint overrides, if
- * there is one, or nil, if there isn't.
- * Assume: I am not already satisfied.
- */
-Constraint.prototype.satisfy = function (mark) {
-  this.chooseMethod(mark);
-  if (!this.isSatisfied()) {
-    if (this.strength == Strength.REQUIRED)
-      alert("Could not satisfy a required constraint!");
-    return null;
-  }
-  this.markInputs(mark);
-  var out = this.output();
-  var overridden = out.determinedBy;
-  if (overridden != null) overridden.markUnsatisfied();
-  out.determinedBy = this;
-  if (!planner.addPropagate(this, mark))
-    alert("Cycle encountered");
-  out.mark = mark;
-  return overridden;
-}
-
-Constraint.prototype.destroyConstraint = function () {
-  if (this.isSatisfied()) planner.incrementalRemove(this);
-  else this.removeFromGraph();
-}
-
-/**
- * Normal constraints are not input constraints.  An input constraint
- * is one that depends on external state, such as the mouse, the
- * keybord, a clock, or some arbitraty piece of imperative code.
- */
-Constraint.prototype.isInput = function () {
-  return false;
-}
-
-/* --- *
- * U n a r y   C o n s t r a i n t
- * --- */
-
-/**
- * Abstract superclass for constraints having a single possible output
- * variable.
- */
-function UnaryConstraint(v, strength) {
-  UnaryConstraint.superConstructor.call(this, strength);
-  this.myOutput = v;
-  this.satisfied = false;
-  this.addConstraint();
-}
-
-UnaryConstraint.inheritsFrom(Constraint);
-
-/**
- * Adds this constraint to the constraint graph
- */
-UnaryConstraint.prototype.addToGraph = function () {
-  this.myOutput.addConstraint(this);
-  this.satisfied = false;
-}
-
-/**
- * Decides if this constraint can be satisfied and records that
- * decision.
- */
-UnaryConstraint.prototype.chooseMethod = function (mark) {
-  this.satisfied = (this.myOutput.mark != mark)
-    && Strength.stronger(this.strength, this.myOutput.walkStrength);
-}
-
-/**
- * Returns true if this constraint is satisfied in the current solution.
- */
-UnaryConstraint.prototype.isSatisfied = function () {
-  return this.satisfied;
-}
-
-UnaryConstraint.prototype.markInputs = function (mark) {
-  // has no inputs
-}
-
-/**
- * Returns the current output variable.
- */
-UnaryConstraint.prototype.output = function () {
-  return this.myOutput;
-}
-
-/**
- * Calculate the walkabout strength, the stay flag, and, if it is
- * 'stay', the value for the current output of this constraint. Assume
- * this constraint is satisfied.
- */
-UnaryConstraint.prototype.recalculate = function () {
-  this.myOutput.walkStrength = this.strength;
-  this.myOutput.stay = !this.isInput();
-  if (this.myOutput.stay) this.execute(); // Stay optimization
-}
-
-/**
- * Records that this constraint is unsatisfied
- */
-UnaryConstraint.prototype.markUnsatisfied = function () {
-  this.satisfied = false;
-}
-
-UnaryConstraint.prototype.inputsKnown = function () {
-  return true;
-}
-
-UnaryConstraint.prototype.removeFromGraph = function () {
-  if (this.myOutput != null) this.myOutput.removeConstraint(this);
-  this.satisfied = false;
-}
-
-/* --- *
- * S t a y   C o n s t r a i n t
- * --- */
-
-/**
- * Variables that should, with some level of preference, stay the same.
- * Planners may exploit the fact that instances, if satisfied, will not
- * change their output during plan execution.  This is called "stay
- * optimization".
- */
-function StayConstraint(v, str) {
-  StayConstraint.superConstructor.call(this, v, str);
-}
-
-StayConstraint.inheritsFrom(UnaryConstraint);
-
-StayConstraint.prototype.execute = function () {
-  // Stay constraints do nothing
-}
-
-/* --- *
- * E d i t   C o n s t r a i n t
- * --- */
-
-/**
- * A unary input constraint used to mark a variable that the client
- * wishes to change.
- */
-function EditConstraint(v, str) {
-  EditConstraint.superConstructor.call(this, v, str);
-}
-
-EditConstraint.inheritsFrom(UnaryConstraint);
-
-/**
- * Edits indicate that a variable is to be changed by imperative code.
- */
-EditConstraint.prototype.isInput = function () {
-  return true;
-}
-
-EditConstraint.prototype.execute = function () {
-  // Edit constraints do nothing
-}
-
-/* --- *
- * B i n a r y   C o n s t r a i n t
- * --- */
-
-var Direction = new Object();
-Direction.NONE     = 0;
-Direction.FORWARD  = 1;
-Direction.BACKWARD = -1;
-
-/**
- * Abstract superclass for constraints having two possible output
- * variables.
- */
-function BinaryConstraint(var1, var2, strength) {
-  BinaryConstraint.superConstructor.call(this, strength);
-  this.v1 = var1;
-  this.v2 = var2;
-  this.direction = Direction.NONE;
-  this.addConstraint();
-}
-
-BinaryConstraint.inheritsFrom(Constraint);
-
-/**
- * Decides if this constraint can be satisfied and which way it
- * should flow based on the relative strength of the variables related,
- * and record that decision.
- */
-BinaryConstraint.prototype.chooseMethod = function (mark) {
-  if (this.v1.mark == mark) {
-    this.direction = (this.v2.mark != mark && Strength.stronger(this.strength, this.v2.walkStrength))
-      ? Direction.FORWARD
-      : Direction.NONE;
-  }
-  if (this.v2.mark == mark) {
-    this.direction = (this.v1.mark != mark && Strength.stronger(this.strength, this.v1.walkStrength))
-      ? Direction.BACKWARD
-      : Direction.NONE;
-  }
-  if (Strength.weaker(this.v1.walkStrength, this.v2.walkStrength)) {
-    this.direction = Strength.stronger(this.strength, this.v1.walkStrength)
-      ? Direction.BACKWARD
-      : Direction.NONE;
-  } else {
-    this.direction = Strength.stronger(this.strength, this.v2.walkStrength)
-      ? Direction.FORWARD
-      : Direction.BACKWARD
-  }
-}
-
-/**
- * Add this constraint to the constraint graph
- */
-BinaryConstraint.prototype.addToGraph = function () {
-  this.v1.addConstraint(this);
-  this.v2.addConstraint(this);
-  this.direction = Direction.NONE;
-}
-
-/**
- * Answer true if this constraint is satisfied in the current solution.
- */
-BinaryConstraint.prototype.isSatisfied = function () {
-  return this.direction != Direction.NONE;
-}
-
-/**
- * Mark the input variable with the given mark.
- */
-BinaryConstraint.prototype.markInputs = function (mark) {
-  this.input().mark = mark;
-}
-
-/**
- * Returns the current input variable
- */
-BinaryConstraint.prototype.input = function () {
-  return (this.direction == Direction.FORWARD) ? this.v1 : this.v2;
-}
-
-/**
- * Returns the current output variable
- */
-BinaryConstraint.prototype.output = function () {
-  return (this.direction == Direction.FORWARD) ? this.v2 : this.v1;
-}
-
-/**
- * Calculate the walkabout strength, the stay flag, and, if it is
- * 'stay', the value for the current output of this
- * constraint. Assume this constraint is satisfied.
- */
-BinaryConstraint.prototype.recalculate = function () {
-  var ihn = this.input(), out = this.output();
-  out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength);
-  out.stay = ihn.stay;
-  if (out.stay) this.execute();
-}
-
-/**
- * Record the fact that this constraint is unsatisfied.
- */
-BinaryConstraint.prototype.markUnsatisfied = function () {
-  this.direction = Direction.NONE;
-}
-
-BinaryConstraint.prototype.inputsKnown = function (mark) {
-  var i = this.input();
-  return i.mark == mark || i.stay || i.determinedBy == null;
-}
-
-BinaryConstraint.prototype.removeFromGraph = function () {
-  if (this.v1 != null) this.v1.removeConstraint(this);
-  if (this.v2 != null) this.v2.removeConstraint(this);
-  this.direction = Direction.NONE;
-}
-
-/* --- *
- * S c a l e   C o n s t r a i n t
- * --- */
-
-/**
- * Relates two variables by the linear scaling relationship: "v2 =
- * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
- * this relationship but the scale factor and offset are considered
- * read-only.
- */
-function ScaleConstraint(src, scale, offset, dest, strength) {
-  this.direction = Direction.NONE;
-  this.scale = scale;
-  this.offset = offset;
-  ScaleConstraint.superConstructor.call(this, src, dest, strength);
-}
-
-ScaleConstraint.inheritsFrom(BinaryConstraint);
-
-/**
- * Adds this constraint to the constraint graph.
- */
-ScaleConstraint.prototype.addToGraph = function () {
-  ScaleConstraint.superConstructor.prototype.addToGraph.call(this);
-  this.scale.addConstraint(this);
-  this.offset.addConstraint(this);
-}
-
-ScaleConstraint.prototype.removeFromGraph = function () {
-  ScaleConstraint.superConstructor.prototype.removeFromGraph.call(this);
-  if (this.scale != null) this.scale.removeConstraint(this);
-  if (this.offset != null) this.offset.removeConstraint(this);
-}
-
-ScaleConstraint.prototype.markInputs = function (mark) {
-  ScaleConstraint.superConstructor.prototype.markInputs.call(this, mark);
-  this.scale.mark = this.offset.mark = mark;
-}
-
-/**
- * Enforce this constraint. Assume that it is satisfied.
- */
-ScaleConstraint.prototype.execute = function () {
-  if (this.direction == Direction.FORWARD) {
-    this.v2.value = this.v1.value * this.scale.value + this.offset.value;
-  } else {
-    this.v1.value = (this.v2.value - this.offset.value) / this.scale.value;
-  }
-}
-
-/**
- * Calculate the walkabout strength, the stay flag, and, if it is
- * 'stay', the value for the current output of this constraint. Assume
- * this constraint is satisfied.
- */
-ScaleConstraint.prototype.recalculate = function () {
-  var ihn = this.input(), out = this.output();
-  out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength);
-  out.stay = ihn.stay && this.scale.stay && this.offset.stay;
-  if (out.stay) this.execute();
-}
-
-/* --- *
- * E q u a l i t  y   C o n s t r a i n t
- * --- */
-
-/**
- * Constrains two variables to have the same value.
- */
-function EqualityConstraint(var1, var2, strength) {
-  EqualityConstraint.superConstructor.call(this, var1, var2, strength);
-}
-
-EqualityConstraint.inheritsFrom(BinaryConstraint);
-
-/**
- * Enforce this constraint. Assume that it is satisfied.
- */
-EqualityConstraint.prototype.execute = function () {
-  this.output().value = this.input().value;
-}
-
-/* --- *
- * V a r i a b l e
- * --- */
-
-/**
- * A constrained variable. In addition to its value, it maintain the
- * structure of the constraint graph, the current dataflow graph, and
- * various parameters of interest to the DeltaBlue incremental
- * constraint solver.
- **/
-function Variable(name, initialValue) {
-  this.value = initialValue || 0;
-  this.constraints = new OrderedCollection();
-  this.determinedBy = null;
-  this.mark = 0;
-  this.walkStrength = Strength.WEAKEST;
-  this.stay = true;
-  this.name = name;
-}
-
-/**
- * Add the given constraint to the set of all constraints that refer
- * this variable.
- */
-Variable.prototype.addConstraint = function (c) {
-  this.constraints.add(c);
-}
-
-/**
- * Removes all traces of c from this variable.
- */
-Variable.prototype.removeConstraint = function (c) {
-  this.constraints.remove(c);
-  if (this.determinedBy == c) this.determinedBy = null;
-}
-
-/* --- *
- * P l a n n e r
- * --- */
-
-/**
- * The DeltaBlue planner
- */
-function Planner() {
-  this.currentMark = 0;
-}
-
-/**
- * Attempt to satisfy the given constraint and, if successful,
- * incrementally update the dataflow graph.  Details: If satifying
- * the constraint is successful, it may override a weaker constraint
- * on its output. The algorithm attempts to resatisfy that
- * constraint using some other method. This process is repeated
- * until either a) it reaches a variable that was not previously
- * determined by any constraint or b) it reaches a constraint that
- * is too weak to be satisfied using any of its methods. The
- * variables of constraints that have been processed are marked with
- * a unique mark value so that we know where we've been. This allows
- * the algorithm to avoid getting into an infinite loop even if the
- * constraint graph has an inadvertent cycle.
- */
-Planner.prototype.incrementalAdd = function (c) {
-  var mark = this.newMark();
-  var overridden = c.satisfy(mark);
-  while (overridden != null)
-    overridden = overridden.satisfy(mark);
-}
-
-/**
- * Entry point for retracting a constraint. Remove the given
- * constraint and incrementally update the dataflow graph.
- * Details: Retracting the given constraint may allow some currently
- * unsatisfiable downstream constraint to be satisfied. We therefore collect
- * a list of unsatisfied downstream constraints and attempt to
- * satisfy each one in turn. This list is traversed by constraint
- * strength, strongest first, as a heuristic for avoiding
- * unnecessarily adding and then overriding weak constraints.
- * Assume: c is satisfied.
- */
-Planner.prototype.incrementalRemove = function (c) {
-  var out = c.output();
-  c.markUnsatisfied();
-  c.removeFromGraph();
-  var unsatisfied = this.removePropagateFrom(out);
-  var strength = Strength.REQUIRED;
-  do {
-    for (var i = 0; i < unsatisfied.size(); i++) {
-      var u = unsatisfied.at(i);
-      if (u.strength == strength)
-        this.incrementalAdd(u);
-    }
-    strength = strength.nextWeaker();
-  } while (strength != Strength.WEAKEST);
-}
-
-/**
- * Select a previously unused mark value.
- */
-Planner.prototype.newMark = function () {
-  return ++this.currentMark;
-}
-
-/**
- * Extract a plan for resatisfaction starting from the given source
- * constraints, usually a set of input constraints. This method
- * assumes that stay optimization is desired; the plan will contain
- * only constraints whose output variables are not stay. Constraints
- * that do no computation, such as stay and edit constraints, are
- * not included in the plan.
- * Details: The outputs of a constraint are marked when it is added
- * to the plan under construction. A constraint may be appended to
- * the plan when all its input variables are known. A variable is
- * known if either a) the variable is marked (indicating that has
- * been computed by a constraint appearing earlier in the plan), b)
- * the variable is 'stay' (i.e. it is a constant at plan execution
- * time), or c) the variable is not determined by any
- * constraint. The last provision is for past states of history
- * variables, which are not stay but which are also not computed by
- * any constraint.
- * Assume: sources are all satisfied.
- */
-Planner.prototype.makePlan = function (sources) {
-  var mark = this.newMark();
-  var plan = new Plan();
-  var todo = sources;
-  while (todo.size() > 0) {
-    var c = todo.removeFirst();
-    if (c.output().mark != mark && c.inputsKnown(mark)) {
-      plan.addConstraint(c);
-      c.output().mark = mark;
-      this.addConstraintsConsumingTo(c.output(), todo);
-    }
-  }
-  return plan;
-}
-
-/**
- * Extract a plan for resatisfying starting from the output of the
- * given constraints, usually a set of input constraints.
- */
-Planner.prototype.extractPlanFromConstraints = function (constraints) {
-  var sources = new OrderedCollection();
-  for (var i = 0; i < constraints.size(); i++) {
-    var c = constraints.at(i);
-    if (c.isInput() && c.isSatisfied())
-      // not in plan already and eligible for inclusion
-      sources.add(c);
-  }
-  return this.makePlan(sources);
-}
-
-/**
- * Recompute the walkabout strengths and stay flags of all variables
- * downstream of the given constraint and recompute the actual
- * values of all variables whose stay flag is true. If a cycle is
- * detected, remove the given constraint and answer
- * false. Otherwise, answer true.
- * Details: Cycles are detected when a marked variable is
- * encountered downstream of the given constraint. The sender is
- * assumed to have marked the inputs of the given constraint with
- * the given mark. Thus, encountering a marked node downstream of
- * the output constraint means that there is a path from the
- * constraint's output to one of its inputs.
- */
-Planner.prototype.addPropagate = function (c, mark) {
-  var todo = new OrderedCollection();
-  todo.add(c);
-  while (todo.size() > 0) {
-    var d = todo.removeFirst();
-    if (d.output().mark == mark) {
-      this.incrementalRemove(c);
-      return false;
-    }
-    d.recalculate();
-    this.addConstraintsConsumingTo(d.output(), todo);
-  }
-  return true;
-}
-
-
-/**
- * Update the walkabout strengths and stay flags of all variables
- * downstream of the given constraint. Answer a collection of
- * unsatisfied constraints sorted in order of decreasing strength.
- */
-Planner.prototype.removePropagateFrom = function (out) {
-  out.determinedBy = null;
-  out.walkStrength = Strength.WEAKEST;
-  out.stay = true;
-  var unsatisfied = new OrderedCollection();
-  var todo = new OrderedCollection();
-  todo.add(out);
-  while (todo.size() > 0) {
-    var v = todo.removeFirst();
-    for (var i = 0; i < v.constraints.size(); i++) {
-      var c = v.constraints.at(i);
-      if (!c.isSatisfied())
-        unsatisfied.add(c);
-    }
-    var determining = v.determinedBy;
-    for (var i = 0; i < v.constraints.size(); i++) {
-      var next = v.constraints.at(i);
-      if (next != determining && next.isSatisfied()) {
-        next.recalculate();
-        todo.add(next.output());
-      }
-    }
-  }
-  return unsatisfied;
-}
-
-Planner.prototype.addConstraintsConsumingTo = function (v, coll) {
-  var determining = v.determinedBy;
-  var cc = v.constraints;
-  for (var i = 0; i < cc.size(); i++) {
-    var c = cc.at(i);
-    if (c != determining && c.isSatisfied())
-      coll.add(c);
-  }
-}
-
-/* --- *
- * P l a n
- * --- */
-
-/**
- * A Plan is an ordered list of constraints to be executed in sequence
- * to resatisfy all currently satisfiable constraints in the face of
- * one or more changing inputs.
- */
-function Plan() {
-  this.v = new OrderedCollection();
-}
-
-Plan.prototype.addConstraint = function (c) {
-  this.v.add(c);
-}
-
-Plan.prototype.size = function () {
-  return this.v.size();
-}
-
-Plan.prototype.constraintAt = function (index) {
-  return this.v.at(index);
-}
-
-Plan.prototype.execute = function () {
-  for (var i = 0; i < this.size(); i++) {
-    var c = this.constraintAt(i);
-    c.execute();
-  }
-}
-
-/* --- *
- * M a i n
- * --- */
-
-/**
- * This is the standard DeltaBlue benchmark. A long chain of equality
- * constraints is constructed with a stay constraint on one end. An
- * edit constraint is then added to the opposite end and the time is
- * measured for adding and removing this constraint, and extracting
- * and executing a constraint satisfaction plan. There are two cases.
- * In case 1, the added constraint is stronger than the stay
- * constraint and values must propagate down the entire length of the
- * chain. In case 2, the added constraint is weaker than the stay
- * constraint so it cannot be accomodated. The cost in this case is,
- * of course, very low. Typical situations lie somewhere between these
- * two extremes.
- */
-function chainTest(n) {
-  planner = new Planner();
-  var prev = null, first = null, last = null;
-
-  // Build chain of n equality constraints
-  for (var i = 0; i <= n; i++) {
-    var name = "v" + i;
-    var v = new Variable(name);
-    if (prev != null)
-      new EqualityConstraint(prev, v, Strength.REQUIRED);
-    if (i == 0) first = v;
-    if (i == n) last = v;
-    prev = v;
-  }
-
-  new StayConstraint(last, Strength.STRONG_DEFAULT);
-  var edit = new EditConstraint(first, Strength.PREFERRED);
-  var edits = new OrderedCollection();
-  edits.add(edit);
-  var plan = planner.extractPlanFromConstraints(edits);
-  for (var i = 0; i < 100; i++) {
-    first.value = i;
-    plan.execute();
-    if (last.value != i)
-      alert("Chain test failed.");
-  }
-}
-
-/**
- * This test constructs a two sets of variables related to each
- * other by a simple linear transformation (scale and offset). The
- * time is measured to change a variable on either side of the
- * mapping and to change the scale and offset factors.
- */
-function projectionTest(n) {
-  planner = new Planner();
-  var scale = new Variable("scale", 10);
-  var offset = new Variable("offset", 1000);
-  var src = null, dst = null;
-
-  var dests = new OrderedCollection();
-  for (var i = 0; i < n; i++) {
-    src = new Variable("src" + i, i);
-    dst = new Variable("dst" + i, i);
-    dests.add(dst);
-    new StayConstraint(src, Strength.NORMAL);
-    new ScaleConstraint(src, scale, offset, dst, Strength.REQUIRED);
-  }
-
-  change(src, 17);
-  if (dst.value != 1170) alert("Projection 1 failed");
-  change(dst, 1050);
-  if (src.value != 5) alert("Projection 2 failed");
-  change(scale, 5);
-  for (var i = 0; i < n - 1; i++) {
-    if (dests.at(i).value != i * 5 + 1000)
-      alert("Projection 3 failed");
-  }
-  change(offset, 2000);
-  for (var i = 0; i < n - 1; i++) {
-    if (dests.at(i).value != i * 5 + 2000)
-      alert("Projection 4 failed");
-  }
-}
-
-function change(v, newValue) {
-  var edit = new EditConstraint(v, Strength.PREFERRED);
-  var edits = new OrderedCollection();
-  edits.add(edit);
-  var plan = planner.extractPlanFromConstraints(edits);
-  for (var i = 0; i < 10; i++) {
-    v.value = newValue;
-    plan.execute();
-  }
-  edit.destroyConstraint();
-}
-
-// Global variable holding the current planner.
-var planner = null;
-
-function deltaBlue() {
-  chainTest(100);
-  projectionTest(100);
-}
-
-class Benchmark {
-    runIteration() {
-        for (let i = 0; i < 20; ++i)
-            deltaBlue();
-    }
-}
diff --git a/Octane/earley-boyer.js b/Octane/earley-boyer.js
deleted file mode 100644
index e34f3aa..0000000
--- a/Octane/earley-boyer.js
+++ /dev/null
@@ -1,4685 +0,0 @@
-// This file is automatically generated by scheme2js, except for the
-// benchmark harness code at the beginning and end of the file.
-
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/************* GENERATED FILE - DO NOT EDIT *************/
-/*
- * To use write/prints/... the default-output port has to be set first.
- * Simply setting SC_DEFAULT_OUT and SC_ERROR_OUT to the desired values
- * should do the trick.
- * In the following example the std-out and error-port are redirected to
- * a DIV.
-function initRuntime() {
-    function escapeHTML(s) {
-	var tmp = s;
-	tmp = tmp.replace(/&/g, "&amp;");
-	tmp = tmp.replace(/</g, "&lt;");
-	tmp = tmp.replace(/>/g, "&gt;");
-	tmp = tmp.replace(/ /g, "&nbsp;");
-	tmp = tmp.replace(/\n/g, "<br />");
-	tmp = tmp.replace(/\t/g, "&nbsp;&nbsp;&nbsp;&nbsp");
-	return tmp;
-	
-    }
-
-    document.write("<div id='stdout'></div>");
-    SC_DEFAULT_OUT = new sc_GenericOutputPort(
-	function(s) {
-	    var stdout = document.getElementById('stdout');
-	    stdout.innerHTML = stdout.innerHTML + escapeHTML(s);
-	});
-    SC_ERROR_OUT = SC_DEFAULT_OUT;
-}
-*/
-
-
-function sc_print_debug() {
-    sc_print.apply(null, arguments);
-}
-/*** META ((export *js*)) */
-var sc_JS_GLOBALS = this;
-
-var __sc_LINE=-1;
-var __sc_FILE="";
-
-/*** META ((export #t)) */
-function sc_alert() {
-   var len = arguments.length;
-   var s = "";
-   var i;
-
-   for( i = 0; i < len; i++ ) {
-       s += sc_toDisplayString(arguments[ i ]);
-   }
-
-   return alert( s );
-}
-
-/*** META ((export #t)) */
-function sc_typeof( x ) {
-   return typeof x;
-}
-
-/*** META ((export #t)) */
-function sc_error() {
-    var a = [sc_jsstring2symbol("*error*")];
-    for (var i = 0; i < arguments.length; i++) {
-	a[i+1] = arguments[i];
-    }
-    throw a;
-}
-
-/*** META ((export #t)
-           (peephole (prefix "throw ")))
-*/
-function sc_raise(obj) {
-    throw obj;
-}
-
-/*** META ((export with-handler-lambda)) */
-function sc_withHandlerLambda(handler, body) {
-    try {
-	return body();
-    } catch(e) {
-	if (!e._internalException)
-	    return handler(e);
-	else
-	    throw e;
-    }
-}
-
-var sc_properties = new Object();
-
-/*** META ((export #t)) */
-function sc_putpropBang(sym, key, val) {
-    var ht = sc_properties[sym];
-    if (!ht) {
-	ht = new Object();
-	sc_properties[sym] = ht;
-    }
-    ht[key] = val;
-}
-
-/*** META ((export #t)) */
-function sc_getprop(sym, key) {
-    var ht = sc_properties[sym];
-    if (ht) {
-	if (key in ht)
-	    return ht[key];
-	else
-	    return false;
-    } else
-	return false;
-}
-
-/*** META ((export #t)) */
-function sc_rempropBang(sym, key) {
-    var ht = sc_properties[sym];
-    if (ht)
-	delete ht[key];
-}
-
-/*** META ((export #t)) */
-function sc_any2String(o) {
-    return jsstring2string(sc_toDisplayString(o));
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "==="))
-           (type bool))
-*/
-function sc_isEqv(o1, o2) {
-    return (o1 === o2);
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "==="))
-           (type bool))
-*/
-function sc_isEq(o1, o2) {
-    return (o1 === o2);
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isNumber(n) {
-    return (typeof n === "number");
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isComplex(n) {
-    return sc_isNumber(n);
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isReal(n) {
-    return sc_isNumber(n);
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isRational(n) {
-    return sc_isReal(n);
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isInteger(n) {
-    return (parseInt(n) === n);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix ", false")))
-*/
-// we don't have exact numbers...
-function sc_isExact(n) {
-    return false;
-}
-
-/*** META ((export #t)
-           (peephole (postfix ", true"))
-	   (type bool))
-*/
-function sc_isInexact(n) {
-    return true;
-}
-
-/*** META ((export = =fx =fl)
-           (type bool)
-           (peephole (infix 2 2 "===")))
-*/
-function sc_equal(x) {
-    for (var i = 1; i < arguments.length; i++)
-	if (x !== arguments[i])
-	    return false;
-    return true;
-}
-
-/*** META ((export < <fx <fl)
-           (type bool)
-           (peephole (infix 2 2 "<")))
-*/
-function sc_less(x) {
-    for (var i = 1; i < arguments.length; i++) {
-	if (x >= arguments[i])
-	    return false;
-	x = arguments[i];
-    }
-    return true;
-}
-
-/*** META ((export > >fx >fl)
-           (type bool)
-           (peephole (infix 2 2 ">")))
-*/
-function sc_greater(x, y) {
-    for (var i = 1; i < arguments.length; i++) {
-	if (x <= arguments[i])
-	    return false;
-	x = arguments[i];
-    }
-    return true;
-}
-
-/*** META ((export <= <=fx <=fl)
-           (type bool)
-           (peephole (infix 2 2 "<=")))
-*/
-function sc_lessEqual(x, y) {
-    for (var i = 1; i < arguments.length; i++) {
-	if (x > arguments[i])
-	    return false;
-	x = arguments[i];
-    }
-    return true;
-}
-
-/*** META ((export >= >=fl >=fx)
-           (type bool)
-           (peephole (infix 2 2 ">=")))
-*/
-function sc_greaterEqual(x, y) {
-    for (var i = 1; i < arguments.length; i++) {
-	if (x < arguments[i])
-	    return false;
-	x = arguments[i];
-    }
-    return true;
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "=== 0")))
-*/
-function sc_isZero(x) {
-    return (x === 0);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "> 0")))
-*/
-function sc_isPositive(x) {
-    return (x > 0);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "< 0")))
-*/
-function sc_isNegative(x) {
-    return (x < 0);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "%2===1")))
-*/
-function sc_isOdd(x) {
-    return (x % 2 === 1);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "%2===0")))
-*/
-function sc_isEven(x) {
-    return (x % 2 === 0);
-}
-
-/*** META ((export #t)) */
-var sc_max = Math.max;
-/*** META ((export #t)) */
-var sc_min = Math.min;
-
-/*** META ((export + +fx +fl)
-           (peephole (infix 0 #f "+" "0")))
-*/
-function sc_plus() {
-    var sum = 0;
-    for (var i = 0; i < arguments.length; i++)
-	sum += arguments[i];
-    return sum;
-}
-
-/*** META ((export * *fx *fl)
-           (peephole (infix 0 #f "*" "1")))
-*/
-function sc_multi() {
-    var product = 1;
-    for (var i = 0; i < arguments.length; i++)
-	product *= arguments[i];
-    return product;
-}
-
-/*** META ((export - -fx -fl)
-           (peephole (minus)))
-*/
-function sc_minus(x) {
-    if (arguments.length === 1)
-	return -x;
-    else {
-	var res = x;
-	for (var i = 1; i < arguments.length; i++)
-	    res -= arguments[i];
-	return res;
-    }
-}
-
-/*** META ((export / /fl)
-           (peephole (div)))
-*/
-function sc_div(x) {
-    if (arguments.length === 1)
-	return 1/x;
-    else {
-	var res = x;
-	for (var i = 1; i < arguments.length; i++)
-	    res /= arguments[i];
-	return res;
-    }
-}
-
-/*** META ((export #t)) */
-var sc_abs = Math.abs;
-
-/*** META ((export quotient /fx)
-           (peephole (hole 2 "parseInt(" x "/" y ")")))
-*/
-function sc_quotient(x, y) {
-    return parseInt(x / y);
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "%")))
-*/
-function sc_remainder(x, y) {
-    return x % y;
-}
-
-/*** META ((export #t)
-           (peephole (modulo)))
-*/
-function sc_modulo(x, y) {
-    var remainder = x % y;
-    // if they don't have the same sign
-    if ((remainder * y) < 0)
-	return remainder + y;
-    else
-	return remainder;
-}
-
-function sc_euclid_gcd(a, b) {
-    var temp;
-    if (a === 0) return b;
-    if (b === 0) return a;
-    if (a < 0) {a = -a;};
-    if (b < 0) {b = -b;};
-    if (b > a) {temp = a; a = b; b = temp;};
-    while (true) {
-	a %= b;
-	if(a === 0) {return b;};
-	b %= a;
-	if(b === 0) {return a;};
-    };
-    return b;
-}
-
-/*** META ((export #t)) */
-function sc_gcd() {
-    var gcd = 0;
-    for (var i = 0; i < arguments.length; i++)
-	gcd = sc_euclid_gcd(gcd, arguments[i]);
-    return gcd;
-}
-
-/*** META ((export #t)) */
-function sc_lcm() {
-    var lcm = 1;
-    for (var i = 0; i < arguments.length; i++) {
-	var f = Math.round(arguments[i] / sc_euclid_gcd(arguments[i], lcm));
-	lcm *= Math.abs(f);
-    }
-    return lcm;
-}
-
-// LIMITATION: numerator and denominator don't make sense in floating point world.
-//var SC_MAX_DECIMALS = 1000000
-//
-// function sc_numerator(x) {
-//     var rounded = Math.round(x * SC_MAX_DECIMALS);
-//     return Math.round(rounded / sc_euclid_gcd(rounded, SC_MAX_DECIMALS));
-// }
-
-// function sc_denominator(x) {
-//     var rounded = Math.round(x * SC_MAX_DECIMALS);
-//     return Math.round(SC_MAX_DECIMALS / sc_euclid_gcd(rounded, SC_MAX_DECIMALS));
-// }
-
-/*** META ((export #t)) */
-var sc_floor = Math.floor;
-/*** META ((export #t)) */
-var sc_ceiling = Math.ceil;
-/*** META ((export #t)) */
-var sc_truncate = parseInt;
-/*** META ((export #t)) */
-var sc_round = Math.round;
-
-// LIMITATION: sc_rationalize doesn't make sense in a floating point world.
-
-/*** META ((export #t)) */
-var sc_exp = Math.exp;
-/*** META ((export #t)) */
-var sc_log = Math.log;
-/*** META ((export #t)) */
-var sc_sin = Math.sin;
-/*** META ((export #t)) */
-var sc_cos = Math.cos;
-/*** META ((export #t)) */
-var sc_tan = Math.tan;
-/*** META ((export #t)) */
-var sc_asin = Math.asin;
-/*** META ((export #t)) */
-var sc_acos = Math.acos;
-/*** META ((export #t)) */
-var sc_atan = Math.atan;
-
-/*** META ((export #t)) */
-var sc_sqrt = Math.sqrt;
-/*** META ((export #t)) */
-var sc_expt = Math.pow;
-
-// LIMITATION: we don't have complex numbers.
-// LIMITATION: the following functions are hence not implemented.
-// LIMITATION: make-rectangular, make-polar, real-part, imag-part, magnitude, angle
-// LIMITATION: 2 argument atan
-
-/*** META ((export #t)
-           (peephole (id)))
-*/
-function sc_exact2inexact(x) {
-    return x;
-}
-
-/*** META ((export #t)
-           (peephole (id)))
-*/
-function sc_inexact2exact(x) {
-    return x;
-}
-
-function sc_number2jsstring(x, radix) {
-    if (radix)
-	return x.toString(radix);
-    else
-	return x.toString();
-}
-
-function sc_jsstring2number(s, radix) {
-    if (s === "") return false;
-
-    if (radix) {
-	var t = parseInt(s, radix);
-	if (!t && t !== 0) return false;
-	// verify that each char is in range. (parseInt ignores leading
-	// white and trailing chars)
-	var allowedChars = "01234567890abcdefghijklmnopqrstuvwxyz".substring(0, radix+1);
-	if ((new RegExp("^["+allowedChars+"]*$", "i")).test(s))
-	    return t;
-	else return false;
-    } else {
-	var t = +s; // does not ignore trailing chars.
-	if (!t && t !== 0) return false;
-	// simply verify that first char is not whitespace.
-	var c = s.charAt(0);
-	// if +c is 0, but the char is not "0", then we have a whitespace.
-	if (+c === 0 && c !== "0") return false;
-	return t;
-    }
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (not)))
-*/
-function sc_not(b) {
-    return b === false;
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isBoolean(b) {
-    return (b === true) || (b === false);
-}
-
-function sc_Pair(car, cdr) {
-    this.car = car;
-    this.cdr = cdr;
-}
-
-sc_Pair.prototype.toString = function() {
-    return sc_toDisplayString(this);
-};
-sc_Pair.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
-    var current = this;
-
-    var res = "(";
-
-    while(true) {
-	res += writeOrDisplay(current.car);
-	if (sc_isPair(current.cdr)) {
-	    res += " ";
-	    current = current.cdr;
-	} else if (current.cdr !== null) {
-	    res += " . " + writeOrDisplay(current.cdr);
-	    break;
-	} else // current.cdr == null
-	    break;
-    }
-	
-    res += ")";
-
-    return res;
-};
-sc_Pair.prototype.sc_toDisplayString = function() {
-    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
-};
-sc_Pair.prototype.sc_toWriteString = function() {
-    return this.sc_toWriteOrDisplayString(sc_toWriteString);
-};
-// sc_Pair.prototype.sc_toWriteCircleString in IO.js
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix " instanceof sc_Pair")))
-*/
-function sc_isPair(p) {
-    return (p instanceof sc_Pair);
-}
-
-function sc_isPairEqual(p1, p2, comp) {
-    return (comp(p1.car, p2.car) && comp(p1.cdr, p2.cdr));
-}
-
-/*** META ((export #t)
-           (peephole (hole 2 "new sc_Pair(" car ", " cdr ")")))
-*/
-function sc_cons(car, cdr) {
-    return new sc_Pair(car, cdr);
-}
-
-/*** META ((export cons*)) */
-function sc_consStar() {
-    var res = arguments[arguments.length - 1];
-    for (var i = arguments.length-2; i >= 0; i--)
-	res = new sc_Pair(arguments[i], res);
-    return res;
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".car")))
-*/
-function sc_car(p) {
-    return p.car;
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".cdr")))
-*/
-function sc_cdr(p) {
-    return p.cdr;
-}
-
-/*** META ((export #t)
-           (peephole (hole 2 p ".car = " val)))
-*/
-function sc_setCarBang(p, val) {
-    p.car = val;
-}
-
-/*** META ((export #t)
-           (peephole (hole 2 p ".cdr = " val)))
-*/
-function sc_setCdrBang(p, val) {
-    p.cdr = val;
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".car.car")))
-*/
-function sc_caar(p) { return p.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car")))
-*/
-function sc_cadr(p) { return p.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr")))
-*/
-function sc_cdar(p) { return p.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr")))
-*/
-function sc_cddr(p) { return p.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.car")))
-*/
-function sc_caaar(p) { return p.car.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.car")))
-*/
-function sc_cadar(p) { return p.car.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.car")))
-*/
-function sc_caadr(p) { return p.cdr.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.car")))
-*/
-function sc_caddr(p) { return p.cdr.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.cdr")))
-*/
-function sc_cdaar(p) { return p.car.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.cdr")))
-*/
-function sc_cdadr(p) { return p.cdr.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.cdr")))
-*/
-function sc_cddar(p) { return p.car.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.cdr")))
-*/
-function sc_cdddr(p) { return p.cdr.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.car.car")))
-*/
-function sc_caaaar(p) { return p.car.car.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.car.car")))
-*/
-function sc_caadar(p) { return p.car.cdr.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.car.car")))
-*/
-function sc_caaadr(p) { return p.cdr.car.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.car.car")))
-*/
-function sc_caaddr(p) { return p.cdr.cdr.car.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.car.cdr")))
-*/
-function sc_cdaaar(p) { return p.car.car.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.car.cdr")))
-*/
-function sc_cdadar(p) { return p.car.cdr.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.car.cdr")))
-*/
-function sc_cdaadr(p) { return p.cdr.car.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.car.cdr")))
-*/
-function sc_cdaddr(p) { return p.cdr.cdr.car.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.cdr.car")))
-*/
-function sc_cadaar(p) { return p.car.car.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.cdr.car")))
-*/
-function sc_caddar(p) { return p.car.cdr.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.cdr.car")))
-*/
-function sc_cadadr(p) { return p.cdr.car.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.cdr.car")))
-*/
-function sc_cadddr(p) { return p.cdr.cdr.cdr.car; }
-/*** META ((export #t)
-           (peephole (postfix ".car.car.cdr.cdr")))
-*/
-function sc_cddaar(p) { return p.car.car.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".car.cdr.cdr.cdr")))
-*/
-function sc_cdddar(p) { return p.car.cdr.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.car.cdr.cdr")))
-*/
-function sc_cddadr(p) { return p.cdr.car.cdr.cdr; }
-/*** META ((export #t)
-           (peephole (postfix ".cdr.cdr.cdr.cdr")))
-*/
-function sc_cddddr(p) { return p.cdr.cdr.cdr.cdr; }
-
-/*** META ((export #t)) */
-function sc_lastPair(l) {
-    if (!sc_isPair(l)) sc_error("sc_lastPair: pair expected");
-    var res = l;
-    var cdr = l.cdr;
-    while (sc_isPair(cdr)) {
-	res = cdr;
-	cdr = res.cdr;
-    }
-    return res;
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix " === null")))
-*/
-function sc_isNull(o) {
-    return (o === null);
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isList(o) {
-    var rabbit;
-    var turtle;
-
-    var rabbit = o;
-    var turtle = o;
-    while (true) {
-	if (rabbit === null ||
-	    (rabbit instanceof sc_Pair && rabbit.cdr === null))
-	    return true;  // end of list
-	else if ((rabbit instanceof sc_Pair) &&
-		 (rabbit.cdr instanceof sc_Pair)) {
-	    rabbit = rabbit.cdr.cdr;
-	    turtle = turtle.cdr;
-	    if (rabbit === turtle) return false; // cycle
-	} else
-	    return false; // not pair
-    }
-}
-
-/*** META ((export #t)) */
-function sc_list() {
-    var res = null;
-    var a = arguments;
-    for (var i = a.length-1; i >= 0; i--)
-	res = new sc_Pair(a[i], res);
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_iota(num, init) {
-   var res = null;
-   if (!init) init = 0;
-   for (var i = num - 1; i >= 0; i--)
-      res = new sc_Pair(i + init, res);
-   return res;
-}
-
-/*** META ((export #t)) */
-function sc_makeList(nbEls, fill) {
-    var res = null;
-    for (var i = 0; i < nbEls; i++)
-	res = new sc_Pair(fill, res);
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_length(l) {
-    var res = 0;
-    while (l !== null) {
-	res++;
-	l = l.cdr;
-    }
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_remq(o, l) {
-    var dummy = { cdr : null };
-    var tail = dummy;
-    while (l !== null) {
-	if (l.car !== o) {
-	    tail.cdr = sc_cons(l.car, null);
-	    tail = tail.cdr;
-	}
-	l = l.cdr;
-    }
-    return dummy.cdr;
-}
-
-/*** META ((export #t)) */
-function sc_remqBang(o, l) {
-    var dummy = { cdr : null };
-    var tail = dummy;
-    var needsAssig = true;
-    while (l !== null) {
-	if (l.car === o) {
-	    needsAssig = true;
-	} else {
-	    if (needsAssig) {
-		tail.cdr = l;
-		needsAssig = false;
-	    }
-	    tail = l;
-	}
-	l = l.cdr;
-    }
-    tail.cdr = null;
-    return dummy.cdr;
-}
-
-/*** META ((export #t)) */
-function sc_delete(o, l) {
-    var dummy = { cdr : null };
-    var tail = dummy;
-    while (l !== null) {
-	if (!sc_isEqual(l.car, o)) {
-	    tail.cdr = sc_cons(l.car, null);
-	    tail = tail.cdr;
-	}
-	l = l.cdr;
-    }
-    return dummy.cdr;
-}
-
-/*** META ((export #t)) */
-function sc_deleteBang(o, l) {
-    var dummy = { cdr : null };
-    var tail = dummy;
-    var needsAssig = true;
-    while (l !== null) {
-	if (sc_isEqual(l.car, o)) {
-	    needsAssig = true;
-	} else {
-	    if (needsAssig) {
-		tail.cdr = l;
-		needsAssig = false;
-	    }
-	    tail = l;
-	}
-	l = l.cdr;
-    }
-    tail.cdr = null;
-    return dummy.cdr;
-}
-
-function sc_reverseAppendBang(l1, l2) {
-    var res = l2;
-    while (l1 !== null) {
-	var tmp = res;
-	res = l1;
-	l1 = l1.cdr;
-	res.cdr = tmp;
-    }
-    return res;
-}
-	
-function sc_dualAppend(l1, l2) {
-    if (l1 === null) return l2;
-    if (l2 === null) return l1;
-    var rev = sc_reverse(l1);
-    return sc_reverseAppendBang(rev, l2);
-}
-
-/*** META ((export #t)) */
-function sc_append() {
-    if (arguments.length === 0)
-	return null;
-    var res = arguments[arguments.length - 1];
-    for (var i = arguments.length - 2; i >= 0; i--)
-	res = sc_dualAppend(arguments[i], res);
-    return res;
-}
-
-function sc_dualAppendBang(l1, l2) {
-    if (l1 === null) return l2;
-    if (l2 === null) return l1;
-    var tmp = l1;
-    while (tmp.cdr !== null) tmp=tmp.cdr;
-    tmp.cdr = l2;
-    return l1;
-}
-
-/*** META ((export #t)) */
-function sc_appendBang() {
-    var res = null;
-    for (var i = 0; i < arguments.length; i++)
-	res = sc_dualAppendBang(res, arguments[i]);
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_reverse(l1) {
-    var res = null;
-    while (l1 !== null) {
-	res = sc_cons(l1.car, res);
-	l1 = l1.cdr;
-    }
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_reverseBang(l) {
-    return sc_reverseAppendBang(l, null);
-}
-
-/*** META ((export #t)) */
-function sc_listTail(l, k) {
-    var res = l;
-    for (var i = 0; i < k; i++) {
-	res = res.cdr;
-    }
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_listRef(l, k) {
-    return sc_listTail(l, k).car;
-}
-
-/* // unoptimized generic versions
-function sc_memX(o, l, comp) {
-    while (l != null) {
-	if (comp(l.car, o))
-	    return l;
-	l = l.cdr;
-    }
-    return false;
-}
-function sc_memq(o, l) { return sc_memX(o, l, sc_isEq); }
-function sc_memv(o, l) { return sc_memX(o, l, sc_isEqv); }
-function sc_member(o, l) { return sc_memX(o, l, sc_isEqual); }
-*/
-
-/* optimized versions */
-/*** META ((export #t)) */
-function sc_memq(o, l) {
-    while (l !== null) {
-	if (l.car === o)
-	    return l;
-	l = l.cdr;
-    }
-    return false;
-}
-/*** META ((export #t)) */
-function sc_memv(o, l) {
-    while (l !== null) {
-	if (l.car === o)
-	    return l;
-	l = l.cdr;
-    }
-    return false;
-}
-/*** META ((export #t)) */
-function sc_member(o, l) {
-    while (l !== null) {
-	if (sc_isEqual(l.car,o))
-	    return l;
-	l = l.cdr;
-    }
-    return false;
-}
-
-/* // generic unoptimized versions
-function sc_assX(o, al, comp) {
-    while (al != null) {
-	if (comp(al.car.car, o))
-	    return al.car;
-	al = al.cdr;
-    }
-    return false;
-}
-function sc_assq(o, al) { return sc_assX(o, al, sc_isEq); }
-function sc_assv(o, al) { return sc_assX(o, al, sc_isEqv); }
-function sc_assoc(o, al) { return sc_assX(o, al, sc_isEqual); }
-*/
-// optimized versions
-/*** META ((export #t)) */
-function sc_assq(o, al) {
-    while (al !== null) {
-	if (al.car.car === o)
-	    return al.car;
-	al = al.cdr;
-    }
-    return false;
-}
-/*** META ((export #t)) */
-function sc_assv(o, al) {
-    while (al !== null) {
-	if (al.car.car === o)
-	    return al.car;
-	al = al.cdr;
-    }
-    return false;
-}
-/*** META ((export #t)) */
-function sc_assoc(o, al) {
-    while (al !== null) {
-	if (sc_isEqual(al.car.car, o))
-	    return al.car;
-	al = al.cdr;
-    }
-    return false;
-}
-
-/* can be used for mutable strings and characters */
-function sc_isCharStringEqual(cs1, cs2) { return cs1.val === cs2.val; }
-function sc_isCharStringLess(cs1, cs2) { return cs1.val < cs2.val; }
-function sc_isCharStringGreater(cs1, cs2) { return cs1.val > cs2.val; }
-function sc_isCharStringLessEqual(cs1, cs2) { return cs1.val <= cs2.val; }
-function sc_isCharStringGreaterEqual(cs1, cs2) { return cs1.val >= cs2.val; }
-function sc_isCharStringCIEqual(cs1, cs2)
-    { return cs1.val.toLowerCase() === cs2.val.toLowerCase(); }
-function sc_isCharStringCILess(cs1, cs2)
-    { return cs1.val.toLowerCase() < cs2.val.toLowerCase(); }
-function sc_isCharStringCIGreater(cs1, cs2)
-    { return cs1.val.toLowerCase() > cs2.val.toLowerCase(); }
-function sc_isCharStringCILessEqual(cs1, cs2)
-    { return cs1.val.toLowerCase() <= cs2.val.toLowerCase(); }
-function sc_isCharStringCIGreaterEqual(cs1, cs2)
-    { return cs1.val.toLowerCase() >= cs2.val.toLowerCase(); }
-
-
-
-
-function sc_Char(c) {
-    var cached = sc_Char.lazy[c];
-    if (cached)
-	return cached;
-    this.val = c;
-    sc_Char.lazy[c] = this;
-    // add return, so FF does not complain.
-    return undefined;
-}
-sc_Char.lazy = new Object();
-// thanks to Eric
-sc_Char.char2readable = {
-    "\000": "#\\null",
-    "\007": "#\\bell",
-    "\010": "#\\backspace",
-    "\011": "#\\tab",
-    "\012": "#\\newline",
-    "\014": "#\\page",
-    "\015": "#\\return",
-    "\033": "#\\escape",
-    "\040": "#\\space",
-    "\177": "#\\delete",
-
-  /* poeticless names */
-    "\001": "#\\soh",
-    "\002": "#\\stx",
-    "\003": "#\\etx",
-    "\004": "#\\eot",
-    "\005": "#\\enq",
-    "\006": "#\\ack",
-
-    "\013": "#\\vt",
-    "\016": "#\\so",
-    "\017": "#\\si",
-
-    "\020": "#\\dle",
-    "\021": "#\\dc1",
-    "\022": "#\\dc2",
-    "\023": "#\\dc3",
-    "\024": "#\\dc4",
-    "\025": "#\\nak",
-    "\026": "#\\syn",
-    "\027": "#\\etb",
-
-    "\030": "#\\can",
-    "\031": "#\\em",
-    "\032": "#\\sub",
-    "\033": "#\\esc",
-    "\034": "#\\fs",
-    "\035": "#\\gs",
-    "\036": "#\\rs",
-    "\037": "#\\us"};
-
-sc_Char.readable2char = {
-    "null": "\000",
-    "bell": "\007",
-    "backspace": "\010",
-    "tab": "\011",
-    "newline": "\012",
-    "page": "\014",
-    "return": "\015",
-    "escape": "\033",
-    "space": "\040",
-    "delete": "\000",
-    "soh": "\001",
-    "stx": "\002",
-    "etx": "\003",
-    "eot": "\004",
-    "enq": "\005",
-    "ack": "\006",
-    "bel": "\007",
-    "bs": "\010",
-    "ht": "\011",
-    "nl": "\012",
-    "vt": "\013",
-    "np": "\014",
-    "cr": "\015",
-    "so": "\016",
-    "si": "\017",
-    "dle": "\020",
-    "dc1": "\021",
-    "dc2": "\022",
-    "dc3": "\023",
-    "dc4": "\024",
-    "nak": "\025",
-    "syn": "\026",
-    "etb": "\027",
-    "can": "\030",
-    "em": "\031",
-    "sub": "\032",
-    "esc": "\033",
-    "fs": "\034",
-    "gs": "\035",
-    "rs": "\036",
-    "us": "\037",
-    "sp": "\040",
-    "del": "\177"};
-
-sc_Char.prototype.toString = function() {
-    return this.val;
-};
-// sc_toDisplayString == toString
-sc_Char.prototype.sc_toWriteString = function() {
-    var entry = sc_Char.char2readable[this.val];
-    if (entry)
-	return entry;
-    else
-	return "#\\" + this.val;
-};
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix "instanceof sc_Char")))
-*/
-function sc_isChar(c) {
-    return (c instanceof sc_Char);
-}
-
-/*** META ((export char=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val === " c2 ".val")))
-*/
-var sc_isCharEqual = sc_isCharStringEqual;
-/*** META ((export char<?)
-           (type bool)
-           (peephole (hole 2 c1 ".val < " c2 ".val")))
-*/
-var sc_isCharLess = sc_isCharStringLess;
-/*** META ((export char>?)
-           (type bool)
-           (peephole (hole 2 c1 ".val > " c2 ".val")))
-*/
-var sc_isCharGreater = sc_isCharStringGreater;
-/*** META ((export char<=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val <= " c2 ".val")))
-*/
-var sc_isCharLessEqual = sc_isCharStringLessEqual;
-/*** META ((export char>=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val >= " c2 ".val")))
-*/
-var sc_isCharGreaterEqual = sc_isCharStringGreaterEqual;
-/*** META ((export char-ci=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val.toLowerCase() === " c2 ".val.toLowerCase()")))
-*/
-var sc_isCharCIEqual = sc_isCharStringCIEqual;
-/*** META ((export char-ci<?)
-           (type bool)
-           (peephole (hole 2 c1 ".val.toLowerCase() < " c2 ".val.toLowerCase()")))
-*/
-var sc_isCharCILess = sc_isCharStringCILess;
-/*** META ((export char-ci>?)
-           (type bool)
-           (peephole (hole 2 c1 ".val.toLowerCase() > " c2 ".val.toLowerCase()")))
-*/
-var sc_isCharCIGreater = sc_isCharStringCIGreater;
-/*** META ((export char-ci<=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val.toLowerCase() <= " c2 ".val.toLowerCase()")))
-*/
-var sc_isCharCILessEqual = sc_isCharStringCILessEqual;
-/*** META ((export char-ci>=?)
-           (type bool)
-           (peephole (hole 2 c1 ".val.toLowerCase() >= " c2 ".val.toLowerCase()")))
-*/
-var sc_isCharCIGreaterEqual = sc_isCharStringCIGreaterEqual;
-
-var SC_NUMBER_CLASS = "0123456789";
-var SC_WHITESPACE_CLASS = ' \r\n\t\f';
-var SC_LOWER_CLASS = 'abcdefghijklmnopqrstuvwxyz';
-var SC_UPPER_CLASS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
-
-function sc_isCharOfClass(c, cl) { return (cl.indexOf(c) != -1); }
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isCharAlphabetic(c)
-    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS) ||
-	  sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
-/*** META ((export #t)
-           (type bool)
-           (peephole (hole 1 "SC_NUMBER_CLASS.indexOf(" c ".val) != -1")))
-*/
-function sc_isCharNumeric(c)
-    { return sc_isCharOfClass(c.val, SC_NUMBER_CLASS); }
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isCharWhitespace(c) {
-    var tmp = c.val;
-    return tmp === " " || tmp === "\r" || tmp === "\n" || tmp === "\t" || tmp === "\f";
-}
-/*** META ((export #t)
-           (type bool)
-           (peephole (hole 1 "SC_UPPER_CLASS.indexOf(" c ".val) != -1")))
-*/
-function sc_isCharUpperCase(c)
-    { return sc_isCharOfClass(c.val, SC_UPPER_CLASS); }
-/*** META ((export #t)
-           (type bool)
-           (peephole (hole 1 "SC_LOWER_CLASS.indexOf(" c ".val) != -1")))
-*/
-function sc_isCharLowerCase(c)
-    { return sc_isCharOfClass(c.val, SC_LOWER_CLASS); }
-
-/*** META ((export #t)
-           (peephole (postfix ".val.charCodeAt(0)")))
-*/
-function sc_char2integer(c)
-    { return c.val.charCodeAt(0); }
-/*** META ((export #t)
-           (peephole (hole 1 "new sc_Char(String.fromCharCode(" n "))")))
-*/
-function sc_integer2char(n)
-    { return new sc_Char(String.fromCharCode(n)); }
-
-/*** META ((export #t)
-           (peephole (hole 1 "new sc_Char(" c ".val.toUpperCase())")))
-*/
-function sc_charUpcase(c)
-    { return new sc_Char(c.val.toUpperCase()); }
-/*** META ((export #t)
-           (peephole (hole 1 "new sc_Char(" c ".val.toLowerCase())")))
-*/
-function sc_charDowncase(c)
-    { return new sc_Char(c.val.toLowerCase()); }
-
-function sc_makeJSStringOfLength(k, c) {
-    var fill;
-    if (c === undefined)
-	fill = " ";
-    else
-	fill = c;
-    var res = "";
-    var len = 1;
-    // every round doubles the size of fill.
-    while (k >= len) {
-	if (k & len)
-	    res = res.concat(fill);
-	fill = fill.concat(fill);
-	len *= 2;
-    }
-    return res;
-}
-
-function sc_makejsString(k, c) {
-    var fill;
-    if (c)
-	fill = c.val;
-    else
-	fill = " ";
-    return sc_makeJSStringOfLength(k, fill);
-}
-
-function sc_jsstring2list(s) {
-    var res = null;
-    for (var i = s.length - 1; i >= 0; i--)
-	res = sc_cons(new sc_Char(s.charAt(i)), res);
-    return res;
-}
-
-function sc_list2jsstring(l) {
-    var a = new Array();
-    while(l !== null) {
-	a.push(l.car.val);
-	l = l.cdr;
-    }
-    return "".concat.apply("", a);
-}
-
-var sc_Vector = Array;
-
-sc_Vector.prototype.sc_toWriteOrDisplayString = function(writeOrDisplay) {
-    if (this.length === 0) return "#()";
-
-    var res = "#(" + writeOrDisplay(this[0]);
-    for (var i = 1; i < this.length; i++)
-	res += " " + writeOrDisplay(this[i]);
-    res += ")";
-    return res;
-};
-sc_Vector.prototype.sc_toDisplayString = function() {
-    return this.sc_toWriteOrDisplayString(sc_toDisplayString);
-};
-sc_Vector.prototype.sc_toWriteString = function() {
-    return this.sc_toWriteOrDisplayString(sc_toWriteString);
-};
-
-/*** META ((export vector? array?)
-           (type bool)
-           (peephole (postfix " instanceof sc_Vector")))
-*/
-function sc_isVector(v) {
-    return (v instanceof sc_Vector);
-}
-
-// only applies to vectors
-function sc_isVectorEqual(v1, v2, comp) {
-    if (v1.length !== v2.length) return false;
-    for (var i = 0; i < v1.length; i++)
-	if (!comp(v1[i], v2[i])) return false;
-    return true;
-}
-
-/*** META ((export make-vector make-array)) */
-function sc_makeVector(size, fill) {
-    var a = new sc_Vector(size);
-    if (fill !== undefined)
-	sc_vectorFillBang(a, fill);
-    return a;
-}
-
-/*** META ((export vector array)
-           (peephole (vector)))
-*/
-function sc_vector() {
-    var a = new sc_Vector();
-    for (var i = 0; i < arguments.length; i++)
-	a.push(arguments[i]);
-    return a;
-}
-
-/*** META ((export vector-length array-length)
-           (peephole (postfix ".length")))
-*/
-function sc_vectorLength(v) {
-    return v.length;
-}
-
-/*** META ((export vector-ref array-ref)
-           (peephole (hole 2 v "[" pos "]")))
-*/
-function sc_vectorRef(v, pos) {
-    return v[pos];
-}
-
-/*** META ((export vector-set! array-set!)
-           (peephole (hole 3 v "[" pos "] = " val)))
-*/
-function sc_vectorSetBang(v, pos, val) {
-    v[pos] = val;
-}
-
-/*** META ((export vector->list array->list)) */
-function sc_vector2list(a) {
-    var res = null;
-    for (var i = a.length-1; i >= 0; i--)
-	res = sc_cons(a[i], res);
-    return res;
-}
-
-/*** META ((export list->vector list->array)) */
-function sc_list2vector(l) {
-    var a = new sc_Vector();
-    while(l !== null) {
-	a.push(l.car);
-	l = l.cdr;
-    }
-    return a;
-}
-
-/*** META ((export vector-fill! array-fill!)) */
-function sc_vectorFillBang(a, fill) {
-    for (var i = 0; i < a.length; i++)
-	a[i] = fill;
-}
-
-
-/*** META ((export #t)) */
-function sc_copyVector(a, len) {
-    if (len <= a.length)
-	return a.slice(0, len);
-    else {
-	var tmp = a.concat();
-	tmp.length = len;
-	return tmp;
-    }
-}
-
-/*** META ((export #t)
-           (peephole (hole 3 a ".slice(" start "," end ")")))
-*/
-function sc_vectorCopy(a, start, end) {
-    return a.slice(start, end);
-}
-
-/*** META ((export #t)) */
-function sc_vectorCopyBang(target, tstart, source, sstart, send) {
-    if (!sstart) sstart = 0;
-    if (!send) send = source.length;
-
-    // if target == source we don't want to overwrite not yet copied elements.
-    if (tstart <= sstart) {
-	for (var i = tstart, j = sstart; j < send; i++, j++) {
-	    target[i] = source[j];
-	}
-    } else {
-	var diff = send - sstart;
-	for (var i = tstart + diff - 1, j = send - 1;
-	     j >= sstart;
-	     i--, j--) {
-	    target[i] = source[j];
-	}
-    }
-    return target;
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (hole 1 "typeof " o " === 'function'")))
-*/
-function sc_isProcedure(o) {
-    return (typeof o === "function");
-}
-
-/*** META ((export #t)) */
-function sc_apply(proc) {
-    var args = new Array();
-    // first part of arguments are not in list-form.
-    for (var i = 1; i < arguments.length - 1; i++)
-	args.push(arguments[i]);
-    var l = arguments[arguments.length - 1];
-    while (l !== null) {
-	args.push(l.car);
-	l = l.cdr;
-    }
-    return proc.apply(null, args);
-}
-
-/*** META ((export #t)) */
-function sc_map(proc, l1) {
-    if (l1 === undefined)
-	return null;
-    // else
-    var nbApplyArgs = arguments.length - 1;
-    var applyArgs = new Array(nbApplyArgs);
-    var revres = null;
-    while (l1 !== null) {
-	for (var i = 0; i < nbApplyArgs; i++) {
-	    applyArgs[i] = arguments[i + 1].car;
-	    arguments[i + 1] = arguments[i + 1].cdr;
-	}
-	revres = sc_cons(proc.apply(null, applyArgs), revres);
-    }
-    return sc_reverseAppendBang(revres, null);
-}
-
-/*** META ((export #t)) */
-function sc_mapBang(proc, l1) {
-    if (l1 === undefined)
-	return null;
-    // else
-    var l1_orig = l1;
-    var nbApplyArgs = arguments.length - 1;
-    var applyArgs = new Array(nbApplyArgs);
-    while (l1 !== null) {
-	var tmp = l1;
-	for (var i = 0; i < nbApplyArgs; i++) {
-	    applyArgs[i] = arguments[i + 1].car;
-	    arguments[i + 1] = arguments[i + 1].cdr;
-	}
-	tmp.car = proc.apply(null, applyArgs);
-    }
-    return l1_orig;
-}
-
-/*** META ((export #t)) */
-function sc_forEach(proc, l1) {
-    if (l1 === undefined)
-	return undefined;
-    // else
-    var nbApplyArgs = arguments.length - 1;
-    var applyArgs = new Array(nbApplyArgs);
-    while (l1 !== null) {
-	for (var i = 0; i < nbApplyArgs; i++) {
-	    applyArgs[i] = arguments[i + 1].car;
-	    arguments[i + 1] = arguments[i + 1].cdr;
-	}
-	proc.apply(null, applyArgs);
-    }
-    // add return so FF does not complain.
-    return undefined;
-}
-
-/*** META ((export #t)) */
-function sc_filter(proc, l1) {
-    var dummy = { cdr : null };
-    var tail = dummy;
-    while (l1 !== null) {
-	if (proc(l1.car) !== false) {
-	    tail.cdr = sc_cons(l1.car, null);
-	    tail = tail.cdr;
-	}
-	l1 = l1.cdr;
-    }
-    return dummy.cdr;
-}
-
-/*** META ((export #t)) */
-function sc_filterBang(proc, l1) {
-    var head = sc_cons("dummy", l1);
-    var it = head;
-    var next = l1;
-    while (next !== null) {
-        if (proc(next.car) !== false) {
-	    it.cdr = next
-	    it = next;
-	}
-	next = next.cdr;
-    }
-    it.cdr = null;
-    return head.cdr;
-}
-
-function sc_filterMap1(proc, l1) {
-    var revres = null;
-    while (l1 !== null) {
-        var tmp = proc(l1.car)
-        if (tmp !== false) revres = sc_cons(tmp, revres);
-        l1 = l1.cdr;
-    }
-    return sc_reverseAppendBang(revres, null);
-}
-function sc_filterMap2(proc, l1, l2) {
-    var revres = null;
-    while (l1 !== null) {
-        var tmp = proc(l1.car, l2.car);
-        if(tmp !== false) revres = sc_cons(tmp, revres);
-	l1 = l1.cdr;
-	l2 = l2.cdr
-    }
-    return sc_reverseAppendBang(revres, null);
-}
-
-/*** META ((export #t)) */
-function sc_filterMap(proc, l1, l2, l3) {
-    if (l2 === undefined)
-	return sc_filterMap1(proc, l1);
-    else if (l3 === undefined)
-	return sc_filterMap2(proc, l1, l2);
-    // else
-    var nbApplyArgs = arguments.length - 1;
-    var applyArgs = new Array(nbApplyArgs);
-    var revres = null;
-    while (l1 !== null) {
-	for (var i = 0; i < nbApplyArgs; i++) {
-	    applyArgs[i] = arguments[i + 1].car;
-	    arguments[i + 1] = arguments[i + 1].cdr;
-	}
-	var tmp = proc.apply(null, applyArgs);
-	if(tmp !== false) revres = sc_cons(tmp, revres);
-    }
-    return sc_reverseAppendBang(revres, null);
-}
-
-/*** META ((export #t)) */
-function sc_any(proc, l) {
-    var revres = null;
-    while (l !== null) {
-        var tmp = proc(l.car);
-        if(tmp !== false) return tmp;
-	l = l.cdr;
-    }
-    return false;
-}
-
-/*** META ((export any?)
-           (peephole (hole 2 "sc_any(" proc "," l ") !== false")))
-*/
-function sc_anyPred(proc, l) {
-    return sc_any(proc, l)!== false;
-}
-
-/*** META ((export #t)) */
-function sc_every(proc, l) {
-    var revres = null;
-    var tmp = true;
-    while (l !== null) {
-        tmp = proc(l.car);
-        if (tmp === false) return false;
-	l = l.cdr;
-    }
-    return tmp;
-}
-
-/*** META ((export every?)
-           (peephole (hole 2 "sc_every(" proc "," l ") !== false")))
-*/
-function sc_everyPred(proc, l) {
-    var tmp = sc_every(proc, l);
-    if (tmp !== false) return true;
-    return false;
-}
-
-/*** META ((export #t)
-           (peephole (postfix "()")))
-*/
-function sc_force(o) {
-    return o();
-}
-
-/*** META ((export #t)) */
-function sc_makePromise(proc) {
-    var isResultReady = false;
-    var result = undefined;
-    return function() {
-	if (!isResultReady) {
-	    var tmp = proc();
-	    if (!isResultReady) {
-		isResultReady = true;
-		result = tmp;
-	    }
-	}
-	return result;
-    };
-}
-
-function sc_Values(values) {
-    this.values = values;
-}
-
-/*** META ((export #t)
-           (peephole (values)))
-*/
-function sc_values() {
-    if (arguments.length === 1)
-	return arguments[0];
-    else
-	return new sc_Values(arguments);
-}
-
-/*** META ((export #t)) */
-function sc_callWithValues(producer, consumer) {
-    var produced = producer();
-    if (produced instanceof sc_Values)
-	return consumer.apply(null, produced.values);
-    else
-	return consumer(produced);
-}
-
-/*** META ((export #t)) */
-function sc_dynamicWind(before, thunk, after) {
-    before();
-    try {
-	var res = thunk();
-	return res;
-    } finally {
-	after();
-    }
-}
-
-
-// TODO: eval/scheme-report-environment/null-environment/interaction-environment
-
-// LIMITATION: 'load' doesn't exist without files.
-// LIMITATION: transcript-on/transcript-off doesn't exist without files.
-
-
-function sc_Struct(name) {
-    this.name = name;
-}
-sc_Struct.prototype.sc_toDisplayString = function() {
-    return "#<struct" + sc_hash(this) + ">";
-};
-sc_Struct.prototype.sc_toWriteString = sc_Struct.prototype.sc_toDisplayString;
-
-/*** META ((export #t)
-           (peephole (hole 1 "new sc_Struct(" name ")")))
-*/
-function sc_makeStruct(name) {
-    return new sc_Struct(name);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix " instanceof sc_Struct")))
-*/
-function sc_isStruct(o) {
-    return (o instanceof sc_Struct);
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (hole 2 "(" 1 " instanceof sc_Struct) && ( " 1 ".name === " 0 ")")))
-*/
-function sc_isStructNamed(name, s) {
-    return ((s instanceof sc_Struct) && (s.name === name));
-}
-
-/*** META ((export struct-field)
-           (peephole (hole 3 0 "[" 2 "]")))
-*/
-function sc_getStructField(s, name, field) {
-    return s[field];
-}
-
-/*** META ((export struct-field-set!)
-           (peephole (hole 4 0 "[" 2 "] = " 3)))
-*/
-function sc_setStructFieldBang(s, name, field, val) {
-    s[field] = val;
-}
-
-/*** META ((export #t)
-           (peephole (prefix "~")))
-*/
-function sc_bitNot(x) {
-    return ~x;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "&")))
-*/
-function sc_bitAnd(x, y) {
-    return x & y;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "|")))
-*/
-function sc_bitOr(x, y) {
-    return x | y;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "^")))
-*/
-function sc_bitXor(x, y) {
-    return x ^ y;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 "<<")))
-*/
-function sc_bitLsh(x, y) {
-    return x << y;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 ">>")))
-*/
-function sc_bitRsh(x, y) {
-    return x >> y;
-}
-
-/*** META ((export #t)
-           (peephole (infix 2 2 ">>>")))
-*/
-function sc_bitUrsh(x, y) {
-    return x >>> y;
-}
-
-/*** META ((export js-field js-property)
-           (peephole (hole 2 o "[" field "]")))
-*/
-function sc_jsField(o, field) {
-    return o[field];
-}
-
-/*** META ((export js-field-set! js-property-set!)
-           (peephole (hole 3 o "[" field "] = " val)))
-*/
-function sc_setJsFieldBang(o, field, val) {
-    return o[field] = val;
-}
-
-/*** META ((export js-field-delete! js-property-delete!)
-           (peephole (hole 2 "delete" o "[" field "]")))
-*/
-function sc_deleteJsFieldBang(o, field) {
-    delete o[field];
-}
-
-/*** META ((export #t)
-           (peephole (jsCall)))
-*/
-function sc_jsCall(o, fun) {
-    var args = new Array();
-    for (var i = 2; i < arguments.length; i++)
-	args[i-2] = arguments[i];
-    return fun.apply(o, args);
-}
-
-/*** META ((export #t)
-           (peephole (jsMethodCall)))
-*/
-function sc_jsMethodCall(o, field) {
-    var args = new Array();
-    for (var i = 2; i < arguments.length; i++)
-	args[i-2] = arguments[i];
-    return o[field].apply(o, args);
-}
-
-/*** META ((export new js-new)
-           (peephole (jsNew)))
-*/
-function sc_jsNew(c) {
-    var evalStr = "new c(";
-    evalStr +=arguments.length > 1? "arguments[1]": "";
-    for (var i = 2; i < arguments.length; i++)
-	evalStr += ", arguments[" + i + "]";
-    evalStr +=")";
-    return eval(evalStr);
-}
-
-// ======================== RegExp ====================
-/*** META ((export #t)) */
-function sc_pregexp(re) {
-    return new RegExp(sc_string2jsstring(re));
-}
-
-/*** META ((export #t)) */
-function sc_pregexpMatch(re, s) {
-    var reg = (re instanceof RegExp) ? re : sc_pregexp(re);
-    var tmp = reg.exec(sc_string2jsstring(s));
-
-    if (tmp == null) return false;
-
-    var res = null;
-    for (var i = tmp.length-1; i >= 0; i--) {
-	if (tmp[i] !== null) {
-	    res = sc_cons(sc_jsstring2string(tmp[i]), res);
-	} else {
-	    res = sc_cons(false, res);
-	}
-    }
-    return res;
-}
-
-/*** META ((export #t)) */
-function sc_pregexpReplace(re, s1, s2) {
-   var reg;
-   var jss1 = sc_string2jsstring(s1);
-   var jss2 = sc_string2jsstring(s2);
-
-   if (re instanceof RegExp) {
-       if (re.global)
-	   reg = re;
-       else
-	   reg = new RegExp(re.source);
-   } else {
-       reg = new RegExp(sc_string2jsstring(re));
-   }
-
-   return jss1.replace(reg, jss2);
-}
-
-/*** META ((export pregexp-replace*)) */
-function sc_pregexpReplaceAll(re, s1, s2) {
-   var reg;
-   var jss1 = sc_string2jsstring(s1);
-   var jss2 = sc_string2jsstring(s2);
-
-   if (re instanceof RegExp) {
-      if (re.global)
-	  reg = re;
-      else
-	  reg = new RegExp(re.source, "g");
-   } else {
-       reg = new RegExp(sc_string2jsstring(re), "g");
-   }
-
-   return jss1.replace(reg, jss2);
-}
-
-/*** META ((export #t)) */
-function sc_pregexpSplit(re, s) {
-   var reg = ((re instanceof RegExp) ?
-	      re :
-	      new RegExp(sc_string2jsstring(re)));
-   var jss = sc_string2jsstring(s);
-   var tmp = jss.split(reg);
-
-   if (tmp == null) return false;
-
-   return sc_vector2list(tmp);
-}
-
-
-/* =========================================================================== */
-/* Other library stuff */
-/* =========================================================================== */
-
-/*** META ((export #t)
-           (peephole (hole 1 "Math.floor(Math.random()*" 'n ")")))
-*/
-function sc_random(n) {
-    return Math.floor(Math.random()*n);
-}
-
-/*** META ((export current-date)
-           (peephole (hole 0 "new Date()")))
-*/
-function sc_currentDate() {
-   return new Date();
-}
-
-function sc_Hashtable() {
-}
-sc_Hashtable.prototype.toString = function() {
-    return "#{%hashtable}";
-};
-// sc_toWriteString == sc_toDisplayString == toString
-
-function sc_HashtableElement(key, val) {
-    this.key = key;
-    this.val = val;
-}
-
-/*** META ((export #t)
-           (peephole (hole 0 "new sc_Hashtable()")))
-*/
-function sc_makeHashtable() {
-    return new sc_Hashtable();
-}
-
-/*** META ((export #t)) */
-function sc_hashtablePutBang(ht, key, val) {
-    var hash = sc_hash(key);
-    ht[hash] = new sc_HashtableElement(key, val);
-}
-
-/*** META ((export #t)) */
-function sc_hashtableGet(ht, key) {
-    var hash = sc_hash(key);
-    if (hash in ht)
-	return ht[hash].val;
-    else
-	return false;
-}
-
-/*** META ((export #t)) */
-function sc_hashtableForEach(ht, f) {
-    for (var v in ht) {
-	if (ht[v] instanceof sc_HashtableElement)
-	    f(ht[v].key, ht[v].val);
-    }
-}
-
-/*** META ((export hashtable-contains?)
-           (peephole (hole 2 "sc_hash(" 1 ") in " 0)))
-*/
-function sc_hashtableContains(ht, key) {
-    var hash = sc_hash(key);
-    if (hash in ht)
-	return true;
-    else
-	return false;
-}
-
-var SC_HASH_COUNTER = 0;
-
-function sc_hash(o) {
-    if (o === null)
-	return "null";
-    else if (o === undefined)
-	return "undefined";
-    else if (o === true)
-	return "true";
-    else if (o === false)
-	return "false";
-    else if (typeof o === "number")
-	return "num-" + o;
-    else if (typeof o === "string")
-	return "jsstr-" + o;
-    else if (o.sc_getHash)
-	return o.sc_getHash();
-    else
-	return sc_counterHash.call(o);
-}
-function sc_counterHash() {
-    if (!this.sc_hash) {
-	this.sc_hash = "hash-" + SC_HASH_COUNTER;
-	SC_HASH_COUNTER++;
-    }
-    return this.sc_hash;
-}
-
-function sc_Trampoline(args, maxTailCalls) {
-    this['__trampoline return__'] = true;
-    this.args = args;
-    this.MAX_TAIL_CALLs = maxTailCalls;
-}
-// TODO: call/cc stuff
-sc_Trampoline.prototype.restart = function() {
-    var o = this;
-    while (true) {
-	// set both globals.
-	SC_TAIL_OBJECT.calls = o.MAX_TAIL_CALLs-1;
-	var fun = o.args.callee;
-	var res = fun.apply(SC_TAIL_OBJECT, o.args);
-	if (res instanceof sc_Trampoline)
-	    o = res;
-	else
-	    return res;
-    }
-}
-
-/*** META ((export bind-exit-lambda)) */
-function sc_bindExitLambda(proc) {
-    var escape_obj = new sc_BindExitException();
-    var escape = function(res) {
-	escape_obj.res = res;
-	throw escape_obj;
-    };
-    try {
-	return proc(escape);
-    } catch(e) {
-	if (e === escape_obj) {
-	    return e.res;
-	}
-	throw e;
-    }
-}
-function sc_BindExitException() {
-    this._internalException = true;
-}
-
-var SC_SCM2JS_GLOBALS = new Object();
-
-// default tail-call depth.
-// normally the program should set it again. but just in case...
-var SC_TAIL_OBJECT = new Object();
-SC_SCM2JS_GLOBALS.TAIL_OBJECT = SC_TAIL_OBJECT;
-// ======================== I/O =======================
-
-/*------------------------------------------------------------------*/
-
-function sc_EOF() {
-}
-var SC_EOF_OBJECT = new sc_EOF();
-
-function sc_Port() {
-}
-
-/* --------------- Input ports -------------------------------------*/
-
-function sc_InputPort() {
-}
-sc_InputPort.prototype = new sc_Port();
-
-sc_InputPort.prototype.peekChar = function() {
-    if (!("peeked" in this))
-	this.peeked = this.getNextChar();
-    return this.peeked;
-}
-sc_InputPort.prototype.readChar = function() {
-    var tmp = this.peekChar();
-    delete this.peeked;
-    return tmp;
-}
-sc_InputPort.prototype.isCharReady = function() {
-    return true;
-}
-sc_InputPort.prototype.close = function() {
-    // do nothing
-}
-
-/* .............. String port ..........................*/
-function sc_ErrorInputPort() {
-};
-sc_ErrorInputPort.prototype = new sc_InputPort();
-sc_ErrorInputPort.prototype.getNextChar = function() {
-    throw "can't read from error-port.";
-};
-sc_ErrorInputPort.prototype.isCharReady = function() {
-    return false;
-};
-
-
-/* .............. String port ..........................*/
-
-function sc_StringInputPort(jsStr) {
-    // we are going to do some charAts on the str.
-    // instead of recreating all the time a String-object, we
-    // create one in the beginning. (not sure, if this is really an optim)
-    this.str = new String(jsStr);
-    this.pos = 0;
-}
-sc_StringInputPort.prototype = new sc_InputPort();
-sc_StringInputPort.prototype.getNextChar = function() {
-    if (this.pos >= this.str.length)
-	return SC_EOF_OBJECT;
-    return this.str.charAt(this.pos++);
-};
-
-/* ------------- Read and other lib-funs  -------------------------------*/
-function sc_Token(type, val, pos) {
-    this.type = type;
-    this.val = val;
-    this.pos = pos;
-}
-sc_Token.EOF = 0/*EOF*/;
-sc_Token.OPEN_PAR = 1/*OPEN_PAR*/;
-sc_Token.CLOSE_PAR = 2/*CLOSE_PAR*/;
-sc_Token.OPEN_BRACE = 3/*OPEN_BRACE*/;
-sc_Token.CLOSE_BRACE = 4/*CLOSE_BRACE*/;
-sc_Token.OPEN_BRACKET = 5/*OPEN_BRACKET*/;
-sc_Token.CLOSE_BRACKET = 6/*CLOSE_BRACKET*/;
-sc_Token.WHITESPACE = 7/*WHITESPACE*/;
-sc_Token.QUOTE = 8/*QUOTE*/;
-sc_Token.ID = 9/*ID*/;
-sc_Token.DOT = 10/*DOT*/;
-sc_Token.STRING = 11/*STRING*/;
-sc_Token.NUMBER = 12/*NUMBER*/;
-sc_Token.ERROR = 13/*ERROR*/;
-sc_Token.VECTOR_BEGIN = 14/*VECTOR_BEGIN*/;
-sc_Token.TRUE = 15/*TRUE*/;
-sc_Token.FALSE = 16/*FALSE*/;
-sc_Token.UNSPECIFIED = 17/*UNSPECIFIED*/;
-sc_Token.REFERENCE = 18/*REFERENCE*/;
-sc_Token.STORE = 19/*STORE*/;
-sc_Token.CHAR = 20/*CHAR*/;
-
-var SC_ID_CLASS = SC_LOWER_CLASS + SC_UPPER_CLASS + "!$%*+-./:<=>?@^_~";
-function sc_Tokenizer(port) {
-    this.port = port;
-}
-sc_Tokenizer.prototype.peekToken = function() {
-    if (this.peeked)
-	return this.peeked;
-    var newToken = this.nextToken();
-    this.peeked = newToken;
-    return newToken;
-};
-sc_Tokenizer.prototype.readToken = function() {
-    var tmp = this.peekToken();
-    delete this.peeked;
-    return tmp;
-};
-sc_Tokenizer.prototype.nextToken = function() {
-    var port = this.port;
-
-    function isNumberChar(c) {
-	return (c >= "0" && c <= "9");
-    };
-    function isIdOrNumberChar(c) {
-	return SC_ID_CLASS.indexOf(c) != -1 || // ID-char
-	    (c >= "0" && c <= "9");
-    }
-    function isWhitespace(c) {
-	return c === " " || c === "\r" || c === "\n" || c === "\t" || c === "\f";
-    };
-    function isWhitespaceOrEOF(c) {
-	return isWhitespace(c) || c === SC_EOF_OBJECT;
-    };
-
-    function readString() {
-	res = "";
-	while (true) {
-	    var c = port.readChar();
-	    switch (c) {
-	    case '"':
-		return new sc_Token(11/*STRING*/, res);
-	    case "\\":
-		var tmp = port.readChar();
-		switch (tmp) {
-		case '0': res += "\0"; break;
-		case 'a': res += "\a"; break;
-		case 'b': res += "\b"; break;
-		case 'f': res += "\f"; break;
-		case 'n': res += "\n"; break;
-		case 'r': res += "\r"; break;
-		case 't': res += "\t"; break;
-		case 'v': res += "\v"; break;
-		case '"': res += '"'; break;
-		case '\\': res += '\\'; break;
-		case 'x':
-		    /* hexa-number */
-		    var nb = 0;
-		    while (true) {
-			var hexC = port.peekChar();
-			if (hexC >= '0' && hexC <= '9') {
-			    port.readChar();
-			    nb = nb * 16 + hexC.charCodeAt(0) - '0'.charCodeAt(0);
-			} else if (hexC >= 'a' && hexC <= 'f') {
-			    port.readChar();
-			    nb = nb * 16 + hexC.charCodeAt(0) - 'a'.charCodeAt(0);
-			} else if (hexC >= 'A' && hexC <= 'F') {
-			    port.readChar();
-			    nb = nb * 16 + hexC.charCodeAt(0) - 'A'.charCodeAt(0);
-			} else {
-			    // next char isn't part of hex.
-			    res += String.fromCharCode(nb);
-			    break;
-			}
-		    }
-		    break;
-		default:
-		    if (tmp === SC_EOF_OBJECT) {
-			return new sc_Token(13/*ERROR*/, "unclosed string-literal" + res);
-		    }
-		    res += tmp;
-		}
-		break;
-	    default:
-		if (c === SC_EOF_OBJECT) {
-		    return new sc_Token(13/*ERROR*/, "unclosed string-literal" + res);
-		}
-		res += c;
-	    }
-	}
-    };
-    function readIdOrNumber(firstChar) {
-	var res = firstChar;
-	while (isIdOrNumberChar(port.peekChar()))
-	    res += port.readChar();
-	if (isNaN(res))
-	    return new sc_Token(9/*ID*/, res);
-	else
-	    return new sc_Token(12/*NUMBER*/, res - 0);
-    };
-
-    function skipWhitespaceAndComments() {
-	var done = false;
-	while (!done) {
-	    done = true;
-	    while (isWhitespace(port.peekChar()))
-		port.readChar();
-	    if (port.peekChar() === ';') {
-		port.readChar();
-		done = false;
-		while (true) {
-		    curChar = port.readChar();
-		    if (curChar === SC_EOF_OBJECT ||
-			curChar === '\n')
-			break;
-		}
-	    }
-	}
-    };
-
-    function readDot() {
-	if (isWhitespace(port.peekChar()))
-	    return new sc_Token(10/*DOT*/);
-	else
-	    return readIdOrNumber(".");
-    };
-
-    function readSharp() {
-	var c = port.readChar();
-	if (isWhitespace(c))
-	    return new sc_Token(13/*ERROR*/, "bad #-pattern0.");
-
-	// reference
-	if (isNumberChar(c)) {
-	    var nb = c - 0;
-	    while (isNumberChar(port.peekChar()))
-		nb = nb*10 + (port.readChar() - 0);
-	    switch (port.readChar()) {
-	    case '#':
-		return new sc_Token(18/*REFERENCE*/, nb);
-	    case '=':
-		return new sc_Token(19/*STORE*/, nb);
-	    default:
-		return new sc_Token(13/*ERROR*/, "bad #-pattern1." + nb);
-	    }
-	}
-
-	if (c === "(")
-	    return new sc_Token(14/*VECTOR_BEGIN*/);
-	
-	if (c === "\\") { // character
-	    var tmp = ""
-	    while (!isWhitespaceOrEOF(port.peekChar()))
-		tmp += port.readChar();
-	    switch (tmp.length) {
-	    case 0: // it's escaping a whitespace char:
-		if (sc_isEOFObject(port.peekChar))
-		    return new sc_Token(13/*ERROR*/, "bad #-pattern2.");
-		else
-		    return new sc_Token(20/*CHAR*/, port.readChar());
-	    case 1:
-		return new sc_Token(20/*CHAR*/, tmp);
-	    default:
-		var entry = sc_Char.readable2char[tmp.toLowerCase()];
-		if (entry)
-		    return new sc_Token(20/*CHAR*/, entry);
-		else
-		    return new sc_Token(13/*ERROR*/, "unknown character description: #\\" + tmp);
-	    }
-	}
-
-	// some constants (#t, #f, #unspecified)
-	var res;
-	var needing;
-	switch (c) {
-	case 't': res = new sc_Token(15/*TRUE*/, true); needing = ""; break;
-	case 'f': res = new sc_Token(16/*FALSE*/, false); needing = ""; break;
-	case 'u': res = new sc_Token(17/*UNSPECIFIED*/, undefined); needing = "nspecified"; break;
-	default:
-	    return new sc_Token(13/*ERROR*/, "bad #-pattern3: " + c);
-	}
-	while(true) {
-	    c = port.peekChar();
-	    if ((isWhitespaceOrEOF(c) || c === ')') &&
-		needing == "")
-		return res;
-	    else if (isWhitespace(c) || needing == "")
-		return new sc_Token(13/*ERROR*/, "bad #-pattern4 " + c + " " + needing);
-	    else if (needing.charAt(0) == c) {
-		port.readChar(); // consume
-		needing = needing.slice(1);
-	    } else
-		return new sc_Token(13/*ERROR*/, "bad #-pattern5");
-	}
-	
-    };
-
-    skipWhitespaceAndComments();
-    var curChar = port.readChar();
-    if (curChar === SC_EOF_OBJECT)
-	return new sc_Token(0/*EOF*/, curChar);
-    switch (curChar)
-    {
-    case " ":
-    case "\n":
-    case "\t":
-	return readWhitespace();
-    case "(":
-	return new sc_Token(1/*OPEN_PAR*/);
-    case ")":
-	return new sc_Token(2/*CLOSE_PAR*/);
-    case "{":
-	return new sc_Token(3/*OPEN_BRACE*/);
-    case "}":
-	return new sc_Token(4/*CLOSE_BRACE*/);
-    case "[":
-	return new sc_Token(5/*OPEN_BRACKET*/);
-    case "]":
-	return new sc_Token(6/*CLOSE_BRACKET*/);
-    case "'":
-	return new sc_Token(8/*QUOTE*/);
-    case "#":
-	return readSharp();
-    case ".":
-	return readDot();
-    case '"':
-	return readString();
-    default:
-	if (isIdOrNumberChar(curChar))
-	    return readIdOrNumber(curChar);
-	throw "unexpected character: " + curChar;
-    }
-};
-
-function sc_Reader(tokenizer) {
-    this.tokenizer = tokenizer;
-    this.backref = new Array();
-}
-sc_Reader.prototype.read = function() {
-    function readList(listBeginType) {
-	function matchesPeer(open, close) {
-	    return open === 1/*OPEN_PAR*/ && close === 2/*CLOSE_PAR*/
-	    	|| open === 3/*OPEN_BRACE*/ && close === 4/*CLOSE_BRACE*/
-		|| open === 5/*OPEN_BRACKET*/ && close === 6/*CLOSE_BRACKET*/;
-	};
-	var res = null;
-
-	while (true) {
-	    var token = tokenizer.peekToken();
-
-	    switch (token.type) {
-	    case 2/*CLOSE_PAR*/:
-	    case 4/*CLOSE_BRACE*/:
-	    case 6/*CLOSE_BRACKET*/:
-		if (matchesPeer(listBeginType, token.type)) {
-		    tokenizer.readToken(); // consume token
-		    return sc_reverseBang(res);
-		} else
-		    throw "closing par doesn't match: " + listBeginType
-			+ " " + listEndType;
-
-	    case 0/*EOF*/:
-		throw "unexpected end of file";
-
-	    case 10/*DOT*/:
-		tokenizer.readToken(); // consume token
-		var cdr = this.read();
-		var par = tokenizer.readToken();
-		if (!matchesPeer(listBeginType, par.type))
-		    throw "closing par doesn't match: " + listBeginType
-			+ " " + par.type;
-		else
-		    return sc_reverseAppendBang(res, cdr);
-		
-
-	    default:
-		res = sc_cons(this.read(), res);
-	    }
-	}
-    };
-    function readQuote() {
-	return sc_cons("quote", sc_cons(this.read(), null));
-    };
-    function readVector() {
-	// opening-parenthesis is already consumed
-	var a = new Array();
-	while (true) {
-	    var token = tokenizer.peekToken();
-	    switch (token.type) {
-	    case 2/*CLOSE_PAR*/:
-		tokenizer.readToken();
-		return a;
-		
-	    default:
-		a.push(this.read());
-	    }
-	}
-    };
-
-    function storeRefence(nb) {
-	var tmp = this.read();
-	this.backref[nb] = tmp;
-	return tmp;
-    };
-	
-    function readReference(nb) {
-	if (nb in this.backref)
-	    return this.backref[nb];
-	else
-	    throw "bad reference: " + nb;
-    };
-
-    var tokenizer = this.tokenizer;
-
-    var token = tokenizer.readToken();
-
-    // handle error
-    if (token.type === 13/*ERROR*/)
-	throw token.val;
-
-    switch (token.type) {
-    case 1/*OPEN_PAR*/:
-    case 3/*OPEN_BRACE*/:
-    case 5/*OPEN_BRACKET*/:
-	return readList.call(this, token.type);
-    case 8/*QUOTE*/:
-	return readQuote.call(this);
-    case 11/*STRING*/:
-	return sc_jsstring2string(token.val);
-    case 20/*CHAR*/:
-	return new sc_Char(token.val);
-    case 14/*VECTOR_BEGIN*/:
-	return readVector.call(this);
-    case 18/*REFERENCE*/:
-	return readReference.call(this, token.val);
-    case 19/*STORE*/:
-	return storeRefence.call(this, token.val);
-    case 9/*ID*/:
-	return sc_jsstring2symbol(token.val);
-    case 0/*EOF*/:
-    case 12/*NUMBER*/:
-    case 15/*TRUE*/:
-    case 16/*FALSE*/:
-    case 17/*UNSPECIFIED*/:
-	return token.val;
-    default:
-	throw "unexpected token " + token.type + " " + token.val;
-    }
-};
-
-/*** META ((export #t)) */
-function sc_read(port) {
-    if (port === undefined) // we assume the port hasn't been given.
-	port = SC_DEFAULT_IN; // THREAD: shared var...
-    var reader = new sc_Reader(new sc_Tokenizer(port));
-    return reader.read();
-}
-/*** META ((export #t)) */
-function sc_readChar(port) {
-    if (port === undefined) // we assume the port hasn't been given.
-	port = SC_DEFAULT_IN; // THREAD: shared var...
-    var t = port.readChar();
-    return t === SC_EOF_OBJECT? t: new sc_Char(t);
-}
-/*** META ((export #t)) */
-function sc_peekChar(port) {
-    if (port === undefined) // we assume the port hasn't been given.
-	port = SC_DEFAULT_IN; // THREAD: shared var...
-    var t = port.peekChar();
-    return t === SC_EOF_OBJECT? t: new sc_Char(t);
-}
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isCharReady(port) {
-    if (port === undefined) // we assume the port hasn't been given.
-	port = SC_DEFAULT_IN; // THREAD: shared var...
-    return port.isCharReady();
-}
-/*** META ((export #t)
-           (peephole (postfix ".close()")))
-*/
-function sc_closeInputPort(p) {
-    return p.close();
-}
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix " instanceof sc_InputPort")))
-*/
-function sc_isInputPort(o) {
-    return (o instanceof sc_InputPort);
-}
-
-/*** META ((export eof-object?)
-           (type bool)
-           (peephole (postfix " === SC_EOF_OBJECT")))
-*/
-function sc_isEOFObject(o) {
-    return o === SC_EOF_OBJECT;
-}
-
-/*** META ((export #t)
-           (peephole (hole 0 "SC_DEFAULT_IN")))
-*/
-function sc_currentInputPort() {
-    return SC_DEFAULT_IN;
-}
-
-/* ------------ file operations are not supported -----------*/
-/*** META ((export #t)) */
-function sc_callWithInputFile(s, proc) {
-    throw "can't open " + s;
-}
-
-/*** META ((export #t)) */
-function sc_callWithOutputFile(s, proc) {
-    throw "can't open " + s;
-}
-
-/*** META ((export #t)) */
-function sc_withInputFromFile(s, thunk) {
-    throw "can't open " + s;
-}
-
-/*** META ((export #t)) */
-function sc_withOutputToFile(s, thunk) {
-    throw "can't open " + s;
-}
-
-/*** META ((export #t)) */
-function sc_openInputFile(s) {
-    throw "can't open " + s;
-}
-
-/*** META ((export #t)) */
-function sc_openOutputFile(s) {
-    throw "can't open " + s;
-}
-
-/* ----------------------------------------------------------------------------*/
-/*** META ((export #t)) */
-function sc_basename(p) {
-   var i = p.lastIndexOf('/');
-
-   if(i >= 0)
-      return p.substring(i + 1, p.length);
-   else
-      return '';
-}
-
-/*** META ((export #t)) */
-function sc_dirname(p) {
-   var i = p.lastIndexOf('/');
-
-   if(i >= 0)
-      return p.substring(0, i);
-   else
-      return '';
-}
-
-/* ----------------------------------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_withInputFromPort(p, thunk) {
-    try {
-	var tmp = SC_DEFAULT_IN; // THREAD: shared var.
-	SC_DEFAULT_IN = p;
-	return thunk();
-    } finally {
-	SC_DEFAULT_IN = tmp;
-    }
-}
-
-/*** META ((export #t)) */
-function sc_withInputFromString(s, thunk) {
-    return sc_withInputFromPort(new sc_StringInputPort(sc_string2jsstring(s)), thunk);
-}
-
-/*** META ((export #t)) */
-function sc_withOutputToPort(p, thunk) {
-    try {
-	var tmp = SC_DEFAULT_OUT; // THREAD: shared var.
-	SC_DEFAULT_OUT = p;
-	return thunk();
-    } finally {
-	SC_DEFAULT_OUT = tmp;
-    }
-}
-
-/*** META ((export #t)) */
-function sc_withOutputToString(thunk) {
-    var p = new sc_StringOutputPort();
-    sc_withOutputToPort(p, thunk);
-    return p.close();
-}
-
-/*** META ((export #t)) */
-function sc_withOutputToProcedure(proc, thunk) {
-    var t = function(s) { proc(sc_jsstring2string(s)); };
-    return sc_withOutputToPort(new sc_GenericOutputPort(t), thunk);
-}
-
-/*** META ((export #t)
-           (peephole (hole 0 "new sc_StringOutputPort()")))
-*/
-function sc_openOutputString() {
-    return new sc_StringOutputPort();
-}
-
-/*** META ((export #t)) */
-function sc_openInputString(str) {
-    return new sc_StringInputPort(sc_string2jsstring(str));
-}
-
-/* ----------------------------------------------------------------------------*/
-
-function sc_OutputPort() {
-}
-sc_OutputPort.prototype = new sc_Port();
-sc_OutputPort.prototype.appendJSString = function(obj) {
-    /* do nothing */
-}
-sc_OutputPort.prototype.close = function() {
-    /* do nothing */
-}
-
-function sc_StringOutputPort() {
-    this.res = "";
-}
-sc_StringOutputPort.prototype = new sc_OutputPort();
-sc_StringOutputPort.prototype.appendJSString = function(s) {
-    this.res += s;
-}
-sc_StringOutputPort.prototype.close = function() {
-    return sc_jsstring2string(this.res);
-}
-
-/*** META ((export #t)) */
-function sc_getOutputString(sp) {
-    return sc_jsstring2string(sp.res);
-}
-
-
-function sc_ErrorOutputPort() {
-}
-sc_ErrorOutputPort.prototype = new sc_OutputPort();
-sc_ErrorOutputPort.prototype.appendJSString = function(s) {
-    throw "don't write on ErrorPort!";
-}
-sc_ErrorOutputPort.prototype.close = function() {
-    /* do nothing */
-}
-
-function sc_GenericOutputPort(appendJSString, close) {
-    this.appendJSString = appendJSString;
-    if (close)
-	this.close = close;
-}
-sc_GenericOutputPort.prototype = new sc_OutputPort();
-
-/*** META ((export #t)
-           (type bool)
-           (peephole (postfix " instanceof sc_OutputPort")))
-*/
-function sc_isOutputPort(o) {
-    return (o instanceof sc_OutputPort);
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".close()")))
-*/
-function sc_closeOutputPort(p) {
-    return p.close();
-}
-
-/* ------------------ write ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_write(o, p) {
-    if (p === undefined) // we assume not given
-	p = SC_DEFAULT_OUT;
-    p.appendJSString(sc_toWriteString(o));
-}
-
-function sc_toWriteString(o) {
-    if (o === null)
-	return "()";
-    else if (o === true)
-	return "#t";
-    else if (o === false)
-	return "#f";
-    else if (o === undefined)
-	return "#unspecified";
-    else if (typeof o === 'function')
-	return "#<procedure " + sc_hash(o) + ">";
-    else if (o.sc_toWriteString)
-	return o.sc_toWriteString();
-    else
-	return o.toString();
-}
-
-function sc_escapeWriteString(s) {
-    var res = "";
-    var j = 0;
-    for (i = 0; i < s.length; i++) {
-	switch (s.charAt(i)) {
-	case "\0": res += s.substring(j, i) + "\\0"; j = i + 1; break;
-	case "\b": res += s.substring(j, i) + "\\b"; j = i + 1; break;
-	case "\f": res += s.substring(j, i) + "\\f"; j = i + 1; break;
-	case "\n": res += s.substring(j, i) + "\\n"; j = i + 1; break;
-	case "\r": res += s.substring(j, i) + "\\r"; j = i + 1; break;
-	case "\t": res += s.substring(j, i) + "\\t"; j = i + 1; break;
-	case "\v": res += s.substring(j, i) + "\\v"; j = i + 1; break;
-	case '"': res += s.substring(j, i) + '\\"'; j = i + 1; break;
-	case "\\": res += s.substring(j, i) + "\\\\"; j = i + 1; break;
-	default:
-	    var c = s.charAt(i);
-	    if ("\a" !== "a" && c == "\a") {
-		res += s.substring(j, i) + "\\a"; j = i + 1; continue;
-	    }
-	    if ("\v" !== "v" && c == "\v") {
-		res += s.substring(j, i) + "\\v"; j = i + 1; continue;
-	    }
-	    //if (s.charAt(i) < ' ' || s.charCodeAt(i) > 127) {
-	    // CARE: Manuel is this OK with HOP?
-	    if (s.charAt(i) < ' ') {
-		/* non printable character and special chars */
-		res += s.substring(j, i) + "\\x" + s.charCodeAt(i).toString(16);
-		j = i + 1;
-	    }
-	    // else just let i increase...
-	}
-    }
-    res += s.substring(j, i);
-    return res;
-}
-
-/* ------------------ display ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_display(o, p) {
-    if (p === undefined) // we assume not given
-	p = SC_DEFAULT_OUT;
-    p.appendJSString(sc_toDisplayString(o));
-}
-
-function sc_toDisplayString(o) {
-    if (o === null)
-	return "()";
-    else if (o === true)
-	return "#t";
-    else if (o === false)
-	return "#f";
-    else if (o === undefined)
-	return "#unspecified";
-    else if (typeof o === 'function')
-	return "#<procedure " + sc_hash(o) + ">";
-    else if (o.sc_toDisplayString)
-	return o.sc_toDisplayString();
-    else
-	return o.toString();
-}
-
-/* ------------------ newline ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_newline(p) {
-    if (p === undefined) // we assume not given
-	p = SC_DEFAULT_OUT;
-    p.appendJSString("\n");
-}
-
-/* ------------------ write-char ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_writeChar(c, p) {
-    if (p === undefined) // we assume not given
-	p = SC_DEFAULT_OUT;
-    p.appendJSString(c.val);
-}
-
-/* ------------------ write-circle ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_writeCircle(o, p) {
-    if (p === undefined) // we assume not given
-	p = SC_DEFAULT_OUT;
-    p.appendJSString(sc_toWriteCircleString(o));
-}
-
-function sc_toWriteCircleString(o) {
-    var symb = sc_gensym("writeCircle");
-    var nbPointer = new Object();
-    nbPointer.nb = 0;
-    sc_prepWriteCircle(o, symb, nbPointer);
-    return sc_genToWriteCircleString(o, symb);
-}
-
-function sc_prepWriteCircle(o, symb, nbPointer) {
-    // TODO sc_Struct
-    if (o instanceof sc_Pair ||
-	o instanceof sc_Vector) {
-	if (o[symb] !== undefined) {
-	    // not the first visit.
-	    o[symb]++;
-	    // unless there is already a number, assign one.
-	    if (!o[symb + "nb"]) o[symb + "nb"] = nbPointer.nb++;
-	    return;
-	}
-	o[symb] = 0;
-	if (o instanceof sc_Pair) {
-	    sc_prepWriteCircle(o.car, symb, nbPointer);
-	    sc_prepWriteCircle(o.cdr, symb, nbPointer);
-	} else {
-	    for (var i = 0; i < o.length; i++)
-		sc_prepWriteCircle(o[i], symb, nbPointer);
-	}
-    }
-}
-
-function sc_genToWriteCircleString(o, symb) {
-    if (!(o instanceof sc_Pair ||
-	  o instanceof sc_Vector))
-	return sc_toWriteString(o);
-    return o.sc_toWriteCircleString(symb);
-}
-sc_Pair.prototype.sc_toWriteCircleString = function(symb, inList) {
-    if (this[symb + "use"]) { // use-flag is set. Just use it.
-	var nb = this[symb + "nb"];
-	if (this[symb]-- === 0) { // if we are the last use. remove all fields.
-	    delete this[symb];
-	    delete this[symb + "nb"];
-	    delete this[symb + "use"];
-	}
-	if (inList)
-	    return '. #' + nb + '#';
-	else
-	    return '#' + nb + '#';
-    }
-    if (this[symb]-- === 0) { // if we are the last use. remove all fields.
-	delete this[symb];
-	delete this[symb + "nb"];
-	delete this[symb + "use"];
-    }
-
-    var res = "";
-
-    if (this[symb] !== undefined) { // implies > 0
-	this[symb + "use"] = true;
-	if (inList)
-	    res += '. #' + this[symb + "nb"] + '=';
-	else
-	    res += '#' + this[symb + "nb"] + '=';
-	inList = false;
-    }
-
-    if (!inList)
-	res += "(";
-
-    // print car
-    res += sc_genToWriteCircleString(this.car, symb);
-
-    if (sc_isPair(this.cdr)) {
-	res += " " + this.cdr.sc_toWriteCircleString(symb, true);
-    } else if (this.cdr !== null) {
-	res += " . " + sc_genToWriteCircleString(this.cdr, symb);
-    }
-    if (!inList)
-	res += ")";
-    return res;
-};
-sc_Vector.prototype.sc_toWriteCircleString = function(symb) {
-    if (this[symb + "use"]) { // use-flag is set. Just use it.
-	var nb = this[symb + "nb"];
-	if (this[symb]-- === 0) { // if we are the last use. remove all fields.
-	    delete this[symb];
-	    delete this[symb + "nb"];
-	    delete this[symb + "use"];
-	}
-	return '#' + nb + '#';
-    }
-    if (this[symb]-- === 0) { // if we are the last use. remove all fields.
-	delete this[symb];
-	delete this[symb + "nb"];
-	delete this[symb + "use"];
-    }
-
-    var res = "";
-    if (this[symb] !== undefined) { // implies > 0
-	this[symb + "use"] = true;
-	res += '#' + this[symb + "nb"] + '=';
-    }
-    res += "#(";
-    for (var i = 0; i < this.length; i++) {
-	res += sc_genToWriteCircleString(this[i], symb);
-	if (i < this.length - 1) res += " ";
-    }
-    res += ")";
-    return res;
-};
-
-
-/* ------------------ print ---------------------------------------------------*/
-
-/*** META ((export #t)) */
-function sc_print(s) {
-    if (arguments.length === 1) {
-	sc_display(s);
-	sc_newline();
-    }
-    else {
-	for (var i = 0; i < arguments.length; i++)
-	    sc_display(arguments[i]);
-	sc_newline();
-    }
-}
-
-/* ------------------ format ---------------------------------------------------*/
-/*** META ((export #t)) */
-function sc_format(s, args) {
-   var len = s.length;
-   var p = new sc_StringOutputPort();
-   var i = 0, j = 1;
-
-   while( i < len ) {
-      var i2 = s.indexOf("~", i);
-
-      if (i2 == -1) {
-	  p.appendJSString( s.substring( i, len ) );
-	  return p.close();
-      } else {
-	 if (i2 > i) {
-	    if (i2 == (len - 1)) {
-		p.appendJSString(s.substring(i, len));
-		return p.close();
-	    } else {
-	       p.appendJSString(s.substring(i, i2));
-	       i = i2;
-	    }
-	 }
-
-	 switch(s.charCodeAt(i2 + 1)) {
-	    case 65:
-	    case 97:
-	       // a
-	       sc_display(arguments[j], p);
-	       i += 2; j++;
-	       break;
-
-	    case 83:
-	    case 115:
-	       // s
-	       sc_write(arguments[j], p);
-	       i += 2; j++;
-	       break;
-
-	    case 86:
-	    case 118:
-	       // v
-	       sc_display(arguments[j], p);
-	       p.appendJSString("\n");
-	       i += 2; j++;
-	       break;
-
-	    case 67:
-	    case 99:
-	       // c
-	       p.appendJSString(String.fromCharCode(arguments[j]));
-	       i += 2; j++;
-	       break;
-
-	    case 88:
-	    case 120:
-	       // x
-	       p.appendJSString(arguments[j].toString(6));
-	       i += 2; j++;
-	       break;
-
-	    case 79:
-	    case 111:
-	       // o
-	       p.appendJSString(arguments[j].toString(8));
-	       i += 2; j++;
-	       break;
-
-	    case 66:
-	    case 98:
-	       // b
-	       p.appendJSString(arguments[j].toString(2));
-	       i += 2; j++;
-	       break;
-
-	    case 37:
-	    case 110:
-	       // %, n
-	       p.appendJSString("\n");
-	       i += 2; break;
-
-	    case 114:
-	       // r
-	       p.appendJSString("\r");
-	       i += 2; break;
-
-	    case 126:
-	       // ~
-	       p.appendJSString("~");
-	       i += 2; break;
-
-	    default:
-	       sc_error( "format: illegal ~"
-			 + String.fromCharCode(s.charCodeAt(i2 + 1))
-			 + " sequence" );
-	       return "";
-	 }
-      }
-   }
-
-   return p.close();
-}
-
-/* ------------------ global ports ---------------------------------------------------*/
-
-var SC_DEFAULT_IN = new sc_ErrorInputPort();
-var SC_DEFAULT_OUT = new sc_ErrorOutputPort();
-var SC_ERROR_OUT = new sc_ErrorOutputPort();
-
-var sc_SYMBOL_PREFIX = "\u1E9C";
-var sc_KEYWORD_PREFIX = "\u1E9D";
-
-/*** META ((export #t)
-           (peephole (id))) */
-function sc_jsstring2string(s) {
-    return s;
-}
-
-/*** META ((export #t)
-           (peephole (prefix "'\\u1E9C' +")))
-*/
-function sc_jsstring2symbol(s) {
-    return sc_SYMBOL_PREFIX + s;
-}
-
-/*** META ((export #t)
-           (peephole (id)))
-*/
-function sc_string2jsstring(s) {
-    return s;
-}
-
-/*** META ((export #t)
-           (peephole (symbol2jsstring_immutable)))
-*/
-function sc_symbol2jsstring(s) {
-    return s.slice(1);
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".slice(1)")))
-*/
-function sc_keyword2jsstring(k) {
-    return k.slice(1);
-}
-
-/*** META ((export #t)
-           (peephole (prefix "'\\u1E9D' +")))
-*/
-function sc_jsstring2keyword(s) {
-    return sc_KEYWORD_PREFIX + s;
-}
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isKeyword(s) {
-    return (typeof s === "string") &&
-	(s.charAt(0) === sc_KEYWORD_PREFIX);
-}
-
-
-/*** META ((export #t)) */
-var sc_gensym = function() {
-    var counter = 1000;
-    return function(sym) {
-	counter++;
-	if (!sym) sym = sc_SYMBOL_PREFIX;
-	return sym + "s" + counter + "~" + "^sC-GeNsYm ";
-    };
-}();
-
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isEqual(o1, o2) {
-    return ((o1 === o2) ||
-	    (sc_isPair(o1) && sc_isPair(o2)
-	     && sc_isPairEqual(o1, o2, sc_isEqual)) ||
-	    (sc_isVector(o1) && sc_isVector(o2)
-	     && sc_isVectorEqual(o1, o2, sc_isEqual)));
-}
-
-/*** META ((export number->symbol integer->symbol)) */
-function sc_number2symbol(x, radix) {
-    return sc_SYMBOL_PREFIX + sc_number2jsstring(x, radix);
-}
-
-/*** META ((export number->string integer->string)) */
-var sc_number2string = sc_number2jsstring;
-
-/*** META ((export #t)) */
-function sc_symbol2number(s, radix) {
-    return sc_jsstring2number(s.slice(1), radix);
-}
-
-/*** META ((export #t)) */
-var sc_string2number = sc_jsstring2number;
-
-/*** META ((export #t)
-           (peephole (prefix "+" s)))
-           ;; peephole will only apply if no radix is given.
-*/
-function sc_string2integer(s, radix) {
-    if (!radix) return +s;
-    return parseInt(s, radix);
-}
-
-/*** META ((export #t)
-           (peephole (prefix "+")))
-*/
-function sc_string2real(s) {
-    return +s;
-}
-
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isSymbol(s) {
-    return (typeof s === "string") &&
-	(s.charAt(0) === sc_SYMBOL_PREFIX);
-}
-
-/*** META ((export #t)
-           (peephole (symbol2string_immutable)))
-*/
-function sc_symbol2string(s) {
-    return s.slice(1);
-}
-
-/*** META ((export #t)
-           (peephole (prefix "'\\u1E9C' +")))
-*/
-function sc_string2symbol(s) {
-    return sc_SYMBOL_PREFIX + s;
-}
-
-/*** META ((export symbol-append)
-           (peephole (symbolAppend_immutable)))
-*/
-function sc_symbolAppend() {
-    var res = sc_SYMBOL_PREFIX;
-    for (var i = 0; i < arguments.length; i++)
-	res += arguments[i].slice(1);
-    return res;
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".val")))
-*/
-function sc_char2string(c) { return c.val; }
-
-/*** META ((export #t)
-           (peephole (hole 1 "'\\u1E9C' + " c ".val")))
-*/
-function sc_char2symbol(c) { return sc_SYMBOL_PREFIX + c.val; }
-
-/*** META ((export #t)
-           (type bool))
-*/
-function sc_isString(s) {
-    return (typeof s === "string") &&
-	(s.charAt(0) !== sc_SYMBOL_PREFIX);
-}
-
-/*** META ((export #t)) */
-var sc_makeString = sc_makejsString;
-
-
-/*** META ((export #t)) */
-function sc_string() {
-    for (var i = 0; i < arguments.length; i++)
-	arguments[i] = arguments[i].val;
-    return "".concat.apply("", arguments);
-}
-
-/*** META ((export #t)
-           (peephole (postfix ".length")))
-*/
-function sc_stringLength(s) { return s.length; }
-
-/*** META ((export #t)) */
-function sc_stringRef(s, k) {
-    return new sc_Char(s.charAt(k));
-}
-
-/* there's no stringSet in the immutable version
-function sc_stringSet(s, k, c)
-*/
-
-
-/*** META ((export string=?)
-	   (type bool)
-           (peephole (hole 2 str1 " === " str2)))
-*/
-function sc_isStringEqual(s1, s2) {
-    return s1 === s2;
-}
-/*** META ((export string<?)
-	   (type bool)
-           (peephole (hole 2 str1 " < " str2)))
-*/
-function sc_isStringLess(s1, s2) {
-    return s1 < s2;
-}
-/*** META ((export string>?)
-	   (type bool)
-           (peephole (hole 2 str1 " > " str2)))
-*/
-function sc_isStringGreater(s1, s2) {
-    return s1 > s2;
-}
-/*** META ((export string<=?)
-	   (type bool)
-           (peephole (hole 2 str1 " <= " str2)))
-*/
-function sc_isStringLessEqual(s1, s2) {
-    return s1 <= s2;
-}
-/*** META ((export string>=?)
-	   (type bool)
-           (peephole (hole 2 str1 " >= " str2)))
-*/
-function sc_isStringGreaterEqual(s1, s2) {
-    return s1 >= s2;
-}
-/*** META ((export string-ci=?)
-	   (type bool)
-           (peephole (hole 2 str1 ".toLowerCase() === " str2 ".toLowerCase()")))
-*/
-function sc_isStringCIEqual(s1, s2) {
-    return s1.toLowerCase() === s2.toLowerCase();
-}
-/*** META ((export string-ci<?)
-	   (type bool)
-           (peephole (hole 2 str1 ".toLowerCase() < " str2 ".toLowerCase()")))
-*/
-function sc_isStringCILess(s1, s2) {
-    return s1.toLowerCase() < s2.toLowerCase();
-}
-/*** META ((export string-ci>?)
-	   (type bool)
-           (peephole (hole 2 str1 ".toLowerCase() > " str2 ".toLowerCase()")))
-*/
-function sc_isStringCIGreater(s1, s2) {
-    return s1.toLowerCase() > s2.toLowerCase();
-}
-/*** META ((export string-ci<=?)
-	   (type bool)
-           (peephole (hole 2 str1 ".toLowerCase() <= " str2 ".toLowerCase()")))
-*/
-function sc_isStringCILessEqual(s1, s2) {
-    return s1.toLowerCase() <= s2.toLowerCase();
-}
-/*** META ((export string-ci>=?)
-	   (type bool)
-           (peephole (hole 2 str1 ".toLowerCase() >= " str2 ".toLowerCase()")))
-*/
-function sc_isStringCIGreaterEqual(s1, s2) {
-    return s1.toLowerCase() >= s2.toLowerCase();
-}
-
-/*** META ((export #t)
-           (peephole (hole 3 s ".substring(" start ", " end ")")))
-*/
-function sc_substring(s, start, end) {
-    return s.substring(start, end);
-}
-
-/*** META ((export #t))
-*/
-function sc_isSubstring_at(s1, s2, i) {
-    return s2 == s1.substring(i, i+ s2.length);
-}
-
-/*** META ((export #t)
-           (peephole (infix 0 #f "+" "''")))
-*/
-function sc_stringAppend() {
-    return "".concat.apply("", arguments);
-}
-
-/*** META ((export #t)) */
-var sc_string2list = sc_jsstring2list;
-
-/*** META ((export #t)) */
-var sc_list2string = sc_list2jsstring;
-
-/*** META ((export #t)
-           (peephole (id)))
-*/
-function sc_stringCopy(s) {
-    return s;
-}
-
-/* there's no string-fill in the immutable version
-function sc_stringFill(s, c)
-*/
-
-/*** META ((export #t)
-           (peephole (postfix ".slice(1)")))
-*/
-function sc_keyword2string(o) {
-    return o.slice(1);
-}
-
-/*** META ((export #t)
-           (peephole (prefix "'\\u1E9D' +")))
-*/
-function sc_string2keyword(o) {
-    return sc_KEYWORD_PREFIX + o;
-}
-
-String.prototype.sc_toDisplayString = function() {
-    if (this.charAt(0) === sc_SYMBOL_PREFIX)
-	// TODO: care for symbols with spaces (escape-chars symbols).
-	return this.slice(1);
-    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
-	return ":" + this.slice(1);
-    else
-	return this.toString();
-};
-
-String.prototype.sc_toWriteString = function() {
-    if (this.charAt(0) === sc_SYMBOL_PREFIX)
-	// TODO: care for symbols with spaces (escape-chars symbols).
-	return this.slice(1);
-    else if (this.charAt(0) === sc_KEYWORD_PREFIX)
-	return ":" + this.slice(1);
-    else
-	return '"' + sc_escapeWriteString(this) + '"';
-};
-/* Exported Variables */
-var BgL_testzd2boyerzd2;
-var BgL_nboyerzd2benchmarkzd2;
-var BgL_setupzd2boyerzd2;
-/* End Exports */
-
-var translate_term_nboyer;
-var translate_args_nboyer;
-var untranslate_term_nboyer;
-var BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer;
-var BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer;
-var translate_alist_nboyer;
-var apply_subst_nboyer;
-var apply_subst_lst_nboyer;
-var tautologyp_nboyer;
-var if_constructor_nboyer;
-var rewrite_count_nboyer;
-var rewrite_nboyer;
-var rewrite_args_nboyer;
-var unify_subst_nboyer;
-var one_way_unify1_nboyer;
-var false_term_nboyer;
-var true_term_nboyer;
-var trans_of_implies1_nboyer;
-var is_term_equal_nboyer;
-var is_term_member_nboyer;
-var const_nboyer;
-var sc_const_3_nboyer;
-var sc_const_4_nboyer;
-{
-    (sc_const_4_nboyer = (new sc_Pair("\u1E9Cimplies",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cu",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cu",(new sc_Pair("\u1E9Cw",null)))))),null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cw",null)))))),null)))))));
-    (sc_const_3_nboyer = sc_list((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccompile",(new sc_Pair("\u1E9Cform",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Ccodegen",(new sc_Pair((new sc_Pair("\u1E9Coptimize",(new sc_Pair("\u1E9Cform",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ceqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreaterp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clesseqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatereqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cboolean",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ciff",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ceven1",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Codd",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccountps-",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cpred",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccountps-loop",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cpred",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfact-",(new sc_Pair("\u1E9Ci",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfact-loop",(new sc_Pair("\u1E9Ci",(new sc_Pair((1),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdivides",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassume-true",(new sc_Pair("\u1E9Cvar",(new sc_Pair("\u1E9Calist",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cvar",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))),(new sc_Pair("\u1E9Calist",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassume-false",(new sc_Pair("\u1E9Cvar",(new sc_Pair("\u1E9Calist",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cvar",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))),(new sc_Pair("\u1E9Calist",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctautology-checker",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ctautologyp",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfalsify",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfalsify1",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cprime",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))),null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cprime1",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cx",null)))),null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair("\u1E9Cp",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cimplies",(new sc_Pair("\u1E9Cp",(new sc_Pair("\u1E9Cq",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cp",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cq",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair((new sc_Pair("\u1E9Cf",null)),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Ct",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))))),(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cd",(new sc_Pair("\u1E9Ce",null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cb",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cc",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cplus-fringe",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Ca",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cpds",(new sc_Pair("\u1E9Cenvrn",null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cexec",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cpds",(new sc_Pair("\u1E9Cenvrn",null)))))))),(new sc_Pair("\u1E9Cenvrn",null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmc-flatten",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cb",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Cintersect",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ck",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Ck",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ck",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair((new sc_Pair("\u1E9Cexp",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair("\u1E9Ck",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Cy",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Creverse-loop",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Csort-lp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ccount-list",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus1",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cl",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair("\u1E9Ci",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cbase",null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ci",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cj",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cj",(new sc_Pair((1),null)))))),null)))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Ci",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cpower-eval",(new sc_Pair((new sc_Pair("\u1E9Cbig-plus",(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cpower-rep",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Cbase",null)))))))))),(new sc_Pair("\u1E9Cbase",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cj",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Ca",null)))),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cw",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Cx",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cc",null)))))),null)))))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cb",(new sc_Pair("\u1E9Cc",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cz",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Cgcd",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cvalue",(new sc_Pair((new sc_Pair("\u1E9Cnormalize",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cvalue",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cy",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnlistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csamefringe",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((1),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((1),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair((new sc_Pair("\u1E9Cgreatest-factor",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ctimes-list",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cprime-list",(new sc_Pair("\u1E9Cy",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Cz",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cz",null)))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cz",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cw",(new sc_Pair((1),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cgreatereqp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cor",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cand",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cy",(new sc_Pair((1),null)))))),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((1),null)))))),(new sc_Pair(sc_list("\u1E9Cand", (new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))), (new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair("\u1E9Cb",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))), (new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Ca",null)))), (new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cb",null)))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csub1",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cl",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cl",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair("\u1E9Cl",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdsort",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Csort2",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx1",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx2",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx3",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx4",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx5",(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair("\u1E9Cx6",(new sc_Pair("\u1E9Cx7",null)))))),null)))))),null)))))),null)))))),null)))))),null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((6),(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cx7",null)))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((2),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((2),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair("\u1E9Cy",(new sc_Pair((2),null)))))),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Csigma",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ci",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Ci",null)))),null)))))),(new sc_Pair((2),null)))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cz",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnot",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cz",null)))),null)))))),null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair((new sc_Pair("\u1E9Cdelete",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmeaning",(new sc_Pair((new sc_Pair("\u1E9Cplus-tree",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair("\u1E9Ca",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cadd1",(new sc_Pair("\u1E9Cy",null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cnumberp",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cnth",(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Ci",null)))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair("\u1E9Cb",null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Ca",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Clast",(new sc_Pair("\u1E9Ca",null)))),null)))),(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair("\u1E9Cb",null)))))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clessp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ct",null)),(new sc_Pair("\u1E9Cz",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cf",null)),(new sc_Pair("\u1E9Cz",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Cassignedp",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Ca",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cassignment",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cb",null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccar",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair((new sc_Pair("\u1E9Ccdr",(new sc_Pair((new sc_Pair("\u1E9Cgopher",(new sc_Pair("\u1E9Cx",null)))),null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Clistp",(new sc_Pair("\u1E9Cx",null)))),(new sc_Pair((new sc_Pair("\u1E9Ccdr",(new sc_Pair((new sc_Pair("\u1E9Cflatten",(new sc_Pair("\u1E9Cx",null)))),null)))),(new sc_Pair((new sc_Pair("\u1E9Ccons",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cquotient",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cx",null)))))),(new sc_Pair("\u1E9Cy",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Czerop",(new sc_Pair("\u1E9Cy",null)))),(new sc_Pair((new sc_Pair("\u1E9Czero",null)),(new sc_Pair((new sc_Pair("\u1E9Cfix",(new sc_Pair("\u1E9Cx",null)))),null)))))))),null)))))), (new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cget",(new sc_Pair("\u1E9Cj",(new sc_Pair((new sc_Pair("\u1E9Cset",(new sc_Pair("\u1E9Ci",(new sc_Pair("\u1E9Cval",(new sc_Pair("\u1E9Cmem",null)))))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cif",(new sc_Pair((new sc_Pair("\u1E9Ceqp",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Ci",null)))))),(new sc_Pair("\u1E9Cval",(new sc_Pair((new sc_Pair("\u1E9Cget",(new sc_Pair("\u1E9Cj",(new sc_Pair("\u1E9Cmem",null)))))),null)))))))),null))))))));
-    (const_nboyer = (new sc_Pair((new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cc",(new sc_Pair((new sc_Pair("\u1E9Czero",null)),null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cy",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair((new sc_Pair("\u1E9Ctimes",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Cc",(new sc_Pair("\u1E9Cd",null)))))),null)))))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cz",(new sc_Pair("\u1E9Cf",(new sc_Pair((new sc_Pair("\u1E9Creverse",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair((new sc_Pair("\u1E9Cappend",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cnil",null)),null)))))),null)))),null)))))),(new sc_Pair((new sc_Pair("\u1E9Cu",(new sc_Pair("\u1E9Cequal",(new sc_Pair((new sc_Pair("\u1E9Cplus",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cdifference",(new sc_Pair("\u1E9Cx",(new sc_Pair("\u1E9Cy",null)))))),null)))))))),(new sc_Pair((new sc_Pair("\u1E9Cw",(new sc_Pair("\u1E9Clessp",(new sc_Pair((new sc_Pair("\u1E9Cremainder",(new sc_Pair("\u1E9Ca",(new sc_Pair("\u1E9Cb",null)))))),(new sc_Pair((new sc_Pair("\u1E9Cmember",(new sc_Pair("\u1E9Ca",(new sc_Pair((new sc_Pair("\u1E9Clength",(new sc_Pair("\u1E9Cb",null)))),null)))))),null)))))))),null)))))))))));
-    BgL_nboyerzd2benchmarkzd2 = function() {
-        var args = null;
-        for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) {
-            args = sc_cons(arguments[sc_tmp], args);
-        }
-        var n;
-        return ((n = ((args === null)?(0):(args.car))), (BgL_setupzd2boyerzd2()), (BgL_runzd2benchmarkzd2(("nboyer"+(sc_number2string(n))), (1), function() {
-            return (BgL_testzd2boyerzd2(n));
-        }, function(rewrites) {
-            if ((sc_isNumber(rewrites)))
-                switch (n) {
-                case (0):
-                    return (rewrites===(95024));
-                    break;
-                case (1):
-                    return (rewrites===(591777));
-                    break;
-                case (2):
-                    return (rewrites===(1813975));
-                    break;
-                case (3):
-                    return (rewrites===(5375678));
-                    break;
-                case (4):
-                    return (rewrites===(16445406));
-                    break;
-                case (5):
-                    return (rewrites===(51507739));
-                    break;
-                default:
-                    return true;
-                    break;
-                }
-            else
-                return false;
-        })));
-    };
-    BgL_setupzd2boyerzd2 = function() {
-        return true;
-    };
-    BgL_testzd2boyerzd2 = function() {
-        return true;
-    };
-    translate_term_nboyer = function(term) {
-        var lst;
-        return (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), ((lst = (term.cdr)), ((lst === null)?null:(new sc_Pair((translate_term_nboyer((lst.car))), (translate_args_nboyer((lst.cdr))))))))));
-    };
-    translate_args_nboyer = function(lst) {
-        var sc_lst_5;
-        var term;
-        return ((lst === null)?null:(new sc_Pair(((term = (lst.car)), (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr))))))), ((sc_lst_5 = (lst.cdr)), ((sc_lst_5 === null)?null:(new sc_Pair((translate_term_nboyer((sc_lst_5.car))), (translate_args_nboyer((sc_lst_5.cdr))))))))));
-    };
-    untranslate_term_nboyer = function(term) {
-        var optrOpnd;
-        var tail1131;
-        var L1127;
-        var falseHead1130;
-        var symbol_record;
-        if (!(term instanceof sc_Pair))
-            return term;
-        else
-            {
-                (falseHead1130 = (new sc_Pair(null, null)));
-                (L1127 = (term.cdr));
-                (tail1131 = falseHead1130);
-                while (!(L1127 === null)) {
-                    {
-                        (tail1131.cdr = (new sc_Pair((untranslate_term_nboyer((L1127.car))), null)));
-                        (tail1131 = (tail1131.cdr));
-                        (L1127 = (L1127.cdr));
-                    }
-                }
-                (optrOpnd = (falseHead1130.cdr));
-                return (new sc_Pair(((symbol_record = (term.car)), (symbol_record[(0)])), optrOpnd));
-            }
-    };
-    BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer = function(sym) {
-        var r;
-        var x;
-        return ((x = (sc_assq(sym, BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer))), ((x!== false)?(x.cdr):((r = [sym, null]), (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = (new sc_Pair((new sc_Pair(sym, r)), BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer))), r)));
-    };
-    (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null);
-    translate_alist_nboyer = function(alist) {
-        var sc_alist_6;
-        var term;
-        return ((alist === null)?null:(new sc_Pair((new sc_Pair((alist.car.car), ((term = (alist.car.cdr)), (!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr))))))))), ((sc_alist_6 = (alist.cdr)), ((sc_alist_6 === null)?null:(new sc_Pair((new sc_Pair((sc_alist_6.car.car), (translate_term_nboyer((sc_alist_6.car.cdr))))), (translate_alist_nboyer((sc_alist_6.cdr))))))))));
-    };
-    apply_subst_nboyer = function(alist, term) {
-        var lst;
-        var temp_temp;
-        return (!(term instanceof sc_Pair)?((temp_temp = (sc_assq(term, alist))), ((temp_temp!== false)?(temp_temp.cdr):term)):(new sc_Pair((term.car), ((lst = (term.cdr)), ((lst === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (lst.car))), (apply_subst_lst_nboyer(alist, (lst.cdr))))))))));
-    };
-    apply_subst_lst_nboyer = function(alist, lst) {
-        var sc_lst_7;
-        return ((lst === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (lst.car))), ((sc_lst_7 = (lst.cdr)), ((sc_lst_7 === null)?null:(new sc_Pair((apply_subst_nboyer(alist, (sc_lst_7.car))), (apply_subst_lst_nboyer(alist, (sc_lst_7.cdr))))))))));
-    };
-    tautologyp_nboyer = function(sc_x_11, true_lst, false_lst) {
-        var tmp1125;
-        var x;
-        var tmp1126;
-        var sc_x_8;
-        var sc_tmp1125_9;
-        var sc_tmp1126_10;
-        var sc_x_11;
-        var true_lst;
-        var false_lst;
-        while (true) {
-            if ((((sc_tmp1126_10 = (is_term_equal_nboyer(sc_x_11, true_term_nboyer))), ((sc_tmp1126_10!== false)?sc_tmp1126_10:(is_term_member_nboyer(sc_x_11, true_lst))))!== false))
-                return true;
-            else
-                if ((((sc_tmp1125_9 = (is_term_equal_nboyer(sc_x_11, false_term_nboyer))), ((sc_tmp1125_9!== false)?sc_tmp1125_9:(is_term_member_nboyer(sc_x_11, false_lst))))!== false))
-                    return false;
-                else
-                    if (!(sc_x_11 instanceof sc_Pair))
-                        return false;
-                    else
-                        if (((sc_x_11.car)===if_constructor_nboyer))
-                            if ((((sc_x_8 = (sc_x_11.cdr.car)), (tmp1126 = (is_term_equal_nboyer(sc_x_8, true_term_nboyer))), ((tmp1126!== false)?tmp1126:(is_term_member_nboyer(sc_x_8, true_lst))))!== false))
-                                (sc_x_11 = (sc_x_11.cdr.cdr.car));
-                            else
-                                if ((((x = (sc_x_11.cdr.car)), (tmp1125 = (is_term_equal_nboyer(x, false_term_nboyer))), ((tmp1125!== false)?tmp1125:(is_term_member_nboyer(x, false_lst))))!== false))
-                                    (sc_x_11 = (sc_x_11.cdr.cdr.cdr.car));
-                                else
-                                    if (((tautologyp_nboyer((sc_x_11.cdr.cdr.car), (new sc_Pair((sc_x_11.cdr.car), true_lst)), false_lst))!== false))
-                                        {
-                                            (false_lst = (new sc_Pair((sc_x_11.cdr.car), false_lst)));
-                                            (sc_x_11 = (sc_x_11.cdr.cdr.cdr.car));
-                                        }
-                                    else
-                                        return false;
-                        else
-                            return false;
-        }
-    };
-    (if_constructor_nboyer = "\u1E9C*");
-    (rewrite_count_nboyer = (0));
-    rewrite_nboyer = function(term) {
-        var term2;
-        var sc_term_12;
-        var lst;
-        var symbol_record;
-        var sc_lst_13;
-        {
-            (++rewrite_count_nboyer);
-            if (!(term instanceof sc_Pair))
-                return term;
-            else
-                {
-                    (sc_term_12 = (new sc_Pair((term.car), ((sc_lst_13 = (term.cdr)), ((sc_lst_13 === null)?null:(new sc_Pair((rewrite_nboyer((sc_lst_13.car))), (rewrite_args_nboyer((sc_lst_13.cdr))))))))));
-                    (lst = ((symbol_record = (term.car)), (symbol_record[(1)])));
-                    while (true) {
-                        if ((lst === null))
-                            return sc_term_12;
-                        else
-                            if ((((term2 = ((lst.car).cdr.car)), (unify_subst_nboyer = null), (one_way_unify1_nboyer(sc_term_12, term2)))!== false))
-                                return (rewrite_nboyer((apply_subst_nboyer(unify_subst_nboyer, ((lst.car).cdr.cdr.car)))));
-                            else
-                                (lst = (lst.cdr));
-                    }
-                }
-        }
-    };
-    rewrite_args_nboyer = function(lst) {
-        var sc_lst_14;
-        return ((lst === null)?null:(new sc_Pair((rewrite_nboyer((lst.car))), ((sc_lst_14 = (lst.cdr)), ((sc_lst_14 === null)?null:(new sc_Pair((rewrite_nboyer((sc_lst_14.car))), (rewrite_args_nboyer((sc_lst_14.cdr))))))))));
-    };
-    (unify_subst_nboyer = "\u1E9C*");
-    one_way_unify1_nboyer = function(term1, term2) {
-        var lst1;
-        var lst2;
-        var temp_temp;
-        if (!(term2 instanceof sc_Pair))
-            {
-                (temp_temp = (sc_assq(term2, unify_subst_nboyer)));
-                if ((temp_temp!== false))
-                    return (is_term_equal_nboyer(term1, (temp_temp.cdr)));
-                else
-                    if ((sc_isNumber(term2)))
-                        return (sc_isEqual(term1, term2));
-                    else
-                        {
-                            (unify_subst_nboyer = (new sc_Pair((new sc_Pair(term2, term1)), unify_subst_nboyer)));
-                            return true;
-                        }
-            }
-        else
-            if (!(term1 instanceof sc_Pair))
-                return false;
-            else
-                if (((term1.car)===(term2.car)))
-                    {
-                        (lst1 = (term1.cdr));
-                        (lst2 = (term2.cdr));
-                        while (true) {
-                            if ((lst1 === null))
-                                return (lst2 === null);
-                            else
-                                if ((lst2 === null))
-                                    return false;
-                                else
-                                    if (((one_way_unify1_nboyer((lst1.car), (lst2.car)))!== false))
-                                        {
-                                            (lst1 = (lst1.cdr));
-                                            (lst2 = (lst2.cdr));
-                                        }
-                                    else
-                                        return false;
-                        }
-                    }
-                else
-                    return false;
-    };
-    (false_term_nboyer = "\u1E9C*");
-    (true_term_nboyer = "\u1E9C*");
-    trans_of_implies1_nboyer = function(n) {
-        var sc_n_15;
-        return ((sc_isEqual(n, (1)))?(sc_list("\u1E9Cimplies", (0), (1))):(sc_list("\u1E9Cand", (sc_list("\u1E9Cimplies", (n-(1)), n)), ((sc_n_15 = (n-(1))), ((sc_isEqual(sc_n_15, (1)))?(sc_list("\u1E9Cimplies", (0), (1))):(sc_list("\u1E9Cand", (sc_list("\u1E9Cimplies", (sc_n_15-(1)), sc_n_15)), (trans_of_implies1_nboyer((sc_n_15-(1)))))))))));
-    };
-    is_term_equal_nboyer = function(x, y) {
-        var lst1;
-        var lst2;
-        var r2;
-        var r1;
-        if ((x instanceof sc_Pair))
-            if ((y instanceof sc_Pair))
-                if ((((r1 = (x.car)), (r2 = (y.car)), (r1===r2))!== false))
-                    {
-                        (lst1 = (x.cdr));
-                        (lst2 = (y.cdr));
-                        while (true) {
-                            if ((lst1 === null))
-                                return (lst2 === null);
-                            else
-                                if ((lst2 === null))
-                                    return false;
-                                else
-                                    if (((is_term_equal_nboyer((lst1.car), (lst2.car)))!== false))
-                                        {
-                                            (lst1 = (lst1.cdr));
-                                            (lst2 = (lst2.cdr));
-                                        }
-                                    else
-                                        return false;
-                        }
-                    }
-                else
-                    return false;
-            else
-                return false;
-        else
-            return (sc_isEqual(x, y));
-    };
-    is_term_member_nboyer = function(x, lst) {
-        var x;
-        var lst;
-        while (true) {
-            if ((lst === null))
-                return false;
-            else
-                if (((is_term_equal_nboyer(x, (lst.car)))!== false))
-                    return true;
-                else
-                    (lst = (lst.cdr));
-        }
-    };
-    BgL_setupzd2boyerzd2 = function() {
-        var symbol_record;
-        var value;
-        var BgL_sc_symbolzd2record_16zd2;
-        var sym;
-        var sc_sym_17;
-        var term;
-        var lst;
-        var sc_term_18;
-        var sc_term_19;
-        {
-            (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null);
-            (if_constructor_nboyer = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer("\u1E9Cif")));
-            (false_term_nboyer = ((sc_term_19 = (new sc_Pair("\u1E9Cf",null))), (!(sc_term_19 instanceof sc_Pair)?sc_term_19:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_19.car))), (translate_args_nboyer((sc_term_19.cdr))))))));
-            (true_term_nboyer = ((sc_term_18 = (new sc_Pair("\u1E9Ct",null))), (!(sc_term_18 instanceof sc_Pair)?sc_term_18:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_18.car))), (translate_args_nboyer((sc_term_18.cdr))))))));
-            (lst = sc_const_3_nboyer);
-            while (!(lst === null)) {
-                {
-                    (term = (lst.car));
-                    if (((term instanceof sc_Pair)&&(((term.car)==="\u1E9Cequal")&&((term.cdr.car) instanceof sc_Pair))))
-                        {
-                            (sc_sym_17 = ((term.cdr.car).car));
-                            (value = (new sc_Pair((!(term instanceof sc_Pair)?term:(new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((term.car))), (translate_args_nboyer((term.cdr)))))), ((sym = ((term.cdr.car).car)), (BgL_sc_symbolzd2record_16zd2 = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sym))), (BgL_sc_symbolzd2record_16zd2[(1)])))));
-                            (symbol_record = (BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_sym_17)));
-                            (symbol_record[(1)] = value);
-                        }
-                    else
-                        (sc_error("ADD-LEMMA did not like term:  ", term));
-                    (lst = (lst.cdr));
-                }
-            }
-            return true;
-        }
-    };
-    BgL_testzd2boyerzd2 = function(n) {
-        var optrOpnd;
-        var term;
-        var sc_n_20;
-        var answer;
-        var sc_term_21;
-        var sc_term_22;
-        {
-            (rewrite_count_nboyer = (0));
-            (term = sc_const_4_nboyer);
-            (sc_n_20 = n);
-            while (!(sc_n_20=== 0)) {
-                {
-                    (term = (sc_list("\u1E9Cor", term, (new sc_Pair("\u1E9Cf",null)))));
-                    (--sc_n_20);
-                }
-            }
-            (sc_term_22 = term);
-            if (!(sc_term_22 instanceof sc_Pair))
-                (optrOpnd = sc_term_22);
-            else
-                (optrOpnd = (new sc_Pair((BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer((sc_term_22.car))), (translate_args_nboyer((sc_term_22.cdr))))));
-            (sc_term_21 = (apply_subst_nboyer(((const_nboyer === null)?null:(new sc_Pair((new sc_Pair((const_nboyer.car.car), (translate_term_nboyer((const_nboyer.car.cdr))))), (translate_alist_nboyer((const_nboyer.cdr)))))), optrOpnd)));
-            (answer = (tautologyp_nboyer((rewrite_nboyer(sc_term_21)), null, null)));
-            (sc_write(rewrite_count_nboyer));
-            (sc_display(" rewrites"));
-            (sc_newline());
-            if ((answer!== false))
-                return rewrite_count_nboyer;
-            else
-                return false;
-        }
-    };
-}
-/* Exported Variables */
-var BgL_parsezd2ze3nbzd2treesze3;
-var BgL_earleyzd2benchmarkzd2;
-var BgL_parsezd2ze3parsedzf3zc2;
-var test;
-var BgL_parsezd2ze3treesz31;
-var BgL_makezd2parserzd2;
-/* End Exports */
-
-var const_earley;
-{
-    (const_earley = (new sc_Pair((new sc_Pair("\u1E9Cs",(new sc_Pair((new sc_Pair("\u1E9Ca",null)),(new sc_Pair((new sc_Pair("\u1E9Cs",(new sc_Pair("\u1E9Cs",null)))),null)))))),null)));
-    BgL_makezd2parserzd2 = function(grammar, lexer) {
-        var i;
-        var parser_descr;
-        var def_loop;
-        var nb_nts;
-        var names;
-        var steps;
-        var predictors;
-        var enders;
-        var starters;
-        var nts;
-        var sc_names_1;
-        var sc_steps_2;
-        var sc_predictors_3;
-        var sc_enders_4;
-        var sc_starters_5;
-        var nb_confs;
-        var BgL_sc_defzd2loop_6zd2;
-        var BgL_sc_nbzd2nts_7zd2;
-        var sc_nts_8;
-        var BgL_sc_defzd2loop_9zd2;
-        var ind;
-        {
-            ind = function(nt, sc_nts_10) {
-                var i;
-                {
-                    (i = ((sc_nts_10.length)-(1)));
-                    while (true) {
-                        if ((i>=(0)))
-                            if ((sc_isEqual((sc_nts_10[i]), nt)))
-                                return i;
-                            else
-                                (--i);
-                        else
-                            return false;
-                    }
-                }
-            };
-            (sc_nts_8 = ((BgL_sc_defzd2loop_9zd2 = function(defs, sc_nts_11) {
-                var rule_loop;
-                var head;
-                var def;
-                return ((defs instanceof sc_Pair)?((def = (defs.car)), (head = (def.car)), (rule_loop = function(rules, sc_nts_12) {
-                    var nt;
-                    var l;
-                    var sc_nts_13;
-                    var rule;
-                    if ((rules instanceof sc_Pair))
-                        {
-                            (rule = (rules.car));
-                            (l = rule);
-                            (sc_nts_13 = sc_nts_12);
-                            while ((l instanceof sc_Pair)) {
-                                {
-                                    (nt = (l.car));
-                                    (l = (l.cdr));
-                                    (sc_nts_13 = (((sc_member(nt, sc_nts_13))!== false)?sc_nts_13:(new sc_Pair(nt, sc_nts_13))));
-                                }
-                            }
-                            return (rule_loop((rules.cdr), sc_nts_13));
-                        }
-                    else
-                        return (BgL_sc_defzd2loop_9zd2((defs.cdr), sc_nts_12));
-                }), (rule_loop((def.cdr), (((sc_member(head, sc_nts_11))!== false)?sc_nts_11:(new sc_Pair(head, sc_nts_11)))))):(sc_list2vector((sc_reverse(sc_nts_11)))));
-            }), (BgL_sc_defzd2loop_9zd2(grammar, null))));
-            (BgL_sc_nbzd2nts_7zd2 = (sc_nts_8.length));
-            (nb_confs = (((BgL_sc_defzd2loop_6zd2 = function(defs, BgL_sc_nbzd2confs_14zd2) {
-                var rule_loop;
-                var def;
-                return ((defs instanceof sc_Pair)?((def = (defs.car)), (rule_loop = function(rules, BgL_sc_nbzd2confs_15zd2) {
-                    var l;
-                    var BgL_sc_nbzd2confs_16zd2;
-                    var rule;
-                    if ((rules instanceof sc_Pair))
-                        {
-                            (rule = (rules.car));
-                            (l = rule);
-                            (BgL_sc_nbzd2confs_16zd2 = BgL_sc_nbzd2confs_15zd2);
-                            while ((l instanceof sc_Pair)) {
-                                {
-                                    (l = (l.cdr));
-                                    (++BgL_sc_nbzd2confs_16zd2);
-                                }
-                            }
-                            return (rule_loop((rules.cdr), (BgL_sc_nbzd2confs_16zd2+(1))));
-                        }
-                    else
-                        return (BgL_sc_defzd2loop_6zd2((defs.cdr), BgL_sc_nbzd2confs_15zd2));
-                }), (rule_loop((def.cdr), BgL_sc_nbzd2confs_14zd2))):BgL_sc_nbzd2confs_14zd2);
-            }), (BgL_sc_defzd2loop_6zd2(grammar, (0))))+BgL_sc_nbzd2nts_7zd2));
-            (sc_starters_5 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
-            (sc_enders_4 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
-            (sc_predictors_3 = (sc_makeVector(BgL_sc_nbzd2nts_7zd2, null)));
-            (sc_steps_2 = (sc_makeVector(nb_confs, false)));
-            (sc_names_1 = (sc_makeVector(nb_confs, false)));
-            (nts = sc_nts_8);
-            (starters = sc_starters_5);
-            (enders = sc_enders_4);
-            (predictors = sc_predictors_3);
-            (steps = sc_steps_2);
-            (names = sc_names_1);
-            (nb_nts = (sc_nts_8.length));
-            (i = (nb_nts-(1)));
-            while ((i>=(0))) {
-                {
-                    (sc_steps_2[i] = (i-nb_nts));
-                    (sc_names_1[i] = (sc_list((sc_nts_8[i]), (0))));
-                    (sc_enders_4[i] = (sc_list(i)));
-                    (--i);
-                }
-            }
-            def_loop = function(defs, conf) {
-                var rule_loop;
-                var head;
-                var def;
-                return ((defs instanceof sc_Pair)?((def = (defs.car)), (head = (def.car)), (rule_loop = function(rules, conf, rule_num) {
-                    var i;
-                    var sc_i_17;
-                    var nt;
-                    var l;
-                    var sc_conf_18;
-                    var sc_i_19;
-                    var rule;
-                    if ((rules instanceof sc_Pair))
-                        {
-                            (rule = (rules.car));
-                            (names[conf] = (sc_list(head, rule_num)));
-                            (sc_i_19 = (ind(head, nts)));
-                            (starters[sc_i_19] = (new sc_Pair(conf, (starters[sc_i_19]))));
-                            (l = rule);
-                            (sc_conf_18 = conf);
-                            while ((l instanceof sc_Pair)) {
-                                {
-                                    (nt = (l.car));
-                                    (steps[sc_conf_18] = (ind(nt, nts)));
-                                    (sc_i_17 = (ind(nt, nts)));
-                                    (predictors[sc_i_17] = (new sc_Pair(sc_conf_18, (predictors[sc_i_17]))));
-                                    (l = (l.cdr));
-                                    (++sc_conf_18);
-                                }
-                            }
-                            (steps[sc_conf_18] = ((ind(head, nts))-nb_nts));
-                            (i = (ind(head, nts)));
-                            (enders[i] = (new sc_Pair(sc_conf_18, (enders[i]))));
-                            return (rule_loop((rules.cdr), (sc_conf_18+(1)), (rule_num+(1))));
-                        }
-                    else
-                        return (def_loop((defs.cdr), conf));
-                }), (rule_loop((def.cdr), conf, (1)))):undefined);
-            };
-            (def_loop(grammar, (sc_nts_8.length)));
-            (parser_descr = [lexer, sc_nts_8, sc_starters_5, sc_enders_4, sc_predictors_3, sc_steps_2, sc_names_1]);
-            return function(input) {
-                var optrOpnd;
-                var sc_optrOpnd_20;
-                var sc_optrOpnd_21;
-                var sc_optrOpnd_22;
-                var loop1;
-                var BgL_sc_stateza2_23za2;
-                var toks;
-                var BgL_sc_nbzd2nts_24zd2;
-                var sc_steps_25;
-                var sc_enders_26;
-                var state_num;
-                var BgL_sc_statesza2_27za2;
-                var states;
-                var i;
-                var conf;
-                var l;
-                var tok_nts;
-                var sc_i_28;
-                var sc_i_29;
-                var l1;
-                var l2;
-                var tok;
-                var tail1129;
-                var L1125;
-                var goal_enders;
-                var BgL_sc_statesza2_30za2;
-                var BgL_sc_nbzd2nts_31zd2;
-                var BgL_sc_nbzd2confs_32zd2;
-                var nb_toks;
-                var goal_starters;
-                var sc_states_33;
-                var BgL_sc_nbzd2confs_34zd2;
-                var BgL_sc_nbzd2toks_35zd2;
-                var sc_toks_36;
-                var falseHead1128;
-                var sc_names_37;
-                var sc_steps_38;
-                var sc_predictors_39;
-                var sc_enders_40;
-                var sc_starters_41;
-                var sc_nts_42;
-                var lexer;
-                var sc_ind_43;
-                var make_states;
-                var BgL_sc_confzd2setzd2getza2_44za2;
-                var conf_set_merge_new_bang;
-                var conf_set_adjoin;
-                var BgL_sc_confzd2setzd2adjoinza2_45za2;
-                var BgL_sc_confzd2setzd2adjoinza2za2_46z00;
-                var conf_set_union;
-                var forw;
-                var is_parsed;
-                var deriv_trees;
-                var BgL_sc_derivzd2treesza2_47z70;
-                var nb_deriv_trees;
-                var BgL_sc_nbzd2derivzd2treesza2_48za2;
-                {
-                    sc_ind_43 = function(nt, sc_nts_49) {
-                        var i;
-                        {
-                            (i = ((sc_nts_49.length)-(1)));
-                            while (true) {
-                                if ((i>=(0)))
-                                    if ((sc_isEqual((sc_nts_49[i]), nt)))
-                                        return i;
-                                    else
-                                        (--i);
-                                else
-                                    return false;
-                            }
-                        }
-                    };
-                    make_states = function(BgL_sc_nbzd2toks_50zd2, BgL_sc_nbzd2confs_51zd2) {
-                        var v;
-                        var i;
-                        var sc_states_52;
-                        {
-                            (sc_states_52 = (sc_makeVector((BgL_sc_nbzd2toks_50zd2+(1)), false)));
-                            (i = BgL_sc_nbzd2toks_50zd2);
-                            while ((i>=(0))) {
-                                {
-                                    (v = (sc_makeVector((BgL_sc_nbzd2confs_51zd2+(1)), false)));
-                                    (v[(0)] = (-1));
-                                    (sc_states_52[i] = v);
-                                    (--i);
-                                }
-                            }
-                            return sc_states_52;
-                        }
-                    };
-                    BgL_sc_confzd2setzd2getza2_44za2 = function(state, BgL_sc_statezd2num_53zd2, sc_conf_54) {
-                        var conf_set;
-                        var BgL_sc_confzd2set_55zd2;
-                        return ((BgL_sc_confzd2set_55zd2 = (state[(sc_conf_54+(1))])), ((BgL_sc_confzd2set_55zd2!== false)?BgL_sc_confzd2set_55zd2:((conf_set = (sc_makeVector((BgL_sc_statezd2num_53zd2+(6)), false))), (conf_set[(1)] = (-3)), (conf_set[(2)] = (-1)), (conf_set[(3)] = (-1)), (conf_set[(4)] = (-1)), (state[(sc_conf_54+(1))] = conf_set), conf_set)));
-                    };
-                    conf_set_merge_new_bang = function(conf_set) {
-                        return ((conf_set[((conf_set[(1)])+(5))] = (conf_set[(4)])), (conf_set[(1)] = (conf_set[(3)])), (conf_set[(3)] = (-1)), (conf_set[(4)] = (-1)));
-                    };
-                    conf_set_adjoin = function(state, conf_set, sc_conf_56, i) {
-                        var tail;
-                        return ((tail = (conf_set[(3)])), (conf_set[(i+(5))] = (-1)), (conf_set[(tail+(5))] = i), (conf_set[(3)] = i), ((tail<(0))?((conf_set[(0)] = (state[(0)])), (state[(0)] = sc_conf_56)):undefined));
-                    };
-                    BgL_sc_confzd2setzd2adjoinza2_45za2 = function(sc_states_57, BgL_sc_statezd2num_58zd2, l, i) {
-                        var conf_set;
-                        var sc_conf_59;
-                        var l1;
-                        var state;
-                        {
-                            (state = (sc_states_57[BgL_sc_statezd2num_58zd2]));
-                            (l1 = l);
-                            while ((l1 instanceof sc_Pair)) {
-                                {
-                                    (sc_conf_59 = (l1.car));
-                                    (conf_set = (BgL_sc_confzd2setzd2getza2_44za2(state, BgL_sc_statezd2num_58zd2, sc_conf_59)));
-                                    if (((conf_set[(i+(5))])=== false))
-                                        {
-                                            (conf_set_adjoin(state, conf_set, sc_conf_59, i));
-                                            (l1 = (l1.cdr));
-                                        }
-                                    else
-                                        (l1 = (l1.cdr));
-                                }
-                            }
-                            return undefined;
-                        }
-                    };
-                    BgL_sc_confzd2setzd2adjoinza2za2_46z00 = function(sc_states_60, BgL_sc_statesza2_61za2, BgL_sc_statezd2num_62zd2, sc_conf_63, i) {
-                        var BgL_sc_confzd2setza2_64z70;
-                        var BgL_sc_stateza2_65za2;
-                        var conf_set;
-                        var state;
-                        return ((state = (sc_states_60[BgL_sc_statezd2num_62zd2])), ((((conf_set = (state[(sc_conf_63+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)?((BgL_sc_stateza2_65za2 = (BgL_sc_statesza2_61za2[BgL_sc_statezd2num_62zd2])), (BgL_sc_confzd2setza2_64z70 = (BgL_sc_confzd2setzd2getza2_44za2(BgL_sc_stateza2_65za2, BgL_sc_statezd2num_62zd2, sc_conf_63))), (((BgL_sc_confzd2setza2_64z70[(i+(5))])=== false)?(conf_set_adjoin(BgL_sc_stateza2_65za2, BgL_sc_confzd2setza2_64z70, sc_conf_63, i)):undefined), true):false));
-                    };
-                    conf_set_union = function(state, conf_set, sc_conf_66, other_set) {
-                        var i;
-                        {
-                            (i = (other_set[(2)]));
-                            while ((i>=(0))) {
-                                if (((conf_set[(i+(5))])=== false))
-                                    {
-                                        (conf_set_adjoin(state, conf_set, sc_conf_66, i));
-                                        (i = (other_set[(i+(5))]));
-                                    }
-                                else
-                                    (i = (other_set[(i+(5))]));
-                            }
-                            return undefined;
-                        }
-                    };
-                    forw = function(sc_states_67, BgL_sc_statezd2num_68zd2, sc_starters_69, sc_enders_70, sc_predictors_71, sc_steps_72, sc_nts_73) {
-                        var next_set;
-                        var next;
-                        var conf_set;
-                        var ender;
-                        var l;
-                        var starter_set;
-                        var starter;
-                        var sc_l_74;
-                        var sc_loop1_75;
-                        var head;
-                        var BgL_sc_confzd2set_76zd2;
-                        var BgL_sc_statezd2num_77zd2;
-                        var state;
-                        var sc_states_78;
-                        var preds;
-                        var BgL_sc_confzd2set_79zd2;
-                        var step;
-                        var sc_conf_80;
-                        var BgL_sc_nbzd2nts_81zd2;
-                        var sc_state_82;
-                        {
-                            (sc_state_82 = (sc_states_67[BgL_sc_statezd2num_68zd2]));
-                            (BgL_sc_nbzd2nts_81zd2 = (sc_nts_73.length));
-                            while (true) {
-                                {
-                                    (sc_conf_80 = (sc_state_82[(0)]));
-                                    if ((sc_conf_80>=(0)))
-                                        {
-                                            (step = (sc_steps_72[sc_conf_80]));
-                                            (BgL_sc_confzd2set_79zd2 = (sc_state_82[(sc_conf_80+(1))]));
-                                            (head = (BgL_sc_confzd2set_79zd2[(4)]));
-                                            (sc_state_82[(0)] = (BgL_sc_confzd2set_79zd2[(0)]));
-                                            (conf_set_merge_new_bang(BgL_sc_confzd2set_79zd2));
-                                            if ((step>=(0)))
-                                                {
-                                                    (sc_l_74 = (sc_starters_69[step]));
-                                                    while ((sc_l_74 instanceof sc_Pair)) {
-                                                        {
-                                                            (starter = (sc_l_74.car));
-                                                            (starter_set = (BgL_sc_confzd2setzd2getza2_44za2(sc_state_82, BgL_sc_statezd2num_68zd2, starter)));
-                                                            if (((starter_set[(BgL_sc_statezd2num_68zd2+(5))])=== false))
-                                                                {
-                                                                    (conf_set_adjoin(sc_state_82, starter_set, starter, BgL_sc_statezd2num_68zd2));
-                                                                    (sc_l_74 = (sc_l_74.cdr));
-                                                                }
-                                                            else
-                                                                (sc_l_74 = (sc_l_74.cdr));
-                                                        }
-                                                    }
-                                                    (l = (sc_enders_70[step]));
-                                                    while ((l instanceof sc_Pair)) {
-                                                        {
-                                                            (ender = (l.car));
-                                                            if ((((conf_set = (sc_state_82[(ender+(1))])), ((conf_set!== false)?(conf_set[(BgL_sc_statezd2num_68zd2+(5))]):false))!== false))
-                                                                {
-                                                                    (next = (sc_conf_80+(1)));
-                                                                    (next_set = (BgL_sc_confzd2setzd2getza2_44za2(sc_state_82, BgL_sc_statezd2num_68zd2, next)));
-                                                                    (conf_set_union(sc_state_82, next_set, next, BgL_sc_confzd2set_79zd2));
-                                                                    (l = (l.cdr));
-                                                                }
-                                                            else
-                                                                (l = (l.cdr));
-                                                        }
-                                                    }
-                                                }
-                                            else
-                                                {
-                                                    (preds = (sc_predictors_71[(step+BgL_sc_nbzd2nts_81zd2)]));
-                                                    (sc_states_78 = sc_states_67);
-                                                    (state = sc_state_82);
-                                                    (BgL_sc_statezd2num_77zd2 = BgL_sc_statezd2num_68zd2);
-                                                    (BgL_sc_confzd2set_76zd2 = BgL_sc_confzd2set_79zd2);
-                                                    sc_loop1_75 = function(l) {
-                                                        var sc_state_83;
-                                                        var BgL_sc_nextzd2set_84zd2;
-                                                        var sc_next_85;
-                                                        var pred_set;
-                                                        var i;
-                                                        var pred;
-                                                        if ((l instanceof sc_Pair))
-                                                            {
-                                                                (pred = (l.car));
-                                                                (i = head);
-                                                                while ((i>=(0))) {
-                                                                    {
-                                                                        (pred_set = ((sc_state_83 = (sc_states_78[i])), (sc_state_83[(pred+(1))])));
-                                                                        if ((pred_set!== false))
-                                                                            {
-                                                                                (sc_next_85 = (pred+(1)));
-                                                                                (BgL_sc_nextzd2set_84zd2 = (BgL_sc_confzd2setzd2getza2_44za2(state, BgL_sc_statezd2num_77zd2, sc_next_85)));
-                                                                                (conf_set_union(state, BgL_sc_nextzd2set_84zd2, sc_next_85, pred_set));
-                                                                            }
-                                                                        (i = (BgL_sc_confzd2set_76zd2[(i+(5))]));
-                                                                    }
-                                                                }
-                                                                return (sc_loop1_75((l.cdr)));
-                                                            }
-                                                        else
-                                                            return undefined;
-                                                    };
-                                                    (sc_loop1_75(preds));
-                                                }
-                                        }
-                                    else
-                                        return undefined;
-                                }
-                            }
-                        }
-                    };
-                    is_parsed = function(nt, i, j, sc_nts_86, sc_enders_87, sc_states_88) {
-                        var conf_set;
-                        var state;
-                        var sc_conf_89;
-                        var l;
-                        var BgL_sc_ntza2_90za2;
-                        {
-                            (BgL_sc_ntza2_90za2 = (sc_ind_43(nt, sc_nts_86)));
-                            if ((BgL_sc_ntza2_90za2!== false))
-                                {
-                                    (sc_nts_86.length);
-                                    (l = (sc_enders_87[BgL_sc_ntza2_90za2]));
-                                    while (true) {
-                                        if ((l instanceof sc_Pair))
-                                            {
-                                                (sc_conf_89 = (l.car));
-                                                if ((((state = (sc_states_88[j])), (conf_set = (state[(sc_conf_89+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
-                                                    return true;
-                                                else
-                                                    (l = (l.cdr));
-                                            }
-                                        else
-                                            return false;
-                                    }
-                                }
-                            else
-                                return false;
-                        }
-                    };
-                    deriv_trees = function(sc_conf_91, i, j, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2) {
-                        var sc_loop1_98;
-                        var prev;
-                        var name;
-                        return ((name = (sc_names_94[sc_conf_91])), ((name!== false)?((sc_conf_91<BgL_sc_nbzd2nts_97zd2)?(sc_list((sc_list(name, ((sc_toks_95[i]).car))))):(sc_list((sc_list(name))))):((prev = (sc_conf_91-(1))), (sc_loop1_98 = function(l1, l2) {
-                            var loop2;
-                            var ender_set;
-                            var state;
-                            var ender;
-                            var l1;
-                            var l2;
-                            while (true) {
-                                if ((l1 instanceof sc_Pair))
-                                    {
-                                        (ender = (l1.car));
-                                        (ender_set = ((state = (sc_states_96[j])), (state[(ender+(1))])));
-                                        if ((ender_set!== false))
-                                            {
-                                                loop2 = function(k, l2) {
-                                                    var loop3;
-                                                    var ender_trees;
-                                                    var prev_trees;
-                                                    var conf_set;
-                                                    var sc_state_99;
-                                                    var k;
-                                                    var l2;
-                                                    while (true) {
-                                                        if ((k>=(0)))
-                                                            if (((k>=i)&&(((sc_state_99 = (sc_states_96[k])), (conf_set = (sc_state_99[(prev+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)))
-                                                                {
-                                                                    (prev_trees = (deriv_trees(prev, i, k, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2)));
-                                                                    (ender_trees = (deriv_trees(ender, k, j, sc_enders_92, sc_steps_93, sc_names_94, sc_toks_95, sc_states_96, BgL_sc_nbzd2nts_97zd2)));
-                                                                    loop3 = function(l3, l2) {
-                                                                        var l4;
-                                                                        var sc_l2_100;
-                                                                        var ender_tree;
-                                                                        if ((l3 instanceof sc_Pair))
-                                                                            {
-                                                                                (ender_tree = (sc_list((l3.car))));
-                                                                                (l4 = prev_trees);
-                                                                                (sc_l2_100 = l2);
-                                                                                while ((l4 instanceof sc_Pair)) {
-                                                                                    {
-                                                                                        (sc_l2_100 = (new sc_Pair((sc_append((l4.car), ender_tree)), sc_l2_100)));
-                                                                                        (l4 = (l4.cdr));
-                                                                                    }
-                                                                                }
-                                                                                return (loop3((l3.cdr), sc_l2_100));
-                                                                            }
-                                                                        else
-                                                                            return (loop2((ender_set[(k+(5))]), l2));
-                                                                    };
-                                                                    return (loop3(ender_trees, l2));
-                                                                }
-                                                            else
-                                                                (k = (ender_set[(k+(5))]));
-                                                        else
-                                                            return (sc_loop1_98((l1.cdr), l2));
-                                                    }
-                                                };
-                                                return (loop2((ender_set[(2)]), l2));
-                                            }
-                                        else
-                                            (l1 = (l1.cdr));
-                                    }
-                                else
-                                    return l2;
-                            }
-                        }), (sc_loop1_98((sc_enders_92[(sc_steps_93[prev])]), null)))));
-                    };
-                    BgL_sc_derivzd2treesza2_47z70 = function(nt, i, j, sc_nts_101, sc_enders_102, sc_steps_103, sc_names_104, sc_toks_105, sc_states_106) {
-                        var conf_set;
-                        var state;
-                        var sc_conf_107;
-                        var l;
-                        var trees;
-                        var BgL_sc_nbzd2nts_108zd2;
-                        var BgL_sc_ntza2_109za2;
-                        {
-                            (BgL_sc_ntza2_109za2 = (sc_ind_43(nt, sc_nts_101)));
-                            if ((BgL_sc_ntza2_109za2!== false))
-                                {
-                                    (BgL_sc_nbzd2nts_108zd2 = (sc_nts_101.length));
-                                    (l = (sc_enders_102[BgL_sc_ntza2_109za2]));
-                                    (trees = null);
-                                    while ((l instanceof sc_Pair)) {
-                                        {
-                                            (sc_conf_107 = (l.car));
-                                            if ((((state = (sc_states_106[j])), (conf_set = (state[(sc_conf_107+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
-                                                {
-                                                    (l = (l.cdr));
-                                                    (trees = (sc_append((deriv_trees(sc_conf_107, i, j, sc_enders_102, sc_steps_103, sc_names_104, sc_toks_105, sc_states_106, BgL_sc_nbzd2nts_108zd2)), trees)));
-                                                }
-                                            else
-                                                (l = (l.cdr));
-                                        }
-                                    }
-                                    return trees;
-                                }
-                            else
-                                return false;
-                        }
-                    };
-                    nb_deriv_trees = function(sc_conf_110, i, j, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2) {
-                        var sc_loop1_116;
-                        var tmp1124;
-                        var prev;
-                        return ((prev = (sc_conf_110-(1))), ((((tmp1124 = (sc_conf_110<BgL_sc_nbzd2nts_115zd2)), ((tmp1124!== false)?tmp1124:((sc_steps_112[prev])<(0))))!== false)?(1):((sc_loop1_116 = function(l, sc_n_118) {
-                            var nb_ender_trees;
-                            var nb_prev_trees;
-                            var conf_set;
-                            var state;
-                            var k;
-                            var n;
-                            var ender_set;
-                            var sc_state_117;
-                            var ender;
-                            var l;
-                            var sc_n_118;
-                            while (true) {
-                                if ((l instanceof sc_Pair))
-                                    {
-                                        (ender = (l.car));
-                                        (ender_set = ((sc_state_117 = (sc_states_114[j])), (sc_state_117[(ender+(1))])));
-                                        if ((ender_set!== false))
-                                            {
-                                                (k = (ender_set[(2)]));
-                                                (n = sc_n_118);
-                                                while ((k>=(0))) {
-                                                    if (((k>=i)&&(((state = (sc_states_114[k])), (conf_set = (state[(prev+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false)))
-                                                        {
-                                                            (nb_prev_trees = (nb_deriv_trees(prev, i, k, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2)));
-                                                            (nb_ender_trees = (nb_deriv_trees(ender, k, j, sc_enders_111, sc_steps_112, sc_toks_113, sc_states_114, BgL_sc_nbzd2nts_115zd2)));
-                                                            (k = (ender_set[(k+(5))]));
-                                                            (n +=(nb_prev_trees*nb_ender_trees));
-                                                        }
-                                                    else
-                                                        (k = (ender_set[(k+(5))]));
-                                                }
-                                                return (sc_loop1_116((l.cdr), n));
-                                            }
-                                        else
-                                            (l = (l.cdr));
-                                    }
-                                else
-                                    return sc_n_118;
-                            }
-                        }), (sc_loop1_116((sc_enders_111[(sc_steps_112[prev])]), (0))))));
-                    };
-                    BgL_sc_nbzd2derivzd2treesza2_48za2 = function(nt, i, j, sc_nts_119, sc_enders_120, sc_steps_121, sc_toks_122, sc_states_123) {
-                        var conf_set;
-                        var state;
-                        var sc_conf_124;
-                        var l;
-                        var nb_trees;
-                        var BgL_sc_nbzd2nts_125zd2;
-                        var BgL_sc_ntza2_126za2;
-                        {
-                            (BgL_sc_ntza2_126za2 = (sc_ind_43(nt, sc_nts_119)));
-                            if ((BgL_sc_ntza2_126za2!== false))
-                                {
-                                    (BgL_sc_nbzd2nts_125zd2 = (sc_nts_119.length));
-                                    (l = (sc_enders_120[BgL_sc_ntza2_126za2]));
-                                    (nb_trees = (0));
-                                    while ((l instanceof sc_Pair)) {
-                                        {
-                                            (sc_conf_124 = (l.car));
-                                            if ((((state = (sc_states_123[j])), (conf_set = (state[(sc_conf_124+(1))])), ((conf_set!== false)?(conf_set[(i+(5))]):false))!== false))
-                                                {
-                                                    (l = (l.cdr));
-                                                    (nb_trees = ((nb_deriv_trees(sc_conf_124, i, j, sc_enders_120, sc_steps_121, sc_toks_122, sc_states_123, BgL_sc_nbzd2nts_125zd2))+nb_trees));
-                                                }
-                                            else
-                                                (l = (l.cdr));
-                                        }
-                                    }
-                                    return nb_trees;
-                                }
-                            else
-                                return false;
-                        }
-                    };
-                    (lexer = (parser_descr[(0)]));
-                    (sc_nts_42 = (parser_descr[(1)]));
-                    (sc_starters_41 = (parser_descr[(2)]));
-                    (sc_enders_40 = (parser_descr[(3)]));
-                    (sc_predictors_39 = (parser_descr[(4)]));
-                    (sc_steps_38 = (parser_descr[(5)]));
-                    (sc_names_37 = (parser_descr[(6)]));
-                    (falseHead1128 = (new sc_Pair(null, null)));
-                    (L1125 = (lexer(input)));
-                    (tail1129 = falseHead1128);
-                    while (!(L1125 === null)) {
-                        {
-                            (tok = (L1125.car));
-                            (l1 = (tok.cdr));
-                            (l2 = null);
-                            while ((l1 instanceof sc_Pair)) {
-                                {
-                                    (sc_i_29 = (sc_ind_43((l1.car), sc_nts_42)));
-                                    if ((sc_i_29!== false))
-                                        {
-                                            (l1 = (l1.cdr));
-                                            (l2 = (new sc_Pair(sc_i_29, l2)));
-                                        }
-                                    else
-                                        (l1 = (l1.cdr));
-                                }
-                            }
-                            (sc_optrOpnd_22 = (new sc_Pair((tok.car), (sc_reverse(l2)))));
-                            (sc_optrOpnd_21 = (new sc_Pair(sc_optrOpnd_22, null)));
-                            (tail1129.cdr = sc_optrOpnd_21);
-                            (tail1129 = (tail1129.cdr));
-                            (L1125 = (L1125.cdr));
-                        }
-                    }
-                    (sc_optrOpnd_20 = (falseHead1128.cdr));
-                    (sc_toks_36 = (sc_list2vector(sc_optrOpnd_20)));
-                    (BgL_sc_nbzd2toks_35zd2 = (sc_toks_36.length));
-                    (BgL_sc_nbzd2confs_34zd2 = (sc_steps_38.length));
-                    (sc_states_33 = (make_states(BgL_sc_nbzd2toks_35zd2, BgL_sc_nbzd2confs_34zd2)));
-                    (goal_starters = (sc_starters_41[(0)]));
-                    (BgL_sc_confzd2setzd2adjoinza2_45za2(sc_states_33, (0), goal_starters, (0)));
-                    (forw(sc_states_33, (0), sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_nts_42));
-                    (sc_i_28 = (0));
-                    while ((sc_i_28<BgL_sc_nbzd2toks_35zd2)) {
-                        {
-                            (tok_nts = ((sc_toks_36[sc_i_28]).cdr));
-                            (BgL_sc_confzd2setzd2adjoinza2_45za2(sc_states_33, (sc_i_28+(1)), tok_nts, sc_i_28));
-                            (forw(sc_states_33, (sc_i_28+(1)), sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_nts_42));
-                            (++sc_i_28);
-                        }
-                    }
-                    (nb_toks = (sc_toks_36.length));
-                    (BgL_sc_nbzd2confs_32zd2 = (sc_steps_38.length));
-                    (BgL_sc_nbzd2nts_31zd2 = (sc_nts_42.length));
-                    (BgL_sc_statesza2_30za2 = (make_states(nb_toks, BgL_sc_nbzd2confs_32zd2)));
-                    (goal_enders = (sc_enders_40[(0)]));
-                    (l = goal_enders);
-                    while ((l instanceof sc_Pair)) {
-                        {
-                            (conf = (l.car));
-                            (BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_33, BgL_sc_statesza2_30za2, nb_toks, conf, (0)));
-                            (l = (l.cdr));
-                        }
-                    }
-                    (i = nb_toks);
-                    while ((i>=(0))) {
-                        {
-                            (states = sc_states_33);
-                            (BgL_sc_statesza2_27za2 = BgL_sc_statesza2_30za2);
-                            (state_num = i);
-                            (sc_enders_26 = sc_enders_40);
-                            (sc_steps_25 = sc_steps_38);
-                            (BgL_sc_nbzd2nts_24zd2 = BgL_sc_nbzd2nts_31zd2);
-                            (toks = sc_toks_36);
-                            (BgL_sc_stateza2_23za2 = (BgL_sc_statesza2_30za2[i]));
-                            loop1 = function() {
-                                var sc_loop1_127;
-                                var prev;
-                                var BgL_sc_statesza2_128za2;
-                                var sc_states_129;
-                                var j;
-                                var i;
-                                var sc_i_130;
-                                var head;
-                                var conf_set;
-                                var sc_conf_131;
-                                {
-                                    (sc_conf_131 = (BgL_sc_stateza2_23za2[(0)]));
-                                    if ((sc_conf_131>=(0)))
-                                        {
-                                            (conf_set = (BgL_sc_stateza2_23za2[(sc_conf_131+(1))]));
-                                            (head = (conf_set[(4)]));
-                                            (BgL_sc_stateza2_23za2[(0)] = (conf_set[(0)]));
-                                            (conf_set_merge_new_bang(conf_set));
-                                            (sc_i_130 = head);
-                                            while ((sc_i_130>=(0))) {
-                                                {
-                                                    (i = sc_i_130);
-                                                    (j = state_num);
-                                                    (sc_states_129 = states);
-                                                    (BgL_sc_statesza2_128za2 = BgL_sc_statesza2_27za2);
-                                                    (prev = (sc_conf_131-(1)));
-                                                    if (((sc_conf_131>=BgL_sc_nbzd2nts_24zd2)&&((sc_steps_25[prev])>=(0))))
-                                                        {
-                                                            sc_loop1_127 = function(l) {
-                                                                var k;
-                                                                var ender_set;
-                                                                var state;
-                                                                var ender;
-                                                                var l;
-                                                                while (true) {
-                                                                    if ((l instanceof sc_Pair))
-                                                                        {
-                                                                            (ender = (l.car));
-                                                                            (ender_set = ((state = (sc_states_129[j])), (state[(ender+(1))])));
-                                                                            if ((ender_set!== false))
-                                                                                {
-                                                                                    (k = (ender_set[(2)]));
-                                                                                    while ((k>=(0))) {
-                                                                                        {
-                                                                                            if ((k>=i))
-                                                                                                if (((BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_129, BgL_sc_statesza2_128za2, k, prev, i))!== false))
-                                                                                                    (BgL_sc_confzd2setzd2adjoinza2za2_46z00(sc_states_129, BgL_sc_statesza2_128za2, j, ender, k));
-                                                                                            (k = (ender_set[(k+(5))]));
-                                                                                        }
-                                                                                    }
-                                                                                    return (sc_loop1_127((l.cdr)));
-                                                                                }
-                                                                            else
-                                                                                (l = (l.cdr));
-                                                                        }
-                                                                    else
-                                                                        return undefined;
-                                                                }
-                                                            };
-                                                            (sc_loop1_127((sc_enders_26[(sc_steps_25[prev])])));
-                                                        }
-                                                    (sc_i_130 = (conf_set[(sc_i_130+(5))]));
-                                                }
-                                            }
-                                            return (loop1());
-                                        }
-                                    else
-                                        return undefined;
-                                }
-                            };
-                            (loop1());
-                            (--i);
-                        }
-                    }
-                    (optrOpnd = BgL_sc_statesza2_30za2);
-                    return [sc_nts_42, sc_starters_41, sc_enders_40, sc_predictors_39, sc_steps_38, sc_names_37, sc_toks_36, optrOpnd, is_parsed, BgL_sc_derivzd2treesza2_47z70, BgL_sc_nbzd2derivzd2treesza2_48za2];
-                }
-            };
-        }
-    };
-    BgL_parsezd2ze3parsedzf3zc2 = function(parse, nt, i, j) {
-        var is_parsed;
-        var states;
-        var enders;
-        var nts;
-        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (states = (parse[(7)])), (is_parsed = (parse[(8)])), (is_parsed(nt, i, j, nts, enders, states)));
-    };
-    BgL_parsezd2ze3treesz31 = function(parse, nt, i, j) {
-        var BgL_sc_derivzd2treesza2_132z70;
-        var states;
-        var toks;
-        var names;
-        var steps;
-        var enders;
-        var nts;
-        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (steps = (parse[(4)])), (names = (parse[(5)])), (toks = (parse[(6)])), (states = (parse[(7)])), (BgL_sc_derivzd2treesza2_132z70 = (parse[(9)])), (BgL_sc_derivzd2treesza2_132z70(nt, i, j, nts, enders, steps, names, toks, states)));
-    };
-    BgL_parsezd2ze3nbzd2treesze3 = function(parse, nt, i, j) {
-        var BgL_sc_nbzd2derivzd2treesza2_133za2;
-        var states;
-        var toks;
-        var steps;
-        var enders;
-        var nts;
-        return ((nts = (parse[(0)])), (enders = (parse[(2)])), (steps = (parse[(4)])), (toks = (parse[(6)])), (states = (parse[(7)])), (BgL_sc_nbzd2derivzd2treesza2_133za2 = (parse[(10)])), (BgL_sc_nbzd2derivzd2treesza2_133za2(nt, i, j, nts, enders, steps, toks, states)));
-    };
-    test = function(k) {
-        var x;
-        var p;
-        return ((p = (BgL_makezd2parserzd2(const_earley, function(l) {
-            var sc_x_134;
-            var tail1134;
-            var L1130;
-            var falseHead1133;
-            {
-                (falseHead1133 = (new sc_Pair(null, null)));
-                (tail1134 = falseHead1133);
-                (L1130 = l);
-                while (!(L1130 === null)) {
-                    {
-                        (tail1134.cdr = (new sc_Pair(((sc_x_134 = (L1130.car)), (sc_list(sc_x_134, sc_x_134))), null)));
-                        (tail1134 = (tail1134.cdr));
-                        (L1130 = (L1130.cdr));
-                    }
-                }
-                return (falseHead1133.cdr);
-            }
-        }))), (x = (p((sc_vector2list((sc_makeVector(k, "\u1E9Ca"))))))), (sc_length((BgL_parsezd2ze3treesz31(x, "\u1E9Cs", (0), k)))));
-    };
-    BgL_earleyzd2benchmarkzd2 = function() {
-        var args = null;
-        for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) {
-            args = sc_cons(arguments[sc_tmp], args);
-        }
-        var k;
-        return ((k = ((args === null)?(7):(args.car))), (BgL_runzd2benchmarkzd2("earley", (1), function() {
-            return (test(k));
-        }, function(result) {
-            return ((sc_display(result)), (sc_newline()), result == 132);
-        })));
-    };
-}
-
-
-/************* END OF GENERATED CODE *************/
-// Invoke this function to run a benchmark.
-// The first argument is a string identifying the benchmark.
-// The second argument is the number of times to run the benchmark.
-// The third argument is a function that runs the benchmark.
-// The fourth argument is a unary function that warns if the result
-// returned by the benchmark is incorrect.
-//
-// Example:
-// RunBenchmark("new Array()",
-//              1,
-//              function () { new Array(1000000); }
-//              function (v) {
-//                return (v instanceof Array) && (v.length == 1000000);
-//              });
-
-SC_DEFAULT_OUT = new sc_GenericOutputPort(function(s) {});
-SC_ERROR_OUT = SC_DEFAULT_OUT;
-
-function RunBenchmark(name, count, run, warn) {
-  for (var n = 0; n < count; ++n) {
-    result = run();
-    if (!warn(result)) {
-      throw new Error("Earley or Boyer did incorrect number of rewrites");
-    }
-  }
-}
-
-var BgL_runzd2benchmarkzd2 = RunBenchmark;
-
-class Benchmark {
-    runIteration() {
-        BgL_earleyzd2benchmarkzd2();
-        BgL_nboyerzd2benchmarkzd2();
-    }
-}
diff --git a/Octane/gbemu-part1.js b/Octane/gbemu-part1.js
deleted file mode 100644
index 73ff9a3..0000000
--- a/Octane/gbemu-part1.js
+++ /dev/null
@@ -1,1339 +0,0 @@
-// Portions copyright 2013 Google, Inc
-
-// Copyright (C) 2010 - 2012 Grant Galitz
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License version 2 as
-// published by the Free Software Foundation.
-// The full license is available at http://www.gnu.org/licenses/gpl.html
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-// See the GNU General Public License for more details.
-
-// The code has been adapted for use as a benchmark by Google.
-
-var decoded_gameboy_rom = null;
-
-function setupGameboy() {
-
-  // Check if all the types required by the code are supported.
-  // If not, throw exception and quit.
-  if (!(typeof Uint8Array != "undefined" &&
-      typeof Int8Array != "undefined" &&
-      typeof Float32Array != "undefined" &&
-      typeof Int32Array != "undefined") ) {
-    throw "TypedArrayUnsupported";
-  }
-  decoded_gameboy_rom = base64_decode(gameboy_rom);
-  rom = null;
-}
-
-function runGameboy() {
-  start(new GameBoyCanvas(), decoded_gameboy_rom);
-
-  gameboy.instructions = 0;
-  gameboy.totalInstructions = 250000;
-
-  while (gameboy.instructions <= gameboy.totalInstructions) {
-    gameboy.run();
-    GameBoyAudioNode.run();
-  }
-
-  resetGlobalVariables();
-}
-
-function tearDownGameboy() {
-  decoded_gameboy_rom = null;
-  expectedGameboyStateStr = null;
-}
-
-var expectedGameboyStateStr =
-  '{"registerA":160,"registerB":255,"registerC":255,"registerE":11,' +
-  '"registersHL":51600,"programCounter":24309,"stackPointer":49706,' +
-  '"sumROM":10171578,"sumMemory":3435856,"sumMBCRam":234598,"sumVRam":0}';
-
-// Start of browser emulation.
-
-var GameBoyWindow = { };
-
-function GameBoyContext() {
-  this.createBuffer = function() {
-    return new Buffer();
-  }
-  this.createImageData = function (w, h) {
-    var result = {};
-    // The following line was updated since Octane 1.0 to avoid OOB access.
-    result.data = new Uint8Array(w * h * 4);
-    return result;
-  }
-  this.putImageData = function (buffer, x, y) {
-    var sum = 0;
-    for (var i = 0; i < buffer.data.length; i++) {
-      sum += i * buffer.data[i];
-      sum = sum % 1000;
-    }
-  }
-  this.drawImage = function () { }
-};
-
-function GameBoyCanvas() {
-  this.getContext = function() {
-    return new GameBoyContext();
-  }
-  this.width = 160;
-  this.height = 144;
-  this.style = { visibility: "visibile" };
-}
-
-function cout(message, colorIndex) {
-}
-
-function clear_terminal() {
-}
-
-var GameBoyAudioNode = {
-  bufferSize : 0,
-  onaudioprocess : null ,
-  connect : function () {},
-  run: function() {
-    var event = {outputBuffer : this.outputBuffer};
-    this.onaudioprocess(event);
-  }
-};
-
-function GameBoyAudioContext () {
-  this.createBufferSource = function() {
-    return { noteOn : function () {}, connect : function() {}};
-  }
-  this.sampleRate = 48000;
-  this.destination = {}
-  this.createBuffer = function (channels, len, sampleRate) {
-    return { gain : 1,
-             numberOfChannels : 1,
-             length : 1,
-             duration : 0.000020833333110203966,
-             sampleRate : 48000}
-  }
-  this.createJavaScriptNode = function (bufferSize, inputChannels, outputChannels) {
-    GameBoyAudioNode.bufferSize = bufferSize;
-    GameBoyAudioNode.outputBuffer = {
-        getChannelData : function (i) {return this.channelData[i];},
-        channelData    : []
-    };
-    for (var i = 0; i < outputChannels; i++) {
-      GameBoyAudioNode.outputBuffer.channelData[i] = new Float32Array(bufferSize);
-    }
-    return GameBoyAudioNode;
-  }
-}
-
-var mock_date_time_counter = 0;
-
-function new_Date() {
-  return {
-    getTime: function() {
-      mock_date_time_counter += 16;
-      return mock_date_time_counter;
-    }
-  };
-}
-
-// End of browser emulation.
-
-// Start of helper functions.
-
-function checkFinalState() {
-  function sum(a) {
-    var result = 0;
-    for (var i = 0; i < a.length; i++) {
-      result += a[i];
-    }
-    return result;
-  }
-  var state = {
-    registerA: gameboy.registerA,
-    registerB: gameboy.registerB,
-    registerC: gameboy.registerC,
-    registerE: gameboy.registerE,
-    registerF: gameboy.registerF,
-    registersHL: gameboy.registersHL,
-    programCounter: gameboy.programCounter,
-    stackPointer: gameboy.stackPointer,
-    sumROM : sum(gameboy.fromTypedArray(gameboy.ROM)),
-    sumMemory: sum(gameboy.fromTypedArray(gameboy.memory)),
-    sumMBCRam: sum(gameboy.fromTypedArray(gameboy.MBCRam)),
-    sumVRam: sum(gameboy.fromTypedArray(gameboy.VRam))
-  }
-  var stateStr = JSON.stringify(state);
-  if (typeof expectedGameboyStateStr != "undefined") {
-    if (stateStr != expectedGameboyStateStr) {
-      alert("Incorrect final state of processor:\n" +
-            " actual   " + stateStr + "\n" +
-            " expected " + expectedGameboyStateStr);
-    }
-  } else {
-    alert(stateStr);
-  }
-}
-
-
-function resetGlobalVariables () {
-  //Audio API Event Handler:
-  audioContextHandle = null;
-  audioNode = null;
-  audioSource = null;
-  launchedContext = false;
-  audioContextSampleBuffer = [];
-  resampled = [];
-  webAudioMinBufferSize = 15000;
-  webAudioMaxBufferSize = 25000;
-  webAudioActualSampleRate = 44100;
-  XAudioJSSampleRate = 0;
-  webAudioMono = false;
-  XAudioJSVolume = 1;
-  resampleControl = null;
-  audioBufferSize = 0;
-  resampleBufferStart = 0;
-  resampleBufferEnd = 0;
-  resampleBufferSize = 2;
-
-  gameboy = null;           //GameBoyCore object.
-  gbRunInterval = null;       //GameBoyCore Timer
-}
-
-
-// End of helper functions.
-
-// Original code from Grant Galitz follows.
-// Modifications by Google are marked in comments.
-
-// Start of js/other/base64.js file.
-
-var toBase64 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
-  "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
-  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+" , "/", "="];
-var fromBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-function base64(data) {
-  try {
-    // The following line was modified for benchmarking:
-    var base64 = GameBoyWindow.btoa(data);  //Use this native function when it's available, as it's a magnitude faster than the non-native code below.
-  }
-  catch (error) {
-    //Defaulting to non-native base64 encoding...
-    var base64 = "";
-    var dataLength = data.length;
-    if (dataLength > 0) {
-      var bytes = [0, 0, 0];
-      var index = 0;
-      var remainder = dataLength % 3;
-      while (data.length % 3 > 0) {
-        //Make sure we don't do fuzzy math in the next loop...
-        data[data.length] = " ";
-      }
-      while (index < dataLength) {
-        //Keep this loop small for speed.
-        bytes = [data.charCodeAt(index++) & 0xFF, data.charCodeAt(index++) & 0xFF, data.charCodeAt(index++) & 0xFF];
-        base64 += toBase64[bytes[0] >> 2] + toBase64[((bytes[0] & 0x3) << 4) | (bytes[1] >> 4)] + toBase64[((bytes[1] & 0xF) << 2) | (bytes[2] >> 6)] + toBase64[bytes[2] & 0x3F];
-      }
-      if (remainder > 0) {
-        //Fill in the padding and recalulate the trailing six-bit group...
-        base64[base64.length - 1] = "=";
-        if (remainder == 2) {
-          base64[base64.length - 2] = "=";
-          base64[base64.length - 3] = toBase64[(bytes[0] & 0x3) << 4];
-        }
-        else {
-          base64[base64.length - 2] = toBase64[(bytes[1] & 0xF) << 2];
-        }
-      }
-    }
-  }
-  return base64;
-}
-function base64_decode(data) {
-  try {
-    // The following line was modified for benchmarking:
-    var decode64 = GameBoyWindow.atob(data);  //Use this native function when it's available, as it's a magnitude faster than the non-native code below.
-  }
-  catch (error) {
-    //Defaulting to non-native base64 decoding...
-    var decode64 = "";
-    var dataLength = data.length;
-    if (dataLength > 3 && dataLength % 4 == 0) {
-      var sixbits = [0, 0, 0, 0];  //Declare this out of the loop, to speed up the ops.
-      var index = 0;
-      while (index < dataLength) {
-        //Keep this loop small for speed.
-        sixbits = [fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++)), fromBase64.indexOf(data.charAt(index++))];
-        decode64 += String.fromCharCode((sixbits[0] << 2) | (sixbits[1] >> 4)) + String.fromCharCode(((sixbits[1] & 0x0F) << 4) | (sixbits[2] >> 2)) + String.fromCharCode(((sixbits[2] & 0x03) << 6) | sixbits[3]);
-      }
-      //Check for the '=' character after the loop, so we don't hose it up.
-      if (sixbits[3] >= 0x40) {
-        decode64.length -= 1;
-        if (sixbits[2] >= 0x40) {
-          decode64.length -= 1;
-        }
-      }
-    }
-  }
-  return decode64;
-}
-function to_little_endian_dword(str) {
-  return to_little_endian_word(str) + String.fromCharCode((str >> 16) & 0xFF, (str >> 24) & 0xFF);
-}
-function to_little_endian_word(str) {
-  return to_byte(str) + String.fromCharCode((str >> 8) & 0xFF);
-}
-function to_byte(str) {
-  return String.fromCharCode(str & 0xFF);
-}
-function arrayToBase64(arrayIn) {
-  var binString = "";
-  var length = arrayIn.length;
-  for (var index = 0; index < length; ++index) {
-    if (typeof arrayIn[index] == "number") {
-      binString += String.fromCharCode(arrayIn[index]);
-    }
-  }
-  return base64(binString);
-}
-function base64ToArray(b64String) {
-  var binString = base64_decode(b64String);
-  var outArray = [];
-  var length = binString.length;
-  for (var index = 0; index < length;) {
-    outArray.push(binString.charCodeAt(index++) & 0xFF);
-  }
-  return outArray;
-}
-
-// End of js/other/base64.js file.
-
-// Start of js/other/resampler.js file.
-
-//JavaScript Audio Resampler (c) 2011 - Grant Galitz
-function Resampler(fromSampleRate, toSampleRate, channels, outputBufferSize, noReturn) {
-  this.fromSampleRate = fromSampleRate;
-  this.toSampleRate = toSampleRate;
-  this.channels = channels | 0;
-  this.outputBufferSize = outputBufferSize;
-  this.noReturn = !!noReturn;
-  this.initialize();
-}
-Resampler.prototype.initialize = function () {
-  //Perform some checks:
-  if (this.fromSampleRate > 0 && this.toSampleRate > 0 && this.channels > 0) {
-    if (this.fromSampleRate == this.toSampleRate) {
-      //Setup a resampler bypass:
-      this.resampler = this.bypassResampler;    //Resampler just returns what was passed through.
-      this.ratioWeight = 1;
-    }
-    else {
-      //Setup the interpolation resampler:
-      this.compileInterpolationFunction();
-      this.resampler = this.interpolate;      //Resampler is a custom quality interpolation algorithm.
-      this.ratioWeight = this.fromSampleRate / this.toSampleRate;
-      this.tailExists = false;
-      this.lastWeight = 0;
-      this.initializeBuffers();
-    }
-  }
-  else {
-    throw(new Error("Invalid settings specified for the resampler."));
-  }
-}
-Resampler.prototype.compileInterpolationFunction = function () {
-  var toCompile = "var bufferLength = Math.min(buffer.length, this.outputBufferSize);\
-  if ((bufferLength % " + this.channels + ") == 0) {\
-    if (bufferLength > 0) {\
-      var ratioWeight = this.ratioWeight;\
-      var weight = 0;";
-  for (var channel = 0; channel < this.channels; ++channel) {
-    toCompile += "var output" + channel + " = 0;"
-  }
-  toCompile += "var actualPosition = 0;\
-      var amountToNext = 0;\
-      var alreadyProcessedTail = !this.tailExists;\
-      this.tailExists = false;\
-      var outputBuffer = this.outputBuffer;\
-      var outputOffset = 0;\
-      var currentPosition = 0;\
-      do {\
-        if (alreadyProcessedTail) {\
-          weight = ratioWeight;";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "output" + channel + " = 0;"
-  }
-  toCompile += "}\
-        else {\
-          weight = this.lastWeight;";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "output" + channel + " = this.lastOutput[" + channel + "];"
-  }
-  toCompile += "alreadyProcessedTail = true;\
-        }\
-        while (weight > 0 && actualPosition < bufferLength) {\
-          amountToNext = 1 + actualPosition - currentPosition;\
-          if (weight >= amountToNext) {";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "output" + channel + " += buffer[actualPosition++] * amountToNext;"
-  }
-  toCompile += "currentPosition = actualPosition;\
-            weight -= amountToNext;\
-          }\
-          else {";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "output" + channel + " += buffer[actualPosition" + ((channel > 0) ? (" + " + channel) : "") + "] * weight;"
-  }
-  toCompile += "currentPosition += weight;\
-            weight = 0;\
-            break;\
-          }\
-        }\
-        if (weight == 0) {";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "outputBuffer[outputOffset++] = output" + channel + " / ratioWeight;"
-  }
-  toCompile += "}\
-        else {\
-          this.lastWeight = weight;";
-  for (channel = 0; channel < this.channels; ++channel) {
-    toCompile += "this.lastOutput[" + channel + "] = output" + channel + ";"
-  }
-  toCompile += "this.tailExists = true;\
-          break;\
-        }\
-      } while (actualPosition < bufferLength);\
-      return this.bufferSlice(outputOffset);\
-    }\
-    else {\
-      return (this.noReturn) ? 0 : [];\
-    }\
-  }\
-  else {\
-    throw(new Error(\"Buffer was of incorrect sample length.\"));\
-  }";
-  this.interpolate = Function("buffer", toCompile);
-}
-Resampler.prototype.bypassResampler = function (buffer) {
-  if (this.noReturn) {
-    //Set the buffer passed as our own, as we don't need to resample it:
-    this.outputBuffer = buffer;
-    return buffer.length;
-  }
-  else {
-    //Just return the buffer passsed:
-    return buffer;
-  }
-}
-Resampler.prototype.bufferSlice = function (sliceAmount) {
-  if (this.noReturn) {
-    //If we're going to access the properties directly from this object:
-    return sliceAmount;
-  }
-  else {
-    //Typed array and normal array buffer section referencing:
-    try {
-      return this.outputBuffer.subarray(0, sliceAmount);
-    }
-    catch (error) {
-      try {
-        //Regular array pass:
-        this.outputBuffer.length = sliceAmount;
-        return this.outputBuffer;
-      }
-      catch (error) {
-        //Nightly Firefox 4 used to have the subarray function named as slice:
-        return this.outputBuffer.slice(0, sliceAmount);
-      }
-    }
-  }
-}
-Resampler.prototype.initializeBuffers = function () {
-  //Initialize the internal buffer:
-  try {
-    this.outputBuffer = new Float32Array(this.outputBufferSize);
-    this.lastOutput = new Float32Array(this.channels);
-  }
-  catch (error) {
-    this.outputBuffer = [];
-    this.lastOutput = [];
-  }
-}
-
-// End of js/other/resampler.js file.
-
-// Start of js/other/XAudioServer.js file.
-
-/*Initialize here first:
-  Example:
-    Stereo audio with a sample rate of 70 khz, a minimum buffer of 15000 samples total, a maximum buffer of 25000 samples total and a starting volume level of 1.
-      var parentObj = this;
-      this.audioHandle = new XAudioServer(2, 70000, 15000, 25000, function (sampleCount) {
-        return parentObj.audioUnderRun(sampleCount);
-      }, 1);
-
-  The callback is passed the number of samples requested, while it can return any number of samples it wants back.
-*/
-function XAudioServer(channels, sampleRate, minBufferSize, maxBufferSize, underRunCallback, volume) {
-  this.audioChannels = (channels == 2) ? 2 : 1;
-  webAudioMono = (this.audioChannels == 1);
-  XAudioJSSampleRate = (sampleRate > 0 && sampleRate <= 0xFFFFFF) ? sampleRate : 44100;
-  webAudioMinBufferSize = (minBufferSize >= (samplesPerCallback << 1) && minBufferSize < maxBufferSize) ? (minBufferSize & ((webAudioMono) ? 0xFFFFFFFF : 0xFFFFFFFE)) : (samplesPerCallback << 1);
-  webAudioMaxBufferSize = (Math.floor(maxBufferSize) > webAudioMinBufferSize + this.audioChannels) ? (maxBufferSize & ((webAudioMono) ? 0xFFFFFFFF : 0xFFFFFFFE)) : (minBufferSize << 1);
-  this.underRunCallback = (typeof underRunCallback == "function") ? underRunCallback : function () {};
-  XAudioJSVolume = (volume >= 0 && volume <= 1) ? volume : 1;
-  this.audioType = -1;
-  this.mozAudioTail = [];
-  this.audioHandleMoz = null;
-  this.audioHandleFlash = null;
-  this.flashInitialized = false;
-  this.mozAudioFound = false;
-  this.initializeAudio();
-}
-XAudioServer.prototype.MOZWriteAudio = function (buffer) {
-  //mozAudio:
-  this.MOZWriteAudioNoCallback(buffer);
-  this.MOZExecuteCallback();
-}
-XAudioServer.prototype.MOZWriteAudioNoCallback = function (buffer) {
-  //mozAudio:
-  this.writeMozAudio(buffer);
-}
-XAudioServer.prototype.callbackBasedWriteAudio = function (buffer) {
-  //Callback-centered audio APIs:
-  this.callbackBasedWriteAudioNoCallback(buffer);
-  this.callbackBasedExecuteCallback();
-}
-XAudioServer.prototype.callbackBasedWriteAudioNoCallback = function (buffer) {
-  //Callback-centered audio APIs:
-  var length = buffer.length;
-  for (var bufferCounter = 0; bufferCounter < length && audioBufferSize < webAudioMaxBufferSize;) {
-    audioContextSampleBuffer[audioBufferSize++] = buffer[bufferCounter++];
-  }
-}
-/*Pass your samples into here!
-Pack your samples as a one-dimenional array
-With the channel samplea packed uniformly.
-examples:
-    mono - [left, left, left, left]
-    stereo - [left, right, left, right, left, right, left, right]
-*/
-XAudioServer.prototype.writeAudio = function (buffer) {
-  if (this.audioType == 0) {
-    this.MOZWriteAudio(buffer);
-  }
-  else if (this.audioType == 1) {
-    this.callbackBasedWriteAudio(buffer);
-  }
-  else if (this.audioType == 2) {
-    if (this.checkFlashInit() || launchedContext) {
-      this.callbackBasedWriteAudio(buffer);
-    }
-    else if (this.mozAudioFound) {
-      this.MOZWriteAudio(buffer);
-    }
-  }
-}
-/*Pass your samples into here if you don't want automatic callback calling:
-Pack your samples as a one-dimenional array
-With the channel samplea packed uniformly.
-examples:
-    mono - [left, left, left, left]
-    stereo - [left, right, left, right, left, right, left, right]
-Useful in preventing infinite recursion issues with calling writeAudio inside your callback.
-*/
-XAudioServer.prototype.writeAudioNoCallback = function (buffer) {
-  if (this.audioType == 0) {
-    this.MOZWriteAudioNoCallback(buffer);
-  }
-  else if (this.audioType == 1) {
-    this.callbackBasedWriteAudioNoCallback(buffer);
-  }
-  else if (this.audioType == 2) {
-    if (this.checkFlashInit() || launchedContext) {
-      this.callbackBasedWriteAudioNoCallback(buffer);
-    }
-    else if (this.mozAudioFound) {
-      this.MOZWriteAudioNoCallback(buffer);
-    }
-  }
-}
-//Developer can use this to see how many samples to write (example: minimum buffer allotment minus remaining samples left returned from this function to make sure maximum buffering is done...)
-//If -1 is returned, then that means metric could not be done.
-XAudioServer.prototype.remainingBuffer = function () {
-  if (this.audioType == 0) {
-    //mozAudio:
-    return this.samplesAlreadyWritten - this.audioHandleMoz.mozCurrentSampleOffset();
-  }
-  else if (this.audioType == 1) {
-    //WebKit Audio:
-    return (((resampledSamplesLeft() * resampleControl.ratioWeight) >> (this.audioChannels - 1)) << (this.audioChannels - 1)) + audioBufferSize;
-  }
-  else if (this.audioType == 2) {
-    if (this.checkFlashInit() || launchedContext) {
-      //Webkit Audio / Flash Plugin Audio:
-      return (((resampledSamplesLeft() * resampleControl.ratioWeight) >> (this.audioChannels - 1)) << (this.audioChannels - 1)) + audioBufferSize;
-    }
-    else if (this.mozAudioFound) {
-      //mozAudio:
-      return this.samplesAlreadyWritten - this.audioHandleMoz.mozCurrentSampleOffset();
-    }
-  }
-  //Default return:
-  return 0;
-}
-XAudioServer.prototype.MOZExecuteCallback = function () {
-  //mozAudio:
-  var samplesRequested = webAudioMinBufferSize - this.remainingBuffer();
-  if (samplesRequested > 0) {
-    this.writeMozAudio(this.underRunCallback(samplesRequested));
-  }
-}
-XAudioServer.prototype.callbackBasedExecuteCallback = function () {
-  //WebKit /Flash Audio:
-  var samplesRequested = webAudioMinBufferSize - this.remainingBuffer();
-  if (samplesRequested > 0) {
-    this.callbackBasedWriteAudioNoCallback(this.underRunCallback(samplesRequested));
-  }
-}
-//If you just want your callback called for any possible refill (Execution of callback is still conditional):
-XAudioServer.prototype.executeCallback = function () {
-  if (this.audioType == 0) {
-    this.MOZExecuteCallback();
-  }
-  else if (this.audioType == 1) {
-    this.callbackBasedExecuteCallback();
-  }
-  else if (this.audioType == 2) {
-    if (this.checkFlashInit() || launchedContext) {
-      this.callbackBasedExecuteCallback();
-    }
-    else if (this.mozAudioFound) {
-      this.MOZExecuteCallback();
-    }
-  }
-}
-//DO NOT CALL THIS, the lib calls this internally!
-XAudioServer.prototype.initializeAudio = function () {
-  try {
-    throw (new Error("Select initializeWebAudio case"));  // Line added for benchmarking.
-    this.preInitializeMozAudio();
-    if (navigator.platform == "Linux i686") {
-      //Block out mozaudio usage for Linux Firefox due to moz bugs:
-      throw(new Error(""));
-    }
-    this.initializeMozAudio();
-  }
-  catch (error) {
-    try {
-      this.initializeWebAudio();
-    }
-    catch (error) {
-      try {
-        this.initializeFlashAudio();
-      }
-      catch (error) {
-        throw(new Error("Browser does not support real time audio output."));
-      }
-    }
-  }
-}
-XAudioServer.prototype.preInitializeMozAudio = function () {
-  //mozAudio - Synchronous Audio API
-  this.audioHandleMoz = new Audio();
-  this.audioHandleMoz.mozSetup(this.audioChannels, XAudioJSSampleRate);
-  this.samplesAlreadyWritten = 0;
-  var emptySampleFrame = (this.audioChannels == 2) ? [0, 0] : [0];
-  var prebufferAmount = 0;
-  if (navigator.platform != "MacIntel" && navigator.platform != "MacPPC") {  //Mac OS X doesn't experience this moz-bug!
-    while (this.audioHandleMoz.mozCurrentSampleOffset() == 0) {
-      //Mozilla Audio Bugginess Workaround (Firefox freaks out if we don't give it a prebuffer under certain OSes):
-      prebufferAmount += this.audioHandleMoz.mozWriteAudio(emptySampleFrame);
-    }
-    var samplesToDoubleBuffer = prebufferAmount / this.audioChannels;
-    //Double the prebuffering for windows:
-    for (var index = 0; index < samplesToDoubleBuffer; index++) {
-      this.samplesAlreadyWritten += this.audioHandleMoz.mozWriteAudio(emptySampleFrame);
-    }
-  }
-  this.samplesAlreadyWritten += prebufferAmount;
-  webAudioMinBufferSize += this.samplesAlreadyWritten;
-  this.mozAudioFound = true;
-}
-XAudioServer.prototype.initializeMozAudio = function () {
-  //Fill in our own buffering up to the minimum specified:
-  this.writeMozAudio(getFloat32(webAudioMinBufferSize));
-  this.audioType = 0;
-}
-XAudioServer.prototype.initializeWebAudio = function () {
-  if (launchedContext) {
-    resetCallbackAPIAudioBuffer(webAudioActualSampleRate, samplesPerCallback);
-    this.audioType = 1;
-  }
-  else {
-    throw(new Error(""));
-  }
-}
-XAudioServer.prototype.initializeFlashAudio = function () {
-  var existingFlashload = document.getElementById("XAudioJS");
-  if (existingFlashload == null) {
-    var thisObj = this;
-    var mainContainerNode = document.createElement("div");
-    mainContainerNode.setAttribute("style", "position: fixed; bottom: 0px; right: 0px; margin: 0px; padding: 0px; border: none; width: 8px; height: 8px; overflow: hidden; z-index: -1000; ");
-    var containerNode = document.createElement("div");
-    containerNode.setAttribute("style", "position: static; border: none; width: 0px; height: 0px; visibility: hidden; margin: 8px; padding: 0px;");
-    containerNode.setAttribute("id", "XAudioJS");
-    mainContainerNode.appendChild(containerNode);
-    document.getElementsByTagName("body")[0].appendChild(mainContainerNode);
-    swfobject.embedSWF(
-      "XAudioJS.swf",
-      "XAudioJS",
-      "8",
-      "8",
-      "9.0.0",
-      "",
-      {},
-      {"allowscriptaccess":"always"},
-      {"style":"position: static; visibility: hidden; margin: 8px; padding: 0px; border: none"},
-      function (event) {
-        if (event.success) {
-          thisObj.audioHandleFlash = event.ref;
-        }
-        else {
-          thisObj.audioType = 1;
-        }
-      }
-    );
-  }
-  else {
-    this.audioHandleFlash = existingFlashload;
-  }
-  this.audioType = 2;
-}
-XAudioServer.prototype.changeVolume = function (newVolume) {
-  if (newVolume >= 0 && newVolume <= 1) {
-    XAudioJSVolume = newVolume;
-    if (this.checkFlashInit()) {
-      this.audioHandleFlash.changeVolume(XAudioJSVolume);
-    }
-    if (this.mozAudioFound) {
-      this.audioHandleMoz.volume = XAudioJSVolume;
-    }
-  }
-}
-//Moz Audio Buffer Writing Handler:
-XAudioServer.prototype.writeMozAudio = function (buffer) {
-  var length = this.mozAudioTail.length;
-  if (length > 0) {
-    var samplesAccepted = this.audioHandleMoz.mozWriteAudio(this.mozAudioTail);
-    this.samplesAlreadyWritten += samplesAccepted;
-    this.mozAudioTail.splice(0, samplesAccepted);
-  }
-  length = Math.min(buffer.length, webAudioMaxBufferSize - this.samplesAlreadyWritten + this.audioHandleMoz.mozCurrentSampleOffset());
-  var samplesAccepted = this.audioHandleMoz.mozWriteAudio(buffer);
-  this.samplesAlreadyWritten += samplesAccepted;
-  for (var index = 0; length > samplesAccepted; --length) {
-    //Moz Audio wants us saving the tail:
-    this.mozAudioTail.push(buffer[index++]);
-  }
-}
-//Checks to see if the NPAPI Adobe Flash bridge is ready yet:
-XAudioServer.prototype.checkFlashInit = function () {
-  if (!this.flashInitialized && this.audioHandleFlash && this.audioHandleFlash.initialize) {
-    this.flashInitialized = true;
-    this.audioHandleFlash.initialize(this.audioChannels, XAudioJSVolume);
-    resetCallbackAPIAudioBuffer(44100, samplesPerCallback);
-  }
-  return this.flashInitialized;
-}
-/////////END LIB
-function getFloat32(size) {
-  try {
-    return new Float32Array(size);
-  }
-  catch (error) {
-    return new Array(size);
-  }
-}
-function getFloat32Flat(size) {
-  try {
-    var newBuffer = new Float32Array(size);
-  }
-  catch (error) {
-    var newBuffer = new Array(size);
-    var audioSampleIndice = 0;
-    do {
-      newBuffer[audioSampleIndice] = 0;
-    } while (++audioSampleIndice < size);
-  }
-  return newBuffer;
-}
-//Flash NPAPI Event Handler:
-var samplesPerCallback = 2048;      //Has to be between 2048 and 4096 (If over, then samples are ignored, if under then silence is added).
-var outputConvert = null;
-function audioOutputFlashEvent() {    //The callback that flash calls...
-  resampleRefill();
-  return outputConvert();
-}
-function generateFlashStereoString() {  //Convert the arrays to one long string for speed.
-  var copyBinaryStringLeft = "";
-  var copyBinaryStringRight = "";
-  for (var index = 0; index < samplesPerCallback && resampleBufferStart != resampleBufferEnd; ++index) {
-    //Sanitize the buffer:
-    copyBinaryStringLeft += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
-    copyBinaryStringRight += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
-    if (resampleBufferStart == resampleBufferSize) {
-      resampleBufferStart = 0;
-    }
-  }
-  return copyBinaryStringLeft + copyBinaryStringRight;
-}
-function generateFlashMonoString() {  //Convert the array to one long string for speed.
-  var copyBinaryString = "";
-  for (var index = 0; index < samplesPerCallback && resampleBufferStart != resampleBufferEnd; ++index) {
-    //Sanitize the buffer:
-    copyBinaryString += String.fromCharCode(((Math.min(Math.max(resampled[resampleBufferStart++] + 1, 0), 2) * 0x3FFF) | 0) + 0x3000);
-    if (resampleBufferStart == resampleBufferSize) {
-      resampleBufferStart = 0;
-    }
-  }
-  return copyBinaryString;
-}
-//Audio API Event Handler:
-var audioContextHandle = null;
-var audioNode = null;
-var audioSource = null;
-var launchedContext = false;
-var audioContextSampleBuffer = [];
-var resampled = [];
-var webAudioMinBufferSize = 15000;
-var webAudioMaxBufferSize = 25000;
-var webAudioActualSampleRate = 44100;
-var XAudioJSSampleRate = 0;
-var webAudioMono = false;
-var XAudioJSVolume = 1;
-var resampleControl = null;
-var audioBufferSize = 0;
-var resampleBufferStart = 0;
-var resampleBufferEnd = 0;
-var resampleBufferSize = 2;
-function audioOutputEvent(event) {    //Web Audio API callback...
-  var index = 0;
-  var buffer1 = event.outputBuffer.getChannelData(0);
-  var buffer2 = event.outputBuffer.getChannelData(1);
-  resampleRefill();
-  if (!webAudioMono) {
-    //STEREO:
-    while (index < samplesPerCallback && resampleBufferStart != resampleBufferEnd) {
-      buffer1[index] = resampled[resampleBufferStart++] * XAudioJSVolume;
-      buffer2[index++] = resampled[resampleBufferStart++] * XAudioJSVolume;
-      if (resampleBufferStart == resampleBufferSize) {
-        resampleBufferStart = 0;
-      }
-    }
-  }
-  else {
-    //MONO:
-    while (index < samplesPerCallback && resampleBufferStart != resampleBufferEnd) {
-      buffer2[index] = buffer1[index] = resampled[resampleBufferStart++] * XAudioJSVolume;
-      ++index;
-      if (resampleBufferStart == resampleBufferSize) {
-        resampleBufferStart = 0;
-      }
-    }
-  }
-  //Pad with silence if we're underrunning:
-  while (index < samplesPerCallback) {
-    buffer2[index] = buffer1[index] = 0;
-    ++index;
-  }
-}
-function resampleRefill() {
-  if (audioBufferSize > 0) {
-    //Resample a chunk of audio:
-    var resampleLength = resampleControl.resampler(getBufferSamples());
-    var resampledResult = resampleControl.outputBuffer;
-    for (var index2 = 0; index2 < resampleLength; ++index2) {
-      resampled[resampleBufferEnd++] = resampledResult[index2];
-      if (resampleBufferEnd == resampleBufferSize) {
-        resampleBufferEnd = 0;
-      }
-      if (resampleBufferStart == resampleBufferEnd) {
-        ++resampleBufferStart;
-        if (resampleBufferStart == resampleBufferSize) {
-          resampleBufferStart = 0;
-        }
-      }
-    }
-    audioBufferSize = 0;
-  }
-}
-function resampledSamplesLeft() {
-  return ((resampleBufferStart <= resampleBufferEnd) ? 0 : resampleBufferSize) + resampleBufferEnd - resampleBufferStart;
-}
-function getBufferSamples() {
-  //Typed array and normal array buffer section referencing:
-  try {
-    return audioContextSampleBuffer.subarray(0, audioBufferSize);
-  }
-  catch (error) {
-    try {
-      //Regular array pass:
-      audioContextSampleBuffer.length = audioBufferSize;
-      return audioContextSampleBuffer;
-    }
-    catch (error) {
-      //Nightly Firefox 4 used to have the subarray function named as slice:
-      return audioContextSampleBuffer.slice(0, audioBufferSize);
-    }
-  }
-}
-//Initialize WebKit Audio /Flash Audio Buffer:
-function resetCallbackAPIAudioBuffer(APISampleRate, bufferAlloc) {
-  audioContextSampleBuffer = getFloat32(webAudioMaxBufferSize);
-  audioBufferSize = webAudioMaxBufferSize;
-  resampleBufferStart = 0;
-  resampleBufferEnd = 0;
-  resampleBufferSize = Math.max(webAudioMaxBufferSize * Math.ceil(XAudioJSSampleRate / APISampleRate), samplesPerCallback) << 1;
-  if (webAudioMono) {
-    //MONO Handling:
-    resampled = getFloat32Flat(resampleBufferSize);
-    resampleControl = new Resampler(XAudioJSSampleRate, APISampleRate, 1, resampleBufferSize, true);
-    outputConvert = generateFlashMonoString;
-  }
-  else {
-    //STEREO Handling:
-    resampleBufferSize  <<= 1;
-    resampled = getFloat32Flat(resampleBufferSize);
-    resampleControl = new Resampler(XAudioJSSampleRate, APISampleRate, 2, resampleBufferSize, true);
-    outputConvert = generateFlashStereoString;
-  }
-}
-//Initialize WebKit Audio:
-(function () {
-  if (!launchedContext) {
-    try {
-      // The following line was modified for benchmarking:
-      audioContextHandle = new GameBoyAudioContext();              //Create a system audio context.
-    }
-    catch (error) {
-      try {
-        audioContextHandle = new AudioContext();                //Create a system audio context.
-      }
-      catch (error) {
-        return;
-      }
-    }
-    try {
-      audioSource = audioContextHandle.createBufferSource();            //We need to create a false input to get the chain started.
-      audioSource.loop = false;  //Keep this alive forever (Event handler will know when to ouput.)
-      XAudioJSSampleRate = webAudioActualSampleRate = audioContextHandle.sampleRate;
-      audioSource.buffer = audioContextHandle.createBuffer(1, 1, webAudioActualSampleRate);  //Create a zero'd input buffer for the input to be valid.
-      audioNode = audioContextHandle.createJavaScriptNode(samplesPerCallback, 1, 2);      //Create 2 outputs and ignore the input buffer (Just copy buffer 1 over if mono)
-      audioNode.onaudioprocess = audioOutputEvent;                //Connect the audio processing event to a handling function so we can manipulate output
-      audioSource.connect(audioNode);                        //Send and chain the input to the audio manipulation.
-      audioNode.connect(audioContextHandle.destination);              //Send and chain the output of the audio manipulation to the system audio output.
-      audioSource.noteOn(0);                            //Start the loop!
-    }
-    catch (error) {
-      return;
-    }
-    launchedContext = true;
-  }
-})();
-
-// End of js/other/XAudioServer.js file.
-
-// Start of js/other/resize.js file.
-
-//JavaScript Image Resizer (c) 2012 - Grant Galitz
-function Resize(widthOriginal, heightOriginal, targetWidth, targetHeight, blendAlpha, interpolationPass) {
-  this.widthOriginal = Math.abs(parseInt(widthOriginal) || 0);
-  this.heightOriginal = Math.abs(parseInt(heightOriginal) || 0);
-  this.targetWidth = Math.abs(parseInt(targetWidth) || 0);
-  this.targetHeight = Math.abs(parseInt(targetHeight) || 0);
-  this.colorChannels = (!!blendAlpha) ? 4 : 3;
-  this.interpolationPass = !!interpolationPass;
-  this.targetWidthMultipliedByChannels = this.targetWidth * this.colorChannels;
-  this.originalWidthMultipliedByChannels = this.widthOriginal * this.colorChannels;
-  this.originalHeightMultipliedByChannels = this.heightOriginal * this.colorChannels;
-  this.widthPassResultSize = this.targetWidthMultipliedByChannels * this.heightOriginal;
-  this.finalResultSize = this.targetWidthMultipliedByChannels * this.targetHeight;
-  this.initialize();
-}
-Resize.prototype.initialize = function () {
-  //Perform some checks:
-  if (this.widthOriginal > 0 && this.heightOriginal > 0 && this.targetWidth > 0 && this.targetHeight > 0) {
-    if (this.widthOriginal == this.targetWidth) {
-      //Bypass the width resizer pass:
-      this.resizeWidth = this.bypassResizer;
-    }
-    else {
-      //Setup the width resizer pass:
-      this.ratioWeightWidthPass = this.widthOriginal / this.targetWidth;
-      if (this.ratioWeightWidthPass < 1 && this.interpolationPass) {
-        this.initializeFirstPassBuffers(true);
-        this.resizeWidth = (this.colorChannels == 4) ? this.resizeWidthInterpolatedRGBA : this.resizeWidthInterpolatedRGB;
-      }
-      else {
-        this.initializeFirstPassBuffers(false);
-        this.resizeWidth = (this.colorChannels == 4) ? this.resizeWidthRGBA : this.resizeWidthRGB;
-      }
-    }
-    if (this.heightOriginal == this.targetHeight) {
-      //Bypass the height resizer pass:
-      this.resizeHeight = this.bypassResizer;
-    }
-    else {
-      //Setup the height resizer pass:
-      this.ratioWeightHeightPass = this.heightOriginal / this.targetHeight;
-      if (this.ratioWeightHeightPass < 1 && this.interpolationPass) {
-        this.initializeSecondPassBuffers(true);
-        this.resizeHeight = this.resizeHeightInterpolated;
-      }
-      else {
-        this.initializeSecondPassBuffers(false);
-        this.resizeHeight = (this.colorChannels == 4) ? this.resizeHeightRGBA : this.resizeHeightRGB;
-      }
-    }
-  }
-  else {
-    throw(new Error("Invalid settings specified for the resizer."));
-  }
-}
-Resize.prototype.resizeWidthRGB = function (buffer) {
-  var ratioWeight = this.ratioWeightWidthPass;
-  var weight = 0;
-  var amountToNext = 0;
-  var actualPosition = 0;
-  var currentPosition = 0;
-  var line = 0;
-  var pixelOffset = 0;
-  var outputOffset = 0;
-  var nextLineOffsetOriginalWidth = this.originalWidthMultipliedByChannels - 2;
-  var nextLineOffsetTargetWidth = this.targetWidthMultipliedByChannels - 2;
-  var output = this.outputWidthWorkBench;
-  var outputBuffer = this.widthBuffer;
-  do {
-    for (line = 0; line < this.originalHeightMultipliedByChannels;) {
-      output[line++] = 0;
-      output[line++] = 0;
-      output[line++] = 0;
-    }
-    weight = ratioWeight;
-    do {
-      amountToNext = 1 + actualPosition - currentPosition;
-      if (weight >= amountToNext) {
-        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
-          output[line++] += buffer[pixelOffset++] * amountToNext;
-          output[line++] += buffer[pixelOffset++] * amountToNext;
-          output[line++] += buffer[pixelOffset] * amountToNext;
-        }
-        currentPosition = actualPosition = actualPosition + 3;
-        weight -= amountToNext;
-      }
-      else {
-        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
-          output[line++] += buffer[pixelOffset++] * weight;
-          output[line++] += buffer[pixelOffset++] * weight;
-          output[line++] += buffer[pixelOffset] * weight;
-        }
-        currentPosition += weight;
-        break;
-      }
-    } while (weight > 0 && actualPosition < this.originalWidthMultipliedByChannels);
-    for (line = 0, pixelOffset = outputOffset; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetTargetWidth) {
-      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
-      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
-      outputBuffer[pixelOffset] = output[line++] / ratioWeight;
-    }
-    outputOffset += 3;
-  } while (outputOffset < this.targetWidthMultipliedByChannels);
-  return outputBuffer;
-}
-Resize.prototype.resizeWidthInterpolatedRGB = function (buffer) {
-  var ratioWeight = (this.widthOriginal - 1) / this.targetWidth;
-  var weight = 0;
-  var finalOffset = 0;
-  var pixelOffset = 0;
-  var outputBuffer = this.widthBuffer;
-  for (var targetPosition = 0; targetPosition < this.targetWidthMultipliedByChannels; targetPosition += 3, weight += ratioWeight) {
-    //Calculate weightings:
-    secondWeight = weight % 1;
-    firstWeight = 1 - secondWeight;
-    //Interpolate:
-    for (finalOffset = targetPosition, pixelOffset = Math.floor(weight) * 3; finalOffset < this.widthPassResultSize; pixelOffset += this.originalWidthMultipliedByChannels, finalOffset += this.targetWidthMultipliedByChannels) {
-      outputBuffer[finalOffset] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 3] * secondWeight);
-      outputBuffer[finalOffset + 1] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
-      outputBuffer[finalOffset + 2] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
-    }
-  }
-  return outputBuffer;
-}
-Resize.prototype.resizeWidthRGBA = function (buffer) {
-  var ratioWeight = this.ratioWeightWidthPass;
-  var weight = 0;
-  var amountToNext = 0;
-  var actualPosition = 0;
-  var currentPosition = 0;
-  var line = 0;
-  var pixelOffset = 0;
-  var outputOffset = 0;
-  var nextLineOffsetOriginalWidth = this.originalWidthMultipliedByChannels - 3;
-  var nextLineOffsetTargetWidth = this.targetWidthMultipliedByChannels - 3;
-  var output = this.outputWidthWorkBench;
-  var outputBuffer = this.widthBuffer;
-  do {
-    for (line = 0; line < this.originalHeightMultipliedByChannels;) {
-      output[line++] = 0;
-      output[line++] = 0;
-      output[line++] = 0;
-      output[line++] = 0;
-    }
-    weight = ratioWeight;
-    do {
-      amountToNext = 1 + actualPosition - currentPosition;
-      if (weight >= amountToNext) {
-        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
-          output[line++] += buffer[pixelOffset++] * amountToNext;
-          output[line++] += buffer[pixelOffset++] * amountToNext;
-          output[line++] += buffer[pixelOffset++] * amountToNext;
-          output[line++] += buffer[pixelOffset] * amountToNext;
-        }
-        currentPosition = actualPosition = actualPosition + 4;
-        weight -= amountToNext;
-      }
-      else {
-        for (line = 0, pixelOffset = actualPosition; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetOriginalWidth) {
-          output[line++] += buffer[pixelOffset++] * weight;
-          output[line++] += buffer[pixelOffset++] * weight;
-          output[line++] += buffer[pixelOffset++] * weight;
-          output[line++] += buffer[pixelOffset] * weight;
-        }
-        currentPosition += weight;
-        break;
-      }
-    } while (weight > 0 && actualPosition < this.originalWidthMultipliedByChannels);
-    for (line = 0, pixelOffset = outputOffset; line < this.originalHeightMultipliedByChannels; pixelOffset += nextLineOffsetTargetWidth) {
-      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
-      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
-      outputBuffer[pixelOffset++] = output[line++] / ratioWeight;
-      outputBuffer[pixelOffset] = output[line++] / ratioWeight;
-    }
-    outputOffset += 4;
-  } while (outputOffset < this.targetWidthMultipliedByChannels);
-  return outputBuffer;
-}
-Resize.prototype.resizeWidthInterpolatedRGBA = function (buffer) {
-  var ratioWeight = (this.widthOriginal - 1) / this.targetWidth;
-  var weight = 0;
-  var finalOffset = 0;
-  var pixelOffset = 0;
-  var outputBuffer = this.widthBuffer;
-  for (var targetPosition = 0; targetPosition < this.targetWidthMultipliedByChannels; targetPosition += 4, weight += ratioWeight) {
-    //Calculate weightings:
-    secondWeight = weight % 1;
-    firstWeight = 1 - secondWeight;
-    //Interpolate:
-    for (finalOffset = targetPosition, pixelOffset = Math.floor(weight) * 4; finalOffset < this.widthPassResultSize; pixelOffset += this.originalWidthMultipliedByChannels, finalOffset += this.targetWidthMultipliedByChannels) {
-      outputBuffer[finalOffset] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
-      outputBuffer[finalOffset + 1] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
-      outputBuffer[finalOffset + 2] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 6] * secondWeight);
-      outputBuffer[finalOffset + 3] = (buffer[pixelOffset + 3] * firstWeight) + (buffer[pixelOffset + 7] * secondWeight);
-    }
-  }
-  return outputBuffer;
-}
-Resize.prototype.resizeHeightRGB = function (buffer) {
-  var ratioWeight = this.ratioWeightHeightPass;
-  var weight = 0;
-  var amountToNext = 0;
-  var actualPosition = 0;
-  var currentPosition = 0;
-  var pixelOffset = 0;
-  var outputOffset = 0;
-  var output = this.outputHeightWorkBench;
-  var outputBuffer = this.heightBuffer;
-  do {
-    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-      output[pixelOffset++] = 0;
-      output[pixelOffset++] = 0;
-      output[pixelOffset++] = 0;
-    }
-    weight = ratioWeight;
-    do {
-      amountToNext = 1 + actualPosition - currentPosition;
-      if (weight >= amountToNext) {
-        for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-        }
-        currentPosition = actualPosition;
-        weight -= amountToNext;
-      }
-      else {
-        for (pixelOffset = 0, amountToNext = actualPosition; pixelOffset < this.targetWidthMultipliedByChannels;) {
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-        }
-        currentPosition += weight;
-        break;
-      }
-    } while (weight > 0 && actualPosition < this.widthPassResultSize);
-    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-    }
-  } while (outputOffset < this.finalResultSize);
-  return outputBuffer;
-}
-Resize.prototype.resizeHeightInterpolated = function (buffer) {
-  var ratioWeight = (this.heightOriginal - 1) / this.targetHeight;
-  var weight = 0;
-  var finalOffset = 0;
-  var pixelOffset = 0;
-  var pixelOffsetAccumulated = 0;
-  var pixelOffsetAccumulated2 = 0;
-  var outputBuffer = this.heightBuffer;
-  do {
-    //Calculate weightings:
-    secondWeight = weight % 1;
-    firstWeight = 1 - secondWeight;
-    //Interpolate:
-    pixelOffsetAccumulated = Math.floor(weight) * this.targetWidthMultipliedByChannels;
-    pixelOffsetAccumulated2 = pixelOffsetAccumulated + this.targetWidthMultipliedByChannels;
-    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels; ++pixelOffset) {
-      outputBuffer[finalOffset++] = (buffer[pixelOffsetAccumulated + pixelOffset] * firstWeight) + (buffer[pixelOffsetAccumulated2 + pixelOffset] * secondWeight);
-    }
-    weight += ratioWeight;
-  } while (finalOffset < this.finalResultSize);
-  return outputBuffer;
-}
-Resize.prototype.resizeHeightRGBA = function (buffer) {
-  var ratioWeight = this.ratioWeightHeightPass;
-  var weight = 0;
-  var amountToNext = 0;
-  var actualPosition = 0;
-  var currentPosition = 0;
-  var pixelOffset = 0;
-  var outputOffset = 0;
-  var output = this.outputHeightWorkBench;
-  var outputBuffer = this.heightBuffer;
-  do {
-    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-      output[pixelOffset++] = 0;
-      output[pixelOffset++] = 0;
-      output[pixelOffset++] = 0;
-      output[pixelOffset++] = 0;
-    }
-    weight = ratioWeight;
-    do {
-      amountToNext = 1 + actualPosition - currentPosition;
-      if (weight >= amountToNext) {
-        for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-          output[pixelOffset++] += buffer[actualPosition++] * amountToNext;
-        }
-        currentPosition = actualPosition;
-        weight -= amountToNext;
-      }
-      else {
-        for (pixelOffset = 0, amountToNext = actualPosition; pixelOffset < this.targetWidthMultipliedByChannels;) {
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-          output[pixelOffset++] += buffer[amountToNext++] * weight;
-        }
-        currentPosition += weight;
-        break;
-      }
-    } while (weight > 0 && actualPosition < this.widthPassResultSize);
-    for (pixelOffset = 0; pixelOffset < this.targetWidthMultipliedByChannels;) {
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-      outputBuffer[outputOffset++] = Math.round(output[pixelOffset++] / ratioWeight);
-    }
-  } while (outputOffset < this.finalResultSize);
-  return outputBuffer;
-}
-Resize.prototype.resizeHeightInterpolatedRGBA = function (buffer) {
-  var ratioWeight = (this.heightOriginal - 1) / this.targetHeight;
-  var weight = 0;
-  var finalOffset = 0;
-  var pixelOffset = 0;
-  var outputBuffer = this.heightBuffer;
-  while (pixelOffset < this.finalResultSize) {
-    //Calculate weightings:
-    secondWeight = weight % 1;
-    firstWeight = 1 - secondWeight;
-    //Interpolate:
-    for (pixelOffset = Math.floor(weight) * 4; pixelOffset < this.targetWidthMultipliedByChannels; pixelOffset += 4) {
-      outputBuffer[finalOffset++] = (buffer[pixelOffset] * firstWeight) + (buffer[pixelOffset + 4] * secondWeight);
-      outputBuffer[finalOffset++] = (buffer[pixelOffset + 1] * firstWeight) + (buffer[pixelOffset + 5] * secondWeight);
-      outputBuffer[finalOffset++] = (buffer[pixelOffset + 2] * firstWeight) + (buffer[pixelOffset + 6] * secondWeight);
-      outputBuffer[finalOffset++] = (buffer[pixelOffset + 3] * firstWeight) + (buffer[pixelOffset + 7] * secondWeight);
-    }
-    weight += ratioWeight;
-  }
-  return outputBuffer;
-}
-Resize.prototype.resize = function (buffer) {
-  return this.resizeHeight(this.resizeWidth(buffer));
-}
-Resize.prototype.bypassResizer = function (buffer) {
-  //Just return the buffer passsed:
-  return buffer;
-}
-Resize.prototype.initializeFirstPassBuffers = function (BILINEARAlgo) {
-  //Initialize the internal width pass buffers:
-  this.widthBuffer = this.generateFloatBuffer(this.widthPassResultSize);
-  if (!BILINEARAlgo) {
-    this.outputWidthWorkBench = this.generateFloatBuffer(this.originalHeightMultipliedByChannels);
-  }
-}
-Resize.prototype.initializeSecondPassBuffers = function (BILINEARAlgo) {
-  //Initialize the internal height pass buffers:
-  this.heightBuffer = this.generateUint8Buffer(this.finalResultSize);
-  if (!BILINEARAlgo) {
-    this.outputHeightWorkBench = this.generateFloatBuffer(this.targetWidthMultipliedByChannels);
-  }
-}
-Resize.prototype.generateFloatBuffer = function (bufferLength) {
-  //Generate a float32 typed array buffer:
-  try {
-    return new Float32Array(bufferLength);
-  }
-  catch (error) {
-    return [];
-  }
-}
-Resize.prototype.generateUint8Buffer = function (bufferLength) {
-  //Generate a uint8 typed array buffer:
-  try {
-    return this.checkForOperaMathBug(new Uint8Array(bufferLength));
-  }
-  catch (error) {
-    return [];
-  }
-}
-Resize.prototype.checkForOperaMathBug = function (typedArray) {
-  typedArray[0] = -1;
-  typedArray[0] >>= 0;
-  if (typedArray[0] != 0xFF) {
-    return [];
-  }
-  else {
-    return typedArray;
-  }
-}
-
-// End of js/other/resize.js file.
-
-// Remaining files are in gbemu-part2.js, since they run in strict mode.
diff --git a/Octane/gbemu-part2.js b/Octane/gbemu-part2.js
deleted file mode 100644
index 1320cd0..0000000
--- a/Octane/gbemu-part2.js
+++ /dev/null
@@ -1,9788 +0,0 @@
-// Portions copyright 2013 Google, Inc
-
-// Copyright (C) 2010 - 2012 Grant Galitz
-// This program is free software; you can redistribute it and/or modify
-// it under the terms of the GNU General Public License version 2 as
-// published by the Free Software Foundation.
-// The full license is available at http://www.gnu.org/licenses/gpl.html
-// This program is distributed in the hope that it will be useful, but
-// WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-// See the GNU General Public License for more details.
-
-// The code has been adapted for use as a benchmark by Google.
-
-// Previous files are in gbemu-part1.js, since they need to run in sloppy mode.
-
-// Start of js/GameBoyCore.js file.
-
-"use strict";
-/*
- * JavaScript GameBoy Color Emulator
- * Copyright (C) 2010 - 2012 Grant Galitz
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- * The full license is available at http://www.gnu.org/licenses/gpl.html
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- */
-function GameBoyCore(canvas, ROMImage) {
-  //Params, etc...
-  this.canvas = canvas;            //Canvas DOM object for drawing out the graphics to.
-  this.drawContext = null;          // LCD Context
-  this.ROMImage = ROMImage;          //The game's ROM.
-  //CPU Registers and Flags:
-  this.registerA = 0x01;             //Register A (Accumulator)
-  this.FZero = true;               //Register F  - Result was zero
-  this.FSubtract = false;            //Register F  - Subtraction was executed
-  this.FHalfCarry = true;            //Register F  - Half carry or half borrow
-  this.FCarry = true;              //Register F  - Carry or borrow
-  this.registerB = 0x00;            //Register B
-  this.registerC = 0x13;            //Register C
-  this.registerD = 0x00;            //Register D
-  this.registerE = 0xD8;            //Register E
-  this.registersHL = 0x014D;          //Registers H and L combined
-  this.stackPointer = 0xFFFE;          //Stack Pointer
-  this.programCounter = 0x0100;        //Program Counter
-  //Some CPU Emulation State Variables:
-  this.CPUCyclesTotal = 0;          //Relative CPU clocking to speed set, rounded appropriately.
-  this.CPUCyclesTotalBase = 0;        //Relative CPU clocking to speed set base.
-  this.CPUCyclesTotalCurrent = 0;        //Relative CPU clocking to speed set, the directly used value.
-  this.CPUCyclesTotalRoundoff = 0;      //Clocking per iteration rounding catch.
-  this.baseCPUCyclesPerIteration = 0;    //CPU clocks per iteration at 1x speed.
-  this.remainingClocks = 0;          //HALT clocking overrun carry over.
-  this.inBootstrap = true;          //Whether we're in the GBC boot ROM.
-  this.usedBootROM = false;          //Updated upon ROM loading...
-  this.usedGBCBootROM = false;        //Did we boot to the GBC boot ROM?
-  this.halt = false;              //Has the CPU been suspended until the next interrupt?
-  this.skipPCIncrement = false;        //Did we trip the DMG Halt bug?
-  this.stopEmulator = 3;            //Has the emulation been paused or a frame has ended?
-  this.IME = true;              //Are interrupts enabled?
-  this.IRQLineMatched = 0;          //CPU IRQ assertion.
-  this.interruptsRequested = 0;        //IF Register
-  this.interruptsEnabled = 0;          //IE Register
-  this.hdmaRunning = false;          //HDMA Transfer Flag - GBC only
-  this.CPUTicks = 0;              //The number of clock cycles emulated.
-  this.doubleSpeedShifter = 0;        //GBC double speed clocking shifter.
-  this.JoyPad = 0xFF;              //Joypad State (two four-bit states actually)
-  this.CPUStopped = false;          //CPU STOP status.
-  //Main RAM, MBC RAM, GBC Main RAM, VRAM, etc.
-  this.memoryReader = [];            //Array of functions mapped to read back memory
-  this.memoryWriter = [];            //Array of functions mapped to write to memory
-  this.memoryHighReader = [];          //Array of functions mapped to read back 0xFFXX memory
-  this.memoryHighWriter = [];          //Array of functions mapped to write to 0xFFXX memory
-  this.ROM = [];                //The full ROM file dumped to an array.
-  this.memory = [];              //Main Core Memory
-  this.MBCRam = [];              //Switchable RAM (Used by games for more RAM) for the main memory range 0xA000 - 0xC000.
-  this.VRAM = [];                //Extra VRAM bank for GBC.
-  this.GBCMemory = [];            //GBC main RAM Banks
-  this.MBC1Mode = false;            //MBC1 Type (4/32, 16/8)
-  this.MBCRAMBanksEnabled = false;      //MBC RAM Access Control.
-  this.currMBCRAMBank = 0;          //MBC Currently Indexed RAM Bank
-  this.currMBCRAMBankPosition = -0xA000;    //MBC Position Adder;
-  this.cGBC = false;              //GameBoy Color detection.
-  this.gbcRamBank = 1;            //Currently Switched GameBoy Color ram bank
-  this.gbcRamBankPosition = -0xD000;      //GBC RAM offset from address start.
-  this.gbcRamBankPositionECHO = -0xF000;    //GBC RAM (ECHO mirroring) offset from address start.
-  this.RAMBanks = [0, 1, 2, 4, 16];      //Used to map the RAM banks to maximum size the MBC used can do.
-  this.ROMBank1offs = 0;            //Offset of the ROM bank switching.
-  this.currentROMBank = 0;          //The parsed current ROM bank selection.
-  this.cartridgeType = 0;            //Cartridge Type
-  this.name = "";                //Name of the game
-  this.gameCode = "";              //Game code (Suffix for older games)
-  this.fromSaveState = false;          //A boolean to see if this was loaded in as a save state.
-  this.savedStateFileName = "";        //When loaded in as a save state, this will not be empty.
-  this.STATTracker = 0;            //Tracker for STAT triggering.
-  this.modeSTAT = 0;              //The scan line mode (for lines 1-144 it's 2-3-0, for 145-154 it's 1)
-  this.spriteCount = 252;            //Mode 3 extra clocking counter (Depends on how many sprites are on the current line.).
-  this.LYCMatchTriggerSTAT = false;      //Should we trigger an interrupt if LY==LYC?
-  this.mode2TriggerSTAT = false;        //Should we trigger an interrupt if in mode 2?
-  this.mode1TriggerSTAT = false;        //Should we trigger an interrupt if in mode 1?
-  this.mode0TriggerSTAT = false;        //Should we trigger an interrupt if in mode 0?
-  this.LCDisOn = false;            //Is the emulated LCD controller on?
-  this.LINECONTROL = [];            //Array of functions to handle each scan line we do (onscreen + offscreen)
-  this.DISPLAYOFFCONTROL = [function (parentObj) {
-    //Array of line 0 function to handle the LCD controller when it's off (Do nothing!).
-  }];
-  this.LCDCONTROL = null;            //Pointer to either LINECONTROL or DISPLAYOFFCONTROL.
-  this.initializeLCDController();        //Compile the LCD controller functions.
-  //RTC (Real Time Clock for MBC3):
-  this.RTCisLatched = false;
-  this.latchedSeconds = 0;          //RTC latched seconds.
-  this.latchedMinutes = 0;          //RTC latched minutes.
-  this.latchedHours = 0;            //RTC latched hours.
-  this.latchedLDays = 0;            //RTC latched lower 8-bits of the day counter.
-  this.latchedHDays = 0;            //RTC latched high-bit of the day counter.
-  this.RTCSeconds = 0;            //RTC seconds counter.
-  this.RTCMinutes = 0;            //RTC minutes counter.
-  this.RTCHours = 0;              //RTC hours counter.
-  this.RTCDays = 0;              //RTC days counter.
-  this.RTCDayOverFlow = false;        //Did the RTC overflow and wrap the day counter?
-  this.RTCHALT = false;            //Is the RTC allowed to clock up?
-  //Gyro:
-  this.highX = 127;
-  this.lowX = 127;
-  this.highY = 127;
-  this.lowY = 127;
-  //Sound variables:
-  this.audioHandle = null;            //XAudioJS handle
-  this.numSamplesTotal = 0;            //Length of the sound buffers.
-  this.sampleSize = 0;              //Length of the sound buffer for one channel.
-  this.dutyLookup = [                //Map the duty values given to ones we can work with.
-    [false, false, false, false, false, false, false, true],
-    [true, false, false, false, false, false, false, true],
-    [true, false, false, false, false, true, true, true],
-    [false, true, true, true, true, true, true, false]
-  ];
-  this.currentBuffer = [];            //The audio buffer we're working on.
-  this.bufferContainAmount = 0;          //Buffer maintenance metric.
-  this.LSFR15Table = null;
-  this.LSFR7Table = null;
-  this.noiseSampleTable = null;
-  this.initializeAudioStartState();
-  this.soundMasterEnabled = false;      //As its name implies
-  this.channel3PCM = null;          //Channel 3 adjusted sample buffer.
-  //Vin Shit:
-  this.VinLeftChannelMasterVolume = 8;    //Computed post-mixing volume.
-  this.VinRightChannelMasterVolume = 8;    //Computed post-mixing volume.
-  //Channel paths enabled:
-  this.leftChannel1 = false;
-  this.leftChannel2 = false;
-  this.leftChannel3 = false;
-  this.leftChannel4 = false;
-  this.rightChannel1 = false;
-  this.rightChannel2 = false;
-  this.rightChannel3 = false;
-  this.rightChannel4 = false;
-  //Channel output level caches:
-  this.channel1currentSampleLeft = 0;
-  this.channel1currentSampleRight = 0;
-  this.channel2currentSampleLeft = 0;
-  this.channel2currentSampleRight = 0;
-  this.channel3currentSampleLeft = 0;
-  this.channel3currentSampleRight = 0;
-  this.channel4currentSampleLeft = 0;
-  this.channel4currentSampleRight = 0;
-  this.channel1currentSampleLeftSecondary = 0;
-  this.channel1currentSampleRightSecondary = 0;
-  this.channel2currentSampleLeftSecondary = 0;
-  this.channel2currentSampleRightSecondary = 0;
-  this.channel3currentSampleLeftSecondary = 0;
-  this.channel3currentSampleRightSecondary = 0;
-  this.channel4currentSampleLeftSecondary = 0;
-  this.channel4currentSampleRightSecondary = 0;
-  this.channel1currentSampleLeftTrimary = 0;
-  this.channel1currentSampleRightTrimary = 0;
-  this.channel2currentSampleLeftTrimary = 0;
-  this.channel2currentSampleRightTrimary = 0;
-  this.mixerOutputCache = 0;
-  //Pre-multipliers to cache some calculations:
-  this.initializeTiming();
-  this.machineOut = 0;        //Premultiplier for audio samples per instruction.
-  //Audio generation counters:
-  this.audioTicks = 0;        //Used to sample the audio system every x CPU instructions.
-  this.audioIndex = 0;        //Used to keep alignment on audio generation.
-  this.rollover = 0;          //Used to keep alignment on the number of samples to output (Realign from counter alias).
-  //Timing Variables
-  this.emulatorTicks = 0;        //Times for how many instructions to execute before ending the loop.
-  this.DIVTicks = 56;          //DIV Ticks Counter (Invisible lower 8-bit)
-  this.LCDTicks = 60;          //Counter for how many instructions have been executed on a scanline so far.
-  this.timerTicks = 0;        //Counter for the TIMA timer.
-  this.TIMAEnabled = false;      //Is TIMA enabled?
-  this.TACClocker = 1024;        //Timer Max Ticks
-  this.serialTimer = 0;        //Serial IRQ Timer
-  this.serialShiftTimer = 0;      //Serial Transfer Shift Timer
-  this.serialShiftTimerAllocated = 0;  //Serial Transfer Shift Timer Refill
-  this.IRQEnableDelay = 0;      //Are the interrupts on queue to be enabled?
-  var dateVar = new_Date();     // The line is changed for benchmarking.
-  this.lastIteration = dateVar.getTime();//The last time we iterated the main loop.
-  dateVar = new_Date();         // The line is changed for benchmarking.
-  this.firstIteration = dateVar.getTime();
-  this.iterations = 0;
-  this.actualScanLine = 0;      //Actual scan line...
-  this.lastUnrenderedLine = 0;    //Last rendered scan line...
-  this.queuedScanLines = 0;
-  this.totalLinesPassed = 0;
-  this.haltPostClocks = 0;      //Post-Halt clocking.
-  //ROM Cartridge Components:
-  this.cMBC1 = false;          //Does the cartridge use MBC1?
-  this.cMBC2 = false;          //Does the cartridge use MBC2?
-  this.cMBC3 = false;          //Does the cartridge use MBC3?
-  this.cMBC5 = false;          //Does the cartridge use MBC5?
-  this.cMBC7 = false;          //Does the cartridge use MBC7?
-  this.cSRAM = false;          //Does the cartridge use save RAM?
-  this.cMMMO1 = false;        //...
-  this.cRUMBLE = false;        //Does the cartridge use the RUMBLE addressing (modified MBC5)?
-  this.cCamera = false;        //Is the cartridge actually a GameBoy Camera?
-  this.cTAMA5 = false;        //Does the cartridge use TAMA5? (Tamagotchi Cartridge)
-  this.cHuC3 = false;          //Does the cartridge use HuC3 (Hudson Soft / modified MBC3)?
-  this.cHuC1 = false;          //Does the cartridge use HuC1 (Hudson Soft / modified MBC1)?
-  this.cTIMER = false;        //Does the cartridge have an RTC?
-  this.ROMBanks = [          // 1 Bank = 16 KBytes = 256 Kbits
-    2, 4, 8, 16, 32, 64, 128, 256, 512
-  ];
-  this.ROMBanks[0x52] = 72;
-  this.ROMBanks[0x53] = 80;
-  this.ROMBanks[0x54] = 96;
-  this.numRAMBanks = 0;          //How many RAM banks were actually allocated?
-  ////Graphics Variables
-  this.currVRAMBank = 0;          //Current VRAM bank for GBC.
-  this.backgroundX = 0;          //Register SCX (X-Scroll)
-  this.backgroundY = 0;          //Register SCY (Y-Scroll)
-  this.gfxWindowDisplay = false;      //Is the windows enabled?
-  this.gfxSpriteShow = false;        //Are sprites enabled?
-  this.gfxSpriteNormalHeight = true;    //Are we doing 8x8 or 8x16 sprites?
-  this.bgEnabled = true;          //Is the BG enabled?
-  this.BGPriorityEnabled = true;      //Can we flag the BG for priority over sprites?
-  this.gfxWindowCHRBankPosition = 0;    //The current bank of the character map the window uses.
-  this.gfxBackgroundCHRBankPosition = 0;  //The current bank of the character map the BG uses.
-  this.gfxBackgroundBankOffset = 0x80;  //Fast mapping of the tile numbering/
-  this.windowY = 0;            //Current Y offset of the window.
-  this.windowX = 0;            //Current X offset of the window.
-  this.drewBlank = 0;            //To prevent the repeating of drawing a blank screen.
-  this.drewFrame = false;          //Throttle how many draws we can do to once per iteration.
-  this.midScanlineOffset = -1;      //mid-scanline rendering offset.
-  this.pixelEnd = 0;            //track the x-coord limit for line rendering (mid-scanline usage).
-  this.currentX = 0;            //The x-coord we left off at for mid-scanline rendering.
-  //BG Tile Pointer Caches:
-  this.BGCHRBank1 = null;
-  this.BGCHRBank2 = null;
-  this.BGCHRCurrentBank = null;
-  //Tile Data Cache:
-  this.tileCache = null;
-  //Palettes:
-  this.colors = [0xEFFFDE, 0xADD794, 0x529273, 0x183442];      //"Classic" GameBoy palette colors.
-  this.OBJPalette = null;
-  this.BGPalette = null;
-  this.gbcOBJRawPalette = null;
-  this.gbcBGRawPalette = null;
-  this.gbOBJPalette = null;
-  this.gbBGPalette = null;
-  this.gbcOBJPalette = null;
-  this.gbcBGPalette = null;
-  this.gbBGColorizedPalette = null;
-  this.gbOBJColorizedPalette = null;
-  this.cachedBGPaletteConversion = null;
-  this.cachedOBJPaletteConversion = null;
-  this.updateGBBGPalette = this.updateGBRegularBGPalette;
-  this.updateGBOBJPalette = this.updateGBRegularOBJPalette;
-  this.colorizedGBPalettes = false;
-  this.BGLayerRender = null;      //Reference to the BG rendering function.
-  this.WindowLayerRender = null;    //Reference to the window rendering function.
-  this.SpriteLayerRender = null;    //Reference to the OAM rendering function.
-  this.frameBuffer = [];        //The internal frame-buffer.
-  this.swizzledFrame = null;      //The secondary gfx buffer that holds the converted RGBA values.
-  this.canvasBuffer = null;      //imageData handle
-  this.pixelStart = 0;        //Temp variable for holding the current working framebuffer offset.
-  //Variables used for scaling in JS:
-  this.onscreenWidth = this.offscreenWidth = 160;
-  this.onscreenHeight = this.offScreenheight = 144;
-  this.offscreenRGBCount = this.onscreenWidth * this.onscreenHeight * 4;
-  //Initialize the white noise cache tables ahead of time:
-  this.intializeWhiteNoise();
-}
-
-// Start of code changed for benchmarking (removed ROM):
-GameBoyCore.prototype.GBBOOTROM = [];
-GameBoyCore.prototype.GBCBOOTROM = [];
-// End of code changed for benchmarking.
-
-GameBoyCore.prototype.ffxxDump = [  //Dump of the post-BOOT I/O register state (From gambatte):
-  0x0F, 0x00, 0x7C, 0xFF, 0x00, 0x00, 0x00, 0xF8,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01,
-  0x80, 0xBF, 0xF3, 0xFF, 0xBF, 0xFF, 0x3F, 0x00,   0xFF, 0xBF, 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, 0xFF,
-  0xFF, 0x00, 0x00, 0xBF, 0x77, 0xF3, 0xF1, 0xFF,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,   0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF,
-  0x91, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,   0x00, 0x00, 0x00, 0x00, 0xFF, 0x7E, 0xFF, 0xFE,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,   0xC0, 0xFF, 0xC1, 0x00, 0xFE, 0xFF, 0xFF, 0xFF,
-  0xF8, 0xFF, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x00,   0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B,   0x03, 0x73, 0x00, 0x83, 0x00, 0x0C, 0x00, 0x0D,
-  0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,   0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99,
-  0xBB, 0xBB, 0x67, 0x63, 0x6E, 0x0E, 0xEC, 0xCC,   0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E,
-  0x45, 0xEC, 0x52, 0xFA, 0x08, 0xB7, 0x07, 0x5D,   0x01, 0xFD, 0xC0, 0xFF, 0x08, 0xFC, 0x00, 0xE5,
-  0x0B, 0xF8, 0xC2, 0xCE, 0xF4, 0xF9, 0x0F, 0x7F,   0x45, 0x6D, 0x3D, 0xFE, 0x46, 0x97, 0x33, 0x5E,
-  0x08, 0xEF, 0xF1, 0xFF, 0x86, 0x83, 0x24, 0x74,   0x12, 0xFC, 0x00, 0x9F, 0xB4, 0xB7, 0x06, 0xD5,
-  0xD0, 0x7A, 0x00, 0x9E, 0x04, 0x5F, 0x41, 0x2F,   0x1D, 0x77, 0x36, 0x75, 0x81, 0xAA, 0x70, 0x3A,
-  0x98, 0xD1, 0x71, 0x02, 0x4D, 0x01, 0xC1, 0xFF,   0x0D, 0x00, 0xD3, 0x05, 0xF9, 0x00, 0x0B, 0x00
-];
-GameBoyCore.prototype.OPCODE = [
-  //NOP
-  //#0x00:
-  function (parentObj) {
-    //Do Nothing...
-  },
-  //LD BC, nn
-  //#0x01:
-  function (parentObj) {
-    parentObj.registerC = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.registerB = parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //LD (BC), A
-  //#0x02:
-  function (parentObj) {
-    parentObj.memoryWrite((parentObj.registerB << 8) | parentObj.registerC, parentObj.registerA);
-  },
-  //INC BC
-  //#0x03:
-  function (parentObj) {
-    var temp_var = ((parentObj.registerB << 8) | parentObj.registerC) + 1;
-    parentObj.registerB = (temp_var >> 8) & 0xFF;
-    parentObj.registerC = temp_var & 0xFF;
-  },
-  //INC B
-  //#0x04:
-  function (parentObj) {
-    parentObj.registerB = (parentObj.registerB + 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerB == 0);
-    parentObj.FHalfCarry = ((parentObj.registerB & 0xF) == 0);
-    parentObj.FSubtract = false;
-  },
-  //DEC B
-  //#0x05:
-  function (parentObj) {
-    parentObj.registerB = (parentObj.registerB - 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerB == 0);
-    parentObj.FHalfCarry = ((parentObj.registerB & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-  },
-  //LD B, n
-  //#0x06:
-  function (parentObj) {
-    parentObj.registerB = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //RLCA
-  //#0x07:
-  function (parentObj) {
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | (parentObj.registerA >> 7);
-    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //LD (nn), SP
-  //#0x08:
-  function (parentObj) {
-    var temp_var = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    parentObj.memoryWrite(temp_var, parentObj.stackPointer & 0xFF);
-    parentObj.memoryWrite((temp_var + 1) & 0xFFFF, parentObj.stackPointer >> 8);
-  },
-  //ADD HL, BC
-  //#0x09:
-  function (parentObj) {
-    var dirtySum = parentObj.registersHL + ((parentObj.registerB << 8) | parentObj.registerC);
-    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
-    parentObj.FCarry = (dirtySum > 0xFFFF);
-    parentObj.registersHL = dirtySum & 0xFFFF;
-    parentObj.FSubtract = false;
-  },
-  //LD A, (BC)
-  //#0x0A:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryRead((parentObj.registerB << 8) | parentObj.registerC);
-  },
-  //DEC BC
-  //#0x0B:
-  function (parentObj) {
-    var temp_var = (((parentObj.registerB << 8) | parentObj.registerC) - 1) & 0xFFFF;
-    parentObj.registerB = temp_var >> 8;
-    parentObj.registerC = temp_var & 0xFF;
-  },
-  //INC C
-  //#0x0C:
-  function (parentObj) {
-    parentObj.registerC = (parentObj.registerC + 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerC == 0);
-    parentObj.FHalfCarry = ((parentObj.registerC & 0xF) == 0);
-    parentObj.FSubtract = false;
-  },
-  //DEC C
-  //#0x0D:
-  function (parentObj) {
-    parentObj.registerC = (parentObj.registerC - 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerC == 0);
-    parentObj.FHalfCarry = ((parentObj.registerC & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-  },
-  //LD C, n
-  //#0x0E:
-  function (parentObj) {
-    parentObj.registerC = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //RRCA
-  //#0x0F:
-  function (parentObj) {
-    parentObj.registerA = (parentObj.registerA >> 1) | ((parentObj.registerA & 1) << 7);
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //STOP
-  //#0x10:
-  function (parentObj) {
-    if (parentObj.cGBC) {
-      if ((parentObj.memory[0xFF4D] & 0x01) == 0x01) {    //Speed change requested.
-        if (parentObj.memory[0xFF4D] > 0x7F) {        //Go back to single speed mode.
-          cout("Going into single clock speed mode.", 0);
-          parentObj.doubleSpeedShifter = 0;
-          parentObj.memory[0xFF4D] &= 0x7F;        //Clear the double speed mode flag.
-        }
-        else {                        //Go to double speed mode.
-          cout("Going into double clock speed mode.", 0);
-          parentObj.doubleSpeedShifter = 1;
-          parentObj.memory[0xFF4D] |= 0x80;        //Set the double speed mode flag.
-        }
-        parentObj.memory[0xFF4D] &= 0xFE;          //Reset the request bit.
-      }
-      else {
-        parentObj.handleSTOP();
-      }
-    }
-    else {
-      parentObj.handleSTOP();
-    }
-  },
-  //LD DE, nn
-  //#0x11:
-  function (parentObj) {
-    parentObj.registerE = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.registerD = parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //LD (DE), A
-  //#0x12:
-  function (parentObj) {
-    parentObj.memoryWrite((parentObj.registerD << 8) | parentObj.registerE, parentObj.registerA);
-  },
-  //INC DE
-  //#0x13:
-  function (parentObj) {
-    var temp_var = ((parentObj.registerD << 8) | parentObj.registerE) + 1;
-    parentObj.registerD = (temp_var >> 8) & 0xFF;
-    parentObj.registerE = temp_var & 0xFF;
-  },
-  //INC D
-  //#0x14:
-  function (parentObj) {
-    parentObj.registerD = (parentObj.registerD + 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerD == 0);
-    parentObj.FHalfCarry = ((parentObj.registerD & 0xF) == 0);
-    parentObj.FSubtract = false;
-  },
-  //DEC D
-  //#0x15:
-  function (parentObj) {
-    parentObj.registerD = (parentObj.registerD - 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerD == 0);
-    parentObj.FHalfCarry = ((parentObj.registerD & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-  },
-  //LD D, n
-  //#0x16:
-  function (parentObj) {
-    parentObj.registerD = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //RLA
-  //#0x17:
-  function (parentObj) {
-    var carry_flag = (parentObj.FCarry) ? 1 : 0;
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | carry_flag;
-    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //JR n
-  //#0x18:
-  function (parentObj) {
-    parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
-  },
-  //ADD HL, DE
-  //#0x19:
-  function (parentObj) {
-    var dirtySum = parentObj.registersHL + ((parentObj.registerD << 8) | parentObj.registerE);
-    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
-    parentObj.FCarry = (dirtySum > 0xFFFF);
-    parentObj.registersHL = dirtySum & 0xFFFF;
-    parentObj.FSubtract = false;
-  },
-  //LD A, (DE)
-  //#0x1A:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryRead((parentObj.registerD << 8) | parentObj.registerE);
-  },
-  //DEC DE
-  //#0x1B:
-  function (parentObj) {
-    var temp_var = (((parentObj.registerD << 8) | parentObj.registerE) - 1) & 0xFFFF;
-    parentObj.registerD = temp_var >> 8;
-    parentObj.registerE = temp_var & 0xFF;
-  },
-  //INC E
-  //#0x1C:
-  function (parentObj) {
-    parentObj.registerE = (parentObj.registerE + 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerE == 0);
-    parentObj.FHalfCarry = ((parentObj.registerE & 0xF) == 0);
-    parentObj.FSubtract = false;
-  },
-  //DEC E
-  //#0x1D:
-  function (parentObj) {
-    parentObj.registerE = (parentObj.registerE - 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerE == 0);
-    parentObj.FHalfCarry = ((parentObj.registerE & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-  },
-  //LD E, n
-  //#0x1E:
-  function (parentObj) {
-    parentObj.registerE = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //RRA
-  //#0x1F:
-  function (parentObj) {
-    var carry_flag = (parentObj.FCarry) ? 0x80 : 0;
-    parentObj.FCarry = ((parentObj.registerA & 1) == 1);
-    parentObj.registerA = (parentObj.registerA >> 1) | carry_flag;
-    parentObj.FZero = parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //JR NZ, n
-  //#0x20:
-  function (parentObj) {
-    if (!parentObj.FZero) {
-      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    }
-  },
-  //LD HL, nn
-  //#0x21:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //LDI (HL), A
-  //#0x22:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
-    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
-  },
-  //INC HL
-  //#0x23:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
-  },
-  //INC H
-  //#0x24:
-  function (parentObj) {
-    var H = ((parentObj.registersHL >> 8) + 1) & 0xFF;
-    parentObj.FZero = (H == 0);
-    parentObj.FHalfCarry = ((H & 0xF) == 0);
-    parentObj.FSubtract = false;
-    parentObj.registersHL = (H << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //DEC H
-  //#0x25:
-  function (parentObj) {
-    var H = ((parentObj.registersHL >> 8) - 1) & 0xFF;
-    parentObj.FZero = (H == 0);
-    parentObj.FHalfCarry = ((H & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-    parentObj.registersHL = (H << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, n
-  //#0x26:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 8) | (parentObj.registersHL & 0xFF);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //DAA
-  //#0x27:
-  function (parentObj) {
-    if (!parentObj.FSubtract) {
-      if (parentObj.FCarry || parentObj.registerA > 0x99) {
-        parentObj.registerA = (parentObj.registerA + 0x60) & 0xFF;
-        parentObj.FCarry = true;
-      }
-      if (parentObj.FHalfCarry || (parentObj.registerA & 0xF) > 0x9) {
-        parentObj.registerA = (parentObj.registerA + 0x06) & 0xFF;
-        parentObj.FHalfCarry = false;
-      }
-    }
-    else if (parentObj.FCarry && parentObj.FHalfCarry) {
-      parentObj.registerA = (parentObj.registerA + 0x9A) & 0xFF;
-      parentObj.FHalfCarry = false;
-    }
-    else if (parentObj.FCarry) {
-      parentObj.registerA = (parentObj.registerA + 0xA0) & 0xFF;
-    }
-    else if (parentObj.FHalfCarry) {
-      parentObj.registerA = (parentObj.registerA + 0xFA) & 0xFF;
-      parentObj.FHalfCarry = false;
-    }
-    parentObj.FZero = (parentObj.registerA == 0);
-  },
-  //JR Z, n
-  //#0x28:
-  function (parentObj) {
-    if (parentObj.FZero) {
-      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    }
-  },
-  //ADD HL, HL
-  //#0x29:
-  function (parentObj) {
-    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > 0x7FF);
-    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
-    parentObj.registersHL = (parentObj.registersHL << 1) & 0xFFFF;
-    parentObj.FSubtract = false;
-  },
-  //LDI A, (HL)
-  //#0x2A:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.registersHL = (parentObj.registersHL + 1) & 0xFFFF;
-  },
-  //DEC HL
-  //#0x2B:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
-  },
-  //INC L
-  //#0x2C:
-  function (parentObj) {
-    var L = (parentObj.registersHL + 1) & 0xFF;
-    parentObj.FZero = (L == 0);
-    parentObj.FHalfCarry = ((L & 0xF) == 0);
-    parentObj.FSubtract = false;
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | L;
-  },
-  //DEC L
-  //#0x2D:
-  function (parentObj) {
-    var L = (parentObj.registersHL - 1) & 0xFF;
-    parentObj.FZero = (L == 0);
-    parentObj.FHalfCarry = ((L & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | L;
-  },
-  //LD L, n
-  //#0x2E:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //CPL
-  //#0x2F:
-  function (parentObj) {
-    parentObj.registerA ^= 0xFF;
-    parentObj.FSubtract = parentObj.FHalfCarry = true;
-  },
-  //JR NC, n
-  //#0x30:
-  function (parentObj) {
-    if (!parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    }
-  },
-  //LD SP, nn
-  //#0x31:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //LDD (HL), A
-  //#0x32:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
-    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
-  },
-  //INC SP
-  //#0x33:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer + 1) & 0xFFFF;
-  },
-  //INC (HL)
-  //#0x34:
-  function (parentObj) {
-    var temp_var = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) + 1) & 0xFF;
-    parentObj.FZero = (temp_var == 0);
-    parentObj.FHalfCarry = ((temp_var & 0xF) == 0);
-    parentObj.FSubtract = false;
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-  },
-  //DEC (HL)
-  //#0x35:
-  function (parentObj) {
-    var temp_var = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) - 1) & 0xFF;
-    parentObj.FZero = (temp_var == 0);
-    parentObj.FHalfCarry = ((temp_var & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-  },
-  //LD (HL), n
-  //#0x36:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //SCF
-  //#0x37:
-  function (parentObj) {
-    parentObj.FCarry = true;
-    parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //JR C, n
-  //#0x38:
-  function (parentObj) {
-    if (parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.programCounter + ((parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24) + 1) & 0xFFFF;
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    }
-  },
-  //ADD HL, SP
-  //#0x39:
-  function (parentObj) {
-    var dirtySum = parentObj.registersHL + parentObj.stackPointer;
-    parentObj.FHalfCarry = ((parentObj.registersHL & 0xFFF) > (dirtySum & 0xFFF));
-    parentObj.FCarry = (dirtySum > 0xFFFF);
-    parentObj.registersHL = dirtySum & 0xFFFF;
-    parentObj.FSubtract = false;
-  },
-  //LDD A, (HL)
-  //#0x3A:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.registersHL = (parentObj.registersHL - 1) & 0xFFFF;
-  },
-  //DEC SP
-  //#0x3B:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-  },
-  //INC A
-  //#0x3C:
-  function (parentObj) {
-    parentObj.registerA = (parentObj.registerA + 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) == 0);
-    parentObj.FSubtract = false;
-  },
-  //DEC A
-  //#0x3D:
-  function (parentObj) {
-    parentObj.registerA = (parentObj.registerA - 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) == 0xF);
-    parentObj.FSubtract = true;
-  },
-  //LD A, n
-  //#0x3E:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //CCF
-  //#0x3F:
-  function (parentObj) {
-    parentObj.FCarry = !parentObj.FCarry;
-    parentObj.FSubtract = parentObj.FHalfCarry = false;
-  },
-  //LD B, B
-  //#0x40:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD B, C
-  //#0x41:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registerC;
-  },
-  //LD B, D
-  //#0x42:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registerD;
-  },
-  //LD B, E
-  //#0x43:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registerE;
-  },
-  //LD B, H
-  //#0x44:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registersHL >> 8;
-  },
-  //LD B, L
-  //#0x45:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registersHL & 0xFF;
-  },
-  //LD B, (HL)
-  //#0x46:
-  function (parentObj) {
-    parentObj.registerB = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD B, A
-  //#0x47:
-  function (parentObj) {
-    parentObj.registerB = parentObj.registerA;
-  },
-  //LD C, B
-  //#0x48:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registerB;
-  },
-  //LD C, C
-  //#0x49:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD C, D
-  //#0x4A:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registerD;
-  },
-  //LD C, E
-  //#0x4B:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registerE;
-  },
-  //LD C, H
-  //#0x4C:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registersHL >> 8;
-  },
-  //LD C, L
-  //#0x4D:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registersHL & 0xFF;
-  },
-  //LD C, (HL)
-  //#0x4E:
-  function (parentObj) {
-    parentObj.registerC = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD C, A
-  //#0x4F:
-  function (parentObj) {
-    parentObj.registerC = parentObj.registerA;
-  },
-  //LD D, B
-  //#0x50:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registerB;
-  },
-  //LD D, C
-  //#0x51:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registerC;
-  },
-  //LD D, D
-  //#0x52:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD D, E
-  //#0x53:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registerE;
-  },
-  //LD D, H
-  //#0x54:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registersHL >> 8;
-  },
-  //LD D, L
-  //#0x55:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registersHL & 0xFF;
-  },
-  //LD D, (HL)
-  //#0x56:
-  function (parentObj) {
-    parentObj.registerD = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD D, A
-  //#0x57:
-  function (parentObj) {
-    parentObj.registerD = parentObj.registerA;
-  },
-  //LD E, B
-  //#0x58:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registerB;
-  },
-  //LD E, C
-  //#0x59:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registerC;
-  },
-  //LD E, D
-  //#0x5A:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registerD;
-  },
-  //LD E, E
-  //#0x5B:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD E, H
-  //#0x5C:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registersHL >> 8;
-  },
-  //LD E, L
-  //#0x5D:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registersHL & 0xFF;
-  },
-  //LD E, (HL)
-  //#0x5E:
-  function (parentObj) {
-    parentObj.registerE = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD E, A
-  //#0x5F:
-  function (parentObj) {
-    parentObj.registerE = parentObj.registerA;
-  },
-  //LD H, B
-  //#0x60:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registerB << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, C
-  //#0x61:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registerC << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, D
-  //#0x62:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registerD << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, E
-  //#0x63:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registerE << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, H
-  //#0x64:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD H, L
-  //#0x65:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF) * 0x101;
-  },
-  //LD H, (HL)
-  //#0x66:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD H, A
-  //#0x67:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registerA << 8) | (parentObj.registersHL & 0xFF);
-  },
-  //LD L, B
-  //#0x68:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerB;
-  },
-  //LD L, C
-  //#0x69:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerC;
-  },
-  //LD L, D
-  //#0x6A:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerD;
-  },
-  //LD L, E
-  //#0x6B:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerE;
-  },
-  //LD L, H
-  //#0x6C:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | (parentObj.registersHL >> 8);
-  },
-  //LD L, L
-  //#0x6D:
-  function (parentObj) {
-    //Do nothing...
-  },
-  //LD L, (HL)
-  //#0x6E:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD L, A
-  //#0x6F:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | parentObj.registerA;
-  },
-  //LD (HL), B
-  //#0x70:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerB);
-  },
-  //LD (HL), C
-  //#0x71:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerC);
-  },
-  //LD (HL), D
-  //#0x72:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerD);
-  },
-  //LD (HL), E
-  //#0x73:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerE);
-  },
-  //LD (HL), H
-  //#0x74:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registersHL >> 8);
-  },
-  //LD (HL), L
-  //#0x75:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registersHL & 0xFF);
-  },
-  //HALT
-  //#0x76:
-  function (parentObj) {
-    //See if there's already an IRQ match:
-    if ((parentObj.interruptsEnabled & parentObj.interruptsRequested & 0x1F) > 0) {
-      if (!parentObj.cGBC && !parentObj.usedBootROM) {
-        //HALT bug in the DMG CPU model (Program Counter fails to increment for one instruction after HALT):
-        parentObj.skipPCIncrement = true;
-      }
-      else {
-        //CGB gets around the HALT PC bug by doubling the hidden NOP.
-        parentObj.CPUTicks += 4;
-      }
-    }
-    else {
-      //CPU is stalled until the next IRQ match:
-      parentObj.calculateHALTPeriod();
-    }
-  },
-  //LD (HL), A
-  //#0x77:
-  function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.registerA);
-  },
-  //LD A, B
-  //#0x78:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registerB;
-  },
-  //LD A, C
-  //#0x79:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registerC;
-  },
-  //LD A, D
-  //#0x7A:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registerD;
-  },
-  //LD A, E
-  //#0x7B:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registerE;
-  },
-  //LD A, H
-  //#0x7C:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registersHL >> 8;
-  },
-  //LD A, L
-  //#0x7D:
-  function (parentObj) {
-    parentObj.registerA = parentObj.registersHL & 0xFF;
-  },
-  //LD, A, (HL)
-  //#0x7E:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-  },
-  //LD A, A
-  //#0x7F:
-  function (parentObj) {
-    //Do Nothing...
-  },
-  //ADD A, B
-  //#0x80:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerB;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, C
-  //#0x81:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerC;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, D
-  //#0x82:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerD;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, E
-  //#0x83:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerE;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, H
-  //#0x84:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + (parentObj.registersHL >> 8);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, L
-  //#0x85:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, (HL)
-  //#0x86:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADD A, A
-  //#0x87:
-  function (parentObj) {
-    parentObj.FHalfCarry = ((parentObj.registerA & 0x8) == 0x8);
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = (parentObj.registerA << 1) & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, B
-  //#0x88:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerB + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerB & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, C
-  //#0x89:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerC + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerC & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, D
-  //#0x8A:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerD + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerD & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, E
-  //#0x8B:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.registerE + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (parentObj.registerE & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, H
-  //#0x8C:
-  function (parentObj) {
-    var tempValue = (parentObj.registersHL >> 8);
-    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, L
-  //#0x8D:
-  function (parentObj) {
-    var tempValue = (parentObj.registersHL & 0xFF);
-    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, (HL)
-  //#0x8E:
-  function (parentObj) {
-    var tempValue = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //ADC A, A
-  //#0x8F:
-  function (parentObj) {
-    //shift left register A one bit for some ops here as an optimization:
-    var dirtySum = (parentObj.registerA << 1) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((((parentObj.registerA << 1) & 0x1E) | ((parentObj.FCarry) ? 1 : 0)) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //SUB A, B
-  //#0x90:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerB;
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, C
-  //#0x91:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerC;
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, D
-  //#0x92:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerD;
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, E
-  //#0x93:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerE;
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, H
-  //#0x94:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - (parentObj.registersHL >> 8);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, L
-  //#0x95:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, (HL)
-  //#0x96:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //SUB A, A
-  //#0x97:
-  function (parentObj) {
-    //number - same number == 0
-    parentObj.registerA = 0;
-    parentObj.FHalfCarry = parentObj.FCarry = false;
-    parentObj.FZero = parentObj.FSubtract = true;
-  },
-  //SBC A, B
-  //#0x98:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerB - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerB & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, C
-  //#0x99:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerC - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerC & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, D
-  //#0x9A:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerD - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerD & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, E
-  //#0x9B:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerE - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registerE & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, H
-  //#0x9C:
-  function (parentObj) {
-    var temp_var = parentObj.registersHL >> 8;
-    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, L
-  //#0x9D:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF) - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (parentObj.registersHL & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, (HL)
-  //#0x9E:
-  function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //SBC A, A
-  //#0x9F:
-  function (parentObj) {
-    //Optimized SBC A:
-    if (parentObj.FCarry) {
-      parentObj.FZero = false;
-      parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = true;
-      parentObj.registerA = 0xFF;
-    }
-    else {
-      parentObj.FHalfCarry = parentObj.FCarry = false;
-      parentObj.FSubtract = parentObj.FZero = true;
-      parentObj.registerA = 0;
-    }
-  },
-  //AND B
-  //#0xA0:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.registerB;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND C
-  //#0xA1:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.registerC;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND D
-  //#0xA2:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.registerD;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND E
-  //#0xA3:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.registerE;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND H
-  //#0xA4:
-  function (parentObj) {
-    parentObj.registerA &= (parentObj.registersHL >> 8);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND L
-  //#0xA5:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.registersHL;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND (HL)
-  //#0xA6:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //AND A
-  //#0xA7:
-  function (parentObj) {
-    //number & same number = same number
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //XOR B
-  //#0xA8:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.registerB;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR C
-  //#0xA9:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.registerC;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR D
-  //#0xAA:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.registerD;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR E
-  //#0xAB:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.registerE;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR H
-  //#0xAC:
-  function (parentObj) {
-    parentObj.registerA ^= (parentObj.registersHL >> 8);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR L
-  //#0xAD:
-  function (parentObj) {
-    parentObj.registerA ^= (parentObj.registersHL & 0xFF);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR (HL)
-  //#0xAE:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //XOR A
-  //#0xAF:
-  function (parentObj) {
-    //number ^ same number == 0
-    parentObj.registerA = 0;
-    parentObj.FZero = true;
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //OR B
-  //#0xB0:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.registerB;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR C
-  //#0xB1:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.registerC;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR D
-  //#0xB2:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.registerD;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR E
-  //#0xB3:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.registerE;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR H
-  //#0xB4:
-  function (parentObj) {
-    parentObj.registerA |= (parentObj.registersHL >> 8);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR L
-  //#0xB5:
-  function (parentObj) {
-    parentObj.registerA |= (parentObj.registersHL & 0xFF);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR (HL)
-  //#0xB6:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //OR A
-  //#0xB7:
-  function (parentObj) {
-    //number | same number == same number
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //CP B
-  //#0xB8:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerB;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP C
-  //#0xB9:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerC;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP D
-  //#0xBA:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerD;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP E
-  //#0xBB:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.registerE;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP H
-  //#0xBC:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - (parentObj.registersHL >> 8);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP L
-  //#0xBD:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP (HL)
-  //#0xBE:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //CP A
-  //#0xBF:
-  function (parentObj) {
-    parentObj.FHalfCarry = parentObj.FCarry = false;
-    parentObj.FZero = parentObj.FSubtract = true;
-  },
-  //RET !FZ
-  //#0xC0:
-  function (parentObj) {
-    if (!parentObj.FZero) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-      parentObj.CPUTicks += 12;
-    }
-  },
-  //POP BC
-  //#0xC1:
-  function (parentObj) {
-    parentObj.registerC = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.registerB = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-  },
-  //JP !FZ, nn
-  //#0xC2:
-  function (parentObj) {
-    if (!parentObj.FZero) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //JP nn
-  //#0xC3:
-  function (parentObj) {
-    parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-  },
-  //CALL !FZ, nn
-  //#0xC4:
-  function (parentObj) {
-    if (!parentObj.FZero) {
-      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-      parentObj.programCounter = temp_pc;
-      parentObj.CPUTicks += 12;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //PUSH BC
-  //#0xC5:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerB);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerC);
-  },
-  //ADD, n
-  //#0xC6:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA + parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) < (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //RST 0
-  //#0xC7:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0;
-  },
-  //RET FZ
-  //#0xC8:
-  function (parentObj) {
-    if (parentObj.FZero) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-      parentObj.CPUTicks += 12;
-    }
-  },
-  //RET
-  //#0xC9:
-  function (parentObj) {
-    parentObj.programCounter =  (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-  },
-  //JP FZ, nn
-  //#0xCA:
-  function (parentObj) {
-    if (parentObj.FZero) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //Secondary OP Code Set:
-  //#0xCB:
-  function (parentObj) {
-    var opcode = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    //Increment the program counter to the next instruction:
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    //Get how many CPU cycles the current 0xCBXX op code counts for:
-    parentObj.CPUTicks += parentObj.SecondaryTICKTable[opcode];
-    //Execute secondary OP codes for the 0xCB OP code call.
-    parentObj.CBOPCODE[opcode](parentObj);
-  },
-  //CALL FZ, nn
-  //#0xCC:
-  function (parentObj) {
-    if (parentObj.FZero) {
-      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-      parentObj.programCounter = temp_pc;
-      parentObj.CPUTicks += 12;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //CALL nn
-  //#0xCD:
-  function (parentObj) {
-    var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = temp_pc;
-  },
-  //ADC A, n
-  //#0xCE:
-  function (parentObj) {
-    var tempValue = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    var dirtySum = parentObj.registerA + tempValue + ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) + (tempValue & 0xF) + ((parentObj.FCarry) ? 1 : 0) > 0xF);
-    parentObj.FCarry = (dirtySum > 0xFF);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = false;
-  },
-  //RST 0x8
-  //#0xCF:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x8;
-  },
-  //RET !FC
-  //#0xD0:
-  function (parentObj) {
-    if (!parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-      parentObj.CPUTicks += 12;
-    }
-  },
-  //POP DE
-  //#0xD1:
-  function (parentObj) {
-    parentObj.registerE = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.registerD = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-  },
-  //JP !FC, nn
-  //#0xD2:
-  function (parentObj) {
-    if (!parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //0xD3 - Illegal
-  //#0xD3:
-  function (parentObj) {
-    cout("Illegal op code 0xD3 called, pausing emulation.", 2);
-    pause();
-  },
-  //CALL !FC, nn
-  //#0xD4:
-  function (parentObj) {
-    if (!parentObj.FCarry) {
-      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-      parentObj.programCounter = temp_pc;
-      parentObj.CPUTicks += 12;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //PUSH DE
-  //#0xD5:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerD);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerE);
-  },
-  //SUB A, n
-  //#0xD6:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) < (dirtySum & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //RST 0x10
-  //#0xD7:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x10;
-  },
-  //RET FC
-  //#0xD8:
-  function (parentObj) {
-    if (parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-      parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-      parentObj.CPUTicks += 12;
-    }
-  },
-  //RETI
-  //#0xD9:
-  function (parentObj) {
-    parentObj.programCounter = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-    //Immediate for HALT:
-    parentObj.IRQEnableDelay = (parentObj.IRQEnableDelay == 2 || parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) == 0x76) ? 1 : 2;
-  },
-  //JP FC, nn
-  //#0xDA:
-  function (parentObj) {
-    if (parentObj.FCarry) {
-      parentObj.programCounter = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.CPUTicks += 4;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //0xDB - Illegal
-  //#0xDB:
-  function (parentObj) {
-    cout("Illegal op code 0xDB called, pausing emulation.", 2);
-    pause();
-  },
-  //CALL FC, nn
-  //#0xDC:
-  function (parentObj) {
-    if (parentObj.FCarry) {
-      var temp_pc = (parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-      parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-      parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-      parentObj.programCounter = temp_pc;
-      parentObj.CPUTicks += 12;
-    }
-    else {
-      parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-    }
-  },
-  //0xDD - Illegal
-  //#0xDD:
-  function (parentObj) {
-    cout("Illegal op code 0xDD called, pausing emulation.", 2);
-    pause();
-  },
-  //SBC A, n
-  //#0xDE:
-  function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    var dirtySum = parentObj.registerA - temp_var - ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = ((parentObj.registerA & 0xF) - (temp_var & 0xF) - ((parentObj.FCarry) ? 1 : 0) < 0);
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.registerA = dirtySum & 0xFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = true;
-  },
-  //RST 0x18
-  //#0xDF:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x18;
-  },
-  //LDH (n), A
-  //#0xE0:
-  function (parentObj) {
-    parentObj.memoryHighWrite(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter), parentObj.registerA);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //POP HL
-  //#0xE1:
-  function (parentObj) {
-    parentObj.registersHL = (parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-  },
-  //LD (0xFF00 + C), A
-  //#0xE2:
-  function (parentObj) {
-    parentObj.memoryHighWriter[parentObj.registerC](parentObj, parentObj.registerC, parentObj.registerA);
-  },
-  //0xE3 - Illegal
-  //#0xE3:
-  function (parentObj) {
-    cout("Illegal op code 0xE3 called, pausing emulation.", 2);
-    pause();
-  },
-  //0xE4 - Illegal
-  //#0xE4:
-  function (parentObj) {
-    cout("Illegal op code 0xE4 called, pausing emulation.", 2);
-    pause();
-  },
-  //PUSH HL
-  //#0xE5:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registersHL >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registersHL & 0xFF);
-  },
-  //AND n
-  //#0xE6:
-  function (parentObj) {
-    parentObj.registerA &= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = parentObj.FCarry = false;
-  },
-  //RST 0x20
-  //#0xE7:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x20;
-  },
-  //ADD SP, n
-  //#0xE8:
-  function (parentObj) {
-    var temp_value2 = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24;
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    var temp_value = (parentObj.stackPointer + temp_value2) & 0xFFFF;
-    temp_value2 = parentObj.stackPointer ^ temp_value2 ^ temp_value;
-    parentObj.stackPointer = temp_value;
-    parentObj.FCarry = ((temp_value2 & 0x100) == 0x100);
-    parentObj.FHalfCarry = ((temp_value2 & 0x10) == 0x10);
-    parentObj.FZero = parentObj.FSubtract = false;
-  },
-  //JP, (HL)
-  //#0xE9:
-  function (parentObj) {
-    parentObj.programCounter = parentObj.registersHL;
-  },
-  //LD n, A
-  //#0xEA:
-  function (parentObj) {
-    parentObj.memoryWrite((parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter), parentObj.registerA);
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //0xEB - Illegal
-  //#0xEB:
-  function (parentObj) {
-    cout("Illegal op code 0xEB called, pausing emulation.", 2);
-    pause();
-  },
-  //0xEC - Illegal
-  //#0xEC:
-  function (parentObj) {
-    cout("Illegal op code 0xEC called, pausing emulation.", 2);
-    pause();
-  },
-  //0xED - Illegal
-  //#0xED:
-  function (parentObj) {
-    cout("Illegal op code 0xED called, pausing emulation.", 2);
-    pause();
-  },
-  //XOR n
-  //#0xEE:
-  function (parentObj) {
-    parentObj.registerA ^= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FSubtract = parentObj.FHalfCarry = parentObj.FCarry = false;
-  },
-  //RST 0x28
-  //#0xEF:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x28;
-  },
-  //LDH A, (n)
-  //#0xF0:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryHighRead(parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-  },
-  //POP AF
-  //#0xF1:
-  function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.stackPointer](parentObj, parentObj.stackPointer);
-    parentObj.FZero = (temp_var > 0x7F);
-    parentObj.FSubtract = ((temp_var & 0x40) == 0x40);
-    parentObj.FHalfCarry = ((temp_var & 0x20) == 0x20);
-    parentObj.FCarry = ((temp_var & 0x10) == 0x10);
-    parentObj.registerA = parentObj.memoryRead((parentObj.stackPointer + 1) & 0xFFFF);
-    parentObj.stackPointer = (parentObj.stackPointer + 2) & 0xFFFF;
-  },
-  //LD A, (0xFF00 + C)
-  //#0xF2:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryHighReader[parentObj.registerC](parentObj, parentObj.registerC);
-  },
-  //DI
-  //#0xF3:
-  function (parentObj) {
-    parentObj.IME = false;
-    parentObj.IRQEnableDelay = 0;
-  },
-  //0xF4 - Illegal
-  //#0xF4:
-  function (parentObj) {
-    cout("Illegal op code 0xF4 called, pausing emulation.", 2);
-    pause();
-  },
-  //PUSH AF
-  //#0xF5:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.registerA);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, ((parentObj.FZero) ? 0x80 : 0) | ((parentObj.FSubtract) ? 0x40 : 0) | ((parentObj.FHalfCarry) ? 0x20 : 0) | ((parentObj.FCarry) ? 0x10 : 0));
-  },
-  //OR n
-  //#0xF6:
-  function (parentObj) {
-    parentObj.registerA |= parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FSubtract = parentObj.FCarry = parentObj.FHalfCarry = false;
-  },
-  //RST 0x30
-  //#0xF7:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x30;
-  },
-  //LDHL SP, n
-  //#0xF8:
-  function (parentObj) {
-    var temp_var = (parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) << 24) >> 24;
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.registersHL = (parentObj.stackPointer + temp_var) & 0xFFFF;
-    temp_var = parentObj.stackPointer ^ temp_var ^ parentObj.registersHL;
-    parentObj.FCarry = ((temp_var & 0x100) == 0x100);
-    parentObj.FHalfCarry = ((temp_var & 0x10) == 0x10);
-    parentObj.FZero = parentObj.FSubtract = false;
-  },
-  //LD SP, HL
-  //#0xF9:
-  function (parentObj) {
-    parentObj.stackPointer = parentObj.registersHL;
-  },
-  //LD A, (nn)
-  //#0xFA:
-  function (parentObj) {
-    parentObj.registerA = parentObj.memoryRead((parentObj.memoryRead((parentObj.programCounter + 1) & 0xFFFF) << 8) | parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter));
-    parentObj.programCounter = (parentObj.programCounter + 2) & 0xFFFF;
-  },
-  //EI
-  //#0xFB:
-  function (parentObj) {
-    //Immediate for HALT:
-    parentObj.IRQEnableDelay = (parentObj.IRQEnableDelay == 2 || parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter) == 0x76) ? 1 : 2;
-  },
-  //0xFC - Illegal
-  //#0xFC:
-  function (parentObj) {
-    cout("Illegal op code 0xFC called, pausing emulation.", 2);
-    pause();
-  },
-  //0xFD - Illegal
-  //#0xFD:
-  function (parentObj) {
-    cout("Illegal op code 0xFD called, pausing emulation.", 2);
-    pause();
-  },
-  //CP n
-  //#0xFE:
-  function (parentObj) {
-    var dirtySum = parentObj.registerA - parentObj.memoryReader[parentObj.programCounter](parentObj, parentObj.programCounter);
-    parentObj.programCounter = (parentObj.programCounter + 1) & 0xFFFF;
-    parentObj.FHalfCarry = ((dirtySum & 0xF) > (parentObj.registerA & 0xF));
-    parentObj.FCarry = (dirtySum < 0);
-    parentObj.FZero = (dirtySum == 0);
-    parentObj.FSubtract = true;
-  },
-  //RST 0x38
-  //#0xFF:
-  function (parentObj) {
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter >> 8);
-    parentObj.stackPointer = (parentObj.stackPointer - 1) & 0xFFFF;
-    parentObj.memoryWriter[parentObj.stackPointer](parentObj, parentObj.stackPointer, parentObj.programCounter & 0xFF);
-    parentObj.programCounter = 0x38;
-  }
-];
-GameBoyCore.prototype.CBOPCODE = [
-  //RLC B
-  //#0x00:
-  function (parentObj) {
-    parentObj.FCarry = (parentObj.registerB > 0x7F);
-    parentObj.registerB = ((parentObj.registerB << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //RLC C
-  //#0x01:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerC > 0x7F);
-    parentObj.registerC = ((parentObj.registerC << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //RLC D
-  //#0x02:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerD > 0x7F);
-    parentObj.registerD = ((parentObj.registerD << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //RLC E
-  //#0x03:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerE > 0x7F);
-    parentObj.registerE = ((parentObj.registerE << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //RLC H
-  //#0x04:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
-    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | ((parentObj.FCarry) ? 0x100 : 0) | (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //RLC L
-  //#0x05:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x80) == 0x80);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //RLC (HL)
-  //#0x06:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FCarry = (temp_var > 0x7F);
-    temp_var = ((temp_var << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //RLC A
-  //#0x07:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //RRC B
-  //#0x08:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
-    parentObj.registerB = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerB >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //RRC C
-  //#0x09:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
-    parentObj.registerC = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerC >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //RRC D
-  //#0x0A:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
-    parentObj.registerD = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerD >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //RRC E
-  //#0x0B:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
-    parentObj.registerE = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerE >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //RRC H
-  //#0x0C:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
-    parentObj.registersHL = ((parentObj.FCarry) ? 0x8000 : 0) | ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //RRC L
-  //#0x0D:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x01) == 0x01);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.FCarry) ? 0x80 : 0) | ((parentObj.registersHL & 0xFF) >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //RRC (HL)
-  //#0x0E:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
-    temp_var = ((parentObj.FCarry) ? 0x80 : 0) | (temp_var >> 1);
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //RRC A
-  //#0x0F:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
-    parentObj.registerA = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerA >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //RL B
-  //#0x10:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registerB > 0x7F);
-    parentObj.registerB = ((parentObj.registerB << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //RL C
-  //#0x11:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registerC > 0x7F);
-    parentObj.registerC = ((parentObj.registerC << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //RL D
-  //#0x12:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registerD > 0x7F);
-    parentObj.registerD = ((parentObj.registerD << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //RL E
-  //#0x13:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registerE > 0x7F);
-    parentObj.registerE = ((parentObj.registerE << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //RL H
-  //#0x14:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registersHL > 0x7FFF);
-    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | ((parentObj.FCarry) ? 0x100 : 0) | (parentObj.registersHL & 0xFF);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //RL L
-  //#0x15:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registersHL & 0x80) == 0x80);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //RL (HL)
-  //#0x16:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    var newFCarry = (temp_var > 0x7F);
-    temp_var = ((temp_var << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //RL A
-  //#0x17:
-  ,function (parentObj) {
-    var newFCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = ((parentObj.registerA << 1) & 0xFF) | ((parentObj.FCarry) ? 1 : 0);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //RR B
-  //#0x18:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registerB & 0x01) == 0x01);
-    parentObj.registerB = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerB >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //RR C
-  //#0x19:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registerC & 0x01) == 0x01);
-    parentObj.registerC = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerC >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //RR D
-  //#0x1A:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registerD & 0x01) == 0x01);
-    parentObj.registerD = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerD >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //RR E
-  //#0x1B:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registerE & 0x01) == 0x01);
-    parentObj.registerE = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerE >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //RR H
-  //#0x1C:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
-    parentObj.registersHL = ((parentObj.FCarry) ? 0x8000 : 0) | ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //RR L
-  //#0x1D:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registersHL & 0x01) == 0x01);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.FCarry) ? 0x80 : 0) | ((parentObj.registersHL & 0xFF) >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //RR (HL)
-  //#0x1E:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    var newFCarry = ((temp_var & 0x01) == 0x01);
-    temp_var = ((parentObj.FCarry) ? 0x80 : 0) | (temp_var >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //RR A
-  //#0x1F:
-  ,function (parentObj) {
-    var newFCarry = ((parentObj.registerA & 0x01) == 0x01);
-    parentObj.registerA = ((parentObj.FCarry) ? 0x80 : 0) | (parentObj.registerA >> 1);
-    parentObj.FCarry = newFCarry;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //SLA B
-  //#0x20:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerB > 0x7F);
-    parentObj.registerB = (parentObj.registerB << 1) & 0xFF;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //SLA C
-  //#0x21:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerC > 0x7F);
-    parentObj.registerC = (parentObj.registerC << 1) & 0xFF;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //SLA D
-  //#0x22:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerD > 0x7F);
-    parentObj.registerD = (parentObj.registerD << 1) & 0xFF;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //SLA E
-  //#0x23:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerE > 0x7F);
-    parentObj.registerE = (parentObj.registerE << 1) & 0xFF;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //SLA H
-  //#0x24:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registersHL > 0x7FFF);
-    parentObj.registersHL = ((parentObj.registersHL << 1) & 0xFE00) | (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //SLA L
-  //#0x25:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0080) == 0x0080);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL << 1) & 0xFF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //SLA (HL)
-  //#0x26:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FCarry = (temp_var > 0x7F);
-    temp_var = (temp_var << 1) & 0xFF;
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //SLA A
-  //#0x27:
-  ,function (parentObj) {
-    parentObj.FCarry = (parentObj.registerA > 0x7F);
-    parentObj.registerA = (parentObj.registerA << 1) & 0xFF;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //SRA B
-  //#0x28:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
-    parentObj.registerB = (parentObj.registerB & 0x80) | (parentObj.registerB >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //SRA C
-  //#0x29:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
-    parentObj.registerC = (parentObj.registerC & 0x80) | (parentObj.registerC >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //SRA D
-  //#0x2A:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
-    parentObj.registerD = (parentObj.registerD & 0x80) | (parentObj.registerD >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //SRA E
-  //#0x2B:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
-    parentObj.registerE = (parentObj.registerE & 0x80) | (parentObj.registerE >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //SRA H
-  //#0x2C:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
-    parentObj.registersHL = ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0x80FF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //SRA L
-  //#0x2D:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0001) == 0x0001);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF80) | ((parentObj.registersHL & 0xFF) >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //SRA (HL)
-  //#0x2E:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
-    temp_var = (temp_var & 0x80) | (temp_var >> 1);
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var == 0);
-  }
-  //SRA A
-  //#0x2F:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
-    parentObj.registerA = (parentObj.registerA & 0x80) | (parentObj.registerA >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //SWAP B
-  //#0x30:
-  ,function (parentObj) {
-    parentObj.registerB = ((parentObj.registerB & 0xF) << 4) | (parentObj.registerB >> 4);
-    parentObj.FZero = (parentObj.registerB == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP C
-  //#0x31:
-  ,function (parentObj) {
-    parentObj.registerC = ((parentObj.registerC & 0xF) << 4) | (parentObj.registerC >> 4);
-    parentObj.FZero = (parentObj.registerC == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP D
-  //#0x32:
-  ,function (parentObj) {
-    parentObj.registerD = ((parentObj.registerD & 0xF) << 4) | (parentObj.registerD >> 4);
-    parentObj.FZero = (parentObj.registerD == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP E
-  //#0x33:
-  ,function (parentObj) {
-    parentObj.registerE = ((parentObj.registerE & 0xF) << 4) | (parentObj.registerE >> 4);
-    parentObj.FZero = (parentObj.registerE == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP H
-  //#0x34:
-  ,function (parentObj) {
-    parentObj.registersHL = ((parentObj.registersHL & 0xF00) << 4) | ((parentObj.registersHL & 0xF000) >> 4) | (parentObj.registersHL & 0xFF);
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP L
-  //#0x35:
-  ,function (parentObj) {
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL & 0xF) << 4) | ((parentObj.registersHL & 0xF0) >> 4);
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP (HL)
-  //#0x36:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    temp_var = ((temp_var & 0xF) << 4) | (temp_var >> 4);
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var);
-    parentObj.FZero = (temp_var == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SWAP A
-  //#0x37:
-  ,function (parentObj) {
-    parentObj.registerA = ((parentObj.registerA & 0xF) << 4) | (parentObj.registerA >> 4);
-    parentObj.FZero = (parentObj.registerA == 0);
-    parentObj.FCarry = parentObj.FHalfCarry = parentObj.FSubtract = false;
-  }
-  //SRL B
-  //#0x38:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerB & 0x01) == 0x01);
-    parentObj.registerB >>= 1;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerB == 0);
-  }
-  //SRL C
-  //#0x39:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerC & 0x01) == 0x01);
-    parentObj.registerC >>= 1;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerC == 0);
-  }
-  //SRL D
-  //#0x3A:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerD & 0x01) == 0x01);
-    parentObj.registerD >>= 1;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerD == 0);
-  }
-  //SRL E
-  //#0x3B:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerE & 0x01) == 0x01);
-    parentObj.registerE >>= 1;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerE == 0);
-  }
-  //SRL H
-  //#0x3C:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0100) == 0x0100);
-    parentObj.registersHL = ((parentObj.registersHL >> 1) & 0xFF00) | (parentObj.registersHL & 0xFF);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registersHL < 0x100);
-  }
-  //SRL L
-  //#0x3D:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registersHL & 0x0001) == 0x0001);
-    parentObj.registersHL = (parentObj.registersHL & 0xFF00) | ((parentObj.registersHL & 0xFF) >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0xFF) == 0);
-  }
-  //SRL (HL)
-  //#0x3E:
-  ,function (parentObj) {
-    var temp_var = parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL);
-    parentObj.FCarry = ((temp_var & 0x01) == 0x01);
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, temp_var >> 1);
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (temp_var < 2);
-  }
-  //SRL A
-  //#0x3F:
-  ,function (parentObj) {
-    parentObj.FCarry = ((parentObj.registerA & 0x01) == 0x01);
-    parentObj.registerA >>= 1;
-    parentObj.FHalfCarry = parentObj.FSubtract = false;
-    parentObj.FZero = (parentObj.registerA == 0);
-  }
-  //BIT 0, B
-  //#0x40:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x01) == 0);
-  }
-  //BIT 0, C
-  //#0x41:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x01) == 0);
-  }
-  //BIT 0, D
-  //#0x42:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x01) == 0);
-  }
-  //BIT 0, E
-  //#0x43:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x01) == 0);
-  }
-  //BIT 0, H
-  //#0x44:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0100) == 0);
-  }
-  //BIT 0, L
-  //#0x45:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0001) == 0);
-  }
-  //BIT 0, (HL)
-  //#0x46:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x01) == 0);
-  }
-  //BIT 0, A
-  //#0x47:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x01) == 0);
-  }
-  //BIT 1, B
-  //#0x48:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x02) == 0);
-  }
-  //BIT 1, C
-  //#0x49:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x02) == 0);
-  }
-  //BIT 1, D
-  //#0x4A:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x02) == 0);
-  }
-  //BIT 1, E
-  //#0x4B:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x02) == 0);
-  }
-  //BIT 1, H
-  //#0x4C:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0200) == 0);
-  }
-  //BIT 1, L
-  //#0x4D:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0002) == 0);
-  }
-  //BIT 1, (HL)
-  //#0x4E:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x02) == 0);
-  }
-  //BIT 1, A
-  //#0x4F:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x02) == 0);
-  }
-  //BIT 2, B
-  //#0x50:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x04) == 0);
-  }
-  //BIT 2, C
-  //#0x51:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x04) == 0);
-  }
-  //BIT 2, D
-  //#0x52:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x04) == 0);
-  }
-  //BIT 2, E
-  //#0x53:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x04) == 0);
-  }
-  //BIT 2, H
-  //#0x54:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0400) == 0);
-  }
-  //BIT 2, L
-  //#0x55:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0004) == 0);
-  }
-  //BIT 2, (HL)
-  //#0x56:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x04) == 0);
-  }
-  //BIT 2, A
-  //#0x57:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x04) == 0);
-  }
-  //BIT 3, B
-  //#0x58:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x08) == 0);
-  }
-  //BIT 3, C
-  //#0x59:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x08) == 0);
-  }
-  //BIT 3, D
-  //#0x5A:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x08) == 0);
-  }
-  //BIT 3, E
-  //#0x5B:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x08) == 0);
-  }
-  //BIT 3, H
-  //#0x5C:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0800) == 0);
-  }
-  //BIT 3, L
-  //#0x5D:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0008) == 0);
-  }
-  //BIT 3, (HL)
-  //#0x5E:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x08) == 0);
-  }
-  //BIT 3, A
-  //#0x5F:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x08) == 0);
-  }
-  //BIT 4, B
-  //#0x60:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x10) == 0);
-  }
-  //BIT 4, C
-  //#0x61:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x10) == 0);
-  }
-  //BIT 4, D
-  //#0x62:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x10) == 0);
-  }
-  //BIT 4, E
-  //#0x63:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x10) == 0);
-  }
-  //BIT 4, H
-  //#0x64:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x1000) == 0);
-  }
-  //BIT 4, L
-  //#0x65:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0010) == 0);
-  }
-  //BIT 4, (HL)
-  //#0x66:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x10) == 0);
-  }
-  //BIT 4, A
-  //#0x67:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x10) == 0);
-  }
-  //BIT 5, B
-  //#0x68:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x20) == 0);
-  }
-  //BIT 5, C
-  //#0x69:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x20) == 0);
-  }
-  //BIT 5, D
-  //#0x6A:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x20) == 0);
-  }
-  //BIT 5, E
-  //#0x6B:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x20) == 0);
-  }
-  //BIT 5, H
-  //#0x6C:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x2000) == 0);
-  }
-  //BIT 5, L
-  //#0x6D:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0020) == 0);
-  }
-  //BIT 5, (HL)
-  //#0x6E:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x20) == 0);
-  }
-  //BIT 5, A
-  //#0x6F:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x20) == 0);
-  }
-  //BIT 6, B
-  //#0x70:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x40) == 0);
-  }
-  //BIT 6, C
-  //#0x71:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x40) == 0);
-  }
-  //BIT 6, D
-  //#0x72:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x40) == 0);
-  }
-  //BIT 6, E
-  //#0x73:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x40) == 0);
-  }
-  //BIT 6, H
-  //#0x74:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x4000) == 0);
-  }
-  //BIT 6, L
-  //#0x75:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0040) == 0);
-  }
-  //BIT 6, (HL)
-  //#0x76:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x40) == 0);
-  }
-  //BIT 6, A
-  //#0x77:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x40) == 0);
-  }
-  //BIT 7, B
-  //#0x78:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerB & 0x80) == 0);
-  }
-  //BIT 7, C
-  //#0x79:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerC & 0x80) == 0);
-  }
-  //BIT 7, D
-  //#0x7A:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerD & 0x80) == 0);
-  }
-  //BIT 7, E
-  //#0x7B:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerE & 0x80) == 0);
-  }
-  //BIT 7, H
-  //#0x7C:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x8000) == 0);
-  }
-  //BIT 7, L
-  //#0x7D:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registersHL & 0x0080) == 0);
-  }
-  //BIT 7, (HL)
-  //#0x7E:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x80) == 0);
-  }
-  //BIT 7, A
-  //#0x7F:
-  ,function (parentObj) {
-    parentObj.FHalfCarry = true;
-    parentObj.FSubtract = false;
-    parentObj.FZero = ((parentObj.registerA & 0x80) == 0);
-  }
-  //RES 0, B
-  //#0x80:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xFE;
-  }
-  //RES 0, C
-  //#0x81:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xFE;
-  }
-  //RES 0, D
-  //#0x82:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xFE;
-  }
-  //RES 0, E
-  //#0x83:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xFE;
-  }
-  //RES 0, H
-  //#0x84:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFEFF;
-  }
-  //RES 0, L
-  //#0x85:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFFE;
-  }
-  //RES 0, (HL)
-  //#0x86:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFE);
-  }
-  //RES 0, A
-  //#0x87:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xFE;
-  }
-  //RES 1, B
-  //#0x88:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xFD;
-  }
-  //RES 1, C
-  //#0x89:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xFD;
-  }
-  //RES 1, D
-  //#0x8A:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xFD;
-  }
-  //RES 1, E
-  //#0x8B:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xFD;
-  }
-  //RES 1, H
-  //#0x8C:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFDFF;
-  }
-  //RES 1, L
-  //#0x8D:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFFD;
-  }
-  //RES 1, (HL)
-  //#0x8E:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFD);
-  }
-  //RES 1, A
-  //#0x8F:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xFD;
-  }
-  //RES 2, B
-  //#0x90:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xFB;
-  }
-  //RES 2, C
-  //#0x91:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xFB;
-  }
-  //RES 2, D
-  //#0x92:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xFB;
-  }
-  //RES 2, E
-  //#0x93:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xFB;
-  }
-  //RES 2, H
-  //#0x94:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFBFF;
-  }
-  //RES 2, L
-  //#0x95:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFFB;
-  }
-  //RES 2, (HL)
-  //#0x96:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xFB);
-  }
-  //RES 2, A
-  //#0x97:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xFB;
-  }
-  //RES 3, B
-  //#0x98:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xF7;
-  }
-  //RES 3, C
-  //#0x99:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xF7;
-  }
-  //RES 3, D
-  //#0x9A:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xF7;
-  }
-  //RES 3, E
-  //#0x9B:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xF7;
-  }
-  //RES 3, H
-  //#0x9C:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xF7FF;
-  }
-  //RES 3, L
-  //#0x9D:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFF7;
-  }
-  //RES 3, (HL)
-  //#0x9E:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xF7);
-  }
-  //RES 3, A
-  //#0x9F:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xF7;
-  }
-  //RES 3, B
-  //#0xA0:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xEF;
-  }
-  //RES 4, C
-  //#0xA1:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xEF;
-  }
-  //RES 4, D
-  //#0xA2:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xEF;
-  }
-  //RES 4, E
-  //#0xA3:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xEF;
-  }
-  //RES 4, H
-  //#0xA4:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xEFFF;
-  }
-  //RES 4, L
-  //#0xA5:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFEF;
-  }
-  //RES 4, (HL)
-  //#0xA6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xEF);
-  }
-  //RES 4, A
-  //#0xA7:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xEF;
-  }
-  //RES 5, B
-  //#0xA8:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xDF;
-  }
-  //RES 5, C
-  //#0xA9:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xDF;
-  }
-  //RES 5, D
-  //#0xAA:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xDF;
-  }
-  //RES 5, E
-  //#0xAB:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xDF;
-  }
-  //RES 5, H
-  //#0xAC:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xDFFF;
-  }
-  //RES 5, L
-  //#0xAD:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFDF;
-  }
-  //RES 5, (HL)
-  //#0xAE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xDF);
-  }
-  //RES 5, A
-  //#0xAF:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xDF;
-  }
-  //RES 6, B
-  //#0xB0:
-  ,function (parentObj) {
-    parentObj.registerB &= 0xBF;
-  }
-  //RES 6, C
-  //#0xB1:
-  ,function (parentObj) {
-    parentObj.registerC &= 0xBF;
-  }
-  //RES 6, D
-  //#0xB2:
-  ,function (parentObj) {
-    parentObj.registerD &= 0xBF;
-  }
-  //RES 6, E
-  //#0xB3:
-  ,function (parentObj) {
-    parentObj.registerE &= 0xBF;
-  }
-  //RES 6, H
-  //#0xB4:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xBFFF;
-  }
-  //RES 6, L
-  //#0xB5:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFFBF;
-  }
-  //RES 6, (HL)
-  //#0xB6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0xBF);
-  }
-  //RES 6, A
-  //#0xB7:
-  ,function (parentObj) {
-    parentObj.registerA &= 0xBF;
-  }
-  //RES 7, B
-  //#0xB8:
-  ,function (parentObj) {
-    parentObj.registerB &= 0x7F;
-  }
-  //RES 7, C
-  //#0xB9:
-  ,function (parentObj) {
-    parentObj.registerC &= 0x7F;
-  }
-  //RES 7, D
-  //#0xBA:
-  ,function (parentObj) {
-    parentObj.registerD &= 0x7F;
-  }
-  //RES 7, E
-  //#0xBB:
-  ,function (parentObj) {
-    parentObj.registerE &= 0x7F;
-  }
-  //RES 7, H
-  //#0xBC:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0x7FFF;
-  }
-  //RES 7, L
-  //#0xBD:
-  ,function (parentObj) {
-    parentObj.registersHL &= 0xFF7F;
-  }
-  //RES 7, (HL)
-  //#0xBE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) & 0x7F);
-  }
-  //RES 7, A
-  //#0xBF:
-  ,function (parentObj) {
-    parentObj.registerA &= 0x7F;
-  }
-  //SET 0, B
-  //#0xC0:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x01;
-  }
-  //SET 0, C
-  //#0xC1:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x01;
-  }
-  //SET 0, D
-  //#0xC2:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x01;
-  }
-  //SET 0, E
-  //#0xC3:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x01;
-  }
-  //SET 0, H
-  //#0xC4:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x0100;
-  }
-  //SET 0, L
-  //#0xC5:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x01;
-  }
-  //SET 0, (HL)
-  //#0xC6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x01);
-  }
-  //SET 0, A
-  //#0xC7:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x01;
-  }
-  //SET 1, B
-  //#0xC8:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x02;
-  }
-  //SET 1, C
-  //#0xC9:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x02;
-  }
-  //SET 1, D
-  //#0xCA:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x02;
-  }
-  //SET 1, E
-  //#0xCB:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x02;
-  }
-  //SET 1, H
-  //#0xCC:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x0200;
-  }
-  //SET 1, L
-  //#0xCD:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x02;
-  }
-  //SET 1, (HL)
-  //#0xCE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x02);
-  }
-  //SET 1, A
-  //#0xCF:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x02;
-  }
-  //SET 2, B
-  //#0xD0:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x04;
-  }
-  //SET 2, C
-  //#0xD1:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x04;
-  }
-  //SET 2, D
-  //#0xD2:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x04;
-  }
-  //SET 2, E
-  //#0xD3:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x04;
-  }
-  //SET 2, H
-  //#0xD4:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x0400;
-  }
-  //SET 2, L
-  //#0xD5:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x04;
-  }
-  //SET 2, (HL)
-  //#0xD6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x04);
-  }
-  //SET 2, A
-  //#0xD7:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x04;
-  }
-  //SET 3, B
-  //#0xD8:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x08;
-  }
-  //SET 3, C
-  //#0xD9:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x08;
-  }
-  //SET 3, D
-  //#0xDA:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x08;
-  }
-  //SET 3, E
-  //#0xDB:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x08;
-  }
-  //SET 3, H
-  //#0xDC:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x0800;
-  }
-  //SET 3, L
-  //#0xDD:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x08;
-  }
-  //SET 3, (HL)
-  //#0xDE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x08);
-  }
-  //SET 3, A
-  //#0xDF:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x08;
-  }
-  //SET 4, B
-  //#0xE0:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x10;
-  }
-  //SET 4, C
-  //#0xE1:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x10;
-  }
-  //SET 4, D
-  //#0xE2:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x10;
-  }
-  //SET 4, E
-  //#0xE3:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x10;
-  }
-  //SET 4, H
-  //#0xE4:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x1000;
-  }
-  //SET 4, L
-  //#0xE5:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x10;
-  }
-  //SET 4, (HL)
-  //#0xE6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x10);
-  }
-  //SET 4, A
-  //#0xE7:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x10;
-  }
-  //SET 5, B
-  //#0xE8:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x20;
-  }
-  //SET 5, C
-  //#0xE9:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x20;
-  }
-  //SET 5, D
-  //#0xEA:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x20;
-  }
-  //SET 5, E
-  //#0xEB:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x20;
-  }
-  //SET 5, H
-  //#0xEC:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x2000;
-  }
-  //SET 5, L
-  //#0xED:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x20;
-  }
-  //SET 5, (HL)
-  //#0xEE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x20);
-  }
-  //SET 5, A
-  //#0xEF:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x20;
-  }
-  //SET 6, B
-  //#0xF0:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x40;
-  }
-  //SET 6, C
-  //#0xF1:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x40;
-  }
-  //SET 6, D
-  //#0xF2:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x40;
-  }
-  //SET 6, E
-  //#0xF3:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x40;
-  }
-  //SET 6, H
-  //#0xF4:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x4000;
-  }
-  //SET 6, L
-  //#0xF5:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x40;
-  }
-  //SET 6, (HL)
-  //#0xF6:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x40);
-  }
-  //SET 6, A
-  //#0xF7:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x40;
-  }
-  //SET 7, B
-  //#0xF8:
-  ,function (parentObj) {
-    parentObj.registerB |= 0x80;
-  }
-  //SET 7, C
-  //#0xF9:
-  ,function (parentObj) {
-    parentObj.registerC |= 0x80;
-  }
-  //SET 7, D
-  //#0xFA:
-  ,function (parentObj) {
-    parentObj.registerD |= 0x80;
-  }
-  //SET 7, E
-  //#0xFB:
-  ,function (parentObj) {
-    parentObj.registerE |= 0x80;
-  }
-  //SET 7, H
-  //#0xFC:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x8000;
-  }
-  //SET 7, L
-  //#0xFD:
-  ,function (parentObj) {
-    parentObj.registersHL |= 0x80;
-  }
-  //SET 7, (HL)
-  //#0xFE:
-  ,function (parentObj) {
-    parentObj.memoryWriter[parentObj.registersHL](parentObj, parentObj.registersHL, parentObj.memoryReader[parentObj.registersHL](parentObj, parentObj.registersHL) | 0x80);
-  }
-  //SET 7, A
-  //#0xFF:
-  ,function (parentObj) {
-    parentObj.registerA |= 0x80;
-  }
-];
-GameBoyCore.prototype.TICKTable = [    //Number of machine cycles for each instruction:
-/*   0,  1,  2,  3,  4,  5,  6,  7,      8,  9,  A, B,  C,  D, E,  F*/
-     4, 12,  8,  8,  4,  4,  8,  4,     20,  8,  8, 8,  4,  4, 8,  4,  //0
-     4, 12,  8,  8,  4,  4,  8,  4,     12,  8,  8, 8,  4,  4, 8,  4,  //1
-     8, 12,  8,  8,  4,  4,  8,  4,      8,  8,  8, 8,  4,  4, 8,  4,  //2
-     8, 12,  8,  8, 12, 12, 12,  4,      8,  8,  8, 8,  4,  4, 8,  4,  //3
-
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //4
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //5
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //6
-     8,  8,  8,  8,  8,  8,  4,  8,      4,  4,  4, 4,  4,  4, 8,  4,  //7
-
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //8
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //9
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //A
-     4,  4,  4,  4,  4,  4,  8,  4,      4,  4,  4, 4,  4,  4, 8,  4,  //B
-
-     8, 12, 12, 16, 12, 16,  8, 16,      8, 16, 12, 0, 12, 24, 8, 16,  //C
-     8, 12, 12,  4, 12, 16,  8, 16,      8, 16, 12, 4, 12,  4, 8, 16,  //D
-    12, 12,  8,  4,  4, 16,  8, 16,     16,  4, 16, 4,  4,  4, 8, 16,  //E
-    12, 12,  8,  4,  4, 16,  8, 16,     12,  8, 16, 4,  0,  4, 8, 16   //F
-];
-GameBoyCore.prototype.SecondaryTICKTable = [  //Number of machine cycles for each 0xCBXX instruction:
-/*  0, 1, 2, 3, 4, 5,  6, 7,        8, 9, A, B, C, D,  E, F*/
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //0
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //1
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //2
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //3
-
-    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //4
-    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //5
-    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //6
-    8, 8, 8, 8, 8, 8, 12, 8,        8, 8, 8, 8, 8, 8, 12, 8,  //7
-
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //8
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //9
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //A
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //B
-
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //C
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //D
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8,  //E
-    8, 8, 8, 8, 8, 8, 16, 8,        8, 8, 8, 8, 8, 8, 16, 8   //F
-];
-GameBoyCore.prototype.saveSRAMState = function () {
-  if (!this.cBATT || this.MBCRam.length == 0) {
-    //No battery backup...
-    return [];
-  }
-  else {
-    //Return the MBC RAM for backup...
-    return this.fromTypedArray(this.MBCRam);
-  }
-}
-GameBoyCore.prototype.saveRTCState = function () {
-  if (!this.cTIMER) {
-    //No battery backup...
-    return [];
-  }
-  else {
-    //Return the MBC RAM for backup...
-    return [
-      this.lastIteration,
-      this.RTCisLatched,
-      this.latchedSeconds,
-      this.latchedMinutes,
-      this.latchedHours,
-      this.latchedLDays,
-      this.latchedHDays,
-      this.RTCSeconds,
-      this.RTCMinutes,
-      this.RTCHours,
-      this.RTCDays,
-      this.RTCDayOverFlow,
-      this.RTCHALT
-    ];
-  }
-}
-GameBoyCore.prototype.saveState = function () {
-  return [
-    this.fromTypedArray(this.ROM),
-    this.inBootstrap,
-    this.registerA,
-    this.FZero,
-    this.FSubtract,
-    this.FHalfCarry,
-    this.FCarry,
-    this.registerB,
-    this.registerC,
-    this.registerD,
-    this.registerE,
-    this.registersHL,
-    this.stackPointer,
-    this.programCounter,
-    this.halt,
-    this.IME,
-    this.hdmaRunning,
-    this.CPUTicks,
-    this.doubleSpeedShifter,
-    this.fromTypedArray(this.memory),
-    this.fromTypedArray(this.MBCRam),
-    this.fromTypedArray(this.VRAM),
-    this.currVRAMBank,
-    this.fromTypedArray(this.GBCMemory),
-    this.MBC1Mode,
-    this.MBCRAMBanksEnabled,
-    this.currMBCRAMBank,
-    this.currMBCRAMBankPosition,
-    this.cGBC,
-    this.gbcRamBank,
-    this.gbcRamBankPosition,
-    this.ROMBank1offs,
-    this.currentROMBank,
-    this.cartridgeType,
-    this.name,
-    this.gameCode,
-    this.modeSTAT,
-    this.LYCMatchTriggerSTAT,
-    this.mode2TriggerSTAT,
-    this.mode1TriggerSTAT,
-    this.mode0TriggerSTAT,
-    this.LCDisOn,
-    this.gfxWindowCHRBankPosition,
-    this.gfxWindowDisplay,
-    this.gfxSpriteShow,
-    this.gfxSpriteNormalHeight,
-    this.gfxBackgroundCHRBankPosition,
-    this.gfxBackgroundBankOffset,
-    this.TIMAEnabled,
-    this.DIVTicks,
-    this.LCDTicks,
-    this.timerTicks,
-    this.TACClocker,
-    this.serialTimer,
-    this.serialShiftTimer,
-    this.serialShiftTimerAllocated,
-    this.IRQEnableDelay,
-    this.lastIteration,
-    this.cMBC1,
-    this.cMBC2,
-    this.cMBC3,
-    this.cMBC5,
-    this.cMBC7,
-    this.cSRAM,
-    this.cMMMO1,
-    this.cRUMBLE,
-    this.cCamera,
-    this.cTAMA5,
-    this.cHuC3,
-    this.cHuC1,
-    this.drewBlank,
-    this.fromTypedArray(this.frameBuffer),
-    this.bgEnabled,
-    this.BGPriorityEnabled,
-    this.channel1FrequencyTracker,
-    this.channel1FrequencyCounter,
-    this.channel1totalLength,
-    this.channel1envelopeVolume,
-    this.channel1envelopeType,
-    this.channel1envelopeSweeps,
-    this.channel1envelopeSweepsLast,
-    this.channel1consecutive,
-    this.channel1frequency,
-    this.channel1SweepFault,
-    this.channel1ShadowFrequency,
-    this.channel1timeSweep,
-    this.channel1lastTimeSweep,
-    this.channel1numSweep,
-    this.channel1frequencySweepDivider,
-    this.channel1decreaseSweep,
-    this.channel2FrequencyTracker,
-    this.channel2FrequencyCounter,
-    this.channel2totalLength,
-    this.channel2envelopeVolume,
-    this.channel2envelopeType,
-    this.channel2envelopeSweeps,
-    this.channel2envelopeSweepsLast,
-    this.channel2consecutive,
-    this.channel2frequency,
-    this.channel3canPlay,
-    this.channel3totalLength,
-    this.channel3patternType,
-    this.channel3frequency,
-    this.channel3consecutive,
-    this.fromTypedArray(this.channel3PCM),
-    this.channel4FrequencyPeriod,
-    this.channel4lastSampleLookup,
-    this.channel4totalLength,
-    this.channel4envelopeVolume,
-    this.channel4currentVolume,
-    this.channel4envelopeType,
-    this.channel4envelopeSweeps,
-    this.channel4envelopeSweepsLast,
-    this.channel4consecutive,
-    this.channel4BitRange,
-    this.soundMasterEnabled,
-    this.VinLeftChannelMasterVolume,
-    this.VinRightChannelMasterVolume,
-    this.leftChannel1,
-    this.leftChannel2,
-    this.leftChannel3,
-    this.leftChannel4,
-    this.rightChannel1,
-    this.rightChannel2,
-    this.rightChannel3,
-    this.rightChannel4,
-    this.channel1currentSampleLeft,
-    this.channel1currentSampleRight,
-    this.channel2currentSampleLeft,
-    this.channel2currentSampleRight,
-    this.channel3currentSampleLeft,
-    this.channel3currentSampleRight,
-    this.channel4currentSampleLeft,
-    this.channel4currentSampleRight,
-    this.channel1currentSampleLeftSecondary,
-    this.channel1currentSampleRightSecondary,
-    this.channel2currentSampleLeftSecondary,
-    this.channel2currentSampleRightSecondary,
-    this.channel3currentSampleLeftSecondary,
-    this.channel3currentSampleRightSecondary,
-    this.channel4currentSampleLeftSecondary,
-    this.channel4currentSampleRightSecondary,
-    this.channel1currentSampleLeftTrimary,
-    this.channel1currentSampleRightTrimary,
-    this.channel2currentSampleLeftTrimary,
-    this.channel2currentSampleRightTrimary,
-    this.mixerOutputCache,
-    this.channel1DutyTracker,
-    this.channel1CachedDuty,
-    this.channel2DutyTracker,
-    this.channel2CachedDuty,
-    this.channel1Enabled,
-    this.channel2Enabled,
-    this.channel3Enabled,
-    this.channel4Enabled,
-    this.sequencerClocks,
-    this.sequencePosition,
-    this.channel3Counter,
-    this.channel4Counter,
-    this.cachedChannel3Sample,
-    this.cachedChannel4Sample,
-    this.channel3FrequencyPeriod,
-    this.channel3lastSampleLookup,
-    this.actualScanLine,
-    this.lastUnrenderedLine,
-    this.queuedScanLines,
-    this.RTCisLatched,
-    this.latchedSeconds,
-    this.latchedMinutes,
-    this.latchedHours,
-    this.latchedLDays,
-    this.latchedHDays,
-    this.RTCSeconds,
-    this.RTCMinutes,
-    this.RTCHours,
-    this.RTCDays,
-    this.RTCDayOverFlow,
-    this.RTCHALT,
-    this.usedBootROM,
-    this.skipPCIncrement,
-    this.STATTracker,
-    this.gbcRamBankPositionECHO,
-    this.numRAMBanks,
-    this.windowY,
-    this.windowX,
-    this.fromTypedArray(this.gbcOBJRawPalette),
-    this.fromTypedArray(this.gbcBGRawPalette),
-    this.fromTypedArray(this.gbOBJPalette),
-    this.fromTypedArray(this.gbBGPalette),
-    this.fromTypedArray(this.gbcOBJPalette),
-    this.fromTypedArray(this.gbcBGPalette),
-    this.fromTypedArray(this.gbBGColorizedPalette),
-    this.fromTypedArray(this.gbOBJColorizedPalette),
-    this.fromTypedArray(this.cachedBGPaletteConversion),
-    this.fromTypedArray(this.cachedOBJPaletteConversion),
-    this.fromTypedArray(this.BGCHRBank1),
-    this.fromTypedArray(this.BGCHRBank2),
-    this.haltPostClocks,
-    this.interruptsRequested,
-    this.interruptsEnabled,
-    this.remainingClocks,
-    this.colorizedGBPalettes,
-    this.backgroundY,
-    this.backgroundX,
-    this.CPUStopped
-  ];
-}
-GameBoyCore.prototype.returnFromState = function (returnedFrom) {
-  var index = 0;
-  var state = returnedFrom.slice(0);
-  this.ROM = this.toTypedArray(state[index++], "uint8");
-  this.ROMBankEdge = Math.floor(this.ROM.length / 0x4000);
-  this.inBootstrap = state[index++];
-  this.registerA = state[index++];
-  this.FZero = state[index++];
-  this.FSubtract = state[index++];
-  this.FHalfCarry = state[index++];
-  this.FCarry = state[index++];
-  this.registerB = state[index++];
-  this.registerC = state[index++];
-  this.registerD = state[index++];
-  this.registerE = state[index++];
-  this.registersHL = state[index++];
-  this.stackPointer = state[index++];
-  this.programCounter = state[index++];
-  this.halt = state[index++];
-  this.IME = state[index++];
-  this.hdmaRunning = state[index++];
-  this.CPUTicks = state[index++];
-  this.doubleSpeedShifter = state[index++];
-  this.memory = this.toTypedArray(state[index++], "uint8");
-  this.MBCRam = this.toTypedArray(state[index++], "uint8");
-  this.VRAM = this.toTypedArray(state[index++], "uint8");
-  this.currVRAMBank = state[index++];
-  this.GBCMemory = this.toTypedArray(state[index++], "uint8");
-  this.MBC1Mode = state[index++];
-  this.MBCRAMBanksEnabled = state[index++];
-  this.currMBCRAMBank = state[index++];
-  this.currMBCRAMBankPosition = state[index++];
-  this.cGBC = state[index++];
-  this.gbcRamBank = state[index++];
-  this.gbcRamBankPosition = state[index++];
-  this.ROMBank1offs = state[index++];
-  this.currentROMBank = state[index++];
-  this.cartridgeType = state[index++];
-  this.name = state[index++];
-  this.gameCode = state[index++];
-  this.modeSTAT = state[index++];
-  this.LYCMatchTriggerSTAT = state[index++];
-  this.mode2TriggerSTAT = state[index++];
-  this.mode1TriggerSTAT = state[index++];
-  this.mode0TriggerSTAT = state[index++];
-  this.LCDisOn = state[index++];
-  this.gfxWindowCHRBankPosition = state[index++];
-  this.gfxWindowDisplay = state[index++];
-  this.gfxSpriteShow = state[index++];
-  this.gfxSpriteNormalHeight = state[index++];
-  this.gfxBackgroundCHRBankPosition = state[index++];
-  this.gfxBackgroundBankOffset = state[index++];
-  this.TIMAEnabled = state[index++];
-  this.DIVTicks = state[index++];
-  this.LCDTicks = state[index++];
-  this.timerTicks = state[index++];
-  this.TACClocker = state[index++];
-  this.serialTimer = state[index++];
-  this.serialShiftTimer = state[index++];
-  this.serialShiftTimerAllocated = state[index++];
-  this.IRQEnableDelay = state[index++];
-  this.lastIteration = state[index++];
-  this.cMBC1 = state[index++];
-  this.cMBC2 = state[index++];
-  this.cMBC3 = state[index++];
-  this.cMBC5 = state[index++];
-  this.cMBC7 = state[index++];
-  this.cSRAM = state[index++];
-  this.cMMMO1 = state[index++];
-  this.cRUMBLE = state[index++];
-  this.cCamera = state[index++];
-  this.cTAMA5 = state[index++];
-  this.cHuC3 = state[index++];
-  this.cHuC1 = state[index++];
-  this.drewBlank = state[index++];
-  this.frameBuffer = this.toTypedArray(state[index++], "int32");
-  this.bgEnabled = state[index++];
-  this.BGPriorityEnabled = state[index++];
-  this.channel1FrequencyTracker = state[index++];
-  this.channel1FrequencyCounter = state[index++];
-  this.channel1totalLength = state[index++];
-  this.channel1envelopeVolume = state[index++];
-  this.channel1envelopeType = state[index++];
-  this.channel1envelopeSweeps = state[index++];
-  this.channel1envelopeSweepsLast = state[index++];
-  this.channel1consecutive = state[index++];
-  this.channel1frequency = state[index++];
-  this.channel1SweepFault = state[index++];
-  this.channel1ShadowFrequency = state[index++];
-  this.channel1timeSweep = state[index++];
-  this.channel1lastTimeSweep = state[index++];
-  this.channel1numSweep = state[index++];
-  this.channel1frequencySweepDivider = state[index++];
-  this.channel1decreaseSweep = state[index++];
-  this.channel2FrequencyTracker = state[index++];
-  this.channel2FrequencyCounter = state[index++];
-  this.channel2totalLength = state[index++];
-  this.channel2envelopeVolume = state[index++];
-  this.channel2envelopeType = state[index++];
-  this.channel2envelopeSweeps = state[index++];
-  this.channel2envelopeSweepsLast = state[index++];
-  this.channel2consecutive = state[index++];
-  this.channel2frequency = state[index++];
-  this.channel3canPlay = state[index++];
-  this.channel3totalLength = state[index++];
-  this.channel3patternType = state[index++];
-  this.channel3frequency = state[index++];
-  this.channel3consecutive = state[index++];
-  this.channel3PCM = this.toTypedArray(state[index++], "int8");
-  this.channel4FrequencyPeriod = state[index++];
-  this.channel4lastSampleLookup = state[index++];
-  this.channel4totalLength = state[index++];
-  this.channel4envelopeVolume = state[index++];
-  this.channel4currentVolume = state[index++];
-  this.channel4envelopeType = state[index++];
-  this.channel4envelopeSweeps = state[index++];
-  this.channel4envelopeSweepsLast = state[index++];
-  this.channel4consecutive = state[index++];
-  this.channel4BitRange = state[index++];
-  this.soundMasterEnabled = state[index++];
-  this.VinLeftChannelMasterVolume = state[index++];
-  this.VinRightChannelMasterVolume = state[index++];
-  this.leftChannel1 = state[index++];
-  this.leftChannel2 = state[index++];
-  this.leftChannel3 = state[index++];
-  this.leftChannel4 = state[index++];
-  this.rightChannel1 = state[index++];
-  this.rightChannel2 = state[index++];
-  this.rightChannel3 = state[index++];
-  this.rightChannel4 = state[index++];
-  this.channel1currentSampleLeft = state[index++];
-  this.channel1currentSampleRight = state[index++];
-  this.channel2currentSampleLeft = state[index++];
-  this.channel2currentSampleRight = state[index++];
-  this.channel3currentSampleLeft = state[index++];
-  this.channel3currentSampleRight = state[index++];
-  this.channel4currentSampleLeft = state[index++];
-  this.channel4currentSampleRight = state[index++];
-  this.channel1currentSampleLeftSecondary = state[index++];
-  this.channel1currentSampleRightSecondary = state[index++];
-  this.channel2currentSampleLeftSecondary = state[index++];
-  this.channel2currentSampleRightSecondary = state[index++];
-  this.channel3currentSampleLeftSecondary = state[index++];
-  this.channel3currentSampleRightSecondary = state[index++];
-  this.channel4currentSampleLeftSecondary = state[index++];
-  this.channel4currentSampleRightSecondary = state[index++];
-  this.channel1currentSampleLeftTrimary = state[index++];
-  this.channel1currentSampleRightTrimary = state[index++];
-  this.channel2currentSampleLeftTrimary = state[index++];
-  this.channel2currentSampleRightTrimary = state[index++];
-  this.mixerOutputCache = state[index++];
-  this.channel1DutyTracker = state[index++];
-  this.channel1CachedDuty = state[index++];
-  this.channel2DutyTracker = state[index++];
-  this.channel2CachedDuty = state[index++];
-  this.channel1Enabled = state[index++];
-  this.channel2Enabled = state[index++];
-  this.channel3Enabled = state[index++];
-  this.channel4Enabled = state[index++];
-  this.sequencerClocks = state[index++];
-  this.sequencePosition = state[index++];
-  this.channel3Counter = state[index++];
-  this.channel4Counter = state[index++];
-  this.cachedChannel3Sample = state[index++];
-  this.cachedChannel4Sample = state[index++];
-  this.channel3FrequencyPeriod = state[index++];
-  this.channel3lastSampleLookup = state[index++];
-  this.actualScanLine = state[index++];
-  this.lastUnrenderedLine = state[index++];
-  this.queuedScanLines = state[index++];
-  this.RTCisLatched = state[index++];
-  this.latchedSeconds = state[index++];
-  this.latchedMinutes = state[index++];
-  this.latchedHours = state[index++];
-  this.latchedLDays = state[index++];
-  this.latchedHDays = state[index++];
-  this.RTCSeconds = state[index++];
-  this.RTCMinutes = state[index++];
-  this.RTCHours = state[index++];
-  this.RTCDays = state[index++];
-  this.RTCDayOverFlow = state[index++];
-  this.RTCHALT = state[index++];
-  this.usedBootROM = state[index++];
-  this.skipPCIncrement = state[index++];
-  this.STATTracker = state[index++];
-  this.gbcRamBankPositionECHO = state[index++];
-  this.numRAMBanks = state[index++];
-  this.windowY = state[index++];
-  this.windowX = state[index++];
-  this.gbcOBJRawPalette = this.toTypedArray(state[index++], "uint8");
-  this.gbcBGRawPalette = this.toTypedArray(state[index++], "uint8");
-  this.gbOBJPalette = this.toTypedArray(state[index++], "int32");
-  this.gbBGPalette = this.toTypedArray(state[index++], "int32");
-  this.gbcOBJPalette = this.toTypedArray(state[index++], "int32");
-  this.gbcBGPalette = this.toTypedArray(state[index++], "int32");
-  this.gbBGColorizedPalette = this.toTypedArray(state[index++], "int32");
-  this.gbOBJColorizedPalette = this.toTypedArray(state[index++], "int32");
-  this.cachedBGPaletteConversion = this.toTypedArray(state[index++], "int32");
-  this.cachedOBJPaletteConversion = this.toTypedArray(state[index++], "int32");
-  this.BGCHRBank1 = this.toTypedArray(state[index++], "uint8");
-  this.BGCHRBank2 = this.toTypedArray(state[index++], "uint8");
-  this.haltPostClocks = state[index++];
-  this.interruptsRequested = state[index++];
-  this.interruptsEnabled = state[index++];
-  this.checkIRQMatching();
-  this.remainingClocks = state[index++];
-  this.colorizedGBPalettes = state[index++];
-  this.backgroundY = state[index++];
-  this.backgroundX = state[index++];
-  this.CPUStopped = state[index];
-  this.fromSaveState = true;
-  this.TICKTable = this.toTypedArray(this.TICKTable, "uint8");
-  this.SecondaryTICKTable = this.toTypedArray(this.SecondaryTICKTable, "uint8");
-  this.initializeReferencesFromSaveState();
-  this.memoryReadJumpCompile();
-  this.memoryWriteJumpCompile();
-  this.initLCD();
-  this.initSound();
-  this.noiseSampleTable = (this.channel4BitRange == 0x7FFF) ? this.LSFR15Table : this.LSFR7Table;
-  this.channel4VolumeShifter = (this.channel4BitRange == 0x7FFF) ? 15 : 7;
-}
-GameBoyCore.prototype.returnFromRTCState = function () {
-  if (typeof this.openRTC == "function" && this.cTIMER) {
-    var rtcData = this.openRTC(this.name);
-    var index = 0;
-    this.lastIteration = rtcData[index++];
-    this.RTCisLatched = rtcData[index++];
-    this.latchedSeconds = rtcData[index++];
-    this.latchedMinutes = rtcData[index++];
-    this.latchedHours = rtcData[index++];
-    this.latchedLDays = rtcData[index++];
-    this.latchedHDays = rtcData[index++];
-    this.RTCSeconds = rtcData[index++];
-    this.RTCMinutes = rtcData[index++];
-    this.RTCHours = rtcData[index++];
-    this.RTCDays = rtcData[index++];
-    this.RTCDayOverFlow = rtcData[index++];
-    this.RTCHALT = rtcData[index];
-  }
-}
-
-GameBoyCore.prototype.start = function () {
-  this.initMemory();  //Write the startup memory.
-  this.ROMLoad();    //Load the ROM into memory and get cartridge information from it.
-  this.initLCD();    //Initialize the graphics.
-  this.initSound();  //Sound object initialization.
-  this.run();      //Start the emulation.
-}
-GameBoyCore.prototype.initMemory = function () {
-  //Initialize the RAM:
-  this.memory = this.getTypedArray(0x10000, 0, "uint8");
-  this.frameBuffer = this.getTypedArray(23040, 0xF8F8F8, "int32");
-  this.BGCHRBank1 = this.getTypedArray(0x800, 0, "uint8");
-  this.TICKTable = this.toTypedArray(this.TICKTable, "uint8");
-  this.SecondaryTICKTable = this.toTypedArray(this.SecondaryTICKTable, "uint8");
-  this.channel3PCM = this.getTypedArray(0x20, 0, "int8");
-}
-GameBoyCore.prototype.generateCacheArray = function (tileAmount) {
-  var tileArray = [];
-  var tileNumber = 0;
-  while (tileNumber < tileAmount) {
-    tileArray[tileNumber++] = this.getTypedArray(64, 0, "uint8");
-  }
-  return tileArray;
-}
-GameBoyCore.prototype.initSkipBootstrap = function () {
-  //Fill in the boot ROM set register values
-  //Default values to the GB boot ROM values, then fill in the GBC boot ROM values after ROM loading
-  var index = 0xFF;
-  while (index >= 0) {
-    if (index >= 0x30 && index < 0x40) {
-      this.memoryWrite(0xFF00 | index, this.ffxxDump[index]);
-    }
-    else {
-      switch (index) {
-        case 0x00:
-        case 0x01:
-        case 0x02:
-        case 0x05:
-        case 0x07:
-        case 0x0F:
-        case 0xFF:
-          this.memoryWrite(0xFF00 | index, this.ffxxDump[index]);
-          break;
-        default:
-          this.memory[0xFF00 | index] = this.ffxxDump[index];
-      }
-    }
-    --index;
-  }
-  if (this.cGBC) {
-    this.memory[0xFF6C] = 0xFE;
-    this.memory[0xFF74] = 0xFE;
-  }
-  else {
-    this.memory[0xFF48] = 0xFF;
-    this.memory[0xFF49] = 0xFF;
-    this.memory[0xFF6C] = 0xFF;
-    this.memory[0xFF74] = 0xFF;
-  }
-  //Start as an unset device:
-  cout("Starting without the GBC boot ROM.", 0);
-  this.registerA = (this.cGBC) ? 0x11 : 0x1;
-  this.registerB = 0;
-  this.registerC = 0x13;
-  this.registerD = 0;
-  this.registerE = 0xD8;
-  this.FZero = true;
-  this.FSubtract = false;
-  this.FHalfCarry = true;
-  this.FCarry = true;
-  this.registersHL = 0x014D;
-  this.LCDCONTROL = this.LINECONTROL;
-  this.IME = false;
-  this.IRQLineMatched = 0;
-  this.interruptsRequested = 225;
-  this.interruptsEnabled = 0;
-  this.hdmaRunning = false;
-  this.CPUTicks = 12;
-  this.STATTracker = 0;
-  this.modeSTAT = 1;
-  this.spriteCount = 252;
-  this.LYCMatchTriggerSTAT = false;
-  this.mode2TriggerSTAT = false;
-  this.mode1TriggerSTAT = false;
-  this.mode0TriggerSTAT = false;
-  this.LCDisOn = true;
-  this.channel1FrequencyTracker = 0x2000;
-  this.channel1DutyTracker = 0;
-  this.channel1CachedDuty = this.dutyLookup[2];
-  this.channel1totalLength = 0;
-  this.channel1envelopeVolume = 0;
-  this.channel1envelopeType = false;
-  this.channel1envelopeSweeps = 0;
-  this.channel1envelopeSweepsLast = 0;
-  this.channel1consecutive = true;
-  this.channel1frequency = 1985;
-  this.channel1SweepFault = true;
-  this.channel1ShadowFrequency = 1985;
-  this.channel1timeSweep = 1;
-  this.channel1lastTimeSweep = 0;
-  this.channel1numSweep = 0;
-  this.channel1frequencySweepDivider = 0;
-  this.channel1decreaseSweep = false;
-  this.channel2FrequencyTracker = 0x2000;
-  this.channel2DutyTracker = 0;
-  this.channel2CachedDuty = this.dutyLookup[2];
-  this.channel2totalLength = 0;
-  this.channel2envelopeVolume = 0;
-  this.channel2envelopeType = false;
-  this.channel2envelopeSweeps = 0;
-  this.channel2envelopeSweepsLast = 0;
-  this.channel2consecutive = true;
-  this.channel2frequency = 0;
-  this.channel3canPlay = false;
-  this.channel3totalLength = 0;
-  this.channel3patternType = 4;
-  this.channel3frequency = 0;
-  this.channel3consecutive = true;
-  this.channel3Counter = 0x418;
-  this.channel4FrequencyPeriod = 8;
-  this.channel4totalLength = 0;
-  this.channel4envelopeVolume = 0;
-  this.channel4currentVolume = 0;
-  this.channel4envelopeType = false;
-  this.channel4envelopeSweeps = 0;
-  this.channel4envelopeSweepsLast = 0;
-  this.channel4consecutive = true;
-  this.channel4BitRange = 0x7FFF;
-  this.channel4VolumeShifter = 15;
-  this.channel1FrequencyCounter = 0x200;
-  this.channel2FrequencyCounter = 0x200;
-  this.channel3Counter = 0x800;
-  this.channel3FrequencyPeriod = 0x800;
-  this.channel3lastSampleLookup = 0;
-  this.channel4lastSampleLookup = 0;
-  this.VinLeftChannelMasterVolume = 1;
-  this.VinRightChannelMasterVolume = 1;
-  this.soundMasterEnabled = true;
-  this.leftChannel1 = true;
-  this.leftChannel2 = true;
-  this.leftChannel3 = true;
-  this.leftChannel4 = true;
-  this.rightChannel1 = true;
-  this.rightChannel2 = true;
-  this.rightChannel3 = false;
-  this.rightChannel4 = false;
-  this.DIVTicks = 27044;
-  this.LCDTicks = 160;
-  this.timerTicks = 0;
-  this.TIMAEnabled = false;
-  this.TACClocker = 1024;
-  this.serialTimer = 0;
-  this.serialShiftTimer = 0;
-  this.serialShiftTimerAllocated = 0;
-  this.IRQEnableDelay = 0;
-  this.actualScanLine = 144;
-  this.lastUnrenderedLine = 0;
-  this.gfxWindowDisplay = false;
-  this.gfxSpriteShow = false;
-  this.gfxSpriteNormalHeight = true;
-  this.bgEnabled = true;
-  this.BGPriorityEnabled = true;
-  this.gfxWindowCHRBankPosition = 0;
-  this.gfxBackgroundCHRBankPosition = 0;
-  this.gfxBackgroundBankOffset = 0;
-  this.windowY = 0;
-  this.windowX = 0;
-  this.drewBlank = 0;
-  this.midScanlineOffset = -1;
-  this.currentX = 0;
-}
-GameBoyCore.prototype.initBootstrap = function () {
-  //Start as an unset device:
-  cout("Starting the selected boot ROM.", 0);
-  this.programCounter = 0;
-  this.stackPointer = 0;
-  this.IME = false;
-  this.LCDTicks = 0;
-  this.DIVTicks = 0;
-  this.registerA = 0;
-  this.registerB = 0;
-  this.registerC = 0;
-  this.registerD = 0;
-  this.registerE = 0;
-  this.FZero = this.FSubtract = this.FHalfCarry = this.FCarry = false;
-  this.registersHL = 0;
-  this.leftChannel1 = false;
-  this.leftChannel2 = false;
-  this.leftChannel3 = false;
-  this.leftChannel4 = false;
-  this.rightChannel1 = false;
-  this.rightChannel2 = false;
-  this.rightChannel3 = false;
-  this.rightChannel4 = false;
-  this.channel2frequency = this.channel1frequency = 0;
-  this.channel4consecutive = this.channel2consecutive = this.channel1consecutive = false;
-  this.VinLeftChannelMasterVolume = 8;
-  this.VinRightChannelMasterVolume = 8;
-  this.memory[0xFF00] = 0xF;  //Set the joypad state.
-}
-GameBoyCore.prototype.ROMLoad = function () {
-  //Load the first two ROM banks (0x0000 - 0x7FFF) into regular gameboy memory:
-  this.ROM = [];
-  this.usedBootROM = settings[1];
-  var maxLength = this.ROMImage.length;
-  if (maxLength < 0x4000) {
-    throw(new Error("ROM image size too small."));
-  }
-  this.ROM = this.getTypedArray(maxLength, 0, "uint8");
-  var romIndex = 0;
-  if (this.usedBootROM) {
-    if (!settings[11]) {
-      //Patch in the GBC boot ROM into the memory map:
-      for (; romIndex < 0x100; ++romIndex) {
-        this.memory[romIndex] = this.GBCBOOTROM[romIndex];                      //Load in the GameBoy Color BOOT ROM.
-        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
-      }
-      for (; romIndex < 0x200; ++romIndex) {
-        this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
-      }
-      for (; romIndex < 0x900; ++romIndex) {
-        this.memory[romIndex] = this.GBCBOOTROM[romIndex - 0x100];                  //Load in the GameBoy Color BOOT ROM.
-        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
-      }
-      this.usedGBCBootROM = true;
-    }
-    else {
-      //Patch in the GBC boot ROM into the memory map:
-      for (; romIndex < 0x100; ++romIndex) {
-        this.memory[romIndex] = this.GBBOOTROM[romIndex];                      //Load in the GameBoy Color BOOT ROM.
-        this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);              //Decode the ROM binary for the switch out.
-      }
-    }
-    for (; romIndex < 0x4000; ++romIndex) {
-      this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
-    }
-  }
-  else {
-    //Don't load in the boot ROM:
-    for (; romIndex < 0x4000; ++romIndex) {
-      this.memory[romIndex] = this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);  //Load in the game ROM.
-    }
-  }
-  //Finish the decoding of the ROM binary:
-  for (; romIndex < maxLength; ++romIndex) {
-    this.ROM[romIndex] = (this.ROMImage.charCodeAt(romIndex) & 0xFF);
-  }
-  this.ROMBankEdge = Math.floor(this.ROM.length / 0x4000);
-  //Set up the emulator for the cartidge specifics:
-  this.interpretCartridge();
-  //Check for IRQ matching upon initialization:
-  this.checkIRQMatching();
-}
-GameBoyCore.prototype.getROMImage = function () {
-  //Return the binary version of the ROM image currently running:
-  if (this.ROMImage.length > 0) {
-    return this.ROMImage.length;
-  }
-  var length = this.ROM.length;
-  for (var index = 0; index < length; index++) {
-    this.ROMImage += String.fromCharCode(this.ROM[index]);
-  }
-  return this.ROMImage;
-}
-GameBoyCore.prototype.interpretCartridge = function () {
-  // ROM name
-  for (var index = 0x134; index < 0x13F; index++) {
-    if (this.ROMImage.charCodeAt(index) > 0) {
-      this.name += this.ROMImage[index];
-    }
-  }
-  // ROM game code (for newer games)
-  for (var index = 0x13F; index < 0x143; index++) {
-    if (this.ROMImage.charCodeAt(index) > 0) {
-      this.gameCode += this.ROMImage[index];
-    }
-  }
-  cout("Game Title: " + this.name + "[" + this.gameCode + "][" + this.ROMImage[0x143] + "]", 0);
-  cout("Game Code: " + this.gameCode, 0);
-  // Cartridge type
-  this.cartridgeType = this.ROM[0x147];
-  cout("Cartridge type #" + this.cartridgeType, 0);
-  //Map out ROM cartridge sub-types.
-  var MBCType = "";
-  switch (this.cartridgeType) {
-    case 0x00:
-      //ROM w/o bank switching
-      if (!settings[9]) {
-        MBCType = "ROM";
-        break;
-      }
-    case 0x01:
-      this.cMBC1 = true;
-      MBCType = "MBC1";
-      break;
-    case 0x02:
-      this.cMBC1 = true;
-      this.cSRAM = true;
-      MBCType = "MBC1 + SRAM";
-      break;
-    case 0x03:
-      this.cMBC1 = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "MBC1 + SRAM + BATT";
-      break;
-    case 0x05:
-      this.cMBC2 = true;
-      MBCType = "MBC2";
-      break;
-    case 0x06:
-      this.cMBC2 = true;
-      this.cBATT = true;
-      MBCType = "MBC2 + BATT";
-      break;
-    case 0x08:
-      this.cSRAM = true;
-      MBCType = "ROM + SRAM";
-      break;
-    case 0x09:
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "ROM + SRAM + BATT";
-      break;
-    case 0x0B:
-      this.cMMMO1 = true;
-      MBCType = "MMMO1";
-      break;
-    case 0x0C:
-      this.cMMMO1 = true;
-      this.cSRAM = true;
-      MBCType = "MMMO1 + SRAM";
-      break;
-    case 0x0D:
-      this.cMMMO1 = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "MMMO1 + SRAM + BATT";
-      break;
-    case 0x0F:
-      this.cMBC3 = true;
-      this.cTIMER = true;
-      this.cBATT = true;
-      MBCType = "MBC3 + TIMER + BATT";
-      break;
-    case 0x10:
-      this.cMBC3 = true;
-      this.cTIMER = true;
-      this.cBATT = true;
-      this.cSRAM = true;
-      MBCType = "MBC3 + TIMER + BATT + SRAM";
-      break;
-    case 0x11:
-      this.cMBC3 = true;
-      MBCType = "MBC3";
-      break;
-    case 0x12:
-      this.cMBC3 = true;
-      this.cSRAM = true;
-      MBCType = "MBC3 + SRAM";
-      break;
-    case 0x13:
-      this.cMBC3 = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "MBC3 + SRAM + BATT";
-      break;
-    case 0x19:
-      this.cMBC5 = true;
-      MBCType = "MBC5";
-      break;
-    case 0x1A:
-      this.cMBC5 = true;
-      this.cSRAM = true;
-      MBCType = "MBC5 + SRAM";
-      break;
-    case 0x1B:
-      this.cMBC5 = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "MBC5 + SRAM + BATT";
-      break;
-    case 0x1C:
-      this.cRUMBLE = true;
-      MBCType = "RUMBLE";
-      break;
-    case 0x1D:
-      this.cRUMBLE = true;
-      this.cSRAM = true;
-      MBCType = "RUMBLE + SRAM";
-      break;
-    case 0x1E:
-      this.cRUMBLE = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "RUMBLE + SRAM + BATT";
-      break;
-    case 0x1F:
-      this.cCamera = true;
-      MBCType = "GameBoy Camera";
-      break;
-    case 0x22:
-      this.cMBC7 = true;
-      this.cSRAM = true;
-      this.cBATT = true;
-      MBCType = "MBC7 + SRAM + BATT";
-      break;
-    case 0xFD:
-      this.cTAMA5 = true;
-      MBCType = "TAMA5";
-      break;
-    case 0xFE:
-      this.cHuC3 = true;
-      MBCType = "HuC3";
-      break;
-    case 0xFF:
-      this.cHuC1 = true;
-      MBCType = "HuC1";
-      break;
-    default:
-      MBCType = "Unknown";
-      cout("Cartridge type is unknown.", 2);
-      pause();
-  }
-  cout("Cartridge Type: " + MBCType + ".", 0);
-  // ROM and RAM banks
-  this.numROMBanks = this.ROMBanks[this.ROM[0x148]];
-  cout(this.numROMBanks + " ROM banks.", 0);
-  switch (this.RAMBanks[this.ROM[0x149]]) {
-    case 0:
-      cout("No RAM banking requested for allocation or MBC is of type 2.", 0);
-      break;
-    case 2:
-      cout("1 RAM bank requested for allocation.", 0);
-      break;
-    case 3:
-      cout("4 RAM banks requested for allocation.", 0);
-      break;
-    case 4:
-      cout("16 RAM banks requested for allocation.", 0);
-      break;
-    default:
-      cout("RAM bank amount requested is unknown, will use maximum allowed by specified MBC type.", 0);
-  }
-  //Check the GB/GBC mode byte:
-  if (!this.usedBootROM) {
-    switch (this.ROM[0x143]) {
-      case 0x00:  //Only GB mode
-        this.cGBC = false;
-        cout("Only GB mode detected.", 0);
-        break;
-      case 0x32:  //Exception to the GBC identifying code:
-        if (!settings[2] && this.name + this.gameCode + this.ROM[0x143] == "Game and Watch 50") {
-          this.cGBC = true;
-          cout("Created a boot exception for Game and Watch Gallery 2 (GBC ID byte is wrong on the cartridge).", 1);
-        }
-        else {
-          this.cGBC = false;
-        }
-        break;
-      case 0x80:  //Both GB + GBC modes
-        this.cGBC = !settings[2];
-        cout("GB and GBC mode detected.", 0);
-        break;
-      case 0xC0:  //Only GBC mode
-        this.cGBC = true;
-        cout("Only GBC mode detected.", 0);
-        break;
-      default:
-        this.cGBC = false;
-        cout("Unknown GameBoy game type code #" + this.ROM[0x143] + ", defaulting to GB mode (Old games don't have a type code).", 1);
-    }
-    this.inBootstrap = false;
-    this.setupRAM();  //CPU/(V)RAM initialization.
-    this.initSkipBootstrap();
-    this.initializeAudioStartState(); // Line added for benchmarking.
-  }
-  else {
-    this.cGBC = this.usedGBCBootROM;  //Allow the GBC boot ROM to run in GBC mode...
-    this.setupRAM();  //CPU/(V)RAM initialization.
-    this.initBootstrap();
-  }
-  this.initializeModeSpecificArrays();
-  //License Code Lookup:
-  var cOldLicense = this.ROM[0x14B];
-  var cNewLicense = (this.ROM[0x144] & 0xFF00) | (this.ROM[0x145] & 0xFF);
-  if (cOldLicense != 0x33) {
-    //Old Style License Header
-    cout("Old style license code: " + cOldLicense, 0);
-  }
-  else {
-    //New Style License Header
-    cout("New style license code: " + cNewLicense, 0);
-  }
-  this.ROMImage = "";  //Memory consumption reduction.
-}
-GameBoyCore.prototype.disableBootROM = function () {
-  //Remove any traces of the boot ROM from ROM memory.
-  for (var index = 0; index < 0x100; ++index) {
-    this.memory[index] = this.ROM[index];  //Replace the GameBoy or GameBoy Color boot ROM with the game ROM.
-  }
-  if (this.usedGBCBootROM) {
-    //Remove any traces of the boot ROM from ROM memory.
-    for (index = 0x200; index < 0x900; ++index) {
-      this.memory[index] = this.ROM[index];  //Replace the GameBoy Color boot ROM with the game ROM.
-    }
-    if (!this.cGBC) {
-      //Clean up the post-boot (GB mode only) state:
-      this.GBCtoGBModeAdjust();
-    }
-    else {
-      this.recompileBootIOWriteHandling();
-    }
-  }
-  else {
-    this.recompileBootIOWriteHandling();
-  }
-}
-GameBoyCore.prototype.initializeTiming = function () {
-  //Emulator Timing:
-  this.baseCPUCyclesPerIteration = 0x80000 / 0x7D * settings[6];
-  this.CPUCyclesTotalRoundoff = this.baseCPUCyclesPerIteration % 4;
-  this.CPUCyclesTotalBase = this.CPUCyclesTotal = (this.baseCPUCyclesPerIteration - this.CPUCyclesTotalRoundoff) | 0;
-  this.CPUCyclesTotalCurrent = 0;
-}
-GameBoyCore.prototype.setupRAM = function () {
-  //Setup the auxilliary/switchable RAM:
-  if (this.cMBC2) {
-    this.numRAMBanks = 1 / 16;
-  }
-  else if (this.cMBC1 || this.cRUMBLE || this.cMBC3 || this.cHuC3) {
-    this.numRAMBanks = 4;
-  }
-  else if (this.cMBC5) {
-    this.numRAMBanks = 16;
-  }
-  else if (this.cSRAM) {
-    this.numRAMBanks = 1;
-  }
-  if (this.numRAMBanks > 0) {
-    if (!this.MBCRAMUtilized()) {
-      //For ROM and unknown MBC cartridges using the external RAM:
-      this.MBCRAMBanksEnabled = true;
-    }
-    //Switched RAM Used
-    var MBCRam = (typeof this.openMBC == "function") ? this.openMBC(this.name) : [];
-    if (MBCRam.length > 0) {
-      //Flash the SRAM into memory:
-      this.MBCRam = this.toTypedArray(MBCRam, "uint8");
-    }
-    else {
-      this.MBCRam = this.getTypedArray(this.numRAMBanks * 0x2000, 0, "uint8");
-    }
-  }
-  cout("Actual bytes of MBC RAM allocated: " + (this.numRAMBanks * 0x2000), 0);
-  this.returnFromRTCState();
-  //Setup the RAM for GBC mode.
-  if (this.cGBC) {
-    this.VRAM = this.getTypedArray(0x2000, 0, "uint8");
-    this.GBCMemory = this.getTypedArray(0x7000, 0, "uint8");
-  }
-  this.memoryReadJumpCompile();
-  this.memoryWriteJumpCompile();
-}
-GameBoyCore.prototype.MBCRAMUtilized = function () {
-  return this.cMBC1 || this.cMBC2 || this.cMBC3 || this.cMBC5 || this.cMBC7 || this.cRUMBLE;
-}
-GameBoyCore.prototype.recomputeDimension = function () {
-  initNewCanvas();
-  //Cache some dimension info:
-  this.onscreenWidth = this.canvas.width;
-  this.onscreenHeight = this.canvas.height;
-  // The following line was modified for benchmarking:
-  if (GameBoyWindow && GameBoyWindow.mozRequestAnimationFrame) {
-    //Firefox slowness hack:
-    this.canvas.width = this.onscreenWidth = (!settings[12]) ? 160 : this.canvas.width;
-    this.canvas.height = this.onscreenHeight = (!settings[12]) ? 144 : this.canvas.height;
-  }
-  else {
-    this.onscreenWidth = this.canvas.width;
-    this.onscreenHeight = this.canvas.height;
-  }
-  this.offscreenWidth = (!settings[12]) ? 160 : this.canvas.width;
-  this.offscreenHeight = (!settings[12]) ? 144 : this.canvas.height;
-  this.offscreenRGBCount = this.offscreenWidth * this.offscreenHeight * 4;
-}
-GameBoyCore.prototype.initLCD = function () {
-  this.recomputeDimension();
-  if (this.offscreenRGBCount != 92160) {
-    //Only create the resizer handle if we need it:
-    this.compileResizeFrameBufferFunction();
-  }
-  else {
-    //Resizer not needed:
-    this.resizer = null;
-  }
-  try {
-    this.canvasOffscreen = new GameBoyCanvas();  // Line modified for benchmarking.
-    this.canvasOffscreen.width = this.offscreenWidth;
-    this.canvasOffscreen.height = this.offscreenHeight;
-    this.drawContextOffscreen = this.canvasOffscreen.getContext("2d");
-    this.drawContextOnscreen = this.canvas.getContext("2d");
-    //Get a CanvasPixelArray buffer:
-    try {
-      this.canvasBuffer = this.drawContextOffscreen.createImageData(this.offscreenWidth, this.offscreenHeight);
-    }
-    catch (error) {
-      cout("Falling back to the getImageData initialization (Error \"" + error.message + "\").", 1);
-      this.canvasBuffer = this.drawContextOffscreen.getImageData(0, 0, this.offscreenWidth, this.offscreenHeight);
-    }
-    var index = this.offscreenRGBCount;
-    while (index > 0) {
-      this.canvasBuffer.data[index -= 4] = 0xF8;
-      this.canvasBuffer.data[index + 1] = 0xF8;
-      this.canvasBuffer.data[index + 2] = 0xF8;
-      this.canvasBuffer.data[index + 3] = 0xFF;
-    }
-    this.graphicsBlit();
-    this.canvas.style.visibility = "visible";
-    if (this.swizzledFrame == null) {
-      this.swizzledFrame = this.getTypedArray(69120, 0xFF, "uint8");
-    }
-    //Test the draw system and browser vblank latching:
-    this.drewFrame = true;                    //Copy the latest graphics to buffer.
-    this.requestDraw();
-  }
-  catch (error) {
-    throw(new Error("HTML5 Canvas support required: " + error.message + "file: " + error.fileName + ", line: " + error.lineNumber));
-  }
-}
-GameBoyCore.prototype.graphicsBlit = function () {
-  if (this.offscreenWidth == this.onscreenWidth && this.offscreenHeight == this.onscreenHeight) {
-    this.drawContextOnscreen.putImageData(this.canvasBuffer, 0, 0);
-  }
-  else {
-    this.drawContextOffscreen.putImageData(this.canvasBuffer, 0, 0);
-    this.drawContextOnscreen.drawImage(this.canvasOffscreen, 0, 0, this.onscreenWidth, this.onscreenHeight);
-  }
-}
-GameBoyCore.prototype.JoyPadEvent = function (key, down) {
-  if (down) {
-    this.JoyPad &= 0xFF ^ (1 << key);
-    if (!this.cGBC && (!this.usedBootROM || !this.usedGBCBootROM)) {
-      this.interruptsRequested |= 0x10;  //A real GBC doesn't set this!
-      this.remainingClocks = 0;
-      this.checkIRQMatching();
-    }
-  }
-  else {
-    this.JoyPad |= (1 << key);
-  }
-  this.memory[0xFF00] = (this.memory[0xFF00] & 0x30) + ((((this.memory[0xFF00] & 0x20) == 0) ? (this.JoyPad >> 4) : 0xF) & (((this.memory[0xFF00] & 0x10) == 0) ? (this.JoyPad & 0xF) : 0xF));
-  this.CPUStopped = false;
-}
-GameBoyCore.prototype.GyroEvent = function (x, y) {
-  x *= -100;
-  x += 2047;
-  this.highX = x >> 8;
-  this.lowX = x & 0xFF;
-  y *= -100;
-  y += 2047;
-  this.highY = y >> 8;
-  this.lowY = y & 0xFF;
-}
-GameBoyCore.prototype.initSound = function () {
-  this.sampleSize = 0x400000 / 1000 * settings[6];
-  this.machineOut = settings[13];
-  if (settings[0]) {
-    try {
-      var parentObj = this;
-      this.audioHandle = new XAudioServer(2, 0x400000 / settings[13], 0, Math.max(this.sampleSize * settings[8] / settings[13], 8192) << 1, null, settings[14]);
-      this.initAudioBuffer();
-    }
-    catch (error) {
-      cout("Audio system cannot run: " + error.message, 2);
-      settings[0] = false;
-    }
-  }
-  else if (this.audioHandle) {
-    //Mute the audio output, as it has an immediate silencing effect:
-    try {
-      this.audioHandle.changeVolume(0);
-    }
-    catch (error) { }
-  }
-}
-GameBoyCore.prototype.changeVolume = function () {
-  if (settings[0] && this.audioHandle) {
-    try {
-      this.audioHandle.changeVolume(settings[14]);
-    }
-    catch (error) { }
-  }
-}
-GameBoyCore.prototype.initAudioBuffer = function () {
-  this.audioIndex = 0;
-  this.bufferContainAmount = Math.max(this.sampleSize * settings[7] / settings[13], 4096) << 1;
-  this.numSamplesTotal = (this.sampleSize - (this.sampleSize % settings[13])) | 0;
-  this.currentBuffer = this.getTypedArray(this.numSamplesTotal, 0xF0F0, "int32");
-  this.secondaryBuffer = this.getTypedArray((this.numSamplesTotal << 1) / settings[13], 0, "float32");
-}
-GameBoyCore.prototype.intializeWhiteNoise = function () {
-  //Noise Sample Tables:
-  var randomFactor = 1;
-  //15-bit LSFR Cache Generation:
-  this.LSFR15Table = this.getTypedArray(0x80000, 0, "int8");
-  var LSFR = 0x7FFF;  //Seed value has all its bits set.
-  var LSFRShifted = 0x3FFF;
-  for (var index = 0; index < 0x8000; ++index) {
-    //Normalize the last LSFR value for usage:
-    randomFactor = 1 - (LSFR & 1);  //Docs say it's the inverse.
-    //Cache the different volume level results:
-    this.LSFR15Table[0x08000 | index] = randomFactor;
-    this.LSFR15Table[0x10000 | index] = randomFactor * 0x2;
-    this.LSFR15Table[0x18000 | index] = randomFactor * 0x3;
-    this.LSFR15Table[0x20000 | index] = randomFactor * 0x4;
-    this.LSFR15Table[0x28000 | index] = randomFactor * 0x5;
-    this.LSFR15Table[0x30000 | index] = randomFactor * 0x6;
-    this.LSFR15Table[0x38000 | index] = randomFactor * 0x7;
-    this.LSFR15Table[0x40000 | index] = randomFactor * 0x8;
-    this.LSFR15Table[0x48000 | index] = randomFactor * 0x9;
-    this.LSFR15Table[0x50000 | index] = randomFactor * 0xA;
-    this.LSFR15Table[0x58000 | index] = randomFactor * 0xB;
-    this.LSFR15Table[0x60000 | index] = randomFactor * 0xC;
-    this.LSFR15Table[0x68000 | index] = randomFactor * 0xD;
-    this.LSFR15Table[0x70000 | index] = randomFactor * 0xE;
-    this.LSFR15Table[0x78000 | index] = randomFactor * 0xF;
-    //Recompute the LSFR algorithm:
-    LSFRShifted = LSFR >> 1;
-    LSFR = LSFRShifted | (((LSFRShifted ^ LSFR) & 0x1) << 14);
-  }
-  //7-bit LSFR Cache Generation:
-  this.LSFR7Table = this.getTypedArray(0x800, 0, "int8");
-  LSFR = 0x7F;  //Seed value has all its bits set.
-  for (index = 0; index < 0x80; ++index) {
-    //Normalize the last LSFR value for usage:
-    randomFactor = 1 - (LSFR & 1);  //Docs say it's the inverse.
-    //Cache the different volume level results:
-    this.LSFR7Table[0x080 | index] = randomFactor;
-    this.LSFR7Table[0x100 | index] = randomFactor * 0x2;
-    this.LSFR7Table[0x180 | index] = randomFactor * 0x3;
-    this.LSFR7Table[0x200 | index] = randomFactor * 0x4;
-    this.LSFR7Table[0x280 | index] = randomFactor * 0x5;
-    this.LSFR7Table[0x300 | index] = randomFactor * 0x6;
-    this.LSFR7Table[0x380 | index] = randomFactor * 0x7;
-    this.LSFR7Table[0x400 | index] = randomFactor * 0x8;
-    this.LSFR7Table[0x480 | index] = randomFactor * 0x9;
-    this.LSFR7Table[0x500 | index] = randomFactor * 0xA;
-    this.LSFR7Table[0x580 | index] = randomFactor * 0xB;
-    this.LSFR7Table[0x600 | index] = randomFactor * 0xC;
-    this.LSFR7Table[0x680 | index] = randomFactor * 0xD;
-    this.LSFR7Table[0x700 | index] = randomFactor * 0xE;
-    this.LSFR7Table[0x780 | index] = randomFactor * 0xF;
-    //Recompute the LSFR algorithm:
-    LSFRShifted = LSFR >> 1;
-    LSFR = LSFRShifted | (((LSFRShifted ^ LSFR) & 0x1) << 6);
-  }
-  if (!this.noiseSampleTable && this.memory.length == 0x10000) {
-    //If enabling audio for the first time after a game is already running, set up the internal table reference:
-    this.noiseSampleTable = ((this.memory[0xFF22] & 0x8) == 0x8) ? this.LSFR7Table : this.LSFR15Table;
-  }
-}
-GameBoyCore.prototype.audioUnderrunAdjustment = function () {
-  if (settings[0]) {
-    var underrunAmount = this.bufferContainAmount - this.audioHandle.remainingBuffer();
-    if (underrunAmount > 0) {
-      this.CPUCyclesTotalCurrent += (underrunAmount >> 1) * this.machineOut;
-      this.recalculateIterationClockLimit();
-    }
-  }
-}
-GameBoyCore.prototype.initializeAudioStartState = function () {
-  this.channel1FrequencyTracker = 0x2000;
-  this.channel1DutyTracker = 0;
-  this.channel1CachedDuty = this.dutyLookup[2];
-  this.channel1totalLength = 0;
-  this.channel1envelopeVolume = 0;
-  this.channel1envelopeType = false;
-  this.channel1envelopeSweeps = 0;
-  this.channel1envelopeSweepsLast = 0;
-  this.channel1consecutive = true;
-  this.channel1frequency = 0;
-  this.channel1SweepFault = false;
-  this.channel1ShadowFrequency = 0;
-  this.channel1timeSweep = 1;
-  this.channel1lastTimeSweep = 0;
-  this.channel1numSweep = 0;
-  this.channel1frequencySweepDivider = 0;
-  this.channel1decreaseSweep = false;
-  this.channel2FrequencyTracker = 0x2000;
-  this.channel2DutyTracker = 0;
-  this.channel2CachedDuty = this.dutyLookup[2];
-  this.channel2totalLength = 0;
-  this.channel2envelopeVolume = 0;
-  this.channel2envelopeType = false;
-  this.channel2envelopeSweeps = 0;
-  this.channel2envelopeSweepsLast = 0;
-  this.channel2consecutive = true;
-  this.channel2frequency = 0;
-  this.channel3canPlay = false;
-  this.channel3totalLength = 0;
-  this.channel3patternType = 4;
-  this.channel3frequency = 0;
-  this.channel3consecutive = true;
-  this.channel3Counter = 0x800;
-  this.channel4FrequencyPeriod = 8;
-  this.channel4totalLength = 0;
-  this.channel4envelopeVolume = 0;
-  this.channel4currentVolume = 0;
-  this.channel4envelopeType = false;
-  this.channel4envelopeSweeps = 0;
-  this.channel4envelopeSweepsLast = 0;
-  this.channel4consecutive = true;
-  this.channel4BitRange = 0x7FFF;
-  this.noiseSampleTable = this.LSFR15Table;
-  this.channel4VolumeShifter = 15;
-  this.channel1FrequencyCounter = 0x2000;
-  this.channel2FrequencyCounter = 0x2000;
-  this.channel3Counter = 0x800;
-  this.channel3FrequencyPeriod = 0x800;
-  this.channel3lastSampleLookup = 0;
-  this.channel4lastSampleLookup = 0;
-  this.VinLeftChannelMasterVolume = 8;
-  this.VinRightChannelMasterVolume = 8;
-  this.mixerOutputCache = 0;
-  this.sequencerClocks = 0x2000;
-  this.sequencePosition = 0;
-  this.channel4FrequencyPeriod = 8;
-  this.channel4Counter = 8;
-  this.cachedChannel3Sample = 0;
-  this.cachedChannel4Sample = 0;
-  this.channel1Enabled = false;
-  this.channel2Enabled = false;
-  this.channel3Enabled = false;
-  this.channel4Enabled = false;
-  this.channel1canPlay = false;
-  this.channel2canPlay = false;
-  this.channel4canPlay = false;
-  this.channel1OutputLevelCache();
-  this.channel2OutputLevelCache();
-  this.channel3OutputLevelCache();
-  this.channel4OutputLevelCache();
-}
-GameBoyCore.prototype.outputAudio = function () {
-  var sampleFactor = 0;
-  var dirtySample = 0;
-  var averageL = 0;
-  var averageR = 0;
-  var destinationPosition = 0;
-  var divisor1 = settings[13];
-  var divisor2 = divisor1 * 0xF0;
-  for (var sourcePosition = 0; sourcePosition < this.numSamplesTotal;) {
-    for (sampleFactor = averageL = averageR = 0; sampleFactor < divisor1; ++sampleFactor) {
-      dirtySample = this.currentBuffer[sourcePosition++];
-      averageL += dirtySample >> 9;
-      averageR += dirtySample & 0x1FF;
-    }
-    this.secondaryBuffer[destinationPosition++] = averageL / divisor2 - 1;
-    this.secondaryBuffer[destinationPosition++] = averageR / divisor2 - 1;
-  }
-  this.audioHandle.writeAudioNoCallback(this.secondaryBuffer);
-}
-//Below are the audio generation functions timed against the CPU:
-GameBoyCore.prototype.generateAudio = function (numSamples) {
-  if (this.soundMasterEnabled && !this.CPUStopped) {
-    for (var samplesToGenerate = 0; numSamples > 0;) {
-      samplesToGenerate = (numSamples < this.sequencerClocks) ? numSamples : this.sequencerClocks;
-      this.sequencerClocks -= samplesToGenerate;
-      numSamples -= samplesToGenerate;
-      while (--samplesToGenerate > -1) {
-        this.computeAudioChannels();
-        this.currentBuffer[this.audioIndex++] = this.mixerOutputCache;
-        if (this.audioIndex == this.numSamplesTotal) {
-          this.audioIndex = 0;
-          this.outputAudio();
-        }
-      }
-      if (this.sequencerClocks == 0) {
-        this.audioComputeSequencer();
-        this.sequencerClocks = 0x2000;
-      }
-    }
-  }
-  else {
-    //SILENT OUTPUT:
-    while (--numSamples > -1) {
-      this.currentBuffer[this.audioIndex++] = 0xF0F0;
-      if (this.audioIndex == this.numSamplesTotal) {
-        this.audioIndex = 0;
-        this.outputAudio();
-      }
-    }
-  }
-}
-//Generate audio, but don't actually output it (Used for when sound is disabled by user/browser):
-GameBoyCore.prototype.generateAudioFake = function (numSamples) {
-  if (this.soundMasterEnabled && !this.CPUStopped) {
-    while (--numSamples > -1) {
-      this.computeAudioChannels();
-      if (--this.sequencerClocks == 0) {
-        this.audioComputeSequencer();
-        this.sequencerClocks = 0x2000;
-      }
-    }
-  }
-}
-GameBoyCore.prototype.audioJIT = function () {
-  //Audio Sample Generation Timing:
-  if (settings[0]) {
-    this.generateAudio(this.audioTicks);
-  }
-  else {
-    this.generateAudioFake(this.audioTicks);
-  }
-  this.audioTicks = 0;
-}
-GameBoyCore.prototype.audioComputeSequencer = function () {
-  switch (this.sequencePosition++) {
-    case 0:
-      this.clockAudioLength();
-      break;
-    case 2:
-      this.clockAudioLength();
-      this.clockAudioSweep();
-      break;
-    case 4:
-      this.clockAudioLength();
-      break;
-    case 6:
-      this.clockAudioLength();
-      this.clockAudioSweep();
-      break;
-    case 7:
-      this.clockAudioEnvelope();
-      this.sequencePosition = 0;
-  }
-}
-GameBoyCore.prototype.clockAudioLength = function () {
-  //Channel 1:
-  if (this.channel1totalLength > 1) {
-    --this.channel1totalLength;
-  }
-  else if (this.channel1totalLength == 1) {
-    this.channel1totalLength = 0;
-    this.channel1EnableCheck();
-    this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
-  }
-  //Channel 2:
-  if (this.channel2totalLength > 1) {
-    --this.channel2totalLength;
-  }
-  else if (this.channel2totalLength == 1) {
-    this.channel2totalLength = 0;
-    this.channel2EnableCheck();
-    this.memory[0xFF26] &= 0xFD;  //Channel #2 On Flag Off
-  }
-  //Channel 3:
-  if (this.channel3totalLength > 1) {
-    --this.channel3totalLength;
-  }
-  else if (this.channel3totalLength == 1) {
-    this.channel3totalLength = 0;
-    this.channel3EnableCheck();
-    this.memory[0xFF26] &= 0xFB;  //Channel #3 On Flag Off
-  }
-  //Channel 4:
-  if (this.channel4totalLength > 1) {
-    --this.channel4totalLength;
-  }
-  else if (this.channel4totalLength == 1) {
-    this.channel4totalLength = 0;
-    this.channel4EnableCheck();
-    this.memory[0xFF26] &= 0xF7;  //Channel #4 On Flag Off
-  }
-}
-GameBoyCore.prototype.clockAudioSweep = function () {
-  //Channel 1:
-  if (!this.channel1SweepFault && this.channel1timeSweep > 0) {
-    if (--this.channel1timeSweep == 0) {
-      this.runAudioSweep();
-    }
-  }
-}
-GameBoyCore.prototype.runAudioSweep = function () {
-  //Channel 1:
-  if (this.channel1lastTimeSweep > 0) {
-    if (this.channel1frequencySweepDivider > 0) {
-      if (this.channel1numSweep > 0) {
-        --this.channel1numSweep;
-        if (this.channel1decreaseSweep) {
-          this.channel1ShadowFrequency -= this.channel1ShadowFrequency >> this.channel1frequencySweepDivider;
-          this.channel1frequency = this.channel1ShadowFrequency & 0x7FF;
-          this.channel1FrequencyTracker = (0x800 - this.channel1frequency) << 2;
-        }
-        else {
-          this.channel1ShadowFrequency += this.channel1ShadowFrequency >> this.channel1frequencySweepDivider;
-          this.channel1frequency = this.channel1ShadowFrequency;
-          if (this.channel1ShadowFrequency <= 0x7FF) {
-            this.channel1FrequencyTracker = (0x800 - this.channel1frequency) << 2;
-            //Run overflow check twice:
-            if ((this.channel1ShadowFrequency + (this.channel1ShadowFrequency >> this.channel1frequencySweepDivider)) > 0x7FF) {
-              this.channel1SweepFault = true;
-              this.channel1EnableCheck();
-              this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
-            }
-          }
-          else {
-            this.channel1frequency &= 0x7FF;
-            this.channel1SweepFault = true;
-            this.channel1EnableCheck();
-            this.memory[0xFF26] &= 0xFE;  //Channel #1 On Flag Off
-          }
-        }
-      }
-      this.channel1timeSweep = this.channel1lastTimeSweep;
-    }
-    else {
-      //Channel has sweep disabled and timer becomes a length counter:
-      this.channel1SweepFault = true;
-      this.channel1EnableCheck();
-    }
-  }
-}
-GameBoyCore.prototype.clockAudioEnvelope = function () {
-  //Channel 1:
-  if (this.channel1envelopeSweepsLast > -1) {
-    if (this.channel1envelopeSweeps > 0) {
-      --this.channel1envelopeSweeps;
-    }
-    else {
-      if (!this.channel1envelopeType) {
-        if (this.channel1envelopeVolume > 0) {
-          --this.channel1envelopeVolume;
-          this.channel1envelopeSweeps = this.channel1envelopeSweepsLast;
-          this.channel1OutputLevelCache();
-        }
-        else {
-          this.channel1envelopeSweepsLast = -1;
-        }
-      }
-      else if (this.channel1envelopeVolume < 0xF) {
-        ++this.channel1envelopeVolume;
-        this.channel1envelopeSweeps = this.channel1envelopeSweepsLast;
-        this.channel1OutputLevelCache();
-      }
-      else {
-        this.channel1envelopeSweepsLast = -1;
-      }
-    }
-  }
-  //Channel 2:
-  if (this.channel2envelopeSweepsLast > -1) {
-    if (this.channel2envelopeSweeps > 0) {
-      --this.channel2envelopeSweeps;
-    }
-    else {
-      if (!this.channel2envelopeType) {
-        if (this.channel2envelopeVolume > 0) {
-          --this.channel2envelopeVolume;
-          this.channel2envelopeSweeps = this.channel2envelopeSweepsLast;
-          this.channel2OutputLevelCache();
-        }
-        else {
-          this.channel2envelopeSweepsLast = -1;
-        }
-      }
-      else if (this.channel2envelopeVolume < 0xF) {
-        ++this.channel2envelopeVolume;
-        this.channel2envelopeSweeps = this.channel2envelopeSweepsLast;
-        this.channel2OutputLevelCache();
-      }
-      else {
-        this.channel2envelopeSweepsLast = -1;
-      }
-    }
-  }
-  //Channel 4:
-  if (this.channel4envelopeSweepsLast > -1) {
-    if (this.channel4envelopeSweeps > 0) {
-      --this.channel4envelopeSweeps;
-    }
-    else {
-      if (!this.channel4envelopeType) {
-        if (this.channel4envelopeVolume > 0) {
-          this.channel4currentVolume = --this.channel4envelopeVolume << this.channel4VolumeShifter;
-          this.channel4envelopeSweeps = this.channel4envelopeSweepsLast;
-          this.channel4UpdateCache();
-        }
-        else {
-          this.channel4envelopeSweepsLast = -1;
-        }
-      }
-      else if (this.channel4envelopeVolume < 0xF) {
-        this.channel4currentVolume = ++this.channel4envelopeVolume << this.channel4VolumeShifter;
-        this.channel4envelopeSweeps = this.channel4envelopeSweepsLast;
-        this.channel4UpdateCache();
-      }
-      else {
-        this.channel4envelopeSweepsLast = -1;
-      }
-    }
-  }
-}
-GameBoyCore.prototype.computeAudioChannels = function () {
-  //Channel 1 counter:
-  if (--this.channel1FrequencyCounter == 0) {
-    this.channel1FrequencyCounter = this.channel1FrequencyTracker;
-    this.channel1DutyTracker = (this.channel1DutyTracker + 1) & 0x7;
-    this.channel1OutputLevelTrimaryCache();
-  }
-  //Channel 2 counter:
-  if (--this.channel2FrequencyCounter == 0) {
-    this.channel2FrequencyCounter = this.channel2FrequencyTracker;
-    this.channel2DutyTracker = (this.channel2DutyTracker + 1) & 0x7;
-    this.channel2OutputLevelTrimaryCache();
-  }
-  //Channel 3 counter:
-  if (--this.channel3Counter == 0) {
-    if (this.channel3canPlay) {
-      this.channel3lastSampleLookup = (this.channel3lastSampleLookup + 1) & 0x1F;
-    }
-    this.channel3Counter = this.channel3FrequencyPeriod;
-    this.channel3UpdateCache();
-  }
-  //Channel 4 counter:
-  if (--this.channel4Counter == 0) {
-    this.channel4lastSampleLookup = (this.channel4lastSampleLookup + 1) & this.channel4BitRange;
-    this.channel4Counter = this.channel4FrequencyPeriod;
-    this.channel4UpdateCache();
-  }
-}
-GameBoyCore.prototype.channel1EnableCheck = function () {
-  this.channel1Enabled = ((this.channel1consecutive || this.channel1totalLength > 0) && !this.channel1SweepFault && this.channel1canPlay);
-  this.channel1OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel1VolumeEnableCheck = function () {
-  this.channel1canPlay = (this.memory[0xFF12] > 7);
-  this.channel1EnableCheck();
-  this.channel1OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel1OutputLevelCache = function () {
-  this.channel1currentSampleLeft = (this.leftChannel1) ? this.channel1envelopeVolume : 0;
-  this.channel1currentSampleRight = (this.rightChannel1) ? this.channel1envelopeVolume : 0;
-  this.channel1OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel1OutputLevelSecondaryCache = function () {
-  if (this.channel1Enabled) {
-    this.channel1currentSampleLeftSecondary = this.channel1currentSampleLeft;
-    this.channel1currentSampleRightSecondary = this.channel1currentSampleRight;
-  }
-  else {
-    this.channel1currentSampleLeftSecondary = 0;
-    this.channel1currentSampleRightSecondary = 0;
-  }
-  this.channel1OutputLevelTrimaryCache();
-}
-GameBoyCore.prototype.channel1OutputLevelTrimaryCache = function () {
-  if (this.channel1CachedDuty[this.channel1DutyTracker]) {
-    this.channel1currentSampleLeftTrimary = this.channel1currentSampleLeftSecondary;
-    this.channel1currentSampleRightTrimary = this.channel1currentSampleRightSecondary;
-  }
-  else {
-    this.channel1currentSampleLeftTrimary = 0;
-    this.channel1currentSampleRightTrimary = 0;
-  }
-  this.mixerOutputLevelCache();
-}
-GameBoyCore.prototype.channel2EnableCheck = function () {
-  this.channel2Enabled = ((this.channel2consecutive || this.channel2totalLength > 0) && this.channel2canPlay);
-  this.channel2OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel2VolumeEnableCheck = function () {
-  this.channel2canPlay = (this.memory[0xFF17] > 7);
-  this.channel2EnableCheck();
-  this.channel2OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel2OutputLevelCache = function () {
-  this.channel2currentSampleLeft = (this.leftChannel2) ? this.channel2envelopeVolume : 0;
-  this.channel2currentSampleRight = (this.rightChannel2) ? this.channel2envelopeVolume : 0;
-  this.channel2OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel2OutputLevelSecondaryCache = function () {
-  if (this.channel2Enabled) {
-    this.channel2currentSampleLeftSecondary = this.channel2currentSampleLeft;
-    this.channel2currentSampleRightSecondary = this.channel2currentSampleRight;
-  }
-  else {
-    this.channel2currentSampleLeftSecondary = 0;
-    this.channel2currentSampleRightSecondary = 0;
-  }
-  this.channel2OutputLevelTrimaryCache();
-}
-GameBoyCore.prototype.channel2OutputLevelTrimaryCache = function () {
-  if (this.channel2CachedDuty[this.channel2DutyTracker]) {
-    this.channel2currentSampleLeftTrimary = this.channel2currentSampleLeftSecondary;
-    this.channel2currentSampleRightTrimary = this.channel2currentSampleRightSecondary;
-  }
-  else {
-    this.channel2currentSampleLeftTrimary = 0;
-    this.channel2currentSampleRightTrimary = 0;
-  }
-  this.mixerOutputLevelCache();
-}
-GameBoyCore.prototype.channel3EnableCheck = function () {
-  this.channel3Enabled = (/*this.channel3canPlay && */(this.channel3consecutive || this.channel3totalLength > 0));
-  this.channel3OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel3OutputLevelCache = function () {
-  this.channel3currentSampleLeft = (this.leftChannel3) ? this.cachedChannel3Sample : 0;
-  this.channel3currentSampleRight = (this.rightChannel3) ? this.cachedChannel3Sample : 0;
-  this.channel3OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel3OutputLevelSecondaryCache = function () {
-  if (this.channel3Enabled) {
-    this.channel3currentSampleLeftSecondary = this.channel3currentSampleLeft;
-    this.channel3currentSampleRightSecondary = this.channel3currentSampleRight;
-  }
-  else {
-    this.channel3currentSampleLeftSecondary = 0;
-    this.channel3currentSampleRightSecondary = 0;
-  }
-  this.mixerOutputLevelCache();
-}
-GameBoyCore.prototype.channel4EnableCheck = function () {
-  this.channel4Enabled = ((this.channel4consecutive || this.channel4totalLength > 0) && this.channel4canPlay);
-  this.channel4OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel4VolumeEnableCheck = function () {
-  this.channel4canPlay = (this.memory[0xFF21] > 7);
-  this.channel4EnableCheck();
-  this.channel4OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel4OutputLevelCache = function () {
-  this.channel4currentSampleLeft = (this.leftChannel4) ? this.cachedChannel4Sample : 0;
-  this.channel4currentSampleRight = (this.rightChannel4) ? this.cachedChannel4Sample : 0;
-  this.channel4OutputLevelSecondaryCache();
-}
-GameBoyCore.prototype.channel4OutputLevelSecondaryCache = function () {
-  if (this.channel4Enabled) {
-    this.channel4currentSampleLeftSecondary = this.channel4currentSampleLeft;
-    this.channel4currentSampleRightSecondary = this.channel4currentSampleRight;
-  }
-  else {
-    this.channel4currentSampleLeftSecondary = 0;
-    this.channel4currentSampleRightSecondary = 0;
-  }
-  this.mixerOutputLevelCache();
-}
-GameBoyCore.prototype.mixerOutputLevelCache = function () {
-  this.mixerOutputCache = ((((this.channel1currentSampleLeftTrimary + this.channel2currentSampleLeftTrimary + this.channel3currentSampleLeftSecondary + this.channel4currentSampleLeftSecondary) * this.VinLeftChannelMasterVolume) << 9) +
-  ((this.channel1currentSampleRightTrimary + this.channel2currentSampleRightTrimary + this.channel3currentSampleRightSecondary + this.channel4currentSampleRightSecondary) * this.VinRightChannelMasterVolume));
-}
-GameBoyCore.prototype.channel3UpdateCache = function () {
-  this.cachedChannel3Sample = this.channel3PCM[this.channel3lastSampleLookup] >> this.channel3patternType;
-  this.channel3OutputLevelCache();
-}
-GameBoyCore.prototype.channel3WriteRAM = function (address, data) {
-  if (this.channel3canPlay) {
-    this.audioJIT();
-    //address = this.channel3lastSampleLookup >> 1;
-  }
-  this.memory[0xFF30 | address] = data;
-  address <<= 1;
-  this.channel3PCM[address] = data >> 4;
-  this.channel3PCM[address | 1] = data & 0xF;
-}
-GameBoyCore.prototype.channel4UpdateCache = function () {
-  this.cachedChannel4Sample = this.noiseSampleTable[this.channel4currentVolume | this.channel4lastSampleLookup];
-  this.channel4OutputLevelCache();
-}
-GameBoyCore.prototype.run = function () {
-  //The preprocessing before the actual iteration loop:
-  if ((this.stopEmulator & 2) == 0) {
-    if ((this.stopEmulator & 1) == 1) {
-      if (!this.CPUStopped) {
-        this.stopEmulator = 0;
-        this.drewFrame = false;
-        this.audioUnderrunAdjustment();
-        this.clockUpdate();      //RTC clocking.
-        if (!this.halt) {
-          this.executeIteration();
-        }
-        else {            //Finish the HALT rundown execution.
-          this.CPUTicks = 0;
-          this.calculateHALTPeriod();
-          if (this.halt) {
-            this.updateCoreFull();
-          }
-          else {
-            this.executeIteration();
-          }
-        }
-        //Request the graphics target to be updated:
-        this.requestDraw();
-      }
-      else {
-        this.audioUnderrunAdjustment();
-        this.audioTicks += this.CPUCyclesTotal;
-        this.audioJIT();
-        this.stopEmulator |= 1;      //End current loop.
-      }
-    }
-    else {    //We can only get here if there was an internal error, but the loop was restarted.
-      cout("Iterator restarted a faulted core.", 2);
-      pause();
-    }
-  }
-}
-
-GameBoyCore.prototype.executeIteration = function () {
-  //Iterate the interpreter loop:
-  var opcodeToExecute = 0;
-  var timedTicks = 0;
-  while (this.stopEmulator == 0) {
-    //Interrupt Arming:
-    switch (this.IRQEnableDelay) {
-      case 1:
-        this.IME = true;
-        this.checkIRQMatching();
-      case 2:
-        --this.IRQEnableDelay;
-    }
-    //Is an IRQ set to fire?:
-    if (this.IRQLineMatched > 0) {
-      //IME is true and and interrupt was matched:
-      this.launchIRQ();
-    }
-    //Fetch the current opcode:
-    opcodeToExecute = this.memoryReader[this.programCounter](this, this.programCounter);
-    //Increment the program counter to the next instruction:
-    this.programCounter = (this.programCounter + 1) & 0xFFFF;
-    //Check for the program counter quirk:
-    if (this.skipPCIncrement) {
-      this.programCounter = (this.programCounter - 1) & 0xFFFF;
-      this.skipPCIncrement = false;
-    }
-    //Get how many CPU cycles the current instruction counts for:
-    this.CPUTicks = this.TICKTable[opcodeToExecute];
-    //Execute the current instruction:
-    this.OPCODE[opcodeToExecute](this);
-    //Update the state (Inlined updateCoreFull manually here):
-    //Update the clocking for the LCD emulation:
-    this.LCDTicks += this.CPUTicks >> this.doubleSpeedShifter;  //LCD Timing
-    this.LCDCONTROL[this.actualScanLine](this);          //Scan Line and STAT Mode Control
-    //Single-speed relative timing for A/V emulation:
-    timedTicks = this.CPUTicks >> this.doubleSpeedShifter;    //CPU clocking can be updated from the LCD handling.
-    this.audioTicks += timedTicks;                //Audio Timing
-    this.emulatorTicks += timedTicks;              //Emulator Timing
-    //CPU Timers:
-    this.DIVTicks += this.CPUTicks;                //DIV Timing
-    if (this.TIMAEnabled) {                    //TIMA Timing
-      this.timerTicks += this.CPUTicks;
-      while (this.timerTicks >= this.TACClocker) {
-        this.timerTicks -= this.TACClocker;
-        if (++this.memory[0xFF05] == 0x100) {
-          this.memory[0xFF05] = this.memory[0xFF06];
-          this.interruptsRequested |= 0x4;
-          this.checkIRQMatching();
-        }
-      }
-    }
-    if (this.serialTimer > 0) {                    //Serial Timing
-      //IRQ Counter:
-      this.serialTimer -= this.CPUTicks;
-      if (this.serialTimer <= 0) {
-        this.interruptsRequested |= 0x8;
-        this.checkIRQMatching();
-      }
-      //Bit Shit Counter:
-      this.serialShiftTimer -= this.CPUTicks;
-      if (this.serialShiftTimer <= 0) {
-        this.serialShiftTimer = this.serialShiftTimerAllocated;
-        this.memory[0xFF01] = ((this.memory[0xFF01] << 1) & 0xFE) | 0x01;  //We could shift in actual link data here if we were to implement such!!!
-      }
-    }
-    //End of iteration routine:
-    if (this.emulatorTicks >= this.CPUCyclesTotal) {
-      this.iterationEndRoutine();
-    }
-    // Start of code added for benchmarking:
-    this.instructions += 1;
-    if (this.instructions > this.totalInstructions) {
-      this.iterationEndRoutine();
-      this.stopEmulator |= 2;
-      checkFinalState();
-    }
-    // End of code added for benchmarking.
-  }
-}
-GameBoyCore.prototype.iterationEndRoutine = function () {
-  if ((this.stopEmulator & 0x1) == 0) {
-    this.audioJIT();  //Make sure we at least output once per iteration.
-    //Update DIV Alignment (Integer overflow safety):
-    this.memory[0xFF04] = (this.memory[0xFF04] + (this.DIVTicks >> 8)) & 0xFF;
-    this.DIVTicks &= 0xFF;
-    //Update emulator flags:
-    this.stopEmulator |= 1;      //End current loop.
-    this.emulatorTicks -= this.CPUCyclesTotal;
-    this.CPUCyclesTotalCurrent += this.CPUCyclesTotalRoundoff;
-    this.recalculateIterationClockLimit();
-  }
-}
-GameBoyCore.prototype.handleSTOP = function () {
-  this.CPUStopped = true;            //Stop CPU until joypad input changes.
-  this.iterationEndRoutine();
-  if (this.emulatorTicks < 0) {
-    this.audioTicks -= this.emulatorTicks;
-    this.audioJIT();
-  }
-}
-GameBoyCore.prototype.recalculateIterationClockLimit = function () {
-  var endModulus = this.CPUCyclesTotalCurrent % 4;
-  this.CPUCyclesTotal = this.CPUCyclesTotalBase + this.CPUCyclesTotalCurrent - endModulus;
-  this.CPUCyclesTotalCurrent = endModulus;
-}
-GameBoyCore.prototype.scanLineMode2 = function () {  //OAM Search Period
-  if (this.STATTracker != 1) {
-    if (this.mode2TriggerSTAT) {
-      this.interruptsRequested |= 0x2;
-      this.checkIRQMatching();
-    }
-    this.STATTracker = 1;
-    this.modeSTAT = 2;
-  }
-}
-GameBoyCore.prototype.scanLineMode3 = function () {  //Scan Line Drawing Period
-  if (this.modeSTAT != 3) {
-    if (this.STATTracker == 0 && this.mode2TriggerSTAT) {
-      this.interruptsRequested |= 0x2;
-      this.checkIRQMatching();
-    }
-    this.STATTracker = 1;
-    this.modeSTAT = 3;
-  }
-}
-GameBoyCore.prototype.scanLineMode0 = function () {  //Horizontal Blanking Period
-  if (this.modeSTAT != 0) {
-    if (this.STATTracker != 2) {
-      if (this.STATTracker == 0) {
-        if (this.mode2TriggerSTAT) {
-          this.interruptsRequested |= 0x2;
-          this.checkIRQMatching();
-        }
-        this.modeSTAT = 3;
-      }
-      this.incrementScanLineQueue();
-      this.updateSpriteCount(this.actualScanLine);
-      this.STATTracker = 2;
-    }
-    if (this.LCDTicks >= this.spriteCount) {
-      if (this.hdmaRunning) {
-        this.executeHDMA();
-      }
-      if (this.mode0TriggerSTAT) {
-        this.interruptsRequested |= 0x2;
-        this.checkIRQMatching();
-      }
-      this.STATTracker = 3;
-      this.modeSTAT = 0;
-    }
-  }
-}
-GameBoyCore.prototype.clocksUntilLYCMatch = function () {
-  if (this.memory[0xFF45] != 0) {
-    if (this.memory[0xFF45] > this.actualScanLine) {
-      return 456 * (this.memory[0xFF45] - this.actualScanLine);
-    }
-    return 456 * (154 - this.actualScanLine + this.memory[0xFF45]);
-  }
-  return (456 * ((this.actualScanLine == 153 && this.memory[0xFF44] == 0) ? 154 : (153 - this.actualScanLine))) + 8;
-}
-GameBoyCore.prototype.clocksUntilMode0 = function () {
-  switch (this.modeSTAT) {
-    case 0:
-      if (this.actualScanLine == 143) {
-        this.updateSpriteCount(0);
-        return this.spriteCount + 5016;
-      }
-      this.updateSpriteCount(this.actualScanLine + 1);
-      return this.spriteCount + 456;
-    case 2:
-    case 3:
-      this.updateSpriteCount(this.actualScanLine);
-      return this.spriteCount;
-    case 1:
-      this.updateSpriteCount(0);
-      return this.spriteCount + (456 * (154 - this.actualScanLine));
-  }
-}
-GameBoyCore.prototype.updateSpriteCount = function (line) {
-  this.spriteCount = 252;
-  if (this.cGBC && this.gfxSpriteShow) {                    //Is the window enabled and are we in CGB mode?
-    var lineAdjusted = line + 0x10;
-    var yoffset = 0;
-    var yCap = (this.gfxSpriteNormalHeight) ? 0x8 : 0x10;
-    for (var OAMAddress = 0xFE00; OAMAddress < 0xFEA0 && this.spriteCount < 312; OAMAddress += 4) {
-      yoffset = lineAdjusted - this.memory[OAMAddress];
-      if (yoffset > -1 && yoffset < yCap) {
-        this.spriteCount += 6;
-      }
-    }
-  }
-}
-GameBoyCore.prototype.matchLYC = function () {  //LYC Register Compare
-  if (this.memory[0xFF44] == this.memory[0xFF45]) {
-    this.memory[0xFF41] |= 0x04;
-    if (this.LYCMatchTriggerSTAT) {
-      this.interruptsRequested |= 0x2;
-      this.checkIRQMatching();
-    }
-  }
-  else {
-    this.memory[0xFF41] &= 0x7B;
-  }
-}
-GameBoyCore.prototype.updateCore = function () {
-  //Update the clocking for the LCD emulation:
-  this.LCDTicks += this.CPUTicks >> this.doubleSpeedShifter;  //LCD Timing
-  this.LCDCONTROL[this.actualScanLine](this);          //Scan Line and STAT Mode Control
-  //Single-speed relative timing for A/V emulation:
-  var timedTicks = this.CPUTicks >> this.doubleSpeedShifter;  //CPU clocking can be updated from the LCD handling.
-  this.audioTicks += timedTicks;                //Audio Timing
-  this.emulatorTicks += timedTicks;              //Emulator Timing
-  //CPU Timers:
-  this.DIVTicks += this.CPUTicks;                //DIV Timing
-  if (this.TIMAEnabled) {                    //TIMA Timing
-    this.timerTicks += this.CPUTicks;
-    while (this.timerTicks >= this.TACClocker) {
-      this.timerTicks -= this.TACClocker;
-      if (++this.memory[0xFF05] == 0x100) {
-        this.memory[0xFF05] = this.memory[0xFF06];
-        this.interruptsRequested |= 0x4;
-        this.checkIRQMatching();
-      }
-    }
-  }
-  if (this.serialTimer > 0) {                    //Serial Timing
-    //IRQ Counter:
-    this.serialTimer -= this.CPUTicks;
-    if (this.serialTimer <= 0) {
-      this.interruptsRequested |= 0x8;
-      this.checkIRQMatching();
-    }
-    //Bit Shit Counter:
-    this.serialShiftTimer -= this.CPUTicks;
-    if (this.serialShiftTimer <= 0) {
-      this.serialShiftTimer = this.serialShiftTimerAllocated;
-      this.memory[0xFF01] = ((this.memory[0xFF01] << 1) & 0xFE) | 0x01;  //We could shift in actual link data here if we were to implement such!!!
-    }
-  }
-}
-GameBoyCore.prototype.updateCoreFull = function () {
-  //Update the state machine:
-  this.updateCore();
-  //End of iteration routine:
-  if (this.emulatorTicks >= this.CPUCyclesTotal) {
-    this.iterationEndRoutine();
-  }
-}
-GameBoyCore.prototype.initializeLCDController = function () {
-  //Display on hanlding:
-  var line = 0;
-  while (line < 154) {
-    if (line < 143) {
-      //We're on a normal scan line:
-      this.LINECONTROL[line] = function (parentObj) {
-        if (parentObj.LCDTicks < 80) {
-          parentObj.scanLineMode2();
-        }
-        else if (parentObj.LCDTicks < 252) {
-          parentObj.scanLineMode3();
-        }
-        else if (parentObj.LCDTicks < 456) {
-          parentObj.scanLineMode0();
-        }
-        else {
-          //We're on a new scan line:
-          parentObj.LCDTicks -= 456;
-          if (parentObj.STATTracker != 3) {
-            //Make sure the mode 0 handler was run at least once per scan line:
-            if (parentObj.STATTracker != 2) {
-              if (parentObj.STATTracker == 0 && parentObj.mode2TriggerSTAT) {
-                parentObj.interruptsRequested |= 0x2;
-              }
-              parentObj.incrementScanLineQueue();
-            }
-            if (parentObj.hdmaRunning) {
-              parentObj.executeHDMA();
-            }
-            if (parentObj.mode0TriggerSTAT) {
-              parentObj.interruptsRequested |= 0x2;
-            }
-          }
-          //Update the scanline registers and assert the LYC counter:
-          parentObj.actualScanLine = ++parentObj.memory[0xFF44];
-          //Perform a LYC counter assert:
-          if (parentObj.actualScanLine == parentObj.memory[0xFF45]) {
-            parentObj.memory[0xFF41] |= 0x04;
-            if (parentObj.LYCMatchTriggerSTAT) {
-              parentObj.interruptsRequested |= 0x2;
-            }
-          }
-          else {
-            parentObj.memory[0xFF41] &= 0x7B;
-          }
-          parentObj.checkIRQMatching();
-          //Reset our mode contingency variables:
-          parentObj.STATTracker = 0;
-          parentObj.modeSTAT = 2;
-          parentObj.LINECONTROL[parentObj.actualScanLine](parentObj);  //Scan Line and STAT Mode Control.
-        }
-      }
-    }
-    else if (line == 143) {
-      //We're on the last visible scan line of the LCD screen:
-      this.LINECONTROL[143] = function (parentObj) {
-        if (parentObj.LCDTicks < 80) {
-          parentObj.scanLineMode2();
-        }
-        else if (parentObj.LCDTicks < 252) {
-          parentObj.scanLineMode3();
-        }
-        else if (parentObj.LCDTicks < 456) {
-          parentObj.scanLineMode0();
-        }
-        else {
-          //Starting V-Blank:
-          //Just finished the last visible scan line:
-          parentObj.LCDTicks -= 456;
-          if (parentObj.STATTracker != 3) {
-            //Make sure the mode 0 handler was run at least once per scan line:
-            if (parentObj.STATTracker != 2) {
-              if (parentObj.STATTracker == 0 && parentObj.mode2TriggerSTAT) {
-                parentObj.interruptsRequested |= 0x2;
-              }
-              parentObj.incrementScanLineQueue();
-            }
-            if (parentObj.hdmaRunning) {
-              parentObj.executeHDMA();
-            }
-            if (parentObj.mode0TriggerSTAT) {
-              parentObj.interruptsRequested |= 0x2;
-            }
-          }
-          //Update the scanline registers and assert the LYC counter:
-          parentObj.actualScanLine = parentObj.memory[0xFF44] = 144;
-          //Perform a LYC counter assert:
-          if (parentObj.memory[0xFF45] == 144) {
-            parentObj.memory[0xFF41] |= 0x04;
-            if (parentObj.LYCMatchTriggerSTAT) {
-              parentObj.interruptsRequested |= 0x2;
-            }
-          }
-          else {
-            parentObj.memory[0xFF41] &= 0x7B;
-          }
-          //Reset our mode contingency variables:
-          parentObj.STATTracker = 0;
-          //Update our state for v-blank:
-          parentObj.modeSTAT = 1;
-          parentObj.interruptsRequested |= (parentObj.mode1TriggerSTAT) ? 0x3 : 0x1;
-          parentObj.checkIRQMatching();
-          //Attempt to blit out to our canvas:
-          if (parentObj.drewBlank == 0) {
-            //Ensure JIT framing alignment:
-            if (parentObj.totalLinesPassed < 144 || (parentObj.totalLinesPassed == 144 && parentObj.midScanlineOffset > -1)) {
-              //Make sure our gfx are up-to-date:
-              parentObj.graphicsJITVBlank();
-              //Draw the frame:
-              parentObj.prepareFrame();
-            }
-          }
-          else {
-            //LCD off takes at least 2 frames:
-            --parentObj.drewBlank;
-          }
-          parentObj.LINECONTROL[144](parentObj);  //Scan Line and STAT Mode Control.
-        }
-      }
-    }
-    else if (line < 153) {
-      //In VBlank
-      this.LINECONTROL[line] = function (parentObj) {
-        if (parentObj.LCDTicks >= 456) {
-          //We're on a new scan line:
-          parentObj.LCDTicks -= 456;
-          parentObj.actualScanLine = ++parentObj.memory[0xFF44];
-          //Perform a LYC counter assert:
-          if (parentObj.actualScanLine == parentObj.memory[0xFF45]) {
-            parentObj.memory[0xFF41] |= 0x04;
-            if (parentObj.LYCMatchTriggerSTAT) {
-              parentObj.interruptsRequested |= 0x2;
-              parentObj.checkIRQMatching();
-            }
-          }
-          else {
-            parentObj.memory[0xFF41] &= 0x7B;
-          }
-          parentObj.LINECONTROL[parentObj.actualScanLine](parentObj);  //Scan Line and STAT Mode Control.
-        }
-      }
-    }
-    else {
-      //VBlank Ending (We're on the last actual scan line)
-      this.LINECONTROL[153] = function (parentObj) {
-        if (parentObj.LCDTicks >= 8) {
-          if (parentObj.STATTracker != 4 && parentObj.memory[0xFF44] == 153) {
-            parentObj.memory[0xFF44] = 0;  //LY register resets to 0 early.
-            //Perform a LYC counter assert:
-            if (parentObj.memory[0xFF45] == 0) {
-              parentObj.memory[0xFF41] |= 0x04;
-              if (parentObj.LYCMatchTriggerSTAT) {
-                parentObj.interruptsRequested |= 0x2;
-                parentObj.checkIRQMatching();
-              }
-            }
-            else {
-              parentObj.memory[0xFF41] &= 0x7B;
-            }
-            parentObj.STATTracker = 4;
-          }
-          if (parentObj.LCDTicks >= 456) {
-            //We reset back to the beginning:
-            parentObj.LCDTicks -= 456;
-            parentObj.STATTracker = parentObj.actualScanLine = 0;
-            parentObj.LINECONTROL[0](parentObj);  //Scan Line and STAT Mode Control.
-          }
-        }
-      }
-    }
-    ++line;
-  }
-}
-GameBoyCore.prototype.DisplayShowOff = function () {
-  if (this.drewBlank == 0) {
-    //Output a blank screen to the output framebuffer:
-    this.clearFrameBuffer();
-    this.drewFrame = true;
-  }
-  this.drewBlank = 2;
-}
-GameBoyCore.prototype.executeHDMA = function () {
-  this.DMAWrite(1);
-  if (this.halt) {
-    if ((this.LCDTicks - this.spriteCount) < ((4 >> this.doubleSpeedShifter) | 0x20)) {
-      //HALT clocking correction:
-      this.CPUTicks = 4 + ((0x20 + this.spriteCount) << this.doubleSpeedShifter);
-      this.LCDTicks = this.spriteCount + ((4 >> this.doubleSpeedShifter) | 0x20);
-    }
-  }
-  else {
-    this.LCDTicks += (4 >> this.doubleSpeedShifter) | 0x20;      //LCD Timing Update For HDMA.
-  }
-  if (this.memory[0xFF55] == 0) {
-    this.hdmaRunning = false;
-    this.memory[0xFF55] = 0xFF;  //Transfer completed ("Hidden last step," since some ROMs don't imply this, but most do).
-  }
-  else {
-    --this.memory[0xFF55];
-  }
-}
-GameBoyCore.prototype.clockUpdate = function () {
-  if (this.cTIMER) {
-    var dateObj = new_Date(); // The line is changed for benchmarking.
-    var newTime = dateObj.getTime();
-    var timeElapsed = newTime - this.lastIteration;  //Get the numnber of milliseconds since this last executed.
-    this.lastIteration = newTime;
-    if (this.cTIMER && !this.RTCHALT) {
-      //Update the MBC3 RTC:
-      this.RTCSeconds += timeElapsed / 1000;
-      while (this.RTCSeconds >= 60) {  //System can stutter, so the seconds difference can get large, thus the "while".
-        this.RTCSeconds -= 60;
-        ++this.RTCMinutes;
-        if (this.RTCMinutes >= 60) {
-          this.RTCMinutes -= 60;
-          ++this.RTCHours;
-          if (this.RTCHours >= 24) {
-            this.RTCHours -= 24
-            ++this.RTCDays;
-            if (this.RTCDays >= 512) {
-              this.RTCDays -= 512;
-              this.RTCDayOverFlow = true;
-            }
-          }
-        }
-      }
-    }
-  }
-}
-GameBoyCore.prototype.prepareFrame = function () {
-  //Copy the internal frame buffer to the output buffer:
-  this.swizzleFrameBuffer();
-  this.drewFrame = true;
-}
-GameBoyCore.prototype.requestDraw = function () {
-  if (this.drewFrame) {
-    this.dispatchDraw();
-  }
-}
-GameBoyCore.prototype.dispatchDraw = function () {
-  var canvasRGBALength = this.offscreenRGBCount;
-  if (canvasRGBALength > 0) {
-    //We actually updated the graphics internally, so copy out:
-    var frameBuffer = (canvasRGBALength == 92160) ? this.swizzledFrame : this.resizeFrameBuffer();
-    var canvasData = this.canvasBuffer.data;
-    var bufferIndex = 0;
-    for (var canvasIndex = 0; canvasIndex < canvasRGBALength; ++canvasIndex) {
-      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
-      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
-      canvasData[canvasIndex++] = frameBuffer[bufferIndex++];
-    }
-    this.graphicsBlit();
-  }
-}
-GameBoyCore.prototype.swizzleFrameBuffer = function () {
-  //Convert our dirty 24-bit (24-bit, with internal render flags above it) framebuffer to an 8-bit buffer with separate indices for the RGB channels:
-  var frameBuffer = this.frameBuffer;
-  var swizzledFrame = this.swizzledFrame;
-  var bufferIndex = 0;
-  for (var canvasIndex = 0; canvasIndex < 69120;) {
-    swizzledFrame[canvasIndex++] = (frameBuffer[bufferIndex] >> 16) & 0xFF;    //Red
-    swizzledFrame[canvasIndex++] = (frameBuffer[bufferIndex] >> 8) & 0xFF;    //Green
-    swizzledFrame[canvasIndex++] = frameBuffer[bufferIndex++] & 0xFF;      //Blue
-  }
-}
-GameBoyCore.prototype.clearFrameBuffer = function () {
-  var bufferIndex = 0;
-  var frameBuffer = this.swizzledFrame;
-  if (this.cGBC || this.colorizedGBPalettes) {
-    while (bufferIndex < 69120) {
-      frameBuffer[bufferIndex++] = 248;
-    }
-  }
-  else {
-    while (bufferIndex < 69120) {
-      frameBuffer[bufferIndex++] = 239;
-      frameBuffer[bufferIndex++] = 255;
-      frameBuffer[bufferIndex++] = 222;
-    }
-  }
-}
-GameBoyCore.prototype.resizeFrameBuffer = function () {
-  //Return a reference to the generated resized framebuffer:
-  return this.resizer.resize(this.swizzledFrame);
-}
-GameBoyCore.prototype.compileResizeFrameBufferFunction = function () {
-  if (this.offscreenRGBCount > 0) {
-    this.resizer = new Resize(160, 144, this.offscreenWidth, this.offscreenHeight, false, true);
-  }
-}
-GameBoyCore.prototype.renderScanLine = function (scanlineToRender) {
-  this.pixelStart = scanlineToRender * 160;
-  if (this.bgEnabled) {
-    this.pixelEnd = 160;
-    this.BGLayerRender(scanlineToRender);
-    this.WindowLayerRender(scanlineToRender);
-  }
-  else {
-    var pixelLine = (scanlineToRender + 1) * 160;
-    var defaultColor = (this.cGBC || this.colorizedGBPalettes) ? 0xF8F8F8 : 0xEFFFDE;
-    for (var pixelPosition = (scanlineToRender * 160) + this.currentX; pixelPosition < pixelLine; pixelPosition++) {
-      this.frameBuffer[pixelPosition] = defaultColor;
-    }
-  }
-  this.SpriteLayerRender(scanlineToRender);
-  this.currentX = 0;
-  this.midScanlineOffset = -1;
-}
-GameBoyCore.prototype.renderMidScanLine = function () {
-  if (this.actualScanLine < 144 && this.modeSTAT == 3) {
-    //TODO: Get this accurate:
-    if (this.midScanlineOffset == -1) {
-      this.midScanlineOffset = this.backgroundX & 0x7;
-    }
-    if (this.LCDTicks >= 82) {
-      this.pixelEnd = this.LCDTicks - 74;
-      this.pixelEnd = Math.min(this.pixelEnd - this.midScanlineOffset - (this.pixelEnd % 0x8), 160);
-      if (this.bgEnabled) {
-        this.pixelStart = this.lastUnrenderedLine * 160;
-        this.BGLayerRender(this.lastUnrenderedLine);
-        this.WindowLayerRender(this.lastUnrenderedLine);
-        //TODO: Do midscanline JIT for sprites...
-      }
-      else {
-        var pixelLine = (this.lastUnrenderedLine * 160) + this.pixelEnd;
-        var defaultColor = (this.cGBC || this.colorizedGBPalettes) ? 0xF8F8F8 : 0xEFFFDE;
-        for (var pixelPosition = (this.lastUnrenderedLine * 160) + this.currentX; pixelPosition < pixelLine; pixelPosition++) {
-          this.frameBuffer[pixelPosition] = defaultColor;
-        }
-      }
-      this.currentX = this.pixelEnd;
-    }
-  }
-}
-GameBoyCore.prototype.initializeModeSpecificArrays = function () {
-  this.LCDCONTROL = (this.LCDisOn) ? this.LINECONTROL : this.DISPLAYOFFCONTROL;
-  if (this.cGBC) {
-    this.gbcOBJRawPalette = this.getTypedArray(0x40, 0, "uint8");
-    this.gbcBGRawPalette = this.getTypedArray(0x40, 0, "uint8");
-    this.gbcOBJPalette = this.getTypedArray(0x20, 0x1000000, "int32");
-    this.gbcBGPalette = this.getTypedArray(0x40, 0, "int32");
-    this.BGCHRBank2 = this.getTypedArray(0x800, 0, "uint8");
-    this.BGCHRCurrentBank = (this.currVRAMBank > 0) ? this.BGCHRBank2 : this.BGCHRBank1;
-    this.tileCache = this.generateCacheArray(0xF80);
-  }
-  else {
-    this.gbOBJPalette = this.getTypedArray(8, 0, "int32");
-    this.gbBGPalette = this.getTypedArray(4, 0, "int32");
-    this.BGPalette = this.gbBGPalette;
-    this.OBJPalette = this.gbOBJPalette;
-    this.tileCache = this.generateCacheArray(0x700);
-    this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
-    this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
-  }
-  this.renderPathBuild();
-}
-GameBoyCore.prototype.GBCtoGBModeAdjust = function () {
-  cout("Stepping down from GBC mode.", 0);
-  this.VRAM = this.GBCMemory = this.BGCHRCurrentBank = this.BGCHRBank2 = null;
-  this.tileCache.length = 0x700;
-  if (settings[4]) {
-    this.gbBGColorizedPalette = this.getTypedArray(4, 0, "int32");
-    this.gbOBJColorizedPalette = this.getTypedArray(8, 0, "int32");
-    this.cachedBGPaletteConversion = this.getTypedArray(4, 0, "int32");
-    this.cachedOBJPaletteConversion = this.getTypedArray(8, 0, "int32");
-    this.BGPalette = this.gbBGColorizedPalette;
-    this.OBJPalette = this.gbOBJColorizedPalette;
-    this.gbOBJPalette = this.gbBGPalette = null;
-    this.getGBCColor();
-  }
-  else {
-    this.gbOBJPalette = this.getTypedArray(8, 0, "int32");
-    this.gbBGPalette = this.getTypedArray(4, 0, "int32");
-    this.BGPalette = this.gbBGPalette;
-    this.OBJPalette = this.gbOBJPalette;
-  }
-  this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
-  this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
-  this.renderPathBuild();
-  this.memoryReadJumpCompile();
-  this.memoryWriteJumpCompile();
-}
-GameBoyCore.prototype.renderPathBuild = function () {
-  if (!this.cGBC) {
-    this.BGLayerRender = this.BGGBLayerRender;
-    this.WindowLayerRender = this.WindowGBLayerRender;
-    this.SpriteLayerRender = this.SpriteGBLayerRender;
-  }
-  else {
-    this.priorityFlaggingPathRebuild();
-    this.SpriteLayerRender = this.SpriteGBCLayerRender;
-  }
-}
-GameBoyCore.prototype.priorityFlaggingPathRebuild = function () {
-  if (this.BGPriorityEnabled) {
-    this.BGLayerRender = this.BGGBCLayerRender;
-    this.WindowLayerRender = this.WindowGBCLayerRender;
-  }
-  else {
-    this.BGLayerRender = this.BGGBCLayerRenderNoPriorityFlagging;
-    this.WindowLayerRender = this.WindowGBCLayerRenderNoPriorityFlagging;
-  }
-}
-GameBoyCore.prototype.initializeReferencesFromSaveState = function () {
-  this.LCDCONTROL = (this.LCDisOn) ? this.LINECONTROL : this.DISPLAYOFFCONTROL;
-  var tileIndex = 0;
-  if (!this.cGBC) {
-    if (this.colorizedGBPalettes) {
-      this.BGPalette = this.gbBGColorizedPalette;
-      this.OBJPalette = this.gbOBJColorizedPalette;
-      this.updateGBBGPalette = this.updateGBColorizedBGPalette;
-      this.updateGBOBJPalette = this.updateGBColorizedOBJPalette;
-
-    }
-    else {
-      this.BGPalette = this.gbBGPalette;
-      this.OBJPalette = this.gbOBJPalette;
-    }
-    this.tileCache = this.generateCacheArray(0x700);
-    for (tileIndex = 0x8000; tileIndex < 0x9000; tileIndex += 2) {
-      this.generateGBOAMTileLine(tileIndex);
-    }
-    for (tileIndex = 0x9000; tileIndex < 0x9800; tileIndex += 2) {
-      this.generateGBTileLine(tileIndex);
-    }
-    this.sortBuffer = this.getTypedArray(0x100, 0, "uint8");
-    this.OAMAddressCache = this.getTypedArray(10, 0, "int32");
-  }
-  else {
-    this.BGCHRCurrentBank = (this.currVRAMBank > 0) ? this.BGCHRBank2 : this.BGCHRBank1;
-    this.tileCache = this.generateCacheArray(0xF80);
-    for (; tileIndex < 0x1800; tileIndex += 0x10) {
-      this.generateGBCTileBank1(tileIndex);
-      this.generateGBCTileBank2(tileIndex);
-    }
-  }
-  this.renderPathBuild();
-}
-GameBoyCore.prototype.RGBTint = function (value) {
-  //Adjustment for the GBC's tinting (According to Gambatte):
-  var r = value & 0x1F;
-  var g = (value >> 5) & 0x1F;
-  var b = (value >> 10) & 0x1F;
-  return ((r * 13 + g * 2 + b) >> 1) << 16 | (g * 3 + b) << 9 | (r * 3 + g * 2 + b * 11) >> 1;
-}
-GameBoyCore.prototype.getGBCColor = function () {
-  //GBC Colorization of DMG ROMs:
-  //BG
-  for (var counter = 0; counter < 4; counter++) {
-    var adjustedIndex = counter << 1;
-    //BG
-    this.cachedBGPaletteConversion[counter] = this.RGBTint((this.gbcBGRawPalette[adjustedIndex | 1] << 8) | this.gbcBGRawPalette[adjustedIndex]);
-    //OBJ 1
-    this.cachedOBJPaletteConversion[counter] = this.RGBTint((this.gbcOBJRawPalette[adjustedIndex | 1] << 8) | this.gbcOBJRawPalette[adjustedIndex]);
-  }
-  //OBJ 2
-  for (counter = 4; counter < 8; counter++) {
-    adjustedIndex = counter << 1;
-    this.cachedOBJPaletteConversion[counter] = this.RGBTint((this.gbcOBJRawPalette[adjustedIndex | 1] << 8) | this.gbcOBJRawPalette[adjustedIndex]);
-  }
-  //Update the palette entries:
-  this.updateGBBGPalette = this.updateGBColorizedBGPalette;
-  this.updateGBOBJPalette = this.updateGBColorizedOBJPalette;
-  this.updateGBBGPalette(this.memory[0xFF47]);
-  this.updateGBOBJPalette(0, this.memory[0xFF48]);
-  this.updateGBOBJPalette(1, this.memory[0xFF49]);
-  this.colorizedGBPalettes = true;
-}
-GameBoyCore.prototype.updateGBRegularBGPalette = function (data) {
-  this.gbBGPalette[0] = this.colors[data & 0x03] | 0x2000000;
-  this.gbBGPalette[1] = this.colors[(data >> 2) & 0x03];
-  this.gbBGPalette[2] = this.colors[(data >> 4) & 0x03];
-  this.gbBGPalette[3] = this.colors[data >> 6];
-}
-GameBoyCore.prototype.updateGBColorizedBGPalette = function (data) {
-  //GB colorization:
-  this.gbBGColorizedPalette[0] = this.cachedBGPaletteConversion[data & 0x03] | 0x2000000;
-  this.gbBGColorizedPalette[1] = this.cachedBGPaletteConversion[(data >> 2) & 0x03];
-  this.gbBGColorizedPalette[2] = this.cachedBGPaletteConversion[(data >> 4) & 0x03];
-  this.gbBGColorizedPalette[3] = this.cachedBGPaletteConversion[data >> 6];
-}
-GameBoyCore.prototype.updateGBRegularOBJPalette = function (index, data) {
-  this.gbOBJPalette[index | 1] = this.colors[(data >> 2) & 0x03];
-  this.gbOBJPalette[index | 2] = this.colors[(data >> 4) & 0x03];
-  this.gbOBJPalette[index | 3] = this.colors[data >> 6];
-}
-GameBoyCore.prototype.updateGBColorizedOBJPalette = function (index, data) {
-  //GB colorization:
-  this.gbOBJColorizedPalette[index | 1] = this.cachedOBJPaletteConversion[index | ((data >> 2) & 0x03)];
-  this.gbOBJColorizedPalette[index | 2] = this.cachedOBJPaletteConversion[index | ((data >> 4) & 0x03)];
-  this.gbOBJColorizedPalette[index | 3] = this.cachedOBJPaletteConversion[index | (data >> 6)];
-}
-GameBoyCore.prototype.updateGBCBGPalette = function (index, data) {
-  if (this.gbcBGRawPalette[index] != data) {
-    this.midScanLineJIT();
-    //Update the color palette for BG tiles since it changed:
-    this.gbcBGRawPalette[index] = data;
-    if ((index & 0x06) == 0) {
-      //Palette 0 (Special tile Priority stuff)
-      data = 0x2000000 | this.RGBTint((this.gbcBGRawPalette[index | 1] << 8) | this.gbcBGRawPalette[index & 0x3E]);
-      index >>= 1;
-      this.gbcBGPalette[index] = data;
-      this.gbcBGPalette[0x20 | index] = 0x1000000 | data;
-    }
-    else {
-      //Regular Palettes (No special crap)
-      data = this.RGBTint((this.gbcBGRawPalette[index | 1] << 8) | this.gbcBGRawPalette[index & 0x3E]);
-      index >>= 1;
-      this.gbcBGPalette[index] = data;
-      this.gbcBGPalette[0x20 | index] = 0x1000000 | data;
-    }
-  }
-}
-GameBoyCore.prototype.updateGBCOBJPalette = function (index, data) {
-  if (this.gbcOBJRawPalette[index] != data) {
-    //Update the color palette for OBJ tiles since it changed:
-    this.gbcOBJRawPalette[index] = data;
-    if ((index & 0x06) > 0) {
-      //Regular Palettes (No special crap)
-      this.midScanLineJIT();
-      this.gbcOBJPalette[index >> 1] = 0x1000000 | this.RGBTint((this.gbcOBJRawPalette[index | 1] << 8) | this.gbcOBJRawPalette[index & 0x3E]);
-    }
-  }
-}
-GameBoyCore.prototype.BGGBLayerRender = function (scanlineToRender) {
-  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
-  var tileYLine = (scrollYAdjusted & 7) << 3;
-  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
-  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
-  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
-  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
-  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
-  var chrCode = this.BGCHRBank1[tileNumber];
-  if (chrCode < this.gfxBackgroundBankOffset) {
-    chrCode |= 0x100;
-  }
-  var tile = this.tileCache[chrCode];
-  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[tileYLine | texel++]];
-  }
-  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
-  scrollXAdjusted += scrollXAdjustedAligned << 3;
-  scrollXAdjustedAligned += tileNumber;
-  while (tileNumber < scrollXAdjustedAligned) {
-    chrCode = this.BGCHRBank1[++tileNumber];
-    if (chrCode < this.gfxBackgroundBankOffset) {
-      chrCode |= 0x100;
-    }
-    tile = this.tileCache[chrCode];
-    texel = tileYLine;
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
-  }
-  if (pixelPosition < pixelPositionEnd) {
-    if (scrollXAdjusted < 0x100) {
-      chrCode = this.BGCHRBank1[++tileNumber];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      tile = this.tileCache[chrCode];
-      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-        this.frameBuffer[pixelPosition++] = this.BGPalette[tile[++texel]];
-      }
-    }
-    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
-    while (tileYDown < scrollXAdjustedAligned) {
-      chrCode = this.BGCHRBank1[tileYDown++];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      tile = this.tileCache[chrCode];
-      texel = tileYLine;
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
-    }
-    if (pixelPosition < pixelPositionEnd) {
-      chrCode = this.BGCHRBank1[tileYDown];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      tile = this.tileCache[chrCode];
-      switch (pixelPositionEnd - pixelPosition) {
-        case 7:
-          this.frameBuffer[pixelPosition + 6] = this.BGPalette[tile[tileYLine | 6]];
-        case 6:
-          this.frameBuffer[pixelPosition + 5] = this.BGPalette[tile[tileYLine | 5]];
-        case 5:
-          this.frameBuffer[pixelPosition + 4] = this.BGPalette[tile[tileYLine | 4]];
-        case 4:
-          this.frameBuffer[pixelPosition + 3] = this.BGPalette[tile[tileYLine | 3]];
-        case 3:
-          this.frameBuffer[pixelPosition + 2] = this.BGPalette[tile[tileYLine | 2]];
-        case 2:
-          this.frameBuffer[pixelPosition + 1] = this.BGPalette[tile[tileYLine | 1]];
-        case 1:
-          this.frameBuffer[pixelPosition] = this.BGPalette[tile[tileYLine]];
-      }
-    }
-  }
-}
-GameBoyCore.prototype.BGGBCLayerRender = function (scanlineToRender) {
-  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
-  var tileYLine = (scrollYAdjusted & 7) << 3;
-  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
-  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
-  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
-  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
-  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
-  var chrCode = this.BGCHRBank1[tileNumber];
-  if (chrCode < this.gfxBackgroundBankOffset) {
-    chrCode |= 0x100;
-  }
-  var attrCode = this.BGCHRBank2[tileNumber];
-  var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-  var palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
-  }
-  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
-  scrollXAdjusted += scrollXAdjustedAligned << 3;
-  scrollXAdjustedAligned += tileNumber;
-  while (tileNumber < scrollXAdjustedAligned) {
-    chrCode = this.BGCHRBank1[++tileNumber];
-    if (chrCode < this.gfxBackgroundBankOffset) {
-      chrCode |= 0x100;
-    }
-    attrCode = this.BGCHRBank2[tileNumber];
-    tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-    palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-    texel = tileYLine;
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-  }
-  if (pixelPosition < pixelPositionEnd) {
-    if (scrollXAdjusted < 0x100) {
-      chrCode = this.BGCHRBank1[++tileNumber];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileNumber];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-        this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[++texel]];
-      }
-    }
-    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
-    while (tileYDown < scrollXAdjustedAligned) {
-      chrCode = this.BGCHRBank1[tileYDown];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileYDown++];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-      texel = tileYLine;
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-    }
-    if (pixelPosition < pixelPositionEnd) {
-      chrCode = this.BGCHRBank1[tileYDown];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileYDown];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-      switch (pixelPositionEnd - pixelPosition) {
-        case 7:
-          this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
-        case 6:
-          this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
-        case 5:
-          this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
-        case 4:
-          this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
-        case 3:
-          this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
-        case 2:
-          this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
-        case 1:
-          this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
-      }
-    }
-  }
-}
-GameBoyCore.prototype.BGGBCLayerRenderNoPriorityFlagging = function (scanlineToRender) {
-  var scrollYAdjusted = (this.backgroundY + scanlineToRender) & 0xFF;            //The line of the BG we're at.
-  var tileYLine = (scrollYAdjusted & 7) << 3;
-  var tileYDown = this.gfxBackgroundCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2);  //The row of cached tiles we're fetching from.
-  var scrollXAdjusted = (this.backgroundX + this.currentX) & 0xFF;            //The scroll amount of the BG.
-  var pixelPosition = this.pixelStart + this.currentX;                  //Current pixel we're working on.
-  var pixelPositionEnd = this.pixelStart + ((this.gfxWindowDisplay && (scanlineToRender - this.windowY) >= 0) ? Math.min(Math.max(this.windowX, 0) + this.currentX, this.pixelEnd) : this.pixelEnd);  //Make sure we do at most 160 pixels a scanline.
-  var tileNumber = tileYDown + (scrollXAdjusted >> 3);
-  var chrCode = this.BGCHRBank1[tileNumber];
-  if (chrCode < this.gfxBackgroundBankOffset) {
-    chrCode |= 0x100;
-  }
-  var attrCode = this.BGCHRBank2[tileNumber];
-  var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-  var palette = (attrCode & 0x7) << 2;
-  for (var texel = (scrollXAdjusted & 0x7); texel < 8 && pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
-  }
-  var scrollXAdjustedAligned = Math.min(pixelPositionEnd - pixelPosition, 0x100 - scrollXAdjusted) >> 3;
-  scrollXAdjusted += scrollXAdjustedAligned << 3;
-  scrollXAdjustedAligned += tileNumber;
-  while (tileNumber < scrollXAdjustedAligned) {
-    chrCode = this.BGCHRBank1[++tileNumber];
-    if (chrCode < this.gfxBackgroundBankOffset) {
-      chrCode |= 0x100;
-    }
-    attrCode = this.BGCHRBank2[tileNumber];
-    tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-    palette = (attrCode & 0x7) << 2;
-    texel = tileYLine;
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-    this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-  }
-  if (pixelPosition < pixelPositionEnd) {
-    if (scrollXAdjusted < 0x100) {
-      chrCode = this.BGCHRBank1[++tileNumber];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileNumber];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = (attrCode & 0x7) << 2;
-      for (texel = tileYLine - 1; pixelPosition < pixelPositionEnd && scrollXAdjusted < 0x100; ++scrollXAdjusted) {
-        this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[++texel]];
-      }
-    }
-    scrollXAdjustedAligned = ((pixelPositionEnd - pixelPosition) >> 3) + tileYDown;
-    while (tileYDown < scrollXAdjustedAligned) {
-      chrCode = this.BGCHRBank1[tileYDown];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileYDown++];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = (attrCode & 0x7) << 2;
-      texel = tileYLine;
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-      this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-    }
-    if (pixelPosition < pixelPositionEnd) {
-      chrCode = this.BGCHRBank1[tileYDown];
-      if (chrCode < this.gfxBackgroundBankOffset) {
-        chrCode |= 0x100;
-      }
-      attrCode = this.BGCHRBank2[tileYDown];
-      tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-      palette = (attrCode & 0x7) << 2;
-      switch (pixelPositionEnd - pixelPosition) {
-        case 7:
-          this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
-        case 6:
-          this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
-        case 5:
-          this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
-        case 4:
-          this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
-        case 3:
-          this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
-        case 2:
-          this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
-        case 1:
-          this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
-      }
-    }
-  }
-}
-GameBoyCore.prototype.WindowGBLayerRender = function (scanlineToRender) {
-  if (this.gfxWindowDisplay) {                  //Is the window enabled?
-    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
-    if (scrollYAdjusted >= 0) {
-      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
-      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
-      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
-      if (pixelPosition < pixelPositionEnd) {
-        var tileYLine = (scrollYAdjusted & 0x7) << 3;
-        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
-        var chrCode = this.BGCHRBank1[tileNumber];
-        if (chrCode < this.gfxBackgroundBankOffset) {
-          chrCode |= 0x100;
-        }
-        var tile = this.tileCache[chrCode];
-        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
-        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
-        while (texel < scrollXRangeAdjusted) {
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[tileYLine | texel++]];
-        }
-        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
-        while (tileNumber < scrollXRangeAdjusted) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          tile = this.tileCache[chrCode];
-          texel = tileYLine;
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.BGPalette[tile[texel]];
-        }
-        if (pixelPosition < pixelPositionEnd) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          tile = this.tileCache[chrCode];
-          switch (pixelPositionEnd - pixelPosition) {
-            case 7:
-              this.frameBuffer[pixelPosition + 6] = this.BGPalette[tile[tileYLine | 6]];
-            case 6:
-              this.frameBuffer[pixelPosition + 5] = this.BGPalette[tile[tileYLine | 5]];
-            case 5:
-              this.frameBuffer[pixelPosition + 4] = this.BGPalette[tile[tileYLine | 4]];
-            case 4:
-              this.frameBuffer[pixelPosition + 3] = this.BGPalette[tile[tileYLine | 3]];
-            case 3:
-              this.frameBuffer[pixelPosition + 2] = this.BGPalette[tile[tileYLine | 2]];
-            case 2:
-              this.frameBuffer[pixelPosition + 1] = this.BGPalette[tile[tileYLine | 1]];
-            case 1:
-              this.frameBuffer[pixelPosition] = this.BGPalette[tile[tileYLine]];
-          }
-        }
-      }
-    }
-  }
-}
-GameBoyCore.prototype.WindowGBCLayerRender = function (scanlineToRender) {
-  if (this.gfxWindowDisplay) {                  //Is the window enabled?
-    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
-    if (scrollYAdjusted >= 0) {
-      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
-      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
-      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
-      if (pixelPosition < pixelPositionEnd) {
-        var tileYLine = (scrollYAdjusted & 0x7) << 3;
-        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
-        var chrCode = this.BGCHRBank1[tileNumber];
-        if (chrCode < this.gfxBackgroundBankOffset) {
-          chrCode |= 0x100;
-        }
-        var attrCode = this.BGCHRBank2[tileNumber];
-        var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-        var palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
-        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
-        while (texel < scrollXRangeAdjusted) {
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
-        }
-        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
-        while (tileNumber < scrollXRangeAdjusted) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          attrCode = this.BGCHRBank2[tileNumber];
-          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-          palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-          texel = tileYLine;
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-        }
-        if (pixelPosition < pixelPositionEnd) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          attrCode = this.BGCHRBank2[tileNumber];
-          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-          palette = ((attrCode & 0x7) << 2) | ((attrCode & 0x80) >> 2);
-          switch (pixelPositionEnd - pixelPosition) {
-            case 7:
-              this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
-            case 6:
-              this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
-            case 5:
-              this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
-            case 4:
-              this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
-            case 3:
-              this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
-            case 2:
-              this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
-            case 1:
-              this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
-          }
-        }
-      }
-    }
-  }
-}
-GameBoyCore.prototype.WindowGBCLayerRenderNoPriorityFlagging = function (scanlineToRender) {
-  if (this.gfxWindowDisplay) {                  //Is the window enabled?
-    var scrollYAdjusted = scanlineToRender - this.windowY;    //The line of the BG we're at.
-    if (scrollYAdjusted >= 0) {
-      var scrollXRangeAdjusted = (this.windowX > 0) ? (this.windowX + this.currentX) : this.currentX;
-      var pixelPosition = this.pixelStart + scrollXRangeAdjusted;
-      var pixelPositionEnd = this.pixelStart + this.pixelEnd;
-      if (pixelPosition < pixelPositionEnd) {
-        var tileYLine = (scrollYAdjusted & 0x7) << 3;
-        var tileNumber = (this.gfxWindowCHRBankPosition | ((scrollYAdjusted & 0xF8) << 2)) + (this.currentX >> 3);
-        var chrCode = this.BGCHRBank1[tileNumber];
-        if (chrCode < this.gfxBackgroundBankOffset) {
-          chrCode |= 0x100;
-        }
-        var attrCode = this.BGCHRBank2[tileNumber];
-        var tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-        var palette = (attrCode & 0x7) << 2;
-        var texel = (scrollXRangeAdjusted - this.windowX) & 0x7;
-        scrollXRangeAdjusted = Math.min(8, texel + pixelPositionEnd - pixelPosition);
-        while (texel < scrollXRangeAdjusted) {
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[tileYLine | texel++]];
-        }
-        scrollXRangeAdjusted = tileNumber + ((pixelPositionEnd - pixelPosition) >> 3);
-        while (tileNumber < scrollXRangeAdjusted) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          attrCode = this.BGCHRBank2[tileNumber];
-          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-          palette = (attrCode & 0x7) << 2;
-          texel = tileYLine;
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel++]];
-          this.frameBuffer[pixelPosition++] = this.gbcBGPalette[palette | tile[texel]];
-        }
-        if (pixelPosition < pixelPositionEnd) {
-          chrCode = this.BGCHRBank1[++tileNumber];
-          if (chrCode < this.gfxBackgroundBankOffset) {
-            chrCode |= 0x100;
-          }
-          attrCode = this.BGCHRBank2[tileNumber];
-          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | chrCode];
-          palette = (attrCode & 0x7) << 2;
-          switch (pixelPositionEnd - pixelPosition) {
-            case 7:
-              this.frameBuffer[pixelPosition + 6] = this.gbcBGPalette[palette | tile[tileYLine | 6]];
-            case 6:
-              this.frameBuffer[pixelPosition + 5] = this.gbcBGPalette[palette | tile[tileYLine | 5]];
-            case 5:
-              this.frameBuffer[pixelPosition + 4] = this.gbcBGPalette[palette | tile[tileYLine | 4]];
-            case 4:
-              this.frameBuffer[pixelPosition + 3] = this.gbcBGPalette[palette | tile[tileYLine | 3]];
-            case 3:
-              this.frameBuffer[pixelPosition + 2] = this.gbcBGPalette[palette | tile[tileYLine | 2]];
-            case 2:
-              this.frameBuffer[pixelPosition + 1] = this.gbcBGPalette[palette | tile[tileYLine | 1]];
-            case 1:
-              this.frameBuffer[pixelPosition] = this.gbcBGPalette[palette | tile[tileYLine]];
-          }
-        }
-      }
-    }
-  }
-}
-GameBoyCore.prototype.SpriteGBLayerRender = function (scanlineToRender) {
-  if (this.gfxSpriteShow) {                    //Are sprites enabled?
-    var lineAdjusted = scanlineToRender + 0x10;
-    var OAMAddress = 0xFE00;
-    var yoffset = 0;
-    var xcoord = 1;
-    var xCoordStart = 0;
-    var xCoordEnd = 0;
-    var attrCode = 0;
-    var palette = 0;
-    var tile = null;
-    var data = 0;
-    var spriteCount = 0;
-    var length = 0;
-    var currentPixel = 0;
-    var linePixel = 0;
-    //Clear our x-coord sort buffer:
-    while (xcoord < 168) {
-      this.sortBuffer[xcoord++] = 0xFF;
-    }
-    if (this.gfxSpriteNormalHeight) {
-      //Draw the visible sprites:
-      for (var length = this.findLowestSpriteDrawable(lineAdjusted, 0x7); spriteCount < length; ++spriteCount) {
-        OAMAddress = this.OAMAddressCache[spriteCount];
-        yoffset = (lineAdjusted - this.memory[OAMAddress]) << 3;
-        attrCode = this.memory[OAMAddress | 3];
-        palette = (attrCode & 0x10) >> 2;
-        tile = this.tileCache[((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2]];
-        linePixel = xCoordStart = this.memory[OAMAddress | 1];
-        xCoordEnd = Math.min(168 - linePixel, 8);
-        xcoord = (linePixel > 7) ? 0 : (8 - linePixel);
-        for (currentPixel = this.pixelStart + ((linePixel > 8) ? (linePixel - 8) : 0); xcoord < xCoordEnd; ++xcoord, ++currentPixel, ++linePixel) {
-          if (this.sortBuffer[linePixel] > xCoordStart) {
-            if (this.frameBuffer[currentPixel] >= 0x2000000) {
-              data = tile[yoffset | xcoord];
-              if (data > 0) {
-                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
-                this.sortBuffer[linePixel] = xCoordStart;
-              }
-            }
-            else if (this.frameBuffer[currentPixel] < 0x1000000) {
-              data = tile[yoffset | xcoord];
-              if (data > 0 && attrCode < 0x80) {
-                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
-                this.sortBuffer[linePixel] = xCoordStart;
-              }
-            }
-          }
-        }
-      }
-    }
-    else {
-      //Draw the visible sprites:
-      for (var length = this.findLowestSpriteDrawable(lineAdjusted, 0xF); spriteCount < length; ++spriteCount) {
-        OAMAddress = this.OAMAddressCache[spriteCount];
-        yoffset = (lineAdjusted - this.memory[OAMAddress]) << 3;
-        attrCode = this.memory[OAMAddress | 3];
-        palette = (attrCode & 0x10) >> 2;
-        if ((attrCode & 0x40) == (0x40 & yoffset)) {
-          tile = this.tileCache[((attrCode & 0x60) << 4) | (this.memory[OAMAddress | 0x2] & 0xFE)];
-        }
-        else {
-          tile = this.tileCache[((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2] | 1];
-        }
-        yoffset &= 0x3F;
-        linePixel = xCoordStart = this.memory[OAMAddress | 1];
-        xCoordEnd = Math.min(168 - linePixel, 8);
-        xcoord = (linePixel > 7) ? 0 : (8 - linePixel);
-        for (currentPixel = this.pixelStart + ((linePixel > 8) ? (linePixel - 8) : 0); xcoord < xCoordEnd; ++xcoord, ++currentPixel, ++linePixel) {
-          if (this.sortBuffer[linePixel] > xCoordStart) {
-            if (this.frameBuffer[currentPixel] >= 0x2000000) {
-              data = tile[yoffset | xcoord];
-              if (data > 0) {
-                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
-                this.sortBuffer[linePixel] = xCoordStart;
-              }
-            }
-            else if (this.frameBuffer[currentPixel] < 0x1000000) {
-              data = tile[yoffset | xcoord];
-              if (data > 0 && attrCode < 0x80) {
-                this.frameBuffer[currentPixel] = this.OBJPalette[palette | data];
-                this.sortBuffer[linePixel] = xCoordStart;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
-GameBoyCore.prototype.findLowestSpriteDrawable = function (scanlineToRender, drawableRange) {
-  var address = 0xFE00;
-  var spriteCount = 0;
-  var diff = 0;
-  while (address < 0xFEA0 && spriteCount < 10) {
-    diff = scanlineToRender - this.memory[address];
-    if ((diff & drawableRange) == diff) {
-      this.OAMAddressCache[spriteCount++] = address;
-    }
-    address += 4;
-  }
-  return spriteCount;
-}
-GameBoyCore.prototype.SpriteGBCLayerRender = function (scanlineToRender) {
-  if (this.gfxSpriteShow) {                    //Are sprites enabled?
-    var OAMAddress = 0xFE00;
-    var lineAdjusted = scanlineToRender + 0x10;
-    var yoffset = 0;
-    var xcoord = 0;
-    var endX = 0;
-    var xCounter = 0;
-    var attrCode = 0;
-    var palette = 0;
-    var tile = null;
-    var data = 0;
-    var currentPixel = 0;
-    var spriteCount = 0;
-    if (this.gfxSpriteNormalHeight) {
-      for (; OAMAddress < 0xFEA0 && spriteCount < 10; OAMAddress += 4) {
-        yoffset = lineAdjusted - this.memory[OAMAddress];
-        if ((yoffset & 0x7) == yoffset) {
-          xcoord = this.memory[OAMAddress | 1] - 8;
-          endX = Math.min(160, xcoord + 8);
-          attrCode = this.memory[OAMAddress | 3];
-          palette = (attrCode & 7) << 2;
-          tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | this.memory[OAMAddress | 2]];
-          xCounter = (xcoord > 0) ? xcoord : 0;
-          xcoord -= yoffset << 3;
-          for (currentPixel = this.pixelStart + xCounter; xCounter < endX; ++xCounter, ++currentPixel) {
-            if (this.frameBuffer[currentPixel] >= 0x2000000) {
-              data = tile[xCounter - xcoord];
-              if (data > 0) {
-                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
-              }
-            }
-            else if (this.frameBuffer[currentPixel] < 0x1000000) {
-              data = tile[xCounter - xcoord];
-              if (data > 0 && attrCode < 0x80) {    //Don't optimize for attrCode, as LICM-capable JITs should optimize its checks.
-                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
-              }
-            }
-          }
-          ++spriteCount;
-        }
-      }
-    }
-    else {
-      for (; OAMAddress < 0xFEA0 && spriteCount < 10; OAMAddress += 4) {
-        yoffset = lineAdjusted - this.memory[OAMAddress];
-        if ((yoffset & 0xF) == yoffset) {
-          xcoord = this.memory[OAMAddress | 1] - 8;
-          endX = Math.min(160, xcoord + 8);
-          attrCode = this.memory[OAMAddress | 3];
-          palette = (attrCode & 7) << 2;
-          if ((attrCode & 0x40) == (0x40 & (yoffset << 3))) {
-            tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | (this.memory[OAMAddress | 0x2] & 0xFE)];
-          }
-          else {
-            tile = this.tileCache[((attrCode & 0x08) << 8) | ((attrCode & 0x60) << 4) | this.memory[OAMAddress | 0x2] | 1];
-          }
-          xCounter = (xcoord > 0) ? xcoord : 0;
-          xcoord -= (yoffset & 0x7) << 3;
-          for (currentPixel = this.pixelStart + xCounter; xCounter < endX; ++xCounter, ++currentPixel) {
-            if (this.frameBuffer[currentPixel] >= 0x2000000) {
-              data = tile[xCounter - xcoord];
-              if (data > 0) {
-                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
-              }
-            }
-            else if (this.frameBuffer[currentPixel] < 0x1000000) {
-              data = tile[xCounter - xcoord];
-              if (data > 0 && attrCode < 0x80) {    //Don't optimize for attrCode, as LICM-capable JITs should optimize its checks.
-                this.frameBuffer[currentPixel] = this.gbcOBJPalette[palette | data];
-              }
-            }
-          }
-          ++spriteCount;
-        }
-      }
-    }
-  }
-}
-//Generate only a single tile line for the GB tile cache mode:
-GameBoyCore.prototype.generateGBTileLine = function (address) {
-  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
-  var tileBlock = this.tileCache[(address & 0x1FF0) >> 4];
-  address = (address & 0xE) << 2;
-  tileBlock[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-  tileBlock[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-  tileBlock[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-  tileBlock[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-  tileBlock[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-  tileBlock[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-  tileBlock[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-  tileBlock[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-}
-//Generate only a single tile line for the GBC tile cache mode (Bank 1):
-GameBoyCore.prototype.generateGBCTileLineBank1 = function (address) {
-  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
-  address &= 0x1FFE;
-  var tileBlock1 = this.tileCache[address >> 4];
-  var tileBlock2 = this.tileCache[0x200 | (address >> 4)];
-  var tileBlock3 = this.tileCache[0x400 | (address >> 4)];
-  var tileBlock4 = this.tileCache[0x600 | (address >> 4)];
-  address = (address & 0xE) << 2;
-  var addressFlipped = 0x38 - address;
-  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-}
-//Generate all the flip combinations for a full GBC VRAM bank 1 tile:
-GameBoyCore.prototype.generateGBCTileBank1 = function (vramAddress) {
-  var address = vramAddress >> 4;
-  var tileBlock1 = this.tileCache[address];
-  var tileBlock2 = this.tileCache[0x200 | address];
-  var tileBlock3 = this.tileCache[0x400 | address];
-  var tileBlock4 = this.tileCache[0x600 | address];
-  var lineCopy = 0;
-  vramAddress |= 0x8000;
-  address = 0;
-  var addressFlipped = 56;
-  do {
-    lineCopy = (this.memory[0x1 | vramAddress] << 8) | this.memory[vramAddress];
-    tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-    tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-    tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-    tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-    tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-    tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-    tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-    tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-    address += 8;
-    addressFlipped -= 8;
-    vramAddress += 2;
-  } while (addressFlipped > -1);
-}
-//Generate only a single tile line for the GBC tile cache mode (Bank 2):
-GameBoyCore.prototype.generateGBCTileLineBank2 = function (address) {
-  var lineCopy = (this.VRAM[0x1 | address] << 8) | this.VRAM[0x1FFE & address];
-  var tileBlock1 = this.tileCache[0x800 | (address >> 4)];
-  var tileBlock2 = this.tileCache[0xA00 | (address >> 4)];
-  var tileBlock3 = this.tileCache[0xC00 | (address >> 4)];
-  var tileBlock4 = this.tileCache[0xE00 | (address >> 4)];
-  address = (address & 0xE) << 2;
-  var addressFlipped = 0x38 - address;
-  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-}
-//Generate all the flip combinations for a full GBC VRAM bank 2 tile:
-GameBoyCore.prototype.generateGBCTileBank2 = function (vramAddress) {
-  var address = vramAddress >> 4;
-  var tileBlock1 = this.tileCache[0x800 | address];
-  var tileBlock2 = this.tileCache[0xA00 | address];
-  var tileBlock3 = this.tileCache[0xC00 | address];
-  var tileBlock4 = this.tileCache[0xE00 | address];
-  var lineCopy = 0;
-  address = 0;
-  var addressFlipped = 56;
-  do {
-    lineCopy = (this.VRAM[0x1 | vramAddress] << 8) | this.VRAM[vramAddress];
-    tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-    tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-    tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-    tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-    tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-    tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-    tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-    tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-    address += 8;
-    addressFlipped -= 8;
-    vramAddress += 2;
-  } while (addressFlipped > -1);
-}
-//Generate only a single tile line for the GB tile cache mode (OAM accessible range):
-GameBoyCore.prototype.generateGBOAMTileLine = function (address) {
-  var lineCopy = (this.memory[0x1 | address] << 8) | this.memory[0x9FFE & address];
-  address &= 0x1FFE;
-  var tileBlock1 = this.tileCache[address >> 4];
-  var tileBlock2 = this.tileCache[0x200 | (address >> 4)];
-  var tileBlock3 = this.tileCache[0x400 | (address >> 4)];
-  var tileBlock4 = this.tileCache[0x600 | (address >> 4)];
-  address = (address & 0xE) << 2;
-  var addressFlipped = 0x38 - address;
-  tileBlock4[addressFlipped] = tileBlock2[address] = tileBlock3[addressFlipped | 7] = tileBlock1[address | 7] = ((lineCopy & 0x100) >> 7) | (lineCopy & 0x1);
-  tileBlock4[addressFlipped | 1] = tileBlock2[address | 1] = tileBlock3[addressFlipped | 6] = tileBlock1[address | 6] = ((lineCopy & 0x200) >> 8) | ((lineCopy & 0x2) >> 1);
-  tileBlock4[addressFlipped | 2] = tileBlock2[address | 2] = tileBlock3[addressFlipped | 5] = tileBlock1[address | 5] = ((lineCopy & 0x400) >> 9) | ((lineCopy & 0x4) >> 2);
-  tileBlock4[addressFlipped | 3] = tileBlock2[address | 3] = tileBlock3[addressFlipped | 4] = tileBlock1[address | 4] = ((lineCopy & 0x800) >> 10) | ((lineCopy & 0x8) >> 3);
-  tileBlock4[addressFlipped | 4] = tileBlock2[address | 4] = tileBlock3[addressFlipped | 3] = tileBlock1[address | 3] = ((lineCopy & 0x1000) >> 11) | ((lineCopy & 0x10) >> 4);
-  tileBlock4[addressFlipped | 5] = tileBlock2[address | 5] = tileBlock3[addressFlipped | 2] = tileBlock1[address | 2] = ((lineCopy & 0x2000) >> 12) | ((lineCopy & 0x20) >> 5);
-  tileBlock4[addressFlipped | 6] = tileBlock2[address | 6] = tileBlock3[addressFlipped | 1] = tileBlock1[address | 1] = ((lineCopy & 0x4000) >> 13) | ((lineCopy & 0x40) >> 6);
-  tileBlock4[addressFlipped | 7] = tileBlock2[address | 7] = tileBlock3[addressFlipped] = tileBlock1[address] = ((lineCopy & 0x8000) >> 14) | ((lineCopy & 0x80) >> 7);
-}
-GameBoyCore.prototype.graphicsJIT = function () {
-  if (this.LCDisOn) {
-    this.totalLinesPassed = 0;      //Mark frame for ensuring a JIT pass for the next framebuffer output.
-    this.graphicsJITScanlineGroup();
-  }
-}
-GameBoyCore.prototype.graphicsJITVBlank = function () {
-  //JIT the graphics to v-blank framing:
-  this.totalLinesPassed += this.queuedScanLines;
-  this.graphicsJITScanlineGroup();
-}
-GameBoyCore.prototype.graphicsJITScanlineGroup = function () {
-  //Normal rendering JIT, where we try to do groups of scanlines at once:
-  while (this.queuedScanLines > 0) {
-    this.renderScanLine(this.lastUnrenderedLine);
-    if (this.lastUnrenderedLine < 143) {
-      ++this.lastUnrenderedLine;
-    }
-    else {
-      this.lastUnrenderedLine = 0;
-    }
-    --this.queuedScanLines;
-  }
-}
-GameBoyCore.prototype.incrementScanLineQueue = function () {
-  if (this.queuedScanLines < 144) {
-    ++this.queuedScanLines;
-  }
-  else {
-    this.currentX = 0;
-    this.midScanlineOffset = -1;
-    if (this.lastUnrenderedLine < 143) {
-      ++this.lastUnrenderedLine;
-    }
-    else {
-      this.lastUnrenderedLine = 0;
-    }
-  }
-}
-GameBoyCore.prototype.midScanLineJIT = function () {
-  this.graphicsJIT();
-  this.renderMidScanLine();
-}
-//Check for the highest priority IRQ to fire:
-GameBoyCore.prototype.launchIRQ = function () {
-  var bitShift = 0;
-  var testbit = 1;
-  do {
-    //Check to see if an interrupt is enabled AND requested.
-    if ((testbit & this.IRQLineMatched) == testbit) {
-      this.IME = false;            //Reset the interrupt enabling.
-      this.interruptsRequested -= testbit;  //Reset the interrupt request.
-      this.IRQLineMatched = 0;        //Reset the IRQ assertion.
-      //Interrupts have a certain clock cycle length:
-      this.CPUTicks = 20;
-      //Set the stack pointer to the current program counter value:
-      this.stackPointer = (this.stackPointer - 1) & 0xFFFF;
-      this.memoryWriter[this.stackPointer](this, this.stackPointer, this.programCounter >> 8);
-      this.stackPointer = (this.stackPointer - 1) & 0xFFFF;
-      this.memoryWriter[this.stackPointer](this, this.stackPointer, this.programCounter & 0xFF);
-      //Set the program counter to the interrupt's address:
-      this.programCounter = 0x40 | (bitShift << 3);
-      //Clock the core for mid-instruction updates:
-      this.updateCore();
-      return;                  //We only want the highest priority interrupt.
-    }
-    testbit = 1 << ++bitShift;
-  } while (bitShift < 5);
-}
-/*
-  Check for IRQs to be fired while not in HALT:
-*/
-GameBoyCore.prototype.checkIRQMatching = function () {
-  if (this.IME) {
-    this.IRQLineMatched = this.interruptsEnabled & this.interruptsRequested & 0x1F;
-  }
-}
-/*
-  Handle the HALT opcode by predicting all IRQ cases correctly,
-  then selecting the next closest IRQ firing from the prediction to
-  clock up to. This prevents hacky looping that doesn't predict, but
-  instead just clocks through the core update procedure by one which
-  is very slow. Not many emulators do this because they have to cover
-  all the IRQ prediction cases and they usually get them wrong.
-*/
-GameBoyCore.prototype.calculateHALTPeriod = function () {
-  //Initialize our variables and start our prediction:
-  if (!this.halt) {
-    this.halt = true;
-    var currentClocks = -1;
-    var temp_var = 0;
-    if (this.LCDisOn) {
-      //If the LCD is enabled, then predict the LCD IRQs enabled:
-      if ((this.interruptsEnabled & 0x1) == 0x1) {
-        currentClocks = ((456 * (((this.modeSTAT == 1) ? 298 : 144) - this.actualScanLine)) - this.LCDTicks) << this.doubleSpeedShifter;
-      }
-      if ((this.interruptsEnabled & 0x2) == 0x2) {
-        if (this.mode0TriggerSTAT) {
-          temp_var = (this.clocksUntilMode0() - this.LCDTicks) << this.doubleSpeedShifter;
-          if (temp_var <= currentClocks || currentClocks == -1) {
-            currentClocks = temp_var;
-          }
-        }
-        if (this.mode1TriggerSTAT && (this.interruptsEnabled & 0x1) == 0) {
-          temp_var = ((456 * (((this.modeSTAT == 1) ? 298 : 144) - this.actualScanLine)) - this.LCDTicks) << this.doubleSpeedShifter;
-          if (temp_var <= currentClocks || currentClocks == -1) {
-            currentClocks = temp_var;
-          }
-        }
-        if (this.mode2TriggerSTAT) {
-          temp_var = (((this.actualScanLine >= 143) ? (456 * (154 - this.actualScanLine)) : 456) - this.LCDTicks) << this.doubleSpeedShifter;
-          if (temp_var <= currentClocks || currentClocks == -1) {
-            currentClocks = temp_var;
-          }
-        }
-        if (this.LYCMatchTriggerSTAT && this.memory[0xFF45] <= 153) {
-          temp_var = (this.clocksUntilLYCMatch() - this.LCDTicks) << this.doubleSpeedShifter;
-          if (temp_var <= currentClocks || currentClocks == -1) {
-            currentClocks = temp_var;
-          }
-        }
-      }
-    }
-    if (this.TIMAEnabled && (this.interruptsEnabled & 0x4) == 0x4) {
-      //CPU timer IRQ prediction:
-      temp_var = ((0x100 - this.memory[0xFF05]) * this.TACClocker) - this.timerTicks;
-      if (temp_var <= currentClocks || currentClocks == -1) {
-        currentClocks = temp_var;
-      }
-    }
-    if (this.serialTimer > 0 && (this.interruptsEnabled & 0x8) == 0x8) {
-      //Serial IRQ prediction:
-      if (this.serialTimer <= currentClocks || currentClocks == -1) {
-        currentClocks = this.serialTimer;
-      }
-    }
-  }
-  else {
-    var currentClocks = this.remainingClocks;
-  }
-  var maxClocks = (this.CPUCyclesTotal - this.emulatorTicks) << this.doubleSpeedShifter;
-  if (currentClocks >= 0) {
-    if (currentClocks <= maxClocks) {
-      //Exit out of HALT normally:
-      this.CPUTicks = Math.max(currentClocks, this.CPUTicks);
-      this.updateCoreFull();
-      this.halt = false;
-      this.CPUTicks = 0;
-    }
-    else {
-      //Still in HALT, clock only up to the clocks specified per iteration:
-      this.CPUTicks = Math.max(maxClocks, this.CPUTicks);
-      this.remainingClocks = currentClocks - this.CPUTicks;
-    }
-  }
-  else {
-    //Still in HALT, clock only up to the clocks specified per iteration:
-    //Will stay in HALT forever (Stuck in HALT forever), but the APU and LCD are still clocked, so don't pause:
-    this.CPUTicks += maxClocks;
-  }
-}
-//Memory Reading:
-GameBoyCore.prototype.memoryRead = function (address) {
-  //Act as a wrapper for reading the returns from the compiled jumps to memory.
-  return this.memoryReader[address](this, address);  //This seems to be faster than the usual if/else.
-}
-GameBoyCore.prototype.memoryHighRead = function (address) {
-  //Act as a wrapper for reading the returns from the compiled jumps to memory.
-  return this.memoryHighReader[address](this, address);  //This seems to be faster than the usual if/else.
-}
-GameBoyCore.prototype.memoryReadJumpCompile = function () {
-  //Faster in some browsers, since we are doing less conditionals overall by implementing them in advance.
-  for (var index = 0x0000; index <= 0xFFFF; index++) {
-    if (index < 0x4000) {
-      this.memoryReader[index] = this.memoryReadNormal;
-    }
-    else if (index < 0x8000) {
-      this.memoryReader[index] = this.memoryReadROM;
-    }
-    else if (index < 0x9800) {
-      this.memoryReader[index] = (this.cGBC) ? this.VRAMDATAReadCGBCPU : this.VRAMDATAReadDMGCPU;
-    }
-    else if (index < 0xA000) {
-      this.memoryReader[index] = (this.cGBC) ? this.VRAMCHRReadCGBCPU : this.VRAMCHRReadDMGCPU;
-    }
-    else if (index >= 0xA000 && index < 0xC000) {
-      if ((this.numRAMBanks == 1 / 16 && index < 0xA200) || this.numRAMBanks >= 1) {
-        if (this.cMBC7) {
-          this.memoryReader[index] = this.memoryReadMBC7;
-        }
-        else if (!this.cMBC3) {
-          this.memoryReader[index] = this.memoryReadMBC;
-        }
-        else {
-          //MBC3 RTC + RAM:
-          this.memoryReader[index] = this.memoryReadMBC3;
-        }
-      }
-      else {
-        this.memoryReader[index] = this.memoryReadBAD;
-      }
-    }
-    else if (index >= 0xC000 && index < 0xE000) {
-      if (!this.cGBC || index < 0xD000) {
-        this.memoryReader[index] = this.memoryReadNormal;
-      }
-      else {
-        this.memoryReader[index] = this.memoryReadGBCMemory;
-      }
-    }
-    else if (index >= 0xE000 && index < 0xFE00) {
-      if (!this.cGBC || index < 0xF000) {
-        this.memoryReader[index] = this.memoryReadECHONormal;
-      }
-      else {
-        this.memoryReader[index] = this.memoryReadECHOGBCMemory;
-      }
-    }
-    else if (index < 0xFEA0) {
-      this.memoryReader[index] = this.memoryReadOAM;
-    }
-    else if (this.cGBC && index >= 0xFEA0 && index < 0xFF00) {
-      this.memoryReader[index] = this.memoryReadNormal;
-    }
-    else if (index >= 0xFF00) {
-      switch (index) {
-        case 0xFF00:
-          //JOYPAD:
-          this.memoryHighReader[0] = this.memoryReader[0xFF00] = function (parentObj, address) {
-            return 0xC0 | parentObj.memory[0xFF00];  //Top nibble returns as set.
-          }
-          break;
-        case 0xFF01:
-          //SB
-          this.memoryHighReader[0x01] = this.memoryReader[0xFF01] = function (parentObj, address) {
-            return (parentObj.memory[0xFF02] < 0x80) ? parentObj.memory[0xFF01] : 0xFF;
-          }
-          break;
-        case 0xFF02:
-          //SC
-          if (this.cGBC) {
-            this.memoryHighReader[0x02] = this.memoryReader[0xFF02] = function (parentObj, address) {
-              return ((parentObj.serialTimer <= 0) ? 0x7C : 0xFC) | parentObj.memory[0xFF02];
-            }
-          }
-          else {
-            this.memoryHighReader[0x02] = this.memoryReader[0xFF02] = function (parentObj, address) {
-              return ((parentObj.serialTimer <= 0) ? 0x7E : 0xFE) | parentObj.memory[0xFF02];
-            }
-          }
-          break;
-        case 0xFF04:
-          //DIV
-          this.memoryHighReader[0x04] = this.memoryReader[0xFF04] = function (parentObj, address) {
-            parentObj.memory[0xFF04] = (parentObj.memory[0xFF04] + (parentObj.DIVTicks >> 8)) & 0xFF;
-            parentObj.DIVTicks &= 0xFF;
-            return parentObj.memory[0xFF04];
-
-          }
-          break;
-        case 0xFF07:
-          this.memoryHighReader[0x07] = this.memoryReader[0xFF07] = function (parentObj, address) {
-            return 0xF8 | parentObj.memory[0xFF07];
-          }
-          break;
-        case 0xFF0F:
-          //IF
-          this.memoryHighReader[0x0F] = this.memoryReader[0xFF0F] = function (parentObj, address) {
-            return 0xE0 | parentObj.interruptsRequested;
-          }
-          break;
-        case 0xFF10:
-          this.memoryHighReader[0x10] = this.memoryReader[0xFF10] = function (parentObj, address) {
-            return 0x80 | parentObj.memory[0xFF10];
-          }
-          break;
-        case 0xFF11:
-          this.memoryHighReader[0x11] = this.memoryReader[0xFF11] = function (parentObj, address) {
-            return 0x3F | parentObj.memory[0xFF11];
-          }
-          break;
-        case 0xFF13:
-          this.memoryHighReader[0x13] = this.memoryReader[0xFF13] = this.memoryReadBAD;
-          break;
-        case 0xFF14:
-          this.memoryHighReader[0x14] = this.memoryReader[0xFF14] = function (parentObj, address) {
-            return 0xBF | parentObj.memory[0xFF14];
-          }
-          break;
-        case 0xFF16:
-          this.memoryHighReader[0x16] = this.memoryReader[0xFF16] = function (parentObj, address) {
-            return 0x3F | parentObj.memory[0xFF16];
-          }
-          break;
-        case 0xFF18:
-          this.memoryHighReader[0x18] = this.memoryReader[0xFF18] = this.memoryReadBAD;
-          break;
-        case 0xFF19:
-          this.memoryHighReader[0x19] = this.memoryReader[0xFF19] = function (parentObj, address) {
-            return 0xBF | parentObj.memory[0xFF19];
-          }
-          break;
-        case 0xFF1A:
-          this.memoryHighReader[0x1A] = this.memoryReader[0xFF1A] = function (parentObj, address) {
-            return 0x7F | parentObj.memory[0xFF1A];
-          }
-          break;
-        case 0xFF1B:
-          this.memoryHighReader[0x1B] = this.memoryReader[0xFF1B] = this.memoryReadBAD;
-          break;
-        case 0xFF1C:
-          this.memoryHighReader[0x1C] = this.memoryReader[0xFF1C] = function (parentObj, address) {
-            return 0x9F | parentObj.memory[0xFF1C];
-          }
-          break;
-        case 0xFF1D:
-          this.memoryHighReader[0x1D] = this.memoryReader[0xFF1D] = function (parentObj, address) {
-            return 0xFF;
-          }
-          break;
-        case 0xFF1E:
-          this.memoryHighReader[0x1E] = this.memoryReader[0xFF1E] = function (parentObj, address) {
-            return 0xBF | parentObj.memory[0xFF1E];
-          }
-          break;
-        case 0xFF1F:
-        case 0xFF20:
-          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = this.memoryReadBAD;
-          break;
-        case 0xFF23:
-          this.memoryHighReader[0x23] = this.memoryReader[0xFF23] = function (parentObj, address) {
-            return 0xBF | parentObj.memory[0xFF23];
-          }
-          break;
-        case 0xFF26:
-          this.memoryHighReader[0x26] = this.memoryReader[0xFF26] = function (parentObj, address) {
-            parentObj.audioJIT();
-            return 0x70 | parentObj.memory[0xFF26];
-          }
-          break;
-        case 0xFF27:
-        case 0xFF28:
-        case 0xFF29:
-        case 0xFF2A:
-        case 0xFF2B:
-        case 0xFF2C:
-        case 0xFF2D:
-        case 0xFF2E:
-        case 0xFF2F:
-          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = this.memoryReadBAD;
-          break;
-        case 0xFF30:
-        case 0xFF31:
-        case 0xFF32:
-        case 0xFF33:
-        case 0xFF34:
-        case 0xFF35:
-        case 0xFF36:
-        case 0xFF37:
-        case 0xFF38:
-        case 0xFF39:
-        case 0xFF3A:
-        case 0xFF3B:
-        case 0xFF3C:
-        case 0xFF3D:
-        case 0xFF3E:
-        case 0xFF3F:
-          this.memoryReader[index] = function (parentObj, address) {
-            return (parentObj.channel3canPlay) ? parentObj.memory[0xFF00 | (parentObj.channel3lastSampleLookup >> 1)] : parentObj.memory[address];
-          }
-          this.memoryHighReader[index & 0xFF] = function (parentObj, address) {
-            return (parentObj.channel3canPlay) ? parentObj.memory[0xFF00 | (parentObj.channel3lastSampleLookup >> 1)] : parentObj.memory[0xFF00 | address];
-          }
-          break;
-        case 0xFF41:
-          this.memoryHighReader[0x41] = this.memoryReader[0xFF41] = function (parentObj, address) {
-            return 0x80 | parentObj.memory[0xFF41] | parentObj.modeSTAT;
-          }
-          break;
-        case 0xFF42:
-          this.memoryHighReader[0x42] = this.memoryReader[0xFF42] = function (parentObj, address) {
-            return parentObj.backgroundY;
-          }
-          break;
-        case 0xFF43:
-          this.memoryHighReader[0x43] = this.memoryReader[0xFF43] = function (parentObj, address) {
-            return parentObj.backgroundX;
-          }
-          break;
-        case 0xFF44:
-          this.memoryHighReader[0x44] = this.memoryReader[0xFF44] = function (parentObj, address) {
-            return ((parentObj.LCDisOn) ? parentObj.memory[0xFF44] : 0);
-          }
-          break;
-        case 0xFF4A:
-          //WY
-          this.memoryHighReader[0x4A] = this.memoryReader[0xFF4A] = function (parentObj, address) {
-            return parentObj.windowY;
-          }
-          break;
-        case 0xFF4F:
-          this.memoryHighReader[0x4F] = this.memoryReader[0xFF4F] = function (parentObj, address) {
-            return parentObj.currVRAMBank;
-          }
-          break;
-        case 0xFF55:
-          if (this.cGBC) {
-            this.memoryHighReader[0x55] = this.memoryReader[0xFF55] = function (parentObj, address) {
-              if (!parentObj.LCDisOn && parentObj.hdmaRunning) {  //Undocumented behavior alert: HDMA becomes GDMA when LCD is off (Worms Armageddon Fix).
-                //DMA
-                parentObj.DMAWrite((parentObj.memory[0xFF55] & 0x7F) + 1);
-                parentObj.memory[0xFF55] = 0xFF;  //Transfer completed.
-                parentObj.hdmaRunning = false;
-              }
-              return parentObj.memory[0xFF55];
-            }
-          }
-          else {
-            this.memoryReader[0xFF55] = this.memoryReadNormal;
-            this.memoryHighReader[0x55] = this.memoryHighReadNormal;
-          }
-          break;
-        case 0xFF56:
-          if (this.cGBC) {
-            this.memoryHighReader[0x56] = this.memoryReader[0xFF56] = function (parentObj, address) {
-              //Return IR "not connected" status:
-              return 0x3C | ((parentObj.memory[0xFF56] >= 0xC0) ? (0x2 | (parentObj.memory[0xFF56] & 0xC1)) : (parentObj.memory[0xFF56] & 0xC3));
-            }
-          }
-          else {
-            this.memoryReader[0xFF56] = this.memoryReadNormal;
-            this.memoryHighReader[0x56] = this.memoryHighReadNormal;
-          }
-          break;
-        case 0xFF6C:
-          if (this.cGBC) {
-            this.memoryHighReader[0x6C] = this.memoryReader[0xFF6C] = function (parentObj, address) {
-              return 0xFE | parentObj.memory[0xFF6C];
-            }
-          }
-          else {
-            this.memoryHighReader[0x6C] = this.memoryReader[0xFF6C] = this.memoryReadBAD;
-          }
-          break;
-        case 0xFF70:
-          if (this.cGBC) {
-            //SVBK
-            this.memoryHighReader[0x70] = this.memoryReader[0xFF70] = function (parentObj, address) {
-              return 0x40 | parentObj.memory[0xFF70];
-            }
-          }
-          else {
-            this.memoryHighReader[0x70] = this.memoryReader[0xFF70] = this.memoryReadBAD;
-          }
-          break;
-        case 0xFF75:
-          this.memoryHighReader[0x75] = this.memoryReader[0xFF75] = function (parentObj, address) {
-            return 0x8F | parentObj.memory[0xFF75];
-          }
-          break;
-        case 0xFF76:
-        case 0xFF77:
-          this.memoryHighReader[index & 0xFF] = this.memoryReader[index] = function (parentObj, address) {
-            return 0;
-          }
-          break;
-        case 0xFFFF:
-          //IE
-          this.memoryHighReader[0xFF] = this.memoryReader[0xFFFF] = function (parentObj, address) {
-            return parentObj.interruptsEnabled;
-          }
-          break;
-        default:
-          this.memoryReader[index] = this.memoryReadNormal;
-          this.memoryHighReader[index & 0xFF] = this.memoryHighReadNormal;
-      }
-    }
-    else {
-      this.memoryReader[index] = this.memoryReadBAD;
-    }
-  }
-}
-GameBoyCore.prototype.memoryReadNormal = function (parentObj, address) {
-  return parentObj.memory[address];
-}
-GameBoyCore.prototype.memoryHighReadNormal = function (parentObj, address) {
-  return parentObj.memory[0xFF00 | address];
-}
-GameBoyCore.prototype.memoryReadROM = function (parentObj, address) {
-  return parentObj.ROM[parentObj.currentROMBank + address];
-}
-GameBoyCore.prototype.memoryReadMBC = function (parentObj, address) {
-  //Switchable RAM
-  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
-    return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
-  }
-  //cout("Reading from disabled RAM.", 1);
-  return 0xFF;
-}
-GameBoyCore.prototype.memoryReadMBC7 = function (parentObj, address) {
-  //Switchable RAM
-  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
-    switch (address) {
-      case 0xA000:
-      case 0xA060:
-      case 0xA070:
-        return 0;
-      case 0xA080:
-        //TODO: Gyro Control Register
-        return 0;
-      case 0xA050:
-        //Y High Byte
-        return parentObj.highY;
-      case 0xA040:
-        //Y Low Byte
-        return parentObj.lowY;
-      case 0xA030:
-        //X High Byte
-        return parentObj.highX;
-      case 0xA020:
-        //X Low Byte:
-        return parentObj.lowX;
-      default:
-        return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
-    }
-  }
-  //cout("Reading from disabled RAM.", 1);
-  return 0xFF;
-}
-GameBoyCore.prototype.memoryReadMBC3 = function (parentObj, address) {
-  //Switchable RAM
-  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
-    switch (parentObj.currMBCRAMBank) {
-      case 0x00:
-      case 0x01:
-      case 0x02:
-      case 0x03:
-        return parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition];
-        break;
-      case 0x08:
-        return parentObj.latchedSeconds;
-        break;
-      case 0x09:
-        return parentObj.latchedMinutes;
-        break;
-      case 0x0A:
-        return parentObj.latchedHours;
-        break;
-      case 0x0B:
-        return parentObj.latchedLDays;
-        break;
-      case 0x0C:
-        return (((parentObj.RTCDayOverFlow) ? 0x80 : 0) + ((parentObj.RTCHALT) ? 0x40 : 0)) + parentObj.latchedHDays;
-    }
-  }
-  //cout("Reading from invalid or disabled RAM.", 1);
-  return 0xFF;
-}
-GameBoyCore.prototype.memoryReadGBCMemory = function (parentObj, address) {
-  return parentObj.GBCMemory[address + parentObj.gbcRamBankPosition];
-}
-GameBoyCore.prototype.memoryReadOAM = function (parentObj, address) {
-  return (parentObj.modeSTAT > 1) ?  0xFF : parentObj.memory[address];
-}
-GameBoyCore.prototype.memoryReadECHOGBCMemory = function (parentObj, address) {
-  return parentObj.GBCMemory[address + parentObj.gbcRamBankPositionECHO];
-}
-GameBoyCore.prototype.memoryReadECHONormal = function (parentObj, address) {
-  return parentObj.memory[address - 0x2000];
-}
-GameBoyCore.prototype.memoryReadBAD = function (parentObj, address) {
-  return 0xFF;
-}
-GameBoyCore.prototype.VRAMDATAReadCGBCPU = function (parentObj, address) {
-  //CPU Side Reading The VRAM (Optimized for GameBoy Color)
-  return (parentObj.modeSTAT > 2) ? 0xFF : ((parentObj.currVRAMBank == 0) ? parentObj.memory[address] : parentObj.VRAM[address & 0x1FFF]);
-}
-GameBoyCore.prototype.VRAMDATAReadDMGCPU = function (parentObj, address) {
-  //CPU Side Reading The VRAM (Optimized for classic GameBoy)
-  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.memory[address];
-}
-GameBoyCore.prototype.VRAMCHRReadCGBCPU = function (parentObj, address) {
-  //CPU Side Reading the Character Data Map:
-  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.BGCHRCurrentBank[address & 0x7FF];
-}
-GameBoyCore.prototype.VRAMCHRReadDMGCPU = function (parentObj, address) {
-  //CPU Side Reading the Character Data Map:
-  return (parentObj.modeSTAT > 2) ? 0xFF : parentObj.BGCHRBank1[address & 0x7FF];
-}
-GameBoyCore.prototype.setCurrentMBC1ROMBank = function () {
-  //Read the cartridge ROM data from RAM memory:
-  switch (this.ROMBank1offs) {
-    case 0x00:
-    case 0x20:
-    case 0x40:
-    case 0x60:
-      //Bank calls for 0x00, 0x20, 0x40, and 0x60 are really for 0x01, 0x21, 0x41, and 0x61.
-      this.currentROMBank = (this.ROMBank1offs % this.ROMBankEdge) << 14;
-      break;
-    default:
-      this.currentROMBank = ((this.ROMBank1offs % this.ROMBankEdge) - 1) << 14;
-  }
-}
-GameBoyCore.prototype.setCurrentMBC2AND3ROMBank = function () {
-  //Read the cartridge ROM data from RAM memory:
-  //Only map bank 0 to bank 1 here (MBC2 is like MBC1, but can only do 16 banks, so only the bank 0 quirk appears for MBC2):
-  this.currentROMBank = Math.max((this.ROMBank1offs % this.ROMBankEdge) - 1, 0) << 14;
-}
-GameBoyCore.prototype.setCurrentMBC5ROMBank = function () {
-  //Read the cartridge ROM data from RAM memory:
-  this.currentROMBank = ((this.ROMBank1offs % this.ROMBankEdge) - 1) << 14;
-}
-//Memory Writing:
-GameBoyCore.prototype.memoryWrite = function (address, data) {
-  //Act as a wrapper for writing by compiled jumps to specific memory writing functions.
-  this.memoryWriter[address](this, address, data);
-}
-//0xFFXX fast path:
-GameBoyCore.prototype.memoryHighWrite = function (address, data) {
-  //Act as a wrapper for writing by compiled jumps to specific memory writing functions.
-  this.memoryHighWriter[address](this, address, data);
-}
-GameBoyCore.prototype.memoryWriteJumpCompile = function () {
-  //Faster in some browsers, since we are doing less conditionals overall by implementing them in advance.
-  for (var index = 0x0000; index <= 0xFFFF; index++) {
-    if (index < 0x8000) {
-      if (this.cMBC1) {
-        if (index < 0x2000) {
-          this.memoryWriter[index] = this.MBCWriteEnable;
-        }
-        else if (index < 0x4000) {
-          this.memoryWriter[index] = this.MBC1WriteROMBank;
-        }
-        else if (index < 0x6000) {
-          this.memoryWriter[index] = this.MBC1WriteRAMBank;
-        }
-        else {
-          this.memoryWriter[index] = this.MBC1WriteType;
-        }
-      }
-      else if (this.cMBC2) {
-        if (index < 0x1000) {
-          this.memoryWriter[index] = this.MBCWriteEnable;
-        }
-        else if (index >= 0x2100 && index < 0x2200) {
-          this.memoryWriter[index] = this.MBC2WriteROMBank;
-        }
-        else {
-          this.memoryWriter[index] = this.cartIgnoreWrite;
-        }
-      }
-      else if (this.cMBC3) {
-        if (index < 0x2000) {
-          this.memoryWriter[index] = this.MBCWriteEnable;
-        }
-        else if (index < 0x4000) {
-          this.memoryWriter[index] = this.MBC3WriteROMBank;
-        }
-        else if (index < 0x6000) {
-          this.memoryWriter[index] = this.MBC3WriteRAMBank;
-        }
-        else {
-          this.memoryWriter[index] = this.MBC3WriteRTCLatch;
-        }
-      }
-      else if (this.cMBC5 || this.cRUMBLE || this.cMBC7) {
-        if (index < 0x2000) {
-          this.memoryWriter[index] = this.MBCWriteEnable;
-        }
-        else if (index < 0x3000) {
-          this.memoryWriter[index] = this.MBC5WriteROMBankLow;
-        }
-        else if (index < 0x4000) {
-          this.memoryWriter[index] = this.MBC5WriteROMBankHigh;
-        }
-        else if (index < 0x6000) {
-          this.memoryWriter[index] = (this.cRUMBLE) ? this.RUMBLEWriteRAMBank : this.MBC5WriteRAMBank;
-        }
-        else {
-          this.memoryWriter[index] = this.cartIgnoreWrite;
-        }
-      }
-      else if (this.cHuC3) {
-        if (index < 0x2000) {
-          this.memoryWriter[index] = this.MBCWriteEnable;
-        }
-        else if (index < 0x4000) {
-          this.memoryWriter[index] = this.MBC3WriteROMBank;
-        }
-        else if (index < 0x6000) {
-          this.memoryWriter[index] = this.HuC3WriteRAMBank;
-        }
-        else {
-          this.memoryWriter[index] = this.cartIgnoreWrite;
-        }
-      }
-      else {
-        this.memoryWriter[index] = this.cartIgnoreWrite;
-      }
-    }
-    else if (index < 0x9000) {
-      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCDATAWrite : this.VRAMGBDATAWrite;
-    }
-    else if (index < 0x9800) {
-      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCDATAWrite : this.VRAMGBDATAUpperWrite;
-    }
-    else if (index < 0xA000) {
-      this.memoryWriter[index] = (this.cGBC) ? this.VRAMGBCCHRMAPWrite : this.VRAMGBCHRMAPWrite;
-    }
-    else if (index < 0xC000) {
-      if ((this.numRAMBanks == 1 / 16 && index < 0xA200) || this.numRAMBanks >= 1) {
-        if (!this.cMBC3) {
-          this.memoryWriter[index] = this.memoryWriteMBCRAM;
-        }
-        else {
-          //MBC3 RTC + RAM:
-          this.memoryWriter[index] = this.memoryWriteMBC3RAM;
-        }
-      }
-      else {
-        this.memoryWriter[index] = this.cartIgnoreWrite;
-      }
-    }
-    else if (index < 0xE000) {
-      if (this.cGBC && index >= 0xD000) {
-        this.memoryWriter[index] = this.memoryWriteGBCRAM;
-      }
-      else {
-        this.memoryWriter[index] = this.memoryWriteNormal;
-      }
-    }
-    else if (index < 0xFE00) {
-      if (this.cGBC && index >= 0xF000) {
-        this.memoryWriter[index] = this.memoryWriteECHOGBCRAM;
-      }
-      else {
-        this.memoryWriter[index] = this.memoryWriteECHONormal;
-      }
-    }
-    else if (index <= 0xFEA0) {
-      this.memoryWriter[index] = this.memoryWriteOAMRAM;
-    }
-    else if (index < 0xFF00) {
-      if (this.cGBC) {                      //Only GBC has access to this RAM.
-        this.memoryWriter[index] = this.memoryWriteNormal;
-      }
-      else {
-        this.memoryWriter[index] = this.cartIgnoreWrite;
-      }
-    }
-    else {
-      //Start the I/O initialization by filling in the slots as normal memory:
-      this.memoryWriter[index] = this.memoryWriteNormal;
-      this.memoryHighWriter[index & 0xFF] = this.memoryHighWriteNormal;
-    }
-  }
-  this.registerWriteJumpCompile();        //Compile the I/O write functions separately...
-}
-GameBoyCore.prototype.MBCWriteEnable = function (parentObj, address, data) {
-  //MBC RAM Bank Enable/Disable:
-  parentObj.MBCRAMBanksEnabled = ((data & 0x0F) == 0x0A);  //If lower nibble is 0x0A, then enable, otherwise disable.
-}
-GameBoyCore.prototype.MBC1WriteROMBank = function (parentObj, address, data) {
-  //MBC1 ROM bank switching:
-  parentObj.ROMBank1offs = (parentObj.ROMBank1offs & 0x60) | (data & 0x1F);
-  parentObj.setCurrentMBC1ROMBank();
-}
-GameBoyCore.prototype.MBC1WriteRAMBank = function (parentObj, address, data) {
-  //MBC1 RAM bank switching
-  if (parentObj.MBC1Mode) {
-    //4/32 Mode
-    parentObj.currMBCRAMBank = data & 0x03;
-    parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
-  }
-  else {
-    //16/8 Mode
-    parentObj.ROMBank1offs = ((data & 0x03) << 5) | (parentObj.ROMBank1offs & 0x1F);
-    parentObj.setCurrentMBC1ROMBank();
-  }
-}
-GameBoyCore.prototype.MBC1WriteType = function (parentObj, address, data) {
-  //MBC1 mode setting:
-  parentObj.MBC1Mode = ((data & 0x1) == 0x1);
-  if (parentObj.MBC1Mode) {
-    parentObj.ROMBank1offs &= 0x1F;
-    parentObj.setCurrentMBC1ROMBank();
-  }
-  else {
-    parentObj.currMBCRAMBank = 0;
-    parentObj.currMBCRAMBankPosition = -0xA000;
-  }
-}
-GameBoyCore.prototype.MBC2WriteROMBank = function (parentObj, address, data) {
-  //MBC2 ROM bank switching:
-  parentObj.ROMBank1offs = data & 0x0F;
-  parentObj.setCurrentMBC2AND3ROMBank();
-}
-GameBoyCore.prototype.MBC3WriteROMBank = function (parentObj, address, data) {
-  //MBC3 ROM bank switching:
-  parentObj.ROMBank1offs = data & 0x7F;
-  parentObj.setCurrentMBC2AND3ROMBank();
-}
-GameBoyCore.prototype.MBC3WriteRAMBank = function (parentObj, address, data) {
-  parentObj.currMBCRAMBank = data;
-  if (data < 4) {
-    //MBC3 RAM bank switching
-    parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
-  }
-}
-GameBoyCore.prototype.MBC3WriteRTCLatch = function (parentObj, address, data) {
-  if (data == 0) {
-    parentObj.RTCisLatched = false;
-  }
-  else if (!parentObj.RTCisLatched) {
-    //Copy over the current RTC time for reading.
-    parentObj.RTCisLatched = true;
-    parentObj.latchedSeconds = parentObj.RTCSeconds | 0;
-    parentObj.latchedMinutes = parentObj.RTCMinutes;
-    parentObj.latchedHours = parentObj.RTCHours;
-    parentObj.latchedLDays = (parentObj.RTCDays & 0xFF);
-    parentObj.latchedHDays = parentObj.RTCDays >> 8;
-  }
-}
-GameBoyCore.prototype.MBC5WriteROMBankLow = function (parentObj, address, data) {
-  //MBC5 ROM bank switching:
-  parentObj.ROMBank1offs = (parentObj.ROMBank1offs & 0x100) | data;
-  parentObj.setCurrentMBC5ROMBank();
-}
-GameBoyCore.prototype.MBC5WriteROMBankHigh = function (parentObj, address, data) {
-  //MBC5 ROM bank switching (by least significant bit):
-  parentObj.ROMBank1offs  = ((data & 0x01) << 8) | (parentObj.ROMBank1offs & 0xFF);
-  parentObj.setCurrentMBC5ROMBank();
-}
-GameBoyCore.prototype.MBC5WriteRAMBank = function (parentObj, address, data) {
-  //MBC5 RAM bank switching
-  parentObj.currMBCRAMBank = data & 0xF;
-  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
-}
-GameBoyCore.prototype.RUMBLEWriteRAMBank = function (parentObj, address, data) {
-  //MBC5 RAM bank switching
-  //Like MBC5, but bit 3 of the lower nibble is used for rumbling and bit 2 is ignored.
-  parentObj.currMBCRAMBank = data & 0x03;
-  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
-}
-GameBoyCore.prototype.HuC3WriteRAMBank = function (parentObj, address, data) {
-  //HuC3 RAM bank switching
-  parentObj.currMBCRAMBank = data & 0x03;
-  parentObj.currMBCRAMBankPosition = (parentObj.currMBCRAMBank << 13) - 0xA000;
-}
-GameBoyCore.prototype.cartIgnoreWrite = function (parentObj, address, data) {
-  //We might have encountered illegal RAM writing or such, so just do nothing...
-}
-GameBoyCore.prototype.memoryWriteNormal = function (parentObj, address, data) {
-  parentObj.memory[address] = data;
-}
-GameBoyCore.prototype.memoryHighWriteNormal = function (parentObj, address, data) {
-  parentObj.memory[0xFF00 | address] = data;
-}
-GameBoyCore.prototype.memoryWriteMBCRAM = function (parentObj, address, data) {
-  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
-    parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition] = data;
-  }
-}
-GameBoyCore.prototype.memoryWriteMBC3RAM = function (parentObj, address, data) {
-  if (parentObj.MBCRAMBanksEnabled || settings[10]) {
-    switch (parentObj.currMBCRAMBank) {
-      case 0x00:
-      case 0x01:
-      case 0x02:
-      case 0x03:
-        parentObj.MBCRam[address + parentObj.currMBCRAMBankPosition] = data;
-        break;
-      case 0x08:
-        if (data < 60) {
-          parentObj.RTCSeconds = data;
-        }
-        else {
-          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
-        }
-        break;
-      case 0x09:
-        if (data < 60) {
-          parentObj.RTCMinutes = data;
-        }
-        else {
-          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
-        }
-        break;
-      case 0x0A:
-        if (data < 24) {
-          parentObj.RTCHours = data;
-        }
-        else {
-          cout("(Bank #" + parentObj.currMBCRAMBank + ") RTC write out of range: " + data, 1);
-        }
-        break;
-      case 0x0B:
-        parentObj.RTCDays = (data & 0xFF) | (parentObj.RTCDays & 0x100);
-        break;
-      case 0x0C:
-        parentObj.RTCDayOverFlow = (data > 0x7F);
-        parentObj.RTCHalt = (data & 0x40) == 0x40;
-        parentObj.RTCDays = ((data & 0x1) << 8) | (parentObj.RTCDays & 0xFF);
-        break;
-      default:
-        cout("Invalid MBC3 bank address selected: " + parentObj.currMBCRAMBank, 0);
-    }
-  }
-}
-GameBoyCore.prototype.memoryWriteGBCRAM = function (parentObj, address, data) {
-  parentObj.GBCMemory[address + parentObj.gbcRamBankPosition] = data;
-}
-GameBoyCore.prototype.memoryWriteOAMRAM = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 2) {    //OAM RAM cannot be written to in mode 2 & 3
-    if (parentObj.memory[address] != data) {
-      parentObj.graphicsJIT();
-      parentObj.memory[address] = data;
-    }
-  }
-}
-GameBoyCore.prototype.memoryWriteECHOGBCRAM = function (parentObj, address, data) {
-  parentObj.GBCMemory[address + parentObj.gbcRamBankPositionECHO] = data;
-}
-GameBoyCore.prototype.memoryWriteECHONormal = function (parentObj, address, data) {
-  parentObj.memory[address - 0x2000] = data;
-}
-GameBoyCore.prototype.VRAMGBDATAWrite = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
-    if (parentObj.memory[address] != data) {
-      //JIT the graphics render queue:
-      parentObj.graphicsJIT();
-      parentObj.memory[address] = data;
-      parentObj.generateGBOAMTileLine(address);
-    }
-  }
-}
-GameBoyCore.prototype.VRAMGBDATAUpperWrite = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
-    if (parentObj.memory[address] != data) {
-      //JIT the graphics render queue:
-      parentObj.graphicsJIT();
-      parentObj.memory[address] = data;
-      parentObj.generateGBTileLine(address);
-    }
-  }
-}
-GameBoyCore.prototype.VRAMGBCDATAWrite = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
-    if (parentObj.currVRAMBank == 0) {
-      if (parentObj.memory[address] != data) {
-        //JIT the graphics render queue:
-        parentObj.graphicsJIT();
-        parentObj.memory[address] = data;
-        parentObj.generateGBCTileLineBank1(address);
-      }
-    }
-    else {
-      address &= 0x1FFF;
-      if (parentObj.VRAM[address] != data) {
-        //JIT the graphics render queue:
-        parentObj.graphicsJIT();
-        parentObj.VRAM[address] = data;
-        parentObj.generateGBCTileLineBank2(address);
-      }
-    }
-  }
-}
-GameBoyCore.prototype.VRAMGBCHRMAPWrite = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
-    address &= 0x7FF;
-    if (parentObj.BGCHRBank1[address] != data) {
-      //JIT the graphics render queue:
-      parentObj.graphicsJIT();
-      parentObj.BGCHRBank1[address] = data;
-    }
-  }
-}
-GameBoyCore.prototype.VRAMGBCCHRMAPWrite = function (parentObj, address, data) {
-  if (parentObj.modeSTAT < 3) {  //VRAM cannot be written to during mode 3
-    address &= 0x7FF;
-    if (parentObj.BGCHRCurrentBank[address] != data) {
-      //JIT the graphics render queue:
-      parentObj.graphicsJIT();
-      parentObj.BGCHRCurrentBank[address] = data;
-    }
-  }
-}
-GameBoyCore.prototype.DMAWrite = function (tilesToTransfer) {
-  if (!this.halt) {
-    //Clock the CPU for the DMA transfer (CPU is halted during the transfer):
-    this.CPUTicks += 4 | ((tilesToTransfer << 5) << this.doubleSpeedShifter);
-  }
-  //Source address of the transfer:
-  var source = (this.memory[0xFF51] << 8) | this.memory[0xFF52];
-  //Destination address in the VRAM memory range:
-  var destination = (this.memory[0xFF53] << 8) | this.memory[0xFF54];
-  //Creating some references:
-  var memoryReader = this.memoryReader;
-  //JIT the graphics render queue:
-  this.graphicsJIT();
-  var memory = this.memory;
-  //Determining which bank we're working on so we can optimize:
-  if (this.currVRAMBank == 0) {
-    //DMA transfer for VRAM bank 0:
-    do {
-      if (destination < 0x1800) {
-        memory[0x8000 | destination] = memoryReader[source](this, source++);
-        memory[0x8001 | destination] = memoryReader[source](this, source++);
-        memory[0x8002 | destination] = memoryReader[source](this, source++);
-        memory[0x8003 | destination] = memoryReader[source](this, source++);
-        memory[0x8004 | destination] = memoryReader[source](this, source++);
-        memory[0x8005 | destination] = memoryReader[source](this, source++);
-        memory[0x8006 | destination] = memoryReader[source](this, source++);
-        memory[0x8007 | destination] = memoryReader[source](this, source++);
-        memory[0x8008 | destination] = memoryReader[source](this, source++);
-        memory[0x8009 | destination] = memoryReader[source](this, source++);
-        memory[0x800A | destination] = memoryReader[source](this, source++);
-        memory[0x800B | destination] = memoryReader[source](this, source++);
-        memory[0x800C | destination] = memoryReader[source](this, source++);
-        memory[0x800D | destination] = memoryReader[source](this, source++);
-        memory[0x800E | destination] = memoryReader[source](this, source++);
-        memory[0x800F | destination] = memoryReader[source](this, source++);
-        this.generateGBCTileBank1(destination);
-        destination += 0x10;
-      }
-      else {
-        destination &= 0x7F0;
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank1[destination++] = memoryReader[source](this, source++);
-        destination = (destination + 0x1800) & 0x1FF0;
-      }
-      source &= 0xFFF0;
-      --tilesToTransfer;
-    } while (tilesToTransfer > 0);
-  }
-  else {
-    var VRAM = this.VRAM;
-    //DMA transfer for VRAM bank 1:
-    do {
-      if (destination < 0x1800) {
-        VRAM[destination] = memoryReader[source](this, source++);
-        VRAM[destination | 0x1] = memoryReader[source](this, source++);
-        VRAM[destination | 0x2] = memoryReader[source](this, source++);
-        VRAM[destination | 0x3] = memoryReader[source](this, source++);
-        VRAM[destination | 0x4] = memoryReader[source](this, source++);
-        VRAM[destination | 0x5] = memoryReader[source](this, source++);
-        VRAM[destination | 0x6] = memoryReader[source](this, source++);
-        VRAM[destination | 0x7] = memoryReader[source](this, source++);
-        VRAM[destination | 0x8] = memoryReader[source](this, source++);
-        VRAM[destination | 0x9] = memoryReader[source](this, source++);
-        VRAM[destination | 0xA] = memoryReader[source](this, source++);
-        VRAM[destination | 0xB] = memoryReader[source](this, source++);
-        VRAM[destination | 0xC] = memoryReader[source](this, source++);
-        VRAM[destination | 0xD] = memoryReader[source](this, source++);
-        VRAM[destination | 0xE] = memoryReader[source](this, source++);
-        VRAM[destination | 0xF] = memoryReader[source](this, source++);
-        this.generateGBCTileBank2(destination);
-        destination += 0x10;
-      }
-      else {
-        destination &= 0x7F0;
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        this.BGCHRBank2[destination++] = memoryReader[source](this, source++);
-        destination = (destination + 0x1800) & 0x1FF0;
-      }
-      source &= 0xFFF0;
-      --tilesToTransfer;
-    } while (tilesToTransfer > 0);
-  }
-  //Update the HDMA registers to their next addresses:
-  memory[0xFF51] = source >> 8;
-  memory[0xFF52] = source & 0xF0;
-  memory[0xFF53] = destination >> 8;
-  memory[0xFF54] = destination & 0xF0;
-}
-GameBoyCore.prototype.registerWriteJumpCompile = function () {
-  //I/O Registers (GB + GBC):
-  //JoyPad
-  this.memoryHighWriter[0] = this.memoryWriter[0xFF00] = function (parentObj, address, data) {
-    parentObj.memory[0xFF00] = (data & 0x30) | ((((data & 0x20) == 0) ? (parentObj.JoyPad >> 4) : 0xF) & (((data & 0x10) == 0) ? (parentObj.JoyPad & 0xF) : 0xF));
-  }
-  //SB (Serial Transfer Data)
-  this.memoryHighWriter[0x1] = this.memoryWriter[0xFF01] = function (parentObj, address, data) {
-    if (parentObj.memory[0xFF02] < 0x80) {  //Cannot write while a serial transfer is active.
-      parentObj.memory[0xFF01] = data;
-    }
-  }
-  //DIV
-  this.memoryHighWriter[0x4] = this.memoryWriter[0xFF04] = function (parentObj, address, data) {
-    parentObj.DIVTicks &= 0xFF;  //Update DIV for realignment.
-    parentObj.memory[0xFF04] = 0;
-  }
-  //TIMA
-  this.memoryHighWriter[0x5] = this.memoryWriter[0xFF05] = function (parentObj, address, data) {
-    parentObj.memory[0xFF05] = data;
-  }
-  //TMA
-  this.memoryHighWriter[0x6] = this.memoryWriter[0xFF06] = function (parentObj, address, data) {
-    parentObj.memory[0xFF06] = data;
-  }
-  //TAC
-  this.memoryHighWriter[0x7] = this.memoryWriter[0xFF07] = function (parentObj, address, data) {
-    parentObj.memory[0xFF07] = data & 0x07;
-    parentObj.TIMAEnabled = (data & 0x04) == 0x04;
-    parentObj.TACClocker = Math.pow(4, ((data & 0x3) != 0) ? (data & 0x3) : 4) << 2;  //TODO: Find a way to not make a conditional in here...
-  }
-  //IF (Interrupt Request)
-  this.memoryHighWriter[0xF] = this.memoryWriter[0xFF0F] = function (parentObj, address, data) {
-    parentObj.interruptsRequested = data;
-    parentObj.checkIRQMatching();
-  }
-  this.memoryHighWriter[0x10] = this.memoryWriter[0xFF10] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (parentObj.channel1decreaseSweep && (data & 0x08) == 0) {
-        if (parentObj.channel1numSweep != parentObj.channel1frequencySweepDivider) {
-          parentObj.channel1SweepFault = true;
-        }
-      }
-      parentObj.channel1lastTimeSweep = (data & 0x70) >> 4;
-      parentObj.channel1frequencySweepDivider = data & 0x07;
-      parentObj.channel1decreaseSweep = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF10] = data;
-      parentObj.channel1EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x11] = this.memoryWriter[0xFF11] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
-      if (parentObj.soundMasterEnabled) {
-        parentObj.audioJIT();
-      }
-      else {
-        data &= 0x3F;
-      }
-      parentObj.channel1CachedDuty = parentObj.dutyLookup[data >> 6];
-      parentObj.channel1totalLength = 0x40 - (data & 0x3F);
-      parentObj.memory[0xFF11] = data & 0xC0;
-      parentObj.channel1EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x12] = this.memoryWriter[0xFF12] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (parentObj.channel1Enabled && parentObj.channel1envelopeSweeps == 0) {
-        //Zombie Volume PAPU Bug:
-        if (((parentObj.memory[0xFF12] ^ data) & 0x8) == 0x8) {
-          if ((parentObj.memory[0xFF12] & 0x8) == 0) {
-            if ((parentObj.memory[0xFF12] & 0x7) == 0x7) {
-              parentObj.channel1envelopeVolume += 2;
-            }
-            else {
-              ++parentObj.channel1envelopeVolume;
-            }
-          }
-          parentObj.channel1envelopeVolume = (16 - parentObj.channel1envelopeVolume) & 0xF;
-        }
-        else if ((parentObj.memory[0xFF12] & 0xF) == 0x8) {
-          parentObj.channel1envelopeVolume = (1 + parentObj.channel1envelopeVolume) & 0xF;
-        }
-        parentObj.channel1OutputLevelCache();
-      }
-      parentObj.channel1envelopeType = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF12] = data;
-      parentObj.channel1VolumeEnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x13] = this.memoryWriter[0xFF13] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.channel1frequency = (parentObj.channel1frequency & 0x700) | data;
-      parentObj.channel1FrequencyTracker = (0x800 - parentObj.channel1frequency) << 2;
-      parentObj.memory[0xFF13] = data;
-    }
-  }
-  this.memoryHighWriter[0x14] = this.memoryWriter[0xFF14] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.channel1consecutive = ((data & 0x40) == 0x0);
-      parentObj.channel1frequency = ((data & 0x7) << 8) | (parentObj.channel1frequency & 0xFF);
-      parentObj.channel1FrequencyTracker = (0x800 - parentObj.channel1frequency) << 2;
-      if (data > 0x7F) {
-        //Reload 0xFF10:
-        parentObj.channel1timeSweep = parentObj.channel1lastTimeSweep;
-        parentObj.channel1numSweep = parentObj.channel1frequencySweepDivider;
-        //Reload 0xFF12:
-        var nr12 = parentObj.memory[0xFF12];
-        parentObj.channel1envelopeVolume = nr12 >> 4;
-        parentObj.channel1OutputLevelCache();
-        parentObj.channel1envelopeSweepsLast = (nr12 & 0x7) - 1;
-        if (parentObj.channel1totalLength == 0) {
-          parentObj.channel1totalLength = 0x40;
-        }
-        if (parentObj.channel1lastTimeSweep > 0 || parentObj.channel1frequencySweepDivider > 0) {
-          parentObj.memory[0xFF26] |= 0x1;
-        }
-        else {
-          parentObj.memory[0xFF26] &= 0xFE;
-        }
-        if ((data & 0x40) == 0x40) {
-          parentObj.memory[0xFF26] |= 0x1;
-        }
-        parentObj.channel1ShadowFrequency = parentObj.channel1frequency;
-        //Reset frequency overflow check + frequency sweep type check:
-        parentObj.channel1SweepFault = false;
-        //Supposed to run immediately:
-        parentObj.runAudioSweep();
-      }
-      parentObj.channel1EnableCheck();
-      parentObj.memory[0xFF14] = data & 0x40;
-    }
-  }
-  this.memoryHighWriter[0x16] = this.memoryWriter[0xFF16] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
-      if (parentObj.soundMasterEnabled) {
-        parentObj.audioJIT();
-      }
-      else {
-        data &= 0x3F;
-      }
-      parentObj.channel2CachedDuty = parentObj.dutyLookup[data >> 6];
-      parentObj.channel2totalLength = 0x40 - (data & 0x3F);
-      parentObj.memory[0xFF16] = data & 0xC0;
-      parentObj.channel2EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x17] = this.memoryWriter[0xFF17] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (parentObj.channel2Enabled && parentObj.channel2envelopeSweeps == 0) {
-        //Zombie Volume PAPU Bug:
-        if (((parentObj.memory[0xFF17] ^ data) & 0x8) == 0x8) {
-          if ((parentObj.memory[0xFF17] & 0x8) == 0) {
-            if ((parentObj.memory[0xFF17] & 0x7) == 0x7) {
-              parentObj.channel2envelopeVolume += 2;
-            }
-            else {
-              ++parentObj.channel2envelopeVolume;
-            }
-          }
-          parentObj.channel2envelopeVolume = (16 - parentObj.channel2envelopeVolume) & 0xF;
-        }
-        else if ((parentObj.memory[0xFF17] & 0xF) == 0x8) {
-          parentObj.channel2envelopeVolume = (1 + parentObj.channel2envelopeVolume) & 0xF;
-        }
-        parentObj.channel2OutputLevelCache();
-      }
-      parentObj.channel2envelopeType = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF17] = data;
-      parentObj.channel2VolumeEnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x18] = this.memoryWriter[0xFF18] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.channel2frequency = (parentObj.channel2frequency & 0x700) | data;
-      parentObj.channel2FrequencyTracker = (0x800 - parentObj.channel2frequency) << 2;
-      parentObj.memory[0xFF18] = data;
-    }
-  }
-  this.memoryHighWriter[0x19] = this.memoryWriter[0xFF19] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (data > 0x7F) {
-        //Reload 0xFF17:
-        var nr22 = parentObj.memory[0xFF17];
-        parentObj.channel2envelopeVolume = nr22 >> 4;
-        parentObj.channel2OutputLevelCache();
-        parentObj.channel2envelopeSweepsLast = (nr22 & 0x7) - 1;
-        if (parentObj.channel2totalLength == 0) {
-          parentObj.channel2totalLength = 0x40;
-        }
-        if ((data & 0x40) == 0x40) {
-          parentObj.memory[0xFF26] |= 0x2;
-        }
-      }
-      parentObj.channel2consecutive = ((data & 0x40) == 0x0);
-      parentObj.channel2frequency = ((data & 0x7) << 8) | (parentObj.channel2frequency & 0xFF);
-      parentObj.channel2FrequencyTracker = (0x800 - parentObj.channel2frequency) << 2;
-      parentObj.memory[0xFF19] = data & 0x40;
-      parentObj.channel2EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x1A] = this.memoryWriter[0xFF1A] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (!parentObj.channel3canPlay && data >= 0x80) {
-        parentObj.channel3lastSampleLookup = 0;
-        parentObj.channel3UpdateCache();
-      }
-      parentObj.channel3canPlay = (data > 0x7F);
-      if (parentObj.channel3canPlay && parentObj.memory[0xFF1A] > 0x7F && !parentObj.channel3consecutive) {
-        parentObj.memory[0xFF26] |= 0x4;
-      }
-      parentObj.memory[0xFF1A] = data & 0x80;
-      //parentObj.channel3EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x1B] = this.memoryWriter[0xFF1B] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
-      if (parentObj.soundMasterEnabled) {
-        parentObj.audioJIT();
-      }
-      parentObj.channel3totalLength = 0x100 - data;
-      parentObj.memory[0xFF1B] = data;
-      parentObj.channel3EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x1C] = this.memoryWriter[0xFF1C] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      data &= 0x60;
-      parentObj.memory[0xFF1C] = data;
-      parentObj.channel3patternType = (data == 0) ? 4 : ((data >> 5) - 1);
-    }
-  }
-  this.memoryHighWriter[0x1D] = this.memoryWriter[0xFF1D] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.channel3frequency = (parentObj.channel3frequency & 0x700) | data;
-      parentObj.channel3FrequencyPeriod = (0x800 - parentObj.channel3frequency) << 1;
-      parentObj.memory[0xFF1D] = data;
-    }
-  }
-  this.memoryHighWriter[0x1E] = this.memoryWriter[0xFF1E] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (data > 0x7F) {
-        if (parentObj.channel3totalLength == 0) {
-          parentObj.channel3totalLength = 0x100;
-        }
-        parentObj.channel3lastSampleLookup = 0;
-        if ((data & 0x40) == 0x40) {
-          parentObj.memory[0xFF26] |= 0x4;
-        }
-      }
-      parentObj.channel3consecutive = ((data & 0x40) == 0x0);
-      parentObj.channel3frequency = ((data & 0x7) << 8) | (parentObj.channel3frequency & 0xFF);
-      parentObj.channel3FrequencyPeriod = (0x800 - parentObj.channel3frequency) << 1;
-      parentObj.memory[0xFF1E] = data & 0x40;
-      parentObj.channel3EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x20] = this.memoryWriter[0xFF20] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled || !parentObj.cGBC) {
-      if (parentObj.soundMasterEnabled) {
-        parentObj.audioJIT();
-      }
-      parentObj.channel4totalLength = 0x40 - (data & 0x3F);
-      parentObj.memory[0xFF20] = data | 0xC0;
-      parentObj.channel4EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x21] = this.memoryWriter[0xFF21] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      if (parentObj.channel4Enabled && parentObj.channel4envelopeSweeps == 0) {
-        //Zombie Volume PAPU Bug:
-        if (((parentObj.memory[0xFF21] ^ data) & 0x8) == 0x8) {
-          if ((parentObj.memory[0xFF21] & 0x8) == 0) {
-            if ((parentObj.memory[0xFF21] & 0x7) == 0x7) {
-              parentObj.channel4envelopeVolume += 2;
-            }
-            else {
-              ++parentObj.channel4envelopeVolume;
-            }
-          }
-          parentObj.channel4envelopeVolume = (16 - parentObj.channel4envelopeVolume) & 0xF;
-        }
-        else if ((parentObj.memory[0xFF21] & 0xF) == 0x8) {
-          parentObj.channel4envelopeVolume = (1 + parentObj.channel4envelopeVolume) & 0xF;
-        }
-        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
-      }
-      parentObj.channel4envelopeType = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF21] = data;
-      parentObj.channel4UpdateCache();
-      parentObj.channel4VolumeEnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x22] = this.memoryWriter[0xFF22] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.channel4FrequencyPeriod = Math.max((data & 0x7) << 4, 8) << (data >> 4);
-      var bitWidth = (data & 0x8);
-      if ((bitWidth == 0x8 && parentObj.channel4BitRange == 0x7FFF) || (bitWidth == 0 && parentObj.channel4BitRange == 0x7F)) {
-        parentObj.channel4lastSampleLookup = 0;
-        parentObj.channel4BitRange = (bitWidth == 0x8) ? 0x7F : 0x7FFF;
-        parentObj.channel4VolumeShifter = (bitWidth == 0x8) ? 7 : 15;
-        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
-        parentObj.noiseSampleTable = (bitWidth == 0x8) ? parentObj.LSFR7Table : parentObj.LSFR15Table;
-      }
-      parentObj.memory[0xFF22] = data;
-      parentObj.channel4UpdateCache();
-    }
-  }
-  this.memoryHighWriter[0x23] = this.memoryWriter[0xFF23] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled) {
-      parentObj.audioJIT();
-      parentObj.memory[0xFF23] = data;
-      parentObj.channel4consecutive = ((data & 0x40) == 0x0);
-      if (data > 0x7F) {
-        var nr42 = parentObj.memory[0xFF21];
-        parentObj.channel4envelopeVolume = nr42 >> 4;
-        parentObj.channel4currentVolume = parentObj.channel4envelopeVolume << parentObj.channel4VolumeShifter;
-        parentObj.channel4envelopeSweepsLast = (nr42 & 0x7) - 1;
-        if (parentObj.channel4totalLength == 0) {
-          parentObj.channel4totalLength = 0x40;
-        }
-        if ((data & 0x40) == 0x40) {
-          parentObj.memory[0xFF26] |= 0x8;
-        }
-      }
-      parentObj.channel4EnableCheck();
-    }
-  }
-  this.memoryHighWriter[0x24] = this.memoryWriter[0xFF24] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled && parentObj.memory[0xFF24] != data) {
-      parentObj.audioJIT();
-      parentObj.memory[0xFF24] = data;
-      parentObj.VinLeftChannelMasterVolume = ((data >> 4) & 0x07) + 1;
-      parentObj.VinRightChannelMasterVolume = (data & 0x07) + 1;
-      parentObj.mixerOutputLevelCache();
-    }
-  }
-  this.memoryHighWriter[0x25] = this.memoryWriter[0xFF25] = function (parentObj, address, data) {
-    if (parentObj.soundMasterEnabled && parentObj.memory[0xFF25] != data) {
-      parentObj.audioJIT();
-      parentObj.memory[0xFF25] = data;
-      parentObj.rightChannel1 = ((data & 0x01) == 0x01);
-      parentObj.rightChannel2 = ((data & 0x02) == 0x02);
-      parentObj.rightChannel3 = ((data & 0x04) == 0x04);
-      parentObj.rightChannel4 = ((data & 0x08) == 0x08);
-      parentObj.leftChannel1 = ((data & 0x10) == 0x10);
-      parentObj.leftChannel2 = ((data & 0x20) == 0x20);
-      parentObj.leftChannel3 = ((data & 0x40) == 0x40);
-      parentObj.leftChannel4 = (data > 0x7F);
-      parentObj.channel1OutputLevelCache();
-      parentObj.channel2OutputLevelCache();
-      parentObj.channel3OutputLevelCache();
-      parentObj.channel4OutputLevelCache();
-    }
-  }
-  this.memoryHighWriter[0x26] = this.memoryWriter[0xFF26] = function (parentObj, address, data) {
-    parentObj.audioJIT();
-    if (!parentObj.soundMasterEnabled && data > 0x7F) {
-      parentObj.memory[0xFF26] = 0x80;
-      parentObj.soundMasterEnabled = true;
-      parentObj.initializeAudioStartState();
-    }
-    else if (parentObj.soundMasterEnabled && data < 0x80) {
-      parentObj.memory[0xFF26] = 0;
-      parentObj.soundMasterEnabled = false;
-      //GBDev wiki says the registers are written with zeros on power off:
-      for (var index = 0xFF10; index < 0xFF26; index++) {
-        parentObj.memoryWriter[index](parentObj, index, 0);
-      }
-    }
-  }
-  //0xFF27 to 0xFF2F don't do anything...
-  this.memoryHighWriter[0x27] = this.memoryWriter[0xFF27] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x28] = this.memoryWriter[0xFF28] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x29] = this.memoryWriter[0xFF29] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2A] = this.memoryWriter[0xFF2A] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2B] = this.memoryWriter[0xFF2B] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2C] = this.memoryWriter[0xFF2C] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2D] = this.memoryWriter[0xFF2D] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2E] = this.memoryWriter[0xFF2E] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x2F] = this.memoryWriter[0xFF2F] = this.cartIgnoreWrite;
-  //WAVE PCM RAM:
-  this.memoryHighWriter[0x30] = this.memoryWriter[0xFF30] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0, data);
-  }
-  this.memoryHighWriter[0x31] = this.memoryWriter[0xFF31] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x1, data);
-  }
-  this.memoryHighWriter[0x32] = this.memoryWriter[0xFF32] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x2, data);
-  }
-  this.memoryHighWriter[0x33] = this.memoryWriter[0xFF33] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x3, data);
-  }
-  this.memoryHighWriter[0x34] = this.memoryWriter[0xFF34] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x4, data);
-  }
-  this.memoryHighWriter[0x35] = this.memoryWriter[0xFF35] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x5, data);
-  }
-  this.memoryHighWriter[0x36] = this.memoryWriter[0xFF36] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x6, data);
-  }
-  this.memoryHighWriter[0x37] = this.memoryWriter[0xFF37] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x7, data);
-  }
-  this.memoryHighWriter[0x38] = this.memoryWriter[0xFF38] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x8, data);
-  }
-  this.memoryHighWriter[0x39] = this.memoryWriter[0xFF39] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0x9, data);
-  }
-  this.memoryHighWriter[0x3A] = this.memoryWriter[0xFF3A] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xA, data);
-  }
-  this.memoryHighWriter[0x3B] = this.memoryWriter[0xFF3B] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xB, data);
-  }
-  this.memoryHighWriter[0x3C] = this.memoryWriter[0xFF3C] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xC, data);
-  }
-  this.memoryHighWriter[0x3D] = this.memoryWriter[0xFF3D] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xD, data);
-  }
-  this.memoryHighWriter[0x3E] = this.memoryWriter[0xFF3E] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xE, data);
-  }
-  this.memoryHighWriter[0x3F] = this.memoryWriter[0xFF3F] = function (parentObj, address, data) {
-    parentObj.channel3WriteRAM(0xF, data);
-  }
-  //SCY
-  this.memoryHighWriter[0x42] = this.memoryWriter[0xFF42] = function (parentObj, address, data) {
-    if (parentObj.backgroundY != data) {
-      parentObj.midScanLineJIT();
-      parentObj.backgroundY = data;
-    }
-  }
-  //SCX
-  this.memoryHighWriter[0x43] = this.memoryWriter[0xFF43] = function (parentObj, address, data) {
-    if (parentObj.backgroundX != data) {
-      parentObj.midScanLineJIT();
-      parentObj.backgroundX = data;
-    }
-  }
-  //LY
-  this.memoryHighWriter[0x44] = this.memoryWriter[0xFF44] = function (parentObj, address, data) {
-    //Read Only:
-    if (parentObj.LCDisOn) {
-      //Gambatte says to do this:
-      parentObj.modeSTAT = 2;
-      parentObj.midScanlineOffset = -1;
-      parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.LCDTicks = parentObj.STATTracker = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
-    }
-  }
-  //LYC
-  this.memoryHighWriter[0x45] = this.memoryWriter[0xFF45] = function (parentObj, address, data) {
-    if (parentObj.memory[0xFF45] != data) {
-      parentObj.memory[0xFF45] = data;
-      if (parentObj.LCDisOn) {
-        parentObj.matchLYC();  //Get the compare of the first scan line.
-      }
-    }
-  }
-  //WY
-  this.memoryHighWriter[0x4A] = this.memoryWriter[0xFF4A] = function (parentObj, address, data) {
-    if (parentObj.windowY != data) {
-      parentObj.midScanLineJIT();
-      parentObj.windowY = data;
-    }
-  }
-  //WX
-  this.memoryHighWriter[0x4B] = this.memoryWriter[0xFF4B] = function (parentObj, address, data) {
-    if (parentObj.memory[0xFF4B] != data) {
-      parentObj.midScanLineJIT();
-      parentObj.memory[0xFF4B] = data;
-      parentObj.windowX = data - 7;
-    }
-  }
-  this.memoryHighWriter[0x72] = this.memoryWriter[0xFF72] = function (parentObj, address, data) {
-    parentObj.memory[0xFF72] = data;
-  }
-  this.memoryHighWriter[0x73] = this.memoryWriter[0xFF73] = function (parentObj, address, data) {
-    parentObj.memory[0xFF73] = data;
-  }
-  this.memoryHighWriter[0x75] = this.memoryWriter[0xFF75] = function (parentObj, address, data) {
-    parentObj.memory[0xFF75] = data;
-  }
-  this.memoryHighWriter[0x76] = this.memoryWriter[0xFF76] = this.cartIgnoreWrite;
-  this.memoryHighWriter[0x77] = this.memoryWriter[0xFF77] = this.cartIgnoreWrite;
-  //IE (Interrupt Enable)
-  this.memoryHighWriter[0xFF] = this.memoryWriter[0xFFFF] = function (parentObj, address, data) {
-    parentObj.interruptsEnabled = data;
-    parentObj.checkIRQMatching();
-  }
-  this.recompileModelSpecificIOWriteHandling();
-  this.recompileBootIOWriteHandling();
-}
-GameBoyCore.prototype.recompileModelSpecificIOWriteHandling = function () {
-  if (this.cGBC) {
-    //GameBoy Color Specific I/O:
-    //SC (Serial Transfer Control Register)
-    this.memoryHighWriter[0x2] = this.memoryWriter[0xFF02] = function (parentObj, address, data) {
-      if (((data & 0x1) == 0x1)) {
-        //Internal clock:
-        parentObj.memory[0xFF02] = (data & 0x7F);
-        parentObj.serialTimer = ((data & 0x2) == 0) ? 4096 : 128;  //Set the Serial IRQ counter.
-        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = ((data & 0x2) == 0) ? 512 : 16;  //Set the transfer data shift counter.
-      }
-      else {
-        //External clock:
-        parentObj.memory[0xFF02] = data;
-        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = parentObj.serialTimer = 0;  //Zero the timers, since we're emulating as if nothing is connected.
-      }
-    }
-    this.memoryHighWriter[0x40] = this.memoryWriter[0xFF40] = function (parentObj, address, data) {
-      if (parentObj.memory[0xFF40] != data) {
-        parentObj.midScanLineJIT();
-        var temp_var = (data > 0x7F);
-        if (temp_var != parentObj.LCDisOn) {
-          //When the display mode changes...
-          parentObj.LCDisOn = temp_var;
-          parentObj.memory[0xFF41] &= 0x78;
-          parentObj.midScanlineOffset = -1;
-          parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.STATTracker = parentObj.LCDTicks = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
-          if (parentObj.LCDisOn) {
-            parentObj.modeSTAT = 2;
-            parentObj.matchLYC();  //Get the compare of the first scan line.
-            parentObj.LCDCONTROL = parentObj.LINECONTROL;
-          }
-          else {
-            parentObj.modeSTAT = 0;
-            parentObj.LCDCONTROL = parentObj.DISPLAYOFFCONTROL;
-            parentObj.DisplayShowOff();
-          }
-          parentObj.interruptsRequested &= 0xFD;
-        }
-        parentObj.gfxWindowCHRBankPosition = ((data & 0x40) == 0x40) ? 0x400 : 0;
-        parentObj.gfxWindowDisplay = ((data & 0x20) == 0x20);
-        parentObj.gfxBackgroundBankOffset = ((data & 0x10) == 0x10) ? 0 : 0x80;
-        parentObj.gfxBackgroundCHRBankPosition = ((data & 0x08) == 0x08) ? 0x400 : 0;
-        parentObj.gfxSpriteNormalHeight = ((data & 0x04) == 0);
-        parentObj.gfxSpriteShow = ((data & 0x02) == 0x02);
-        parentObj.BGPriorityEnabled = ((data & 0x01) == 0x01);
-        parentObj.priorityFlaggingPathRebuild();  //Special case the priority flagging as an optimization.
-        parentObj.memory[0xFF40] = data;
-      }
-    }
-    this.memoryHighWriter[0x41] = this.memoryWriter[0xFF41] = function (parentObj, address, data) {
-      parentObj.LYCMatchTriggerSTAT = ((data & 0x40) == 0x40);
-      parentObj.mode2TriggerSTAT = ((data & 0x20) == 0x20);
-      parentObj.mode1TriggerSTAT = ((data & 0x10) == 0x10);
-      parentObj.mode0TriggerSTAT = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF41] = data & 0x78;
-    }
-    this.memoryHighWriter[0x46] = this.memoryWriter[0xFF46] = function (parentObj, address, data) {
-      parentObj.memory[0xFF46] = data;
-      if (data < 0xE0) {
-        data <<= 8;
-        address = 0xFE00;
-        var stat = parentObj.modeSTAT;
-        parentObj.modeSTAT = 0;
-        var newData = 0;
-        do {
-          newData = parentObj.memoryReader[data](parentObj, data++);
-          if (newData != parentObj.memory[address]) {
-            //JIT the graphics render queue:
-            parentObj.modeSTAT = stat;
-            parentObj.graphicsJIT();
-            parentObj.modeSTAT = 0;
-            parentObj.memory[address++] = newData;
-            break;
-          }
-        } while (++address < 0xFEA0);
-        if (address < 0xFEA0) {
-          do {
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-          } while (address < 0xFEA0);
-        }
-        parentObj.modeSTAT = stat;
-      }
-    }
-    //KEY1
-    this.memoryHighWriter[0x4D] = this.memoryWriter[0xFF4D] = function (parentObj, address, data) {
-      parentObj.memory[0xFF4D] = (data & 0x7F) | (parentObj.memory[0xFF4D] & 0x80);
-    }
-    this.memoryHighWriter[0x4F] = this.memoryWriter[0xFF4F] = function (parentObj, address, data) {
-      parentObj.currVRAMBank = data & 0x01;
-      if (parentObj.currVRAMBank > 0) {
-        parentObj.BGCHRCurrentBank = parentObj.BGCHRBank2;
-      }
-      else {
-        parentObj.BGCHRCurrentBank = parentObj.BGCHRBank1;
-      }
-      //Only writable by GBC.
-    }
-    this.memoryHighWriter[0x51] = this.memoryWriter[0xFF51] = function (parentObj, address, data) {
-      if (!parentObj.hdmaRunning) {
-        parentObj.memory[0xFF51] = data;
-      }
-    }
-    this.memoryHighWriter[0x52] = this.memoryWriter[0xFF52] = function (parentObj, address, data) {
-      if (!parentObj.hdmaRunning) {
-        parentObj.memory[0xFF52] = data & 0xF0;
-      }
-    }
-    this.memoryHighWriter[0x53] = this.memoryWriter[0xFF53] = function (parentObj, address, data) {
-      if (!parentObj.hdmaRunning) {
-        parentObj.memory[0xFF53] = data & 0x1F;
-      }
-    }
-    this.memoryHighWriter[0x54] = this.memoryWriter[0xFF54] = function (parentObj, address, data) {
-      if (!parentObj.hdmaRunning) {
-        parentObj.memory[0xFF54] = data & 0xF0;
-      }
-    }
-    this.memoryHighWriter[0x55] = this.memoryWriter[0xFF55] = function (parentObj, address, data) {
-      if (!parentObj.hdmaRunning) {
-        if ((data & 0x80) == 0) {
-          //DMA
-          parentObj.DMAWrite((data & 0x7F) + 1);
-          parentObj.memory[0xFF55] = 0xFF;  //Transfer completed.
-        }
-        else {
-          //H-Blank DMA
-          parentObj.hdmaRunning = true;
-          parentObj.memory[0xFF55] = data & 0x7F;
-        }
-      }
-      else if ((data & 0x80) == 0) {
-        //Stop H-Blank DMA
-        parentObj.hdmaRunning = false;
-        parentObj.memory[0xFF55] |= 0x80;
-      }
-      else {
-        parentObj.memory[0xFF55] = data & 0x7F;
-      }
-    }
-    this.memoryHighWriter[0x68] = this.memoryWriter[0xFF68] = function (parentObj, address, data) {
-      parentObj.memory[0xFF69] = parentObj.gbcBGRawPalette[data & 0x3F];
-      parentObj.memory[0xFF68] = data;
-    }
-    this.memoryHighWriter[0x69] = this.memoryWriter[0xFF69] = function (parentObj, address, data) {
-      parentObj.updateGBCBGPalette(parentObj.memory[0xFF68] & 0x3F, data);
-      if (parentObj.memory[0xFF68] > 0x7F) { // high bit = autoincrement
-        var next = ((parentObj.memory[0xFF68] + 1) & 0x3F);
-        parentObj.memory[0xFF68] = (next | 0x80);
-        parentObj.memory[0xFF69] = parentObj.gbcBGRawPalette[next];
-      }
-      else {
-        parentObj.memory[0xFF69] = data;
-      }
-    }
-    this.memoryHighWriter[0x6A] = this.memoryWriter[0xFF6A] = function (parentObj, address, data) {
-      parentObj.memory[0xFF6B] = parentObj.gbcOBJRawPalette[data & 0x3F];
-      parentObj.memory[0xFF6A] = data;
-    }
-    this.memoryHighWriter[0x6B] = this.memoryWriter[0xFF6B] = function (parentObj, address, data) {
-      parentObj.updateGBCOBJPalette(parentObj.memory[0xFF6A] & 0x3F, data);
-      if (parentObj.memory[0xFF6A] > 0x7F) { // high bit = autoincrement
-        var next = ((parentObj.memory[0xFF6A] + 1) & 0x3F);
-        parentObj.memory[0xFF6A] = (next | 0x80);
-        parentObj.memory[0xFF6B] = parentObj.gbcOBJRawPalette[next];
-      }
-      else {
-        parentObj.memory[0xFF6B] = data;
-      }
-    }
-    //SVBK
-    this.memoryHighWriter[0x70] = this.memoryWriter[0xFF70] = function (parentObj, address, data) {
-      var addressCheck = (parentObj.memory[0xFF51] << 8) | parentObj.memory[0xFF52];  //Cannot change the RAM bank while WRAM is the source of a running HDMA.
-      if (!parentObj.hdmaRunning || addressCheck < 0xD000 || addressCheck >= 0xE000) {
-        parentObj.gbcRamBank = Math.max(data & 0x07, 1);  //Bank range is from 1-7
-        parentObj.gbcRamBankPosition = ((parentObj.gbcRamBank - 1) << 12) - 0xD000;
-        parentObj.gbcRamBankPositionECHO = parentObj.gbcRamBankPosition - 0x2000;
-      }
-      parentObj.memory[0xFF70] = data;  //Bit 6 cannot be written to.
-    }
-    this.memoryHighWriter[0x74] = this.memoryWriter[0xFF74] = function (parentObj, address, data) {
-      parentObj.memory[0xFF74] = data;
-    }
-  }
-  else {
-    //Fill in the GameBoy Color I/O registers as normal RAM for GameBoy compatibility:
-    //SC (Serial Transfer Control Register)
-    this.memoryHighWriter[0x2] = this.memoryWriter[0xFF02] = function (parentObj, address, data) {
-      if (((data & 0x1) == 0x1)) {
-        //Internal clock:
-        parentObj.memory[0xFF02] = (data & 0x7F);
-        parentObj.serialTimer = 4096;  //Set the Serial IRQ counter.
-        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = 512;  //Set the transfer data shift counter.
-      }
-      else {
-        //External clock:
-        parentObj.memory[0xFF02] = data;
-        parentObj.serialShiftTimer = parentObj.serialShiftTimerAllocated = parentObj.serialTimer = 0;  //Zero the timers, since we're emulating as if nothing is connected.
-      }
-    }
-    this.memoryHighWriter[0x40] = this.memoryWriter[0xFF40] = function (parentObj, address, data) {
-      if (parentObj.memory[0xFF40] != data) {
-        parentObj.midScanLineJIT();
-        var temp_var = (data > 0x7F);
-        if (temp_var != parentObj.LCDisOn) {
-          //When the display mode changes...
-          parentObj.LCDisOn = temp_var;
-          parentObj.memory[0xFF41] &= 0x78;
-          parentObj.midScanlineOffset = -1;
-          parentObj.totalLinesPassed = parentObj.currentX = parentObj.queuedScanLines = parentObj.lastUnrenderedLine = parentObj.STATTracker = parentObj.LCDTicks = parentObj.actualScanLine = parentObj.memory[0xFF44] = 0;
-          if (parentObj.LCDisOn) {
-            parentObj.modeSTAT = 2;
-            parentObj.matchLYC();  //Get the compare of the first scan line.
-            parentObj.LCDCONTROL = parentObj.LINECONTROL;
-          }
-          else {
-            parentObj.modeSTAT = 0;
-            parentObj.LCDCONTROL = parentObj.DISPLAYOFFCONTROL;
-            parentObj.DisplayShowOff();
-          }
-          parentObj.interruptsRequested &= 0xFD;
-        }
-        parentObj.gfxWindowCHRBankPosition = ((data & 0x40) == 0x40) ? 0x400 : 0;
-        parentObj.gfxWindowDisplay = (data & 0x20) == 0x20;
-        parentObj.gfxBackgroundBankOffset = ((data & 0x10) == 0x10) ? 0 : 0x80;
-        parentObj.gfxBackgroundCHRBankPosition = ((data & 0x08) == 0x08) ? 0x400 : 0;
-        parentObj.gfxSpriteNormalHeight = ((data & 0x04) == 0);
-        parentObj.gfxSpriteShow = (data & 0x02) == 0x02;
-        parentObj.bgEnabled = ((data & 0x01) == 0x01);
-        parentObj.memory[0xFF40] = data;
-      }
-    }
-    this.memoryHighWriter[0x41] = this.memoryWriter[0xFF41] = function (parentObj, address, data) {
-      parentObj.LYCMatchTriggerSTAT = ((data & 0x40) == 0x40);
-      parentObj.mode2TriggerSTAT = ((data & 0x20) == 0x20);
-      parentObj.mode1TriggerSTAT = ((data & 0x10) == 0x10);
-      parentObj.mode0TriggerSTAT = ((data & 0x08) == 0x08);
-      parentObj.memory[0xFF41] = data & 0x78;
-      if ((!parentObj.usedBootROM || !parentObj.usedGBCBootROM) && parentObj.LCDisOn && parentObj.modeSTAT < 2) {
-        parentObj.interruptsRequested |= 0x2;
-        parentObj.checkIRQMatching();
-      }
-    }
-    this.memoryHighWriter[0x46] = this.memoryWriter[0xFF46] = function (parentObj, address, data) {
-      parentObj.memory[0xFF46] = data;
-      if (data > 0x7F && data < 0xE0) {  //DMG cannot DMA from the ROM banks.
-        data <<= 8;
-        address = 0xFE00;
-        var stat = parentObj.modeSTAT;
-        parentObj.modeSTAT = 0;
-        var newData = 0;
-        do {
-          newData = parentObj.memoryReader[data](parentObj, data++);
-          if (newData != parentObj.memory[address]) {
-            //JIT the graphics render queue:
-            parentObj.modeSTAT = stat;
-            parentObj.graphicsJIT();
-            parentObj.modeSTAT = 0;
-            parentObj.memory[address++] = newData;
-            break;
-          }
-        } while (++address < 0xFEA0);
-        if (address < 0xFEA0) {
-          do {
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-            parentObj.memory[address++] = parentObj.memoryReader[data](parentObj, data++);
-          } while (address < 0xFEA0);
-        }
-        parentObj.modeSTAT = stat;
-      }
-    }
-    this.memoryHighWriter[0x47] = this.memoryWriter[0xFF47] = function (parentObj, address, data) {
-      if (parentObj.memory[0xFF47] != data) {
-        parentObj.midScanLineJIT();
-        parentObj.updateGBBGPalette(data);
-        parentObj.memory[0xFF47] = data;
-      }
-    }
-    this.memoryHighWriter[0x48] = this.memoryWriter[0xFF48] = function (parentObj, address, data) {
-      if (parentObj.memory[0xFF48] != data) {
-        parentObj.midScanLineJIT();
-        parentObj.updateGBOBJPalette(0, data);
-        parentObj.memory[0xFF48] = data;
-      }
-    }
-    this.memoryHighWriter[0x49] = this.memoryWriter[0xFF49] = function (parentObj, address, data) {
-      if (parentObj.memory[0xFF49] != data) {
-        parentObj.midScanLineJIT();
-        parentObj.updateGBOBJPalette(4, data);
-        parentObj.memory[0xFF49] = data;
-      }
-    }
-    this.memoryHighWriter[0x4D] = this.memoryWriter[0xFF4D] = function (parentObj, address, data) {
-      parentObj.memory[0xFF4D] = data;
-    }
-    this.memoryHighWriter[0x4F] = this.memoryWriter[0xFF4F] = this.cartIgnoreWrite;  //Not writable in DMG mode.
-    this.memoryHighWriter[0x55] = this.memoryWriter[0xFF55] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x68] = this.memoryWriter[0xFF68] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x69] = this.memoryWriter[0xFF69] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x6A] = this.memoryWriter[0xFF6A] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x6B] = this.memoryWriter[0xFF6B] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x6C] = this.memoryWriter[0xFF6C] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x70] = this.memoryWriter[0xFF70] = this.cartIgnoreWrite;
-    this.memoryHighWriter[0x74] = this.memoryWriter[0xFF74] = this.cartIgnoreWrite;
-  }
-}
-GameBoyCore.prototype.recompileBootIOWriteHandling = function () {
-  //Boot I/O Registers:
-  if (this.inBootstrap) {
-    this.memoryHighWriter[0x50] = this.memoryWriter[0xFF50] = function (parentObj, address, data) {
-      cout("Boot ROM reads blocked: Bootstrap process has ended.", 0);
-      parentObj.inBootstrap = false;
-      parentObj.disableBootROM();      //Fill in the boot ROM ranges with ROM  bank 0 ROM ranges
-      parentObj.memory[0xFF50] = data;  //Bits are sustained in memory?
-    }
-    if (this.cGBC) {
-      this.memoryHighWriter[0x6C] = this.memoryWriter[0xFF6C] = function (parentObj, address, data) {
-        if (parentObj.inBootstrap) {
-          parentObj.cGBC = ((data & 0x1) == 0);
-          //Exception to the GBC identifying code:
-          if (parentObj.name + parentObj.gameCode + parentObj.ROM[0x143] == "Game and Watch 50") {
-            parentObj.cGBC = true;
-            cout("Created a boot exception for Game and Watch Gallery 2 (GBC ID byte is wrong on the cartridge).", 1);
-          }
-          cout("Booted to GBC Mode: " + parentObj.cGBC, 0);
-        }
-        parentObj.memory[0xFF6C] = data;
-      }
-    }
-  }
-  else {
-    //Lockout the ROMs from accessing the BOOT ROM control register:
-    this.memoryHighWriter[0x50] = this.memoryWriter[0xFF50] = this.cartIgnoreWrite;
-  }
-}
-//Helper Functions
-GameBoyCore.prototype.toTypedArray = function (baseArray, memtype) {
-  try {
-    // The following line was modified for benchmarking:
-    if (settings[5] || (memtype != "float32" && GameBoyWindow.opera && this.checkForOperaMathBug())) {
-      return baseArray;
-    }
-    if (!baseArray || !baseArray.length) {
-      return [];
-    }
-    var length = baseArray.length;
-    switch (memtype) {
-      case "uint8":
-        var typedArrayTemp = new Uint8Array(length);
-        break;
-      case "int8":
-        var typedArrayTemp = new Int8Array(length);
-        break;
-      case "int32":
-        var typedArrayTemp = new Int32Array(length);
-        break;
-      case "float32":
-        var typedArrayTemp = new Float32Array(length);
-    }
-    for (var index = 0; index < length; index++) {
-      typedArrayTemp[index] = baseArray[index];
-    }
-    return typedArrayTemp;
-  }
-  catch (error) {
-    cout("Could not convert an array to a typed array: " + error.message, 1);
-    return baseArray;
-  }
-}
-GameBoyCore.prototype.fromTypedArray = function (baseArray) {
-  try {
-    if (!baseArray || !baseArray.length) {
-      return [];
-    }
-    var arrayTemp = [];
-    for (var index = 0; index < baseArray.length; ++index) {
-      arrayTemp[index] = baseArray[index];
-    }
-    return arrayTemp;
-  }
-  catch (error) {
-    cout("Conversion from a typed array failed: " + error.message, 1);
-    return baseArray;
-  }
-}
-GameBoyCore.prototype.getTypedArray = function (length, defaultValue, numberType) {
-  try {
-    if (settings[5]) {
-      throw(new Error(""));
-    }
-    // The following line was modified for benchmarking:
-    if (numberType != "float32" && GameBoyWindow.opera && this.checkForOperaMathBug()) {
-      //Caught Opera breaking typed array math:
-      throw(new Error(""));
-    }
-    switch (numberType) {
-      case "int8":
-        var arrayHandle = new Int8Array(length);
-        break;
-      case "uint8":
-        var arrayHandle = new Uint8Array(length);
-        break;
-      case "int32":
-        var arrayHandle = new Int32Array(length);
-        break;
-      case "float32":
-        var arrayHandle = new Float32Array(length);
-    }
-    if (defaultValue != 0) {
-      var index = 0;
-      while (index < length) {
-        arrayHandle[index++] = defaultValue;
-      }
-    }
-  }
-  catch (error) {
-    cout("Could not convert an array to a typed array: " + error.message, 1);
-    var arrayHandle = [];
-    var index = 0;
-    while (index < length) {
-      arrayHandle[index++] = defaultValue;
-    }
-  }
-  return arrayHandle;
-}
-GameBoyCore.prototype.checkForOperaMathBug = function () {
-  var testTypedArray = new Uint8Array(1);
-  testTypedArray[0] = -1;
-  testTypedArray[0] >>= 0;
-  if (testTypedArray[0] != 0xFF) {
-    cout("Detected faulty math by your browser.", 2);
-    return true;
-  }
-  else {
-    return false;
-  }
-}
-
-// End of js/GameBoyCore.js file.
-
-// Start of js/GameBoyIO.js file.
-
-"use strict";
-var gameboy = null;            //GameBoyCore object.
-var gbRunInterval = null;        //GameBoyCore Timer
-var settings = [            //Some settings.
-  true,                 //Turn on sound.
-  false,                //Boot with boot ROM first? (set to false for benchmarking)
-  false,                //Give priority to GameBoy mode
-  [39, 37, 38, 40, 88, 90, 16, 13],  //Keyboard button map.
-  true,                //Colorize GB mode?
-  false,                //Disallow typed arrays?
-  4,                  //Interval for the emulator loop.
-  15,                  //Audio buffer minimum span amount over x interpreter iterations.
-  30,                  //Audio buffer maximum span amount over x interpreter iterations.
-  false,                //Override to allow for MBC1 instead of ROM only (compatibility for broken 3rd-party cartridges).
-  false,                //Override MBC RAM disabling and always allow reading and writing to the banks.
-  false,                //Use the GameBoy boot ROM instead of the GameBoy Color boot ROM.
-  false,                //Scale the canvas in JS, or let the browser scale the canvas?
-  0x10,                //Internal audio buffer pre-interpolation factor.
-  1                  //Volume level set.
-];
-function start(canvas, ROM) {
-  clearLastEmulation();
-  autoSave();  //If we are about to load a new game, then save the last one...
-  gameboy = new GameBoyCore(canvas, ROM);
-  gameboy.openMBC = openSRAM;
-  gameboy.openRTC = openRTC;
-  gameboy.start();
-  run();
-}
-function run() {
-  if (GameBoyEmulatorInitialized()) {
-    if (!GameBoyEmulatorPlaying()) {
-      gameboy.stopEmulator &= 1;
-      cout("Starting the iterator.", 0);
-      var dateObj = new_Date();  // The line is changed for benchmarking.
-      gameboy.firstIteration = dateObj.getTime();
-      gameboy.iterations = 0;
-      // The following lines are commented out for benchmarking.
-      // gbRunInterval = setInterval(function () {
-      //  if (!document.hidden && !document.msHidden && !document.mozHidden && !document.webkitHidden) {
-      //    gameboy.run();
-      // }
-      // }, settings[6]);
-    }
-    else {
-      cout("The GameBoy core is already running.", 1);
-    }
-  }
-  else {
-    cout("GameBoy core cannot run while it has not been initialized.", 1);
-  }
-}
-function pause() {
-  if (GameBoyEmulatorInitialized()) {
-    if (GameBoyEmulatorPlaying()) {
-      clearLastEmulation();
-    }
-    else {
-      cout("GameBoy core has already been paused.", 1);
-    }
-  }
-  else {
-    cout("GameBoy core cannot be paused while it has not been initialized.", 1);
-  }
-}
-function clearLastEmulation() {
-  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
-    clearInterval(gbRunInterval);
-    gameboy.stopEmulator |= 2;
-    cout("The previous emulation has been cleared.", 0);
-  }
-  else {
-    cout("No previous emulation was found to be cleared.", 0);
-  }
-}
-function save() {
-  if (GameBoyEmulatorInitialized()) {
-    try {
-      var state_suffix = 0;
-      while (findValue("FREEZE_" + gameboy.name + "_" + state_suffix) != null) {
-        state_suffix++;
-      }
-      setValue("FREEZE_" + gameboy.name + "_" + state_suffix, gameboy.saveState());
-      cout("Saved the current state as: FREEZE_" + gameboy.name + "_" + state_suffix, 0);
-    }
-    catch (error) {
-      cout("Could not save the current emulation state(\"" + error.message + "\").", 2);
-    }
-  }
-  else {
-    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
-  }
-}
-function saveSRAM() {
-  if (GameBoyEmulatorInitialized()) {
-    if (gameboy.cBATT) {
-      try {
-        var sram = gameboy.saveSRAMState();
-        if (sram.length > 0) {
-          cout("Saving the SRAM...", 0);
-          if (findValue("SRAM_" + gameboy.name) != null) {
-            //Remove the outdated storage format save:
-            cout("Deleting the old SRAM save due to outdated format.", 0);
-            deleteValue("SRAM_" + gameboy.name);
-          }
-          setValue("B64_SRAM_" + gameboy.name, arrayToBase64(sram));
-        }
-        else {
-          cout("SRAM could not be saved because it was empty.", 1);
-        }
-      }
-      catch (error) {
-        cout("Could not save the current emulation state(\"" + error.message + "\").", 2);
-      }
-    }
-    else {
-      cout("Cannot save a game that does not have battery backed SRAM specified.", 1);
-    }
-    saveRTC();
-  }
-  else {
-    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
-  }
-}
-function saveRTC() {  //Execute this when SRAM is being saved as well.
-  if (GameBoyEmulatorInitialized()) {
-    if (gameboy.cTIMER) {
-      try {
-        cout("Saving the RTC...", 0);
-        setValue("RTC_" + gameboy.name, gameboy.saveRTCState());
-      }
-      catch (error) {
-        cout("Could not save the RTC of the current emulation state(\"" + error.message + "\").", 2);
-      }
-    }
-  }
-  else {
-    cout("GameBoy core cannot be saved while it has not been initialized.", 1);
-  }
-}
-function autoSave() {
-  if (GameBoyEmulatorInitialized()) {
-    cout("Automatically saving the SRAM.", 0);
-    saveSRAM();
-    saveRTC();
-  }
-}
-function openSRAM(filename) {
-  try {
-    if (findValue("B64_SRAM_" + filename) != null) {
-      cout("Found a previous SRAM state (Will attempt to load).", 0);
-      return base64ToArray(findValue("B64_SRAM_" + filename));
-    }
-    else if (findValue("SRAM_" + filename) != null) {
-      cout("Found a previous SRAM state (Will attempt to load).", 0);
-      return findValue("SRAM_" + filename);
-    }
-    else {
-      cout("Could not find any previous SRAM copy for the current ROM.", 0);
-    }
-  }
-  catch (error) {
-    cout("Could not open the  SRAM of the saved emulation state.", 2);
-  }
-  return [];
-}
-function openRTC(filename) {
-  try {
-    if (findValue("RTC_" + filename) != null) {
-      cout("Found a previous RTC state (Will attempt to load).", 0);
-      return findValue("RTC_" + filename);
-    }
-    else {
-      cout("Could not find any previous RTC copy for the current ROM.", 0);
-    }
-  }
-  catch (error) {
-    cout("Could not open the RTC data of the saved emulation state.", 2);
-  }
-  return [];
-}
-function openState(filename, canvas) {
-  try {
-    if (findValue(filename) != null) {
-      try {
-        clearLastEmulation();
-        cout("Attempting to run a saved emulation state.", 0);
-        gameboy = new GameBoyCore(canvas, "");
-        gameboy.savedStateFileName = filename;
-        gameboy.returnFromState(findValue(filename));
-        run();
-      }
-      catch (error) {
-        alert(error.message + " file: " + error.fileName + " line: " + error.lineNumber);
-      }
-    }
-    else {
-      cout("Could not find the save state " + filename + "\".", 2);
-    }
-  }
-  catch (error) {
-    cout("Could not open the saved emulation state.", 2);
-  }
-}
-function import_save(blobData) {
-  blobData = decodeBlob(blobData);
-  if (blobData && blobData.blobs) {
-    if (blobData.blobs.length > 0) {
-      for (var index = 0; index < blobData.blobs.length; ++index) {
-        cout("Importing blob \"" + blobData.blobs[index].blobID + "\"", 0);
-        if (blobData.blobs[index].blobContent) {
-          if (blobData.blobs[index].blobID.substring(0, 5) == "SRAM_") {
-            setValue("B64_" + blobData.blobs[index].blobID, base64(blobData.blobs[index].blobContent));
-          }
-          else {
-            setValue(blobData.blobs[index].blobID, JSON.parse(blobData.blobs[index].blobContent));
-          }
-        }
-        else if (blobData.blobs[index].blobID) {
-          cout("Save file imported had blob \"" + blobData.blobs[index].blobID + "\" with no blob data interpretable.", 2);
-        }
-        else {
-          cout("Blob chunk information missing completely.", 2);
-        }
-      }
-    }
-    else {
-      cout("Could not decode the imported file.", 2);
-    }
-  }
-  else {
-    cout("Could not decode the imported file.", 2);
-  }
-}
-function generateBlob(keyName, encodedData) {
-  //Append the file format prefix:
-  var saveString = "EMULATOR_DATA";
-  var consoleID = "GameBoy";
-  //Figure out the length:
-  var totalLength = (saveString.length + 4 + (1 + consoleID.length)) + ((1 + keyName.length) + (4 + encodedData.length));
-  //Append the total length in bytes:
-  saveString += to_little_endian_dword(totalLength);
-  //Append the console ID text's length:
-  saveString += to_byte(consoleID.length);
-  //Append the console ID text:
-  saveString += consoleID;
-  //Append the blob ID:
-  saveString += to_byte(keyName.length);
-  saveString += keyName;
-  //Now append the save data:
-  saveString += to_little_endian_dword(encodedData.length);
-  saveString += encodedData;
-  return saveString;
-}
-function generateMultiBlob(blobPairs) {
-  var consoleID = "GameBoy";
-  //Figure out the initial length:
-  var totalLength = 13 + 4 + 1 + consoleID.length;
-  //Append the console ID text's length:
-  var saveString = to_byte(consoleID.length);
-  //Append the console ID text:
-  saveString += consoleID;
-  var keyName = "";
-  var encodedData = "";
-  //Now append all the blobs:
-  for (var index = 0; index < blobPairs.length; ++index) {
-    keyName = blobPairs[index][0];
-    encodedData = blobPairs[index][1];
-    //Append the blob ID:
-    saveString += to_byte(keyName.length);
-    saveString += keyName;
-    //Now append the save data:
-    saveString += to_little_endian_dword(encodedData.length);
-    saveString += encodedData;
-    //Update the total length:
-    totalLength += 1 + keyName.length + 4 + encodedData.length;
-  }
-  //Now add the prefix:
-  saveString = "EMULATOR_DATA" + to_little_endian_dword(totalLength) + saveString;
-  return saveString;
-}
-function decodeBlob(blobData) {
-  /*Format is as follows:
-    - 13 byte string "EMULATOR_DATA"
-    - 4 byte total size (including these 4 bytes).
-    - 1 byte Console type ID length
-    - Console type ID text of 8 bit size
-    blobs {
-      - 1 byte blob ID length
-      - blob ID text (Used to say what the data is (SRAM/freeze state/etc...))
-      - 4 byte blob length
-      - blob length of 32 bit size
-    }
-  */
-  var length = blobData.length;
-  var blobProperties = {};
-  blobProperties.consoleID = null;
-  var blobsCount = -1;
-  blobProperties.blobs = [];
-  if (length > 17) {
-    if (blobData.substring(0, 13) == "EMULATOR_DATA") {
-      var length = Math.min(((blobData.charCodeAt(16) & 0xFF) << 24) | ((blobData.charCodeAt(15) & 0xFF) << 16) | ((blobData.charCodeAt(14) & 0xFF) << 8) | (blobData.charCodeAt(13) & 0xFF), length);
-      var consoleIDLength = blobData.charCodeAt(17) & 0xFF;
-      if (length > 17 + consoleIDLength) {
-        blobProperties.consoleID = blobData.substring(18, 18 + consoleIDLength);
-        var blobIDLength = 0;
-        var blobLength = 0;
-        for (var index = 18 + consoleIDLength; index < length;) {
-          blobIDLength = blobData.charCodeAt(index++) & 0xFF;
-          if (index + blobIDLength < length) {
-            blobProperties.blobs[++blobsCount] = {};
-            blobProperties.blobs[blobsCount].blobID = blobData.substring(index, index + blobIDLength);
-            index += blobIDLength;
-            if (index + 4 < length) {
-              blobLength = ((blobData.charCodeAt(index + 3) & 0xFF) << 24) | ((blobData.charCodeAt(index + 2) & 0xFF) << 16) | ((blobData.charCodeAt(index + 1) & 0xFF) << 8) | (blobData.charCodeAt(index) & 0xFF);
-              index += 4;
-              if (index + blobLength <= length) {
-                blobProperties.blobs[blobsCount].blobContent =  blobData.substring(index, index + blobLength);
-                index += blobLength;
-              }
-              else {
-                cout("Blob length check failed, blob determined to be incomplete.", 2);
-                break;
-              }
-            }
-            else {
-              cout("Blob was incomplete, bailing out.", 2);
-              break;
-            }
-          }
-          else {
-            cout("Blob was incomplete, bailing out.", 2);
-            break;
-          }
-        }
-      }
-    }
-  }
-  return blobProperties;
-}
-function matchKey(key) {  //Maps a keyboard key to a gameboy key.
-  //Order: Right, Left, Up, Down, A, B, Select, Start
-  for (var index = 0; index < settings[3].length; index++) {
-    if (settings[3][index] == key) {
-      return index;
-    }
-  }
-  return -1;
-}
-function GameBoyEmulatorInitialized() {
-  return (typeof gameboy == "object" && gameboy != null);
-}
-function GameBoyEmulatorPlaying() {
-  return ((gameboy.stopEmulator & 2) == 0);
-}
-function GameBoyKeyDown(e) {
-  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
-    var keycode = matchKey(e.keyCode);
-    if (keycode >= 0 && keycode < 8) {
-      gameboy.JoyPadEvent(keycode, true);
-      try {
-        e.preventDefault();
-      }
-      catch (error) { }
-    }
-  }
-}
-function GameBoyKeyUp(e) {
-  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
-    var keycode = matchKey(e.keyCode);
-    if (keycode >= 0 && keycode < 8) {
-      gameboy.JoyPadEvent(keycode, false);
-      try {
-        e.preventDefault();
-      }
-      catch (error) { }
-    }
-  }
-}
-function GameBoyGyroSignalHandler(e) {
-  if (GameBoyEmulatorInitialized() && GameBoyEmulatorPlaying()) {
-    if (e.gamma || e.beta) {
-      gameboy.GyroEvent(e.gamma * Math.PI / 180, e.beta * Math.PI / 180);
-    }
-    else {
-      gameboy.GyroEvent(e.x, e.y);
-    }
-    try {
-      e.preventDefault();
-    }
-    catch (error) { }
-  }
-}
-//The emulator will call this to sort out the canvas properties for (re)initialization.
-function initNewCanvas() {
-  if (GameBoyEmulatorInitialized()) {
-    gameboy.canvas.width = gameboy.canvas.clientWidth;
-    gameboy.canvas.height = gameboy.canvas.clientHeight;
-  }
-}
-//Call this when resizing the canvas:
-function initNewCanvasSize() {
-  if (GameBoyEmulatorInitialized()) {
-    if (!settings[12]) {
-      if (gameboy.onscreenWidth != 160 || gameboy.onscreenHeight != 144) {
-        gameboy.initLCD();
-      }
-    }
-    else {
-      if (gameboy.onscreenWidth != gameboy.canvas.clientWidth || gameboy.onscreenHeight != gameboy.canvas.clientHeight) {
-        gameboy.initLCD();
-      }
-    }
-  }
-}
-
-// End of js/GameBoyIO.js file.
-
-// Start of realtime.js file.
-// ROM code from Public Domain LPC2000 Demo "realtime" by AGO.
-
-var gameboy_rom='r+BPyZiEZwA+AeBPySAobeEq6gAgKlYj5WJv6SRmZjjhKuXqACDJ/////////////////////////////////xgHZwCYhGcA2fX6/3/1xdXlIRPKNgHN9f/h0cHx6gAg+hLKtyAC8cnwgLcoF/CC7hjgUT6Q4FOv4FLgVOCAPv/gVfHZ8IG3IALx2fBA7gjgQA8PD+YB7gHgT/CC4FHuEOCCPojgU6/gUuBU4IE+/uBV4ID6NMs86jTL8dkKCgoKbWFkZSBieSBhZ28uIGVtYWlsOmdvYnV6b3ZAeWFob28uY29tCnVybDogc3BlY2N5LmRhLnJ1CgoKCv///////wDDSgnO7WZmzA0ACwNzAIMADAANAAgRH4iJAA7czG7m3d3Zmbu7Z2NuDuzM3dyZn7u5Mz5BR08nUyBSRUFMVElNRSCAAAAAAgEDADMBSTQeIUD/y37I8P/1y4fg//BE/pEg+su+8eD/yT7A4EY+KD0g/cnF1eWvEQPK1RITEhMGAyEAyuXFTgYAIWAMCQkqEhMqEhPB4SMFIOrhrwYIzYsU4dHByf////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAgMFBggJCwwOEBETFBYXGBobHR4fISIjJSYnKSorLC0uLzAxMjM0NTY3ODg5Ojo7PDw9PT4+Pj8/Pz9AQEBAQEBAQEBAPz8/Pz4+PT08PDs7Ojk5ODc2NTU0MzIxMC8uLCsqKSgmJSQjISAfHRwaGRcWFRMSEA8NCwoIBwUEAgH//fz6+ff29PPx8O7t6+ro5+Xk4uHg3t3c2tnY19bU09LR0M/OzczLysnJyMfGxsXFxMPDw8LCwcHBwcDAwMDAwMDAwMDBwcHBwsLDw8PExcXGxsfIycnKy8zNzs/Q0dLT1NXX2Nna3N3e4OHi5OXn6Onr7O7v8fL09vf5+vz9AAEECRAZJDFAUWR5kKnE4QAhRGmQueQRQHGk2RBJhMEAQYTJEFmk8UCR5DmQ6UShAGHEKZD5ZNFAsSSZEIkEgQCBBIkQmSSxQNFk+ZApxGEAoUTpkDnkkUDxpFkQyYRBAMGESRDZpHFAEeS5kGlEIQDhxKmQeWRRQDEkGRAJBAEAAQQJEBkkMUBRZHmQqcThACFEaZC55BFAcaTZEEmEwQBBhMkQWaTxQJHkOZDpRKEAYcQpkPlk0UCxJJkQiQSBAIEEiRCZJLFA0WT5kCnEYQChROmQOeSRQPGkWRDJhEEAwYRJENmkcUAR5LmQaUQhAOHEqZB5ZFFAMSQZEAkEAQAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAgICAgIDAwMDBAQEBAUFBQUGBgYHBwcICAkJCQoKCgsLDAwNDQ4ODw8QEBEREhITExQUFRUWFxcYGRkaGhscHB0eHh8gISEiIyQkJSYnJygpKisrLC0uLzAxMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1FSU1RVVldZWltcXV9gYWJkZWZnaWprbG5vcHJzdHZ3eXp7fX5/gYKEhYeIiouNjpCRk5SWl5manJ2foKKkpaepqqytr7GytLa3ubu9vsDCxMXHycvMztDS1NXX2dvd3+Hi5Obo6uzu8PL09vj6/P4A//z38Ofcz8CvnIdwVzwfAN+8l3BHHO/Aj1wn8Ld8PwC/fDfwp1wPwG8cx3AXvF8AnzzXcAecL8BP3Gfwd/x/AH/8d/Bn3E/AL5wHcNc8nwBfvBdwxxxvwA9cp/A3fL8AP3y38Cdcj8DvHEdwl7zfAB88V3CHnK/Az9zn8Pf8/wD//Pfw59zPwK+ch3BXPB8A37yXcEcc78CPXCfwt3w/AL98N/CnXA/AbxzHcBe8XwCfPNdwB5wvwE/cZ/B3/H8Af/x38GfcT8AvnAdw1zyfAF+8F3DHHG/AD1yn8Dd8vwA/fLfwJ1yPwO8cR3CXvN8AHzxXcIecr8DP3Ofw9/z/AP/////////////////////+/v7+/v79/f39/fz8/Pz8+/v7+vr6+vn5+fj4+Pf39/b29fX19PTz8/Ly8fHw8PDv7u7t7ezs6+vq6uno6Ofn5uXl5OPj4uHh4N/e3t3c3Nva2djY19bV1NTT0tHQz8/OzczLysnIx8bFxMPCwcDAvr28u7q5uLe2tbSzsrGwr62sq6qpqKalpKOioJ+enZyamZiWlZSTkZCPjYyLiYiHhYSCgYB+fXt6eHd1dHJxcG5sa2loZmVjYmBfXVtaWFdVU1JQTk1LSUhGREJBPz08Ojg2NDMxLy0rKigmJCIgHx0bGRcVExEPDQsJBwUDAf9/Px8PBwMBgEAgEAgEAgEAAQEBAQEBAQEBAQEA//////////////+AEAcAAQABAAEBAAEBAAEA/wD//wD//wD/AP+AKwcBAAEAAQD/AP8A/wD/AP8A/wABAAEAAQCARgcBAQEBAQD//////////////wABAQEBAQGAYQf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+AwODw+Pz+/xEAwAGxwj4E9cU+BfUKbwMKZ37+gCALI34LAiN+AwILGOsahhIDHBwcHPE9IN7BIRAAGVRdPgX1Cm8DCmcalhIjfAILfQIDAx0dHR3xPSDnIRgAGVRd8T0grskRAcAB6cI+BPUKbwMKZ37+gCALI34LAiN+AwILGOs+CvUahhIcHBwc8T0g9CN8Agt9AgMD8T0g0MkgIEZJTExFRCAgIFBPTFlHT05TIEhFTElDT1BURVJJTiBBQ1RJT04gIQDADgpwLHQsGhPWICI2ACwNIPE+oOoQyngBCQDlYmsJVF3hDMYKR3AsdCwaG9YgIjYALA0g8a/qEcrJ+hDK/jDI1gTqEMpHPqCQ/lA4Aj5QDgAM1ggw+3ghAcARBAB3xggZDSD5+hHKg+oRykf+UDgCPlAOAAzWCDD7eC4td9YIGQ0g+ckh9grzMf/PzVABr+Am4P/gD+BD4EL2SOBFPkDgQT4E4AfN9RM+CuoAAA4HeeBwJqCvIstsKPsNIPIh/v8yy30g+wEKABH1/yFpAc3kE+cCAVYAEQDBIVt2zeQTrwYYIWsOzYsUIYsOzaQUxwGwAxEAgCGhF8XlzeQT4cERAIjN5BMhAJgRAwABYMDHcc9yIwUg+BQdIPHN9RMhuxUGAc2WE82JEz5E4EGv4EU+A+D/+z4B6hLK4E0QAAB4zccTBSD6zZATxwEACFkhAIhzIwt4sSD5IQDHPv9FdyRwJCJ3JXclcCwg8x5/IQCYx3PPNgDL1DYIx3PLlCPLVCjuPoABDxARIAAhIpjF5XfL1HfLlDwZDSD1POEswQUg7D486jPLr+o0yz3qL8s+oOCCPgLqG8vNiRM+ROBBr+BFPgPg/68+ACEXyyI+CiI+IHev6h7L4ITgluodyz4B6h/L6g/D6g3KBlARnAjNxAjNcwsBLAHFzTsLzQAJwQt4sSDzzZATxwEACFkhAIhzIwt4sSD5zfUTeQYQIYMOzYsUPv/qKcsGgBGwCM3ECM2JEwEsAcXNbAzNAAnBC3ixIPOv6hLKzZATPpDgU/PHAbADEQCIIaEXzeQTzfUTIQIWBgHNlhPNiRM+ROBBr+BFPgPg//sY/j4D6gAgzcRGBgMhF8t+gCJ+gDwifoB3zckP+jDLb/oxy2fNtgs+AeCB8IG3IPv6Dcq3KAPNcwHJ+h3LBgARTg2Hb2AZKmZvTgkq4ItfKjzgjD1PKuCNe4eHg0cRAMUqEhwFIPp5h4eBRxEAxCoSHAUg+n3qMMt86jHLyfCL4I7wjOCP8I3gkBEAw9XlzcoQ4dHwpeaAEhwBAwAJ8JA94JAg6CEAxQYPKk+gXxq3IB95yzegXxq3IBYqT6BfGrcgD3nLN6BfGrcgBiwsLBhHLOXNyhDwlrcoKwYB8KXGP0/LfygBBcXwpMY/Vx4AzZMOe8H18KPGP1ceAM2TDsHhJCJwGAzhJPCjxj8i8KTGPyIsJRbDBg/wjj3gjsLiCz4C6gAgw1JhfBjcHwAL7mpIYL9vBgMhF8t+gCJ+gDwifoB3zckPIcsNEQDGzf4MI+U+A+oAICEgy83+DPocy9YIb+ocy82vYAYDESDLIWIOxeXVzcoQ4fCjxhQi8KQiNg8jVF3hIyMjwQUg5M3ERsE+AeoAIAr+/ygiEQDGbyYAKRnlAwoDbyYAKRleI1bhKmZvxc0xHMwAQMEY2T4B4IHwgbcg+8l+PMjl1c3KEAYB8KVPy38oAQXF8KTLf/UoAi88Vx4AzZMO8XsgAi88xn/B9fCjy3/1KAIvPFceAM2TDvF7KAIvPMZ/wdESE3gSE+EjIyMYsFANAgAIDAYCRCgoFANEKAAUE0QAABQSRAAoFAJVKCjsA1UoAOwTVQAA7BJVACjsAAAEBQAAAAEFAAEBAwIGAQEDBwYCAgAHAwICAAcEAwMBAgYDAwEFBgQEAAECBAQAAwIFBQQFBgUFBAcGMgAAzgAAADIAAM4AAAAyAADOKAAAHhEAChEAAAAACu8AHu8AFAAKFAD2FAAPCgAF6AAC4gAQ3gAQ4gD+CgD74g4C3Q4C4QAC4vIC3fIC4AAM4PsM4PsQ4/sJ3fsJ/wABAQICAwMEBAUFAAAGAQYCBgMGBAYFBgAHAQcCBwMHBAcFBwYICQoKCwsMDA0NDgoPDxAQEQoSEhMTERQVFRYVFxUYCBkIGggb/yAAD/AbD/DlD/9//3+XEQAAAGD/f5cRAAAYAP9/lxEAAIB8lxH/f/9/QHz/f18IAADLI8sSeC9HeS9PAyEAAH2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEn2Pb3yPZwk4BWd9kW+3yxPLEssoyxkJ0BPJ+hfLJgJvfuCcLzzgnn3GQG9+4Jvgn6/gmOCZ4JrgneChPkDgl/oYy29OfcZAb0bFeOCgeeCizdMQ8KPgpvCk4KnwpeCsr+Cg4KI+QOChzdMQ8KPgp/Ck4KrwpeCtwXkvPOCgr+CheOCizdMQ8KPgmfCk4JzwpeCf8Kbgl/Cp4JrwrOCd8KfgmPCq4JvwreCe+hnLJgJvTn3GQG9GxXjgoHkvPOChr+CizdMQ8KPgpvCk4KnwpeCswXngoHjgoa/gos3TEPCj4KfwpOCq8KXgra/goOChPkDgos3TEPCj4JnwpOCc8KXgn/Cm4JfwqeCa8KzgnfCn4JjwquCb8K3gnskq4KAq4KEq4KLwl1/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8Jhf8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CZX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KPwml/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8Jtf8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CcX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KTwnV/woCYGV8t6ICDLe3soJy88X3qTMAIvPG96g1YlXiVvfiVuZxl8LzwYH3ovPFfLeyjhey88X5IwAi88b3qDViVeJW9+JW5nGXxH8J5f8KEmBlfLeiAgy3t7KCcvPF96kzACLzxveoNWJV4lb34lbmcZfC88GB96LzxXy3so4XsvPF+SMAIvPG96g1YlXiVvfiVuZxl8T/CfX/CiJgZXy3ogIMt7eygnLzxfepMwAi88b3qDViVeJW9+JW5nGXwvPBgfei88V8t7KOF7LzxfkjACLzxveoNWJV4lb34lbmcZfICB4KXJ9T6D4EDxyfWv4EDxyfXF1eXHKv7/KFD+FiAaTiMqh4eHVF1vJgApKXgGmAlHelRne11vGNzGYBLPeBIcGNN2ACETyjQ1KPc1yfvFBmR2AAUg+8HJ+3YABSD7yfXF1eUqEhMLeLEg+OHRwfHJxeUBAKAhAMDNAxThwcnF5XEjBSD74cHJxdXlAQCAIZXKzQMU4dHBycXV5a/qFcuwIAwaEyIaEzIEDXjqFcvlxRq+EyAPIxq+IAkTIw0gCMHhGBkrGyMjBSDmecFPBBoTIhoTIiEVyzThDSDS+hXL4dHBydVfzXIUuzD60cnF9cH6FMrLD6mAR/CLkR+AR/AFqOoUysHJ9cXltxcXF/aA4Ggq4GkFIPo+5OBH4cHxyfXF5bcXFxf2gOBqKuBrBSD6PuTgSOBJ4cHxyT4Q4ADwAC/LN+bwRz4g4ADwAC/mD7DqFsvJzyEAgK8GIE8+CCINIPwFIPnHIQCABiBPIg0g/AUg+cnFzQMVSs0eFcHJxc0RFUjNGRVLzSMVwcnFBgHNKxXBycUGABj2xQYDGPHFBgLNKxXByfXlh4eAJsBvceHxyfXlh4cmwG9GI04jXiNW4fHJ9cXV5eCDKjzK8BPWIF/wg835FF95xghPezwY6PXF1eXF1c13FdHBex4FIS3LGNUBKssR8NjNlRURGPzNlRURnP/NlRUR9v/NlRUR//8+LzwZOPwCA3ovV3svXxMZyTAwRlBT/zAwUE5UU/8wMExJTkVT/xYFB1dFTENPTUUgVE8WBQgtUkVBTFRJTUUtFgAJREVNTyBNQURFIEVTUEVDSUFMTFkWAQpGT1IgTENQJzIwMDAgUEFSVFn/FgAAR1JFRVRJTlg6ICAgICAgICAgICAWAAFEU0MsUEFOLFNBQixGQVRBTElUWRYAAkpFRkYgRlJPSFdFSU4sSUNBUlVTFgADRE9YLFFVQU5HLEFCWVNTICAgICAWAAQgICAgICAgICAgICAgICAgICAgIBYABUNSRURJVFM6ICAgICAgICAgICAgFgAGQUxMIEdGWCZDT0RFIEJZIEFHTyAWAAdIRUxJQ09QVEVSIDNEIE1PREVMIBYACENSRUFURUQgQlkgQlVTWSAgICAgFgAJICAgICAgICAgICAgICAgICAgICAWAApVU0VEIFNPRlRXQVJFOiAgICAgIBYAC1JHQkRTLE5PJENBU0gsRkFSICAgFgAMICAgICAgICAgICAgICAgICAgICAWAA1DT05UQUNUOiAgICAgICAgICAgIBYADkdPQlVaT1ZAWUFIT08uQ09NICAgFgAPSFRUUDovL1NQRUNDWS5EQS5SVSAWABAgICAgICAgICAgICAgICAgICAgIBYAEVNFRSBZT1UgT04gR0JERVYyMDAw/wAAAAAAAAAAAAAAAAAAAAAICBwUHBQ4KDgoMDBwUCAgKCh8VHxUKCgAAAAAAAAAABQUPip/QT4qfFT+gnxUKCgICDw0fkL8rP6Cfmr8hHhYJCR+Wn5SPCR4SPyU/LRISBgYPCR+Wjwkflr8tH5KNDQQEDgocFAgIAAAAAAAAAAABAQOChwUOCg4KDgoHBQICBAQOCgcFBwUHBQ4KHBQICAAABQUPio8NH5CPCx8VCgoAAAICBwUPDR+QjwsOCgQEAAAAAAAAAAAEBA4KHBQcFAAAAAAAAB8fP6CfHwAAAAAAAAAAAAAAAAwMHhIeEgwMAQEDgoeEjwkeEjwkOCgQEAYGDwkflr+qv6q/LR4SDAwGBg8JHxUPDQ4KHxs/oJ8fBwcPiJ+Wjw0eEj8vP6CfHwcHD4iflo8NE5K/LR4SDAwJCR+Wn5afFT8tP6CfGwQEBwcPiJ8XPyEfnr8tHhIMDAYGDwkeFj8pP66/LR4SDAwPDx+Qv66XFQ4KHBQcFAgIBwcPiJ+Wjwkflr8tPiIcHAcHD4iflr+sn5KfHT4iHBwAAAAAAgIHBQICBAQOCgQEAAACAgcFAgIEBA4KDgocFAAAAAAHBQ4KHBQcFA4KAAAAAAAADw8fkJ8fPyEeHgAAAAAAAA4KBwUHBQ4KHBQAAAYGDwkflr8tHhoEBA4KBAQHBw+In5a/rL8pPi4+IhwcBwcPiJ+Wv66/oL+uvy0SEg4OHxEflr8pP6a/LT4iHBwHBw+In5a5qbgoP6y/IxwcDAweEh8VH5a7qr+uvyEeHgcHD4ifFx8RHhY/Lz+gnx8HBw+Inxc/IT4uOCg4KBAQBwcPiJ+Wvy8/qL+uvyEeHgkJH5a/rr+gv66/LT8tEhIPDx+QjwsOChwUHhY/IR4eDw8fkI+Og4KXFT8tHhIMDAkJH5afFR+Qv66/LT8tEhIICBwUHBQ4KDkpP66fEQ4OCgofFR+Qv6q/rr8tPy0SEgkJH5a/pr+qv6y7qr8tEhIHBw+In5a7qruqvy0+IhwcBwcPiJ+Wv66/IT4uOCgQEAcHD4iflr+uv6q/LT+inZ2HBw+In5a/LT4iPy0/LRISBwcPiJ8XP6Cfnr8tPiIcHB8fP6CfGw4KHBQcFBwUCAgJCR+Wn5a7qruqvy0eEgwMERE7qruqnxUfFR4SHBQICAkJH5aflr+uv6q/KR8VCgoJCR+WnxUOCg8JH5a/LRISCQkflr8tPy0eEhwUHBQICA8PH5C/LT46Dwsflr8hHh4HBw+IjwsOChwUHhYfEQ4OEBA4KDwkHhIPCQeEg4KBAQ4OHxEPDQcFDgoeGj4iHBwGBg8JH5a7qpERAAAAAAAAAAAAAAAAAAAAAB8fP6CfHx81rdPfJJne5X1MAIvPEevyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxnLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEeRcvT/F5MAIvPIVvJrcBAAA+t7zLEbrLED6/vcsRu8sQPj+8P8sRuj/LEL0/yxG7P8sQeLHIeKHAebcgB3xiV31rX3jLH9L/HD5AlU97lW96lPUwAi88R6/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGTABgB/LGcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYV5Fy9P8XkwAi88hGcuQMMxHMsf0pcdPkCUT3qUZ3uV9TACLzxHr8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZMAGAH8sZyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhMsRyxeUMAGEyxHLF5QwAYTLEcsXlDABhHkXL0/xeTACLzyFbyZAwzEcyx/SoRt91r9PfZNvepT1MAIvPEevyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxnLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFyxHLF5UwAYXLEcsXlTABhcsRyxeVMAGFeRcvT/F5MAIvPIRnLr/DMRz//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3q8MAVUZ3tdb3u90pdAfZNPepRfkTA+V3nLPy88g+CDPn+R5YdPbyYARCkpKQkBkVIJweV41kAXb3nWQB8fH+YPZ/CChGd55gcGB/YITwpP8INHLMl5S1+RV3nLPy88g+CDPneR5YdPbyYARCkpKQkBklsJweV41kAXb3nWQB8fH+YPZ/CChGd55gcGB/YITwpP8INHLMmVT3qUX5EwPld5yz8vPIPggz5/keWHT28mAEQpKSkJAR9BCcHleNZAF2951kAfHx/mD2fwgoRneeYHBgf2CE8KT/CDRyzJeUtfkVd5yz8vPIPggz53keWHT28mAEQpKSkJASBKCcHleNZAF2951kAfHx/mD2fwgoRneeYHBgf2CE8KT/CDRyzJfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkfrF3e8t4IAN6LCyAR8sJMAEkyX6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALH6xInvLeCAGessJMAEkgEcALMl+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASV+sXd7y3ggA3osLIBHywEwASXJfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsfrF3e8t4IAZ6ywEwASWARywsyf///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wHRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyLRe7o4A1pXewYHoE8K9XqgTwQK4JF6Hx8f5g9X8JNnTixGLXsfHx/mD1/wgoNne5LRxADB8JGiVy+mX3qhsyJ6L6ZfeqCzItF7ujgDWld7BgegTwr1eqBPBArgkXofHx/mD1fwk2dOLEYtex8fH+YPX/CCg2d7ktHEAMHwkaJXL6ZfeqGzInovpl96oLMi0Xu6OANaV3sGB6BPCvV6oE8ECuCReh8fH+YPV/CTZ04sRi17Hx8f5g9f8IKDZ3uS0cQAwfCRolcvpl96obMiei+mX3qgsyIxDsrh+eEWwxgNIf3Er+oLyuoMyiwsLPCPPcjgj14sGrcqKPDGeeCT+g3Ktygm+gvKPP4DIAI+AeoLyiAH+gzKPOoMyvoMyl8WyvCT1nkSe8bH4JMqTypHKuUmxl+Hh4M8PG8qX1Z5h4eBPDxveE4sh4eARjw8bypmb3y6OAViV31rX3y4OAVgR31pT3q4OAVQR3tZT3iU4JR8h+CV5dXFr+CSzUpifeCS0eHVzUpi0eE+AeCSzUpi8JRfPniTZy5Hr8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdMAGEH8sdxkBnCA7KMQDC5fCVb8l7vTBVfZNPepRfkTAkV3nLPy88Rz5/kU3Fh09vJgBEKSkJAfdiCcHlJsLwkm94BoDJeUtfkVd5yz8vPEc+d5FNxYdPbyYARCkpCQH4ZwnB5SbC8JJveAaAyZVPepRfkTAkV3nLPy88Rz5/kU3Fh09vJgBEKSkJAalsCcHlJsLwkm94BoDJeUtfkVd5yz8vPEc+d5FNxYdPbyYARCkpCQGqcQnB5SbC8JJveAaAyYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNg7gwBZOCcSwsDYO4MAWTgnEsLA2DuDAFk4JxLCwNyXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDXEsLIO4MAOTgg1xLCyDuDADk4INcSwsg7gwA5OCDcmDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDIO4MAWTgnEsLAyDuDAFk4JxLCwMg7gwBZOCcSwsDMlxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggxxLCyDuDADk4IMcSwsg7gwA5OCDHEsLIO4MAOTggzJxg+Hh+oawXovpl96obMiei+mX3qgszIkeRgAInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQicC0kInAtJCJwLSQW/8n///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+qqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQAhMwwzwAASABIzwDMMACEAITMMM8AAEgASM8AzDAAhACEzDDPAABIAEjPAMwwAIQj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINkI/Bh+Mv1k+8DvgedAsyDZCPwYfjL9ZPvA74HnQLMg2Qj8GH4y/WT7wO+B50CzINnMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzzMzMzDMzMzPMzMzMMzMzM8zMzMwzMzMzwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDMDAwMAMDAwMwMDAwAwMDAzAwMDADAwMDPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBDx8QEBAQEBAR8fEBAQEBAQ8fEBAQEBAQEfHxAQEBAQEPHxAQEBAQEBHx8QEBAQEBCqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlVVqqpVVaqqVVWqqlUC4XIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJInAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSJwCSJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAkicAkicAkicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7InAJInAJInAJLCwly2XIJGjJycnJyeEicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAlyLHAJeyJwCSJwCSwsJctlyCRoycnJycnhInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJInAJcixwCXsicAksLCXLZcgkaMnJycnJ4SJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCSJwCXIscAl7LCwly2XIJGjJycnJydE+t5LI4IXmB8RSRPCFHx8focjlzTJE4XkicCwicCwicCwicCwicCwicCwicCwicCzJ+ABUXWhHeZAfyx1nATNZCfCCMQCv/qAoAzEAvwH/AOlHPgeQVF1HDjOvyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxkwAYAfyxlHIbRXCeViaz7/AQ8Ayfoay2/6G8uFZ/4UIAU+/y0YBtbsIAU8LOoby3zqGsvNr2AhlEbNyhDwpMagV/Cjxn9f1SGXRs3KEPCkxqBn8KPGf2/RzTEcKAsf2hhZH9oYWcPERny6OAViV31rX+XNmkbh1Xu90sxFe9ZA4Ih9k0884Il6lF/ghjzgij2RMGvgh3nLPy88g+CF8IIBDwBvVHzWQBfLN6GFZ3rmBxdvGAjwij3KAETgivCJX/CGV/CFGASCHSgLy38g+Ffwh4LghR3NYkUY2nvgifCIg1/l5gf2CG8mB1Z7aB8fHx/LHR/LHeYDxkBnrx7/6XnghpPgh3vLPy88geCF8IIBDwBvVHzWQBfLN6GFZ3rmBxdv8Ilf8IZX8IXLfyAHV/CHgh0YAYLghc1iRfCKPcoAROCKGN171kDgiHuVTzzgiXqUX+CGPOCKPZEwa+CHecs/LzyD4IXwggEPAG9UfNZAF8s3oYVneuYHF28YCPCKPcoAROCK8Ilf8IZX8IUYBIIdKAvLfyD4V/CHguCFHc0qRhjae+CJ8IiTX+XmB/YQbyYHVntoHx8fH8sdH8sd5gPGQGc+/1jpeeCGk+CHe8s/LzyB4IXwggEPAG9UfNZAF8s3oYVneuYHF2/wiV/whlfwhct/IAdX8IeCHRgBguCFzSpG8Io9ygBE4IoY3UYAALoAAHzWQMhPHx8f5h9HeeYHKAsE/gUwBvUhylblBT4PkCHJRoRn5fCCZ69vyfCCZ69vIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIsnxAQ8APcqEVz0odj0oOj0idwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwksLCXLZSgCJGgidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkidwkid8kicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAksLCUicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAkicAloyfgAVF3wgjEAr/6gKAMxAL8B/wDFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcVia/nJJgJ+4JovPOCYfcZAb37gl+Cbr+CZ4JzgneCePkDgn8n/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Aw==';
-
-// End of realtime.js file.
-
-setupGameboy();
-
-class Benchmark {
-    runIteration() {
-        runGameboy();
-    }
-}
diff --git a/Octane/mandreel.js b/Octane/mandreel.js
deleted file mode 100644
index 656387d..0000000
--- a/Octane/mandreel.js
+++ /dev/null
@@ -1,277398 +0,0 @@
-// Portions copyright 2012 Google, Inc.
-// Copyright 2012 Onan Games. All rights reserved.
-// Copyright (C) 2015 Apple Inc. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-//       notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-//       copyright notice, this list of conditions and the following
-//       disclaimer in the documentation and/or other materials provided
-//       with the distribution.
-//     * Neither the name of Google Inc. nor the names of its
-//       contributors may be used to endorse or promote products derived
-//       from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-var mandreelPauseTimes = [];
-var mandreelSampleTimeStart = 0.0;
-
-function setupMandreel() {
-  // Check for Typed Arrays support, throw error if not.
-  if (!(typeof Uint8Array != "undefined" &&
-    typeof Float64Array != "undefined" &&
-    typeof (new Uint8Array(0)).subarray != "undefined")) {
-      throw "TypedArrayUnsupported";
-  }
-
-  my_old_constructors = mandreel_call_constructors;
-  mandreel_call_constructors = my_mandreel_call_constructors;
-  startMandreelTimer();
-  startApp();
-  _mandreelAppAudioReady();
-}
-
-function runMandreel() {
-  Mandreel_currentTime = 0;
-  var sp = g_stack_pointer+800*1024;
-  for (var i=0;i<mandreel_total_memory/4;i++) {
-    heap32[i] = my_heap32[i];
-  }
-  tlsf_ptr = 0;
-  heapNewPos = my_heapNewPos;
-  my_old_constructors(llvm_2E_global_ctors,5,sp);
-  heapU32[sp>>2] = 640;
-  heapU32[(sp+4)>>2] = 480;
-  __mandreel_internal_SetResolution(sp);
-  __mandreel_internal_init(g_stack_pointer+800*1024);
-  __init(g_stack_pointer+800*1024);
-  for (var i = 0; i < 20; i++) {
-    render();
-    Mandreel_flushTimeouts();
-    updateMandreelStats(performance.now());
-  }
-  Mandreel_checkState();
-}
-
-function updateMandreelStats(time) {
-  var pause = time - mandreelSampleTimeStart;
-  mandreelSampleTimeStart = time;
-  mandreelPauseTimes.push(pause);
-}
-
-function startMandreelTimer() {
-  mandreelSampleTimeStart = performance.now();
-}
-
-function latencyMandreel() {
-  return mandreelPauseTimes;
-}
-
-function tearDownMandreel() {
-  my_old_constructors = null;
-  my_heap = null;
-  my_heap8 = null;
-  my_heap32 = null;
-
-  heap = null;
-  heap8 = null;
-  heapU8 = null;
-  heap16 = null;
-  heapU16 = null;
-  heap32 = null;
-  heapU32 = null;
-  heapFloat = null;
-  heapDouble = null;
-  mandreelAppUsePackAsyncTexture = null;
-  mandreelPauseTimes = [];
-}
-
-// Mocks for browser functions.
-
-function Mandreel_setTimeout(cmd, delay) {
-  timeouts.push(cmd);
-}
-
-function Mandreel_flushTimeouts() {
-  while (Mandreel_timeouts.length != 0) {
-    var next = Mandreel_timeouts.pop();
-    eval(next);
-  }
-}
-
-Mandreel_timeouts = new Array();
-
-Mandreel_XMLHttpRequest = function() {
-  this.open = function(type, url, some_bool) {
-    this.url = url;
-  }
-  this.overrideMimeType = function() {
-  }
-  this.send = function() {
-    this.response = null;
-    this.readyState = 4;
-    this.status = 0;
-    this.onreadystatechange();
-  }
-};
-
-function Mandreel_Element(type) {
-  this.element_type = type;
-  this.insertBefore = function() {
-  }
-}
-
-
-function Mandreel_Context() {
-}
-
-function Mandreel_Canvas() {
-}
-
-function Mandreel_CanvasDiv() {
-}
-
-Mandreel_document = {
-  createElement : function(element_type) {
-    var element = new Mandreel_Element(element_type);
-    element.parentNode = new Mandreel_Element("dummy_parent");
-    return element;
-  },
-  getElementById : function(name) {
-    if (name === "canvas") {
-      return new Mandreel_Canvas();
-    } else if (name === "canvasDiv") {
-      return new Mandreel_CanvasDiv();
-    } else {
-      return undefined;
-    }
-  },
-  getElementsByTagName : function(element) {
-    if (element === "script") {
-      return new Array(new this.createElement(element));
-    }
-  }
-
-};
-
-Mandreel_window = {
-  WebGLRenderingContext: {},
-  Float64Array: Float64Array,
-  Float32Array: Float32Array,
-  Int32Array: Int32Array,
-  Uint32Array: Uint32Array,
-  Int16Array: Int16Array,
-  Uint16Array: Uint16Array,
-  Int8Array: Int8Array,
-  Uint8Array: Uint8Array,
-  setTimeout: Mandreel_setTimeout,
-  addEventListener : function () {},
-  document: Mandreel_document
-};
-
-function dump(x) { }
-
-alert = typeof alert != "undefined" ? alert : function(x) {
-  print(x);
-}
-
-var my_old_constructors;
-var my_heap;
-var my_heap8;
-var my_heap32;
-var my_heapNewPos;
-
-function my_mandreel_call_constructors(_ptr, size,stackPos) {
-  my_heapNewPos = heapNewPos;
-  my_heap = new ArrayBuffer(mandreel_total_memory);
-  my_heap8 = new Int8Array(my_heap);
-  my_heap32 = new Int32Array(my_heap);
-  for (var i=0;i<mandreel_total_memory/4;i++) {
-    my_heap32[i] = heap32[i];
-  }
-  my_old_constructors(_ptr,size,stackPos);
-}
-
-
-var Mandreel_currentTime = 0;
-
-function Date_now() {
-   Mandreel_currentTime += 16;
-   return Mandreel_currentTime;
-}
-
-function Mandreel_checkState() {
-  var sum = 0;
-  for (var i = 0; i < heap32.length; i += 100) {
-    sum = (sum * 3 + heap32[i]) & 0xFFFFFF;
-  }
-  if (sum != 8001026) {
-    alert("Check sum mismatch: expected ???, actual " + sum);
-  }
-}
-
-// Original Mandreel code follows.
-// Modifications for benchmarking are marked in comments.
-
-// Start of js/main.js file:
-
-////////////////////////////////////////////
-function startApp(_platform)
-{
-	// Start mandreel
-	var params =
-	{
-		platform : _platform,
-		width : 1024,
-		height : 768,
-		webglCanvas : "canvas",
-		flashCanvas : "FlashDiv",
-		workingFolderFlash : "data/as3/",
-		workingFolderWebgl : "data/js/",
-		swfFlash : "mandreel.swf",
-		log : true
-	};
-	mandreelAppStart(appStartState,params);
-}
-
-////////////////////////////////////////////
-function appStartState(state,param)
-{
-	// mandreel.js program is been loaded
-	if ( state == "loadingScript" )
-	{
-	}
-
-	// mandreel.js program has been loaded
-	if ( state == "scriptLoaded" )
-	{
-	}
-
-	// loading pack data file
-	if (state == "loadingData")
-	{
-		// param bytes loaded
-	}
-
-	// Audio system is been started
-	if ( state == "loadingAudio" )
-	{
-	}
-
-	// Audio system is ready and the default audio preloading has been done
-	if ( state == "audioLoaded" )
-	{
-	}
-
-
-
-	// Mandreel has been started, render will start automatically
-	if ( state == "ready" )
-	{
-		// Hide loading image
-		var canvasElement = Mandreel_document.getElementById('loading');
-		if ( canvasElement != null )
-			canvasElement.style.visibility = "hidden";
-	}
-
-	// An error has been produced during the start process and the app must quit
-	if ( state == "error" )
-	{
-		if ( param == "webgl_not_found" )
-		{
-			window.location = "http://get.webgl.org";
-			return;
-		}
-		alert(param);
-	}
-}
-
-// End of js/main.js file.
-
-// Start of js/mandreelapp.js file.
-
-var mandreelAppMandreelJs = "mandreel.js";
-var mandreelAppMandreelJsCompressed = false;
-var mandreelAppWorkingFolder = "data/js/";
-var mandreelAppLog = false;
-var mandreelAppLocalHost = "http://localhost";
-var mandreelAppReadDataFromLocalHost = false;
-var mandreelAppReadMandreelJsFromLocalHost = false;
-var mandreelAppHostedAudioServer = null;
-var mandreelAppHostedAudioUrl = null;
-var mandrelCurrentFatVersion = "1.4";
-var mandreelAppPlatform = "webgl";
-var mandreelAppCanvasWidth = 1024;
-var mandreelAppCanvasHeight = 768;
-var mandreelAppWidthSrc = 1024;
-var mandreelAppHeightSrc = 768;
-var mandreelAppCanvasName = "canvas";
-var mandreelAppCanvasDiv = "canvasDiv";
-var mandreelAppUseFlashSockets = false;
-var mandreelAppUsePackAsyncTexture = new Array();
-//var mandreelBufferPackAsyncTexture = null;
-var mandreelAppForceFocus = true;
-var _imandreel_pause_game = false;
-
-/* The following code was removed for benchmarking:
-navigator.pointer = navigator.pointer || navigator.webkitPointer || navigator.mozPointer || null;*/
-
-/* The following code was removed for benchmarking:
- if (!Date_now) {
-   Date_now = function() {
-     return +new Date();
-   };
- };*/
-
-////////////////////////////////////////////
-
-if (Mandreel_window["console"])
-{
-	if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ if ( mandreelAppLog ) console.log(str) };
-}
-else
-{
-	if (!Mandreel_window["dump"]) Mandreel_window["dump"] = function dump(str){ };
-}
-
-/* The following code is removed for benchmarking:
-var mandreel_BrowserDetect = {
-	init: function () {
-		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
-		this.version = this.searchVersion(navigator.userAgent)
-			|| this.searchVersion(navigator.appVersion)
-			|| "an unknown version";
-		this.OS = this.searchString(this.dataOS) || "an unknown OS";
-	},
-	searchString: function (data) {
-		for (var i=0;i<data.length;i++)	{
-			var dataString = data[i].string;
-			var dataProp = data[i].prop;
-			this.versionSearchString = data[i].versionSearch || data[i].identity;
-			if (dataString) {
-				if (dataString.indexOf(data[i].subString) != -1)
-					return data[i].identity;
-			}
-			else if (dataProp)
-				return data[i].identity;
-		}
-	},
-	searchVersion: function (dataString) {
-		var index = dataString.indexOf(this.versionSearchString);
-		if (index == -1) return;
-		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
-	},
-	dataBrowser: [
-		{
-			string: navigator.userAgent,
-			subString: "Chrome",
-			identity: "Chrome"
-		},
-		{ 	string: navigator.userAgent,
-			subString: "OmniWeb",
-			versionSearch: "OmniWeb/",
-			identity: "OmniWeb"
-		},
-		{
-			string: navigator.vendor,
-			subString: "Apple",
-			identity: "Safari",
-			versionSearch: "Version"
-		},
-		{
-			prop: window.opera,
-			identity: "Opera",
-			versionSearch: "Version"
-		},
-		{
-			string: navigator.vendor,
-			subString: "iCab",
-			identity: "iCab"
-		},
-		{
-			string: navigator.vendor,
-			subString: "KDE",
-			identity: "Konqueror"
-		},
-		{
-			string: navigator.userAgent,
-			subString: "Firefox",
-			identity: "Firefox"
-		},
-		{
-			string: navigator.vendor,
-			subString: "Camino",
-			identity: "Camino"
-		},
-		{		// for newer Netscapes (6+)
-			string: navigator.userAgent,
-			subString: "Netscape",
-			identity: "Netscape"
-		},
-		{
-			string: navigator.userAgent,
-			subString: "MSIE",
-			identity: "Explorer",
-			versionSearch: "MSIE"
-		},
-		{
-			string: navigator.userAgent,
-			subString: "Gecko",
-			identity: "Mozilla",
-			versionSearch: "rv"
-		},
-		{ 		// for older Netscapes (4-)
-			string: navigator.userAgent,
-			subString: "Mozilla",
-			identity: "Netscape",
-			versionSearch: "Mozilla"
-		}
-	],
-	dataOS : [
-		{
-			string: navigator.platform,
-			subString: "Win",
-			identity: "Windows"
-		},
-		{
-			string: navigator.platform,
-			subString: "Mac",
-			identity: "Mac"
-		},
-		{
-			   string: navigator.userAgent,
-			   subString: "iPhone",
-			   identity: "iPhone/iPod"
-	    },
-		{
-			string: navigator.platform,
-			subString: "Linux",
-			identity: "Linux"
-		}
-	]
-
-};
-mandreel_BrowserDetect.init(); */
-
-////////////////////////////////////////////
-var mandreel_packfiledata_name = null;
-var mandreel_packfiledata_compressed = false;
-var mandreel_packfiledata_size = 0;
-var mandreel_total_packtexture_size = 0;
-var mandreel_total_pogfile_size = 0;
-var mandreel_loaded_packtexture_size = 0;
-var mandreel_jslzma_size = 0;
-var mandreel_swf_size = 0;
-
-var mandreelJsScriptLoaded_loaded = false;
-
-var mandreel_swf_last_total_size = 0;
-function mandreel_swf_size_updated(str)
-{
-	var params = str.split(',');
-	if ( mandreel_swf_size == 0 )
-	{
-		mandreel_swf_last_loaded_size = 0;
-	}
-	mandreel_swf_size = parseInt(params[0]);
-	var loaded = parseInt(params[1]);
-	var delta_size = loaded - mandreel_swf_last_loaded_size;
-	mandreel_swf_last_loaded_size = loaded;
-
-	var percentage = ((100*loaded)/mandreel_swf_size)|0;
-	if (percentage>100)
-		percentage = 100;
-
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
-
-	imandreel_update_load(delta_size,0);
-}
-
-function mandreel_swf_size_loaded(str)
-{
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("scriptLoaded","");
-}
-
-function mandreelNextDecompress(mandreel_result_lzma)
-{
-
-	if ( mandreelAppStartStateFunc )
-	{
-		var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
-
-		var percentage;
-
-		if (totalBytesLeft == 0)
-			percentage = 0;
-		else
-			percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
-
-		mandreelAppStartStateFunc("uncompressingDataUpdate",percentage);
-	}
-
-	var old_result = mandreel_result_lzma;
-	mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
-
-	if (mandreel_result_lzma == null)
-	{
-		//setTimeout(mandreelLoadScript,10,old_result.my_outStream.data);
-
-		//mandreel_fs_saveFile('data.bin', old_result.my_outStream.arrayBuffer);
-		//callback(old_result.my_outStream.arrayBuffer);
-		//alert('done');
-		mandreelLoadPackData(old_result.my_outStream.arrayBuffer,true);
-	}
-	else
-	{
-		Mandreel_setTimeout(mandreelNextDecompress,10,mandreel_result_lzma);
-	}
-
-
-}
-
-function mandreel_load_packfile(array_buffer)
-{
-	if (array_buffer)
-	{
-		mandreelLoadPackData(array_buffer,false);
-		return;
-	}
-
-	var working_folder = mandreelAppWorkingFolder;
-	if ( mandreelAppReadDataFromLocalHost )
-		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
-	var packdata_request = new XMLHttpRequest();
-	var url = working_folder+mandreel_packfiledata_name;
-
-	packdata_request.open("GET", url, true);
-
-	if("responseType" in packdata_request)
-		packdata_request.responseType="arraybuffer";
-	else
-		packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
-
-	var last_loaded_size = 0;
-
-	packdata_request.onreadystatechange = function()
-	{
-		if (packdata_request.readyState != 4) return;
-
-		if (packdata_request.status == 200)
-		{
-			var buffer;
-			if (packdata_request.responseType=="arraybuffer")
-				buffer=packdata_request.response;
-			else if (packdata_request.mozResponseArrayBuffer != null)
-				buffer = packdata_request.mozResponseArrayBuffer;
-			else
-				buffer=packdata_request.response;
-
-			if (mandreel_packfiledata_compressed)
-			{
-				var inStream = {
-				  data: new Uint8Array(buffer),
-				  offset: 0,
-				  readByte: function(){
-					return this.data[this.offset ++];
-				  }
-				};
-
-				var outStream = {
-				  data: null,
-				  offset: 0,
-				  binary_mode : true,
-				  writeByte: function(value){
-					this.data[this.offset ++] = value;
-				  }
-				};
-
-
-				var result = LZMA.decompress2(inStream,inStream,outStream,null);
-
-				if (result == null)
-					mandreelLoadPackData(outStream.arrayBuffer,true);
-				else
-					Mandreel_setTimeout(mandreelNextDecompress,10,result);
-			}
-			else
-				mandreelLoadPackData(buffer,true);
-		}
-		else
-		{
-			if ( mandreelAppStartStateFunc )
-				mandreelAppStartStateFunc("error","can't load packfile data");
-		}
-	}
-	packdata_request.onprogress = function(e)
-	{
-		var delta_size = e.loaded - last_loaded_size;
-		last_loaded_size = e.loaded;
-		var percentage = ((100*e.loaded)/mandreel_packfiledata_size)|0;
-
-
-		imandreel_update_load(delta_size,0);
-
-		if (percentage>100)
-			percentage = 100;
-
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingData",percentage);
-	}
-
-	packdata_request.send();
-}
-
-function mandreelJsScriptLoaded()
-{
-	if (mandreelJsScriptLoaded_loaded)
-		return;
-
-	if (typeof(mandreel_cache_files)=="undefined")
-	{
-		Mandreel_setTimeout(mandreelJsScriptLoaded,10);
-		return;
-	}
-
-	mandreelJsScriptLoaded_loaded = true;
-
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("scriptLoaded","");
-
-	if (mandreel_packfiledata_name)
-	{
-
-		mandreel_fs_load_binary(mandreel_packfiledata_name, mandreel_load_packfile);
-
-
-	}
-	else
-	{
-		mandreelCacheMandreelFat();
-		imandreelJsScriptLoaded();
-	}
-}
-
-function imandreelLoadAudio()
-{
-	g_mandreel_working_folder = mandreelAppWorkingFolder;
-	if ( mandreelAppReadDataFromLocalHost )
-		g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
-
-	// load audio
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("loadingAudio","");
-	mandreel_start_audio(mandreelAppHostedAudioServer,mandreelAppHostedAudioUrl,_mandreelAppAudioReady);
-}
-
-var _mandreel_currentPackTexture = '';
-
-function imandreel_packasynctexture_loaded(buffer,save_file)
-{
-	if (save_file)
-		mandreel_fs_saveFile(_mandreel_currentPackTexture,buffer);
-
-	//mandreelBufferPackAsyncTexture = buffer;
-	Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = buffer;
-
-	imandreelLoadNextTexturePack();
-}
-
-var mandreel_update_total_size = 0;
-
-function imandreel_update_load(size, total)
-{
-	if (total == 0)
-		total = mandreel_packfiledata_size + mandreel_total_packtexture_size + mandreel_total_pogfile_size + mandreel_jslzma_size + mandreel_swf_size;
-
-
-	mandreel_update_total_size+=size;
-
-	var percentage = ((100*mandreel_update_total_size)/total)|0;
-
-	if (percentage>100)
-		percentage = 100;
-	if (mandreelAppStartStateFunc)
-		mandreelAppStartStateFunc("loadingProgress",percentage);
-
-}
-
-
-function imandreel_packasynctexture_load(array_buffer)
-{
-	if (array_buffer)
-	{
-		imandreel_packasynctexture_loaded(array_buffer, false);
-		return;
-	}
-
-
-	var working_folder = mandreelAppWorkingFolder;
-	if ( mandreelAppReadDataFromLocalHost )
-		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
-	var packdata_request = new XMLHttpRequest();
-	var url = working_folder+_mandreel_currentPackTexture;
-
-	packdata_request.open("GET", url, true);
-
-	if("responseType" in packdata_request)
-		packdata_request.responseType="arraybuffer";
-	else
-		packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
-
-	var last_loaded_size = 0;
-
-	packdata_request.onreadystatechange = function()
-	{
-		if (packdata_request.readyState != 4) return;
-
-		if (packdata_request.status == 200)
-		{
-			var buffer;
-			if (packdata_request.responseType=="arraybuffer")
-				buffer=packdata_request.response;
-			else if (packdata_request.mozResponseArrayBuffer != null)
-				buffer = packdata_request.mozResponseArrayBuffer;
-			else
-				buffer=packdata_request.response;
-
-			imandreel_packasynctexture_loaded(buffer, true);
-		}
-		else
-		{
-			if ( mandreelAppStartStateFunc )
-				mandreelAppStartStateFunc("error","can't load textureasync pack data");
-		}
-	}
-	packdata_request.onprogress = function(e)
-	{
-		var delta_size = e.loaded - last_loaded_size;
-		last_loaded_size = e.loaded;
-		mandreel_loaded_packtexture_size+=delta_size;
-
-		imandreel_update_load(delta_size,0);
-
-		var percentage = ((100*mandreel_loaded_packtexture_size)/mandreel_total_packtexture_size)|0;
-
-		if (percentage>100)
-			percentage = 100;
-
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
-	}
-
-	packdata_request.send();
-
-}
-
-function imandreelLoadNextTexturePack()
-{
-	if (mandreelAppUsePackAsyncTexture.length)
-	{
-		_mandreel_currentPackTexture = mandreelAppUsePackAsyncTexture.pop();
-		mandreel_fs_load_binary(_mandreel_currentPackTexture, imandreel_packasynctexture_load);
-	}
-	else
-		imandreelLoadAudio();
-}
-
-function imandreelJsScriptLoaded()
-{
-	imandreelLoadNextTexturePack();
-}
-
-////////////////////////////////////////////
-
-function mandreelDecompressJSReady(code, save_file)
-{
-	if (save_file)
-		mandreel_fs_saveFile(mandreelAppMandreelJs + ".lzma", code);
-
-	var ga = Mandreel_document.createElement('script');
-	ga.type = "text/javascript";
-	ga.text = code;
-	var s = Mandreel_document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
-	s.parentNode.removeChild(ga);
-	mandreelJsScriptLoaded();
-}
-
-function mandreelNextDecompressJS(mandreel_result_lzma)
-{
-
-	if ( mandreelAppStartStateFunc )
-	{
-		var totalBytesLeft = mandreel_result_lzma.totalSize - mandreel_result_lzma.remainingBytes;
-
-		var percentage;
-
-		if (totalBytesLeft == 0)
-			percentage = 0;
-		else
-			percentage = ((100*totalBytesLeft)/mandreel_result_lzma.totalSize)|0;
-
-		mandreelAppStartStateFunc("uncompressingScriptUpdate",percentage);
-	}
-
-	var old_result = mandreel_result_lzma;
-	mandreel_result_lzma = LZMA.decompress2(mandreel_result_lzma.inStream,mandreel_result_lzma.inStream,mandreel_result_lzma.outStream,mandreel_result_lzma);
-
-	if (mandreel_result_lzma == null)
-	{
-		mandreelDecompressJSReady(old_result.my_outStream.data,true);
-	}
-	else
-	{
-		Mandreel_setTimeout(mandreelNextDecompressJS,10,mandreel_result_lzma);
-	}
-
-
-}
-
-function mandreel_load_compressed_js(code_js)
-{
-	if (code_js)
-	{
-		mandreelDecompressJSReady(code_js,false);
-		return;
-	}
-	 var xmlhttp_get = new XMLHttpRequest();
-
-	 var url = mandreelAppMandreelJs + ".lzma";
-	 if ( mandreelAppReadMandreelJsFromLocalHost )
-		url = mandreelAppLocalHost+"/"+url;
-
-	 xmlhttp_get.open('GET',url);
-
-
-	if("responseType" in xmlhttp_get)
-		xmlhttp_get.responseType="arraybuffer";
-	else
-		xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');
-
-	var last_loaded_size = 0;
-
-	xmlhttp_get.onreadystatechange = function()
-	{
-		if (xmlhttp_get.readyState==4)
-		{
-			if (xmlhttp_get.status==200 || xmlhttp_get.status==0)
-			{
-
-				var inStream = {
-				  data: new Uint8Array(xmlhttp_get.response),
-				  offset: 0,
-				  readByte: function(){
-					return this.data[this.offset ++];
-				  }
-				};
-
-				var outStream = {
-				  data: new String(""),
-				  offset: 0,
-				  binary_mode : false,
-				  writeByte: function(value){
-					this.data+=String.fromCharCode(value);
-				  }
-				};
-
-
-				var result = LZMA.decompress2(inStream,inStream,outStream,null);
-				if (result == null)
-					mandreelDecompressJSReady(outStream.data,true);
-				else
-					Mandreel_setTimeout(mandreelNextDecompressJS,10,result);
-			}
-			else
-			{
-				alert('error ' + xmlhttp_get.status);
-			}
-		}
-
-	}
-
-	xmlhttp_get.onprogress = function(e)
-	{
-		var delta_size = e.loaded - last_loaded_size;
-		last_loaded_size = e.loaded;
-
-		var percentage = ((100*e.loaded)/e.total)|0;
-
-		mandreel_jslzma_size = e.total;
-
-		imandreel_update_load(delta_size,0);
-
-		if (percentage>100)
-			percentage = 100;
-
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingScriptUpdate",percentage);
-	}
-
-	xmlhttp_get.send();
-
-}
-
-function mandreelLoadMandreelJsScript()
-{
-	if (mandreelAppMandreelJsCompressed)
-	{
-		mandreel_fs_load_text(mandreelAppMandreelJs + ".lzma", mandreel_load_compressed_js);
-
-	}
-	else
-	{
-		var ga = Mandreel_document.createElement('script');
-		ga.type = 'text/javascript';
-		ga.async = true;
-		ga.onload = ga.onreadystatechange = mandreelJsScriptLoaded;
-		var url = mandreelAppMandreelJs;
-		if ( mandreelAppReadMandreelJsFromLocalHost )
-			ga.src = mandreelAppLocalHost+"/"+url;
-		else
-			ga.src = url;
-		var s = Mandreel_document.getElementsByTagName('script')[0];
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingScript","");
-		s.parentNode.insertBefore(ga, s);
-	}
-}
-
-////////////////////////////////////////////
-function mandreelFatLoaded()
-{
-	if ( mandreelAppPlatform == "nacl" )
-	{
-		g_mandreel_working_folder = mandreelAppWorkingFolder;
-		if ( mandreelAppReadDataFromLocalHost )
-			g_mandreel_working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
-
-		// load audio
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingAudio","");
-		_mandreelAppAudioReady();
-	}
-	else
-		mandreelLoadMandreelJsScript();
-}
-
-var mandreelFatData = "";
-var mandreelFatPreloadRequest = 0;
-////////////////////////////////////////////
-
-function mandreel_chanka_fixfile(fileName)
-{
-	var fileNameNoExt = fileName.toLowerCase();
-	fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");
-
-	fileNameNoExt =  fileNameNoExt.substr(1);
-
-	var new_fileName = '';
-
-	for(var j = 0; j < fileNameNoExt.length; j++)
-	{
-		var data = fileNameNoExt.charCodeAt(j);
-
-		if (data != 13)
-		{
-			 var t = String.fromCharCode(data);
-			 new_fileName+=t;
-		}
-	}
-
-	return 	new_fileName;
-}
-
-function mandreel_removecr(my_string)
-{
-	var new_string = '';
-	for(var j = 0; j < my_string.length; j++)
-	{
-		var data = my_string.charCodeAt(j);
-
-		if (data != 13)
-		{
-			 var t = String.fromCharCode(data);
-			 new_string+=t;
-		}
-	}
-
-	return 	new_string;
-}
-
-function mandreelCacheMandreelFat()
-{
-	var array_mandreel_fat = new ArrayBuffer(mandreelFatData.length+1);
-
-
-	{
-		var j;
-		var len = mandreelFatData.length;
-		var data_char;
-
-		var my_bytes = new Uint8Array(array_mandreel_fat);
-
-		for(j = 0; j < len; j++)
-		{
-			data_char = mandreelFatData.charCodeAt(j);
-
-			my_bytes[j] = data_char;
-		}
-		my_bytes[j] = 0;
-	}
-
-
-	mandreel_cache_files['mandreel.fat'] = array_mandreel_fat;
-}
-
-function mandreelLoadPackData(data, save_pack)
-{
-	var files = mandreelFatData.split('\n');
-
-	var current_dir = '';
-	var current_offset = 0;
-
-	if (save_pack)
-		mandreel_fs_saveFile(mandreel_packfiledata_name,data);
-
-
-	for (var i=0;i<files.length;++i)
-	{
-		var file_data = files[i].split(',');
-
-		if (file_data[0] == 'dir')
-		{
-			current_dir = file_data[1];
-			//current_dir = current_dir.substr(0,current_dir.lengh-1);
-		}
-		else if (file_data[0] == 'file')
-		{
-			var file_name = current_dir + file_data[1];
-			file_name = mandreel_chanka_fixfile(file_name) ;
-			//dump('new file ' + file_name + ' ' + current_offset);
-			//dump(file_name);
-			var file_size = parseInt(file_data[2]);
-
-			var my_array = new ArrayBuffer(file_size);
-
-			var my_bytes = new Uint8Array(my_array);
-
-			var data_bytes = new Uint8Array(data,current_offset,file_size);
-
-			my_bytes.set(data_bytes);
-
-			mandreel_cache_files[file_name] = my_array;
-
-
-			current_offset+=file_size;
-
-
-		}
-	}
-
-
-
-	g_mandreel_datafiles_sufix = '';
-	mandreelCacheMandreelFat();
-
-	imandreelJsScriptLoaded();
-}
-
-var preCreatedWebAudioContext = null;
-
-function mandreelLoadFat()
-{
-	mandreelFatPreloadRequest = new Mandreel_XMLHttpRequest();
-	var working_folder = mandreelAppWorkingFolder;
-	if ( mandreelAppReadDataFromLocalHost )
-		working_folder = mandreelAppLocalHost+"/"+mandreelAppWorkingFolder;
-	var url = working_folder+"mandreel.fat.dat";
-	if ( mandreelAppPlatform == "nacl" )
-		url = working_folder+"mandreel.fat";
-	mandreelFatPreloadRequest.open("GET", url, true);
-	mandreelFatPreloadRequest.onreadystatechange = function()
-	{
-		if (mandreelFatPreloadRequest.readyState != 4) return;
-		if ( mandreelFatPreloadRequest.status != 404 && mandreelFatPreloadRequest.response != null )
-		{
-			mandreelFatData = mandreelFatPreloadRequest.response;
-		}
-		if ( mandreelFatData == "" )
-		{
-			dump("error loading mandreel.fat file, Maybe the working folder is not correctly set???");
-		}
-
-		var packfiledata = null;
-		var compressed = false;
-		var packfiledata_size = 0;
-		var total_packtexture_size = 0;
-		var pogsize = 0;
-
-		// Check version
-		var FatLines = mandreelFatData.split('\n');
-		for ( var i=0;i<FatLines.length;++i )
-		{
-			var line = mandreel_removecr(FatLines[i]);
-			var params = line.split(',');
-			if ( params[0] == "version" )
-			{
-				if ( params[1] != mandrelCurrentFatVersion )
-					dump("warning: mandreel.fat version number is ("+params[1]+") and it should be ("+mandrelCurrentFatVersion+")");
-
-			}
-			else if ( params[0] == "platform" && params[1] != "js" && (mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas")  )
-				dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (js)");
-			else if ( params[0] == "platform" && params[1] != "nacl" && mandreelAppPlatform == "nacl"  )
-				dump("warning: mandreel.fat platform is ("+params[1]+") and it should be (nacl)");
-			else if (params[0] == 'packdata')
-			{
-				packfiledata = params[1];
-				compressed = params[2].charAt(0) == '1';
-				packfiledata_size =  parseInt(params[3], 10);
-			}
-			else if (params[0] == 'flashsockets')
-			{
-				mandreelAppUseFlashSockets = true;
-			}
-			else if (params[0] == 'packtexture')
-			{
-				var filename = params[1];
-				var size_packtexture = parseInt(params[3], 10);
-				total_packtexture_size+=size_packtexture;
-				mandreelAppUsePackAsyncTexture.push(filename);
-			}
-			else if (params[0] == 'audiopreloadfile')
-			{
-				pogsize = parseInt(params[2],10);
-			}
-			else if (params[0] == 'audiodriver' && params[1] == 'webaudio')
-			{
-				try	{ preCreatedWebAudioContext = new webkitAudioContext(); } catch(err) { preCreatedWebAudioContext = null; }
-			}
-		}
-
-		if ( preCreatedWebAudioContext != null )
-			mandreel_total_pogfile_size = pogsize;
-		mandreel_packfiledata_name = packfiledata;
-		mandreel_packfiledata_compressed = compressed;
-		mandreel_packfiledata_size = packfiledata_size;
-		mandreel_total_packtexture_size = total_packtexture_size;
-		mandreelFatLoaded();
-	}
-	mandreelFatPreloadRequest.send();
-}
-
-var mandreelAppStartStateFunc = 0;
-var mandreelDisableSpaceKey = true;
-////////////////////////////////////////////
-function mandreelAppStart(startStateFunc,params)
-{
-	mandreelAppStartStateFunc = startStateFunc;
-
-
-
-
-	if ( typeof(params.log) != 'undefined' )
-		mandreelAppLog = params.log;
-
-	if ( typeof(params.platform) != 'undefined' )
-		mandreelAppPlatform = params.platform;
-
-	if (typeof(params.mandreelJSCompressed) != 'undefined' )
-		mandreelAppMandreelJsCompressed = params.mandreelJSCompressed;
-
-
-/*	 The following code is removed for benchmarking:
-	if ((mandreel_BrowserDetect.browser == 'Chrome' || mandreel_BrowserDetect.browser == 'Safari') && mandreel_BrowserDetect.OS == 'Mac' && mandreelAppPlatform == "flash")
-		mandreelDisableSpaceKey = false; */
-
-	if ( mandreelAppPlatform != "webgl" && mandreelAppPlatform != "flash" && mandreelAppPlatform != "nacl" && mandreelAppPlatform != "canvas" && mandreelAppPlatform != "plugin")
-	{
-		mandreelAppStartStateFunc("error",'platform ('+mandreelAppPlatform+') not supported');
-		return;
-	}
-
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		mandreelAppWorkingFolder = "data/js/";
-		if ( typeof(params.workingFolderWebgl) != 'undefined' )
-			mandreelAppWorkingFolder = params.workingFolderWebgl;
-		// Check Float64Array availability
-		if ( !Mandreel_window["Float64Array"] )
-		{
-			mandreelAppStartStateFunc("error",'Browser unsupported: Float64Array not available');
-			return;
-		}
-
-		var flashElement = Mandreel_document.getElementById('FlashWrapper');
-		if ( flashElement != null )
-		{
-			flashElement.style.visibility = "hidden";
-			flashElement.style.width = "0px";
-			flashElement.style.height = "0px";
-		}
-		var flashElement = Mandreel_document.getElementById('FlashDiv');
-		if ( flashElement != null )
-		{
-			flashElement.style.visibility = "hidden";
-			flashElement.style.width = "0px";
-			flashElement.style.height = "0px";
-		}
-
-		// Setup WebGL
-		if ( typeof(params.webglCanvas) == 'undefined' )
-		{
-			mandreelAppStartStateFunc("error",'canvas parameter not found');
-			return;
-		}
-		var canvas = Mandreel_document.getElementById(params.webglCanvas);
-		if ( canvas == null )
-		{
-			mandreelAppStartStateFunc("error",'canvas object ('+params.webglCanvas+') not found');
-			return;
-		}
-		if ( params.width != null )
-		{
-			canvas.width = params.width;
-			mandreelAppWidthSrc = params.width;
-		}
-		if ( params.height != null )
-		{
-			canvas.height = params.height;
-			mandreelAppHeightSrc = params.height;
-		}
-		if ( mandreelAppPlatform == "webgl" )
-		{
-			// The following code is removed for benchmarking:
-			// imandreel_gl = WebGLUtils.setupWebGL(canvas,{premultipliedAlpha:false,alpha:false});
-			// if (imandreel_gl == null)
-			// {
-			//	mandreelAppStartStateFunc("error","webgl_not_found");
-			//	return;
-			// }
-		}
-
-		if ( mandreelAppPlatform == "canvas" )
-		{
-			imandreel_ctx_canvas = canvas.getContext('2d');
-			if ( imandreel_ctx_canvas == null )
-			{
-				mandreelAppStartStateFunc("error","canvas context 2d not found");
-				return;
-			}
-		}
-
-		if (params.cache != null)
-		{
-			//alert( params.cache.size + params.cache.url);
-			mandreel_fs_init(function() { if ( mandreelAppStartStateFunc )
-				mandreelAppStartStateFunc("loadingFat","");
-			mandreelLoadFat();}, params.cache.size,params.cache.url);
-		}
-		else
-		{
-			// load Fat
-			if ( mandreelAppStartStateFunc )
-				mandreelAppStartStateFunc("loadingFat","");
-			mandreelLoadFat();
-		}
-	}
-
-	if ( mandreelAppPlatform == "flash" )
-	{
-		mandreelAppWorkingFolder = "data/as3/";
-		if ( typeof(params.workingFolderFlash) != 'undefined' )
-			mandreelAppWorkingFolder = params.workingFolderFlash;
-		if (!swfobject.hasFlashPlayerVersion('11.2.0'))
-		{
-			mandreelAppStartStateFunc("error","flash 11 not found");
-			return;
-		}
-
-		if ( typeof(params.flashCanvas) == 'undefined' )
-		{
-			mandreelAppStartStateFunc("error",'canvas parameter not found');
-			return;
-		}
-
-		if ( true ) // hide webgl canvas
-		{
-			var canvas = Mandreel_document.getElementById(mandreelAppCanvasDiv);
-			if ( canvas != null )
-			{
-				canvas.style.visibility = "hidden";
-				canvas.style.width = "0px";
-				canvas.style.height = "0px";
-			}
-		}
-
-		if ( params.width != null )
-		{
-			mandreelAppCanvasWidth = params.width;
-		}
-		if ( params.height != null )
-		{
-			mandreelAppCanvasHeight = params.height;
-		}
-
-		mandreelAppCanvasDiv = params.flashCanvas;
-
-		try
-		{
-			var mandreelSocketsSwf = "mandreel.swf";
-			if ( typeof(params.swfFlash) != 'undefined' )
-				mandreelSocketsSwf = params.swfFlash;
-
-			var my_flashvars = "workingFolder=" + encodeURIComponent(mandreelAppWorkingFolder);
-			if ( typeof(params.log) != 'undefined' && params.log == true)
-			  my_flashvars += "&log=true"
-			my_flashvars += "&width=" + params.width;
-			my_flashvars += "&height=" + params.height;
-			my_flashvars += "&swfloader=" + mandreelSocketsSwf;
-
-			if (typeof(params.restore_context) != 'undefined' && params.restore_context == true)
-				my_flashvars += "&restore_context=1";
-
-			if (typeof(params.antialiasing) != 'undefined')
-				my_flashvars += "&antialiasing=" + params.antialiasing;
-
-			if (typeof(params.right_click_enable) != 'undefined' && params.right_click_enable == true)
-				my_flashvars += "&right_click=1";
-
-			if (typeof(params.disable_depth) != 'undefined' && params.disable_depth == true)
-				my_flashvars += "&disable_depth=1";
-
-			var swfname = "mandreelloader.swf";
-			if ( typeof(params.swfPreloader) != 'undefined' && params.swfPreloader == false)
-				swfname = mandreelSocketsSwf;
-
-			var swf = swfobject.createSWF({ data:swfname, width:"100%", height:"100%" }, { menu:"false",allowScriptAccess:"always",allowFullScreen:"true",wmode:"direct",scale:"noscale",salign :"tl",bgcolor:"#000000",flashvars:my_flashvars}, params.flashCanvas);
-			if ( !swf )
-			{
-				mandreelAppStartStateFunc("error","error loading " + swfname);
-				return;
-			}
-			else
-			{
-				if ( mandreelAppStartStateFunc )
-					mandreelAppStartStateFunc("loadingScript","");
-			}
-		}
-		catch(err)
-		{
-			mandreelAppStartStateFunc("error","exception " + err + " while loading " + mandreelSocketsSwf);
-			return;
-		}
-
-		appStartState('loadingScript');
-	}
-
-	if ( mandreelAppPlatform == "nacl" )
-	{
-		mandreelAppWorkingFolder = "data/nacl/";
-
-		// load Fat
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingFat","");
-		mandreelLoadFat();
-
-	}
-
-	if ( mandreelAppPlatform == "plugin" )
-	{
-		mandreelInitPluginPlatform(params);
-	}
-}
-
-
-////////////////////////////////////////////
-function MandreelAudioStartedNacl()
-{
-	var helloWorldModule = null;
-	helloWorldModule = Mandreel_document.getElementById('hello_world');
-	helloWorldModule.postMessage('init');
-	var flashElement = Mandreel_document.getElementById('FlashWrapper');
-	if ( flashElement != null )
-		flashElement.style.visibility = "hidden";
-	mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
-}
-
-////////////////////////////////////////////
-function _mandreelAppStartReady()
-{
-	if ( mandreelAppPlatform == "nacl" )
-	{
-		wa_initWebAudio();
-		mandreel_webAudio_PreloadAssets();
-	}
-	else
-	{
-		if ( mandreelAppStartStateFunc )
-		{
-			mandreelAppStartRenderWebGL();
-			mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
-		}
-	}
-}
-////////////////////////////////////////////
-function _mandreelAppAudioReady()
-{
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("audioLoaded","");
-
-	if ( mandreelAppUseFlashSockets )
-		mandreel_flash_sockets_load_flash(_mandreelAppStartReady);
-	else
-		_mandreelAppStartReady();
-}
-
-////////////////////////////////////////////
-function mandreelAppInit()
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		global_init(g_stack_pointer+800*1024);
-
-		//Mandreel_TextureAsync_PackBufferData[_mandreel_currentPackTexture] = mandreelBufferPackAsyncTexture;
-		//mandreelBufferPackAsyncTexture = null;
-		var sp = g_stack_pointer+800*1024;
-		heapU32[sp>>2] = mandreelAppCanvasWidth;
-		heapU32[(sp+4)>>2] = mandreelAppCanvasHeight;
-		__mandreel_internal_SetResolution(sp);
-		__mandreel_internal_init(g_stack_pointer+800*1024);
-		__init(g_stack_pointer+800*1024);
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppDraw(elapsed)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		if ( mandreelAppPlatform == "canvas" && imandreel_ctx_canvas != null )
-		{
-			var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
-			imandreel_ctx_canvas.clearRect(0,0,canvas.width,canvas.height);
-		}
-		var sp = g_stack_pointer+800*1024;
-		__mandreel_internal_preupdate(sp);
-		heapU32[sp>>2] = elapsed;
-		__draw(sp);
-		__mandreel_internal_update(sp);
-		__mandreel_process_async_calls();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppMouseWheel(delta)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = delta;
-		__mouseWheelDelta(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppMouseMove(x,y)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = x;
-		heap32[(i7+4)>>2] = y;
-		__mouseMove(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppResize(x,y)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = x;
-		heap32[(i7+4)>>2] = y;
-		__resize(i7);
-		heap32[(i7+0)>>2] = x;
-		heap32[(i7+4)>>2] = y;
-		__mandreel_internal_SetResolution(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppMouseButton(down,x,y)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = down;
-		heap32[(i7+4)>>2] = x;
-		heap32[(i7+8)>>2] = y;
-		__mouseButton(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppMouseDblClick(x,y)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = x;
-		heap32[(i7+4)>>2] = y;
-		__mouseDoubleClick(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppKeyEvent(down,keyId)
-{
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		var i7 = MandreelLockFrame();
-		heap32[(i7+0)>>2] = down;
-		heap32[(i7+4)>>2] = keyId;
-		__keyEvent(i7);
-		MandreelUnlockFrame();
-	}
-}
-
-////////////////////////////////////////////
-function mandreelAppGetPlatform()
-{
-	return mandreelAppPlatform;
-}
-
-////////////////////////////////////////////
-function mandreelAppGetElementAbsolutePos(elementName)
-{
-	var element = Mandreel_document.getElementById(elementName);
-	var res = new Object();
-	res.x = 0; res.y = 0;
-	if (element !== null)
-	{
-		if (element.getBoundingClientRect)
-		{
-			var viewportElement = Mandreel_document.documentElement;
-			var box = element.getBoundingClientRect();
-			var scrollLeft = viewportElement.scrollLeft;
-			var scrollTop = viewportElement.scrollTop;
-			res.x = box.left + scrollLeft;
-			res.y = box.top + scrollTop;
-		}
-		else
-		{ //for old browsers
-			res.x = element.offsetLeft;
-			res.y = element.offsetTop;
-			var parentNode = element.parentNode;
-			var borderWidth = null;
-			while (offsetParent != null)
-			{
-				res.x += offsetParent.offsetLeft;
-				res.y += offsetParent.offsetTop;
-				var parentTagName = offsetParent.tagName.toLowerCase();
-				if ((__isIEOld && parentTagName != "table") ||
-					((__isFireFoxNew || __isChrome) &&
-						parentTagName == "td"))
-				{
-					borderWidth = kGetBorderWidth(offsetParent);
-					res.x += borderWidth.left;
-					res.y += borderWidth.top;
-				}
-
-				if (offsetParent != Mandreel_document.body &&
-				offsetParent != Mandreel_document.documentElement)
-				{
-					res.x -= offsetParent.scrollLeft;
-					res.y -= offsetParent.scrollTop;
-				}
-
-				//next lines are necessary to fix the problem
-				//with offsetParent
-				if (!__isIE && !__isOperaOld || __isIENew)
-				{
-					while (offsetParent != parentNode &&
-						parentNode !== null) {
-						res.x -= parentNode.scrollLeft;
-						res.y -= parentNode.scrollTop;
-						if (__isFireFoxOld || __isWebKit)
-						{
-						    borderWidth =
-						     kGetBorderWidth(parentNode);
-						    res.x += borderWidth.left;
-						    res.y += borderWidth.top;
-						}
-						parentNode = parentNode.parentNode;
-					}
-				}
-
-				parentNode = offsetParent.parentNode;
-				offsetParent = offsetParent.offsetParent;
-			}
-		}
-	}
-	return res;
-}
-function __getIEVersion()
-{
-	var rv = -1; // Return value assumes failure.
-	if (navigator.appName == 'Microsoft Internet Explorer')
-	{
-		var ua = navigator.userAgent;
-		var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
-		if (re.exec(ua) != null)
-			rv = parseFloat(RegExp.$1);
-	}
-	return rv;
-}
-function __getOperaVersion()
-{
-	var rv = 0; // Default value
-	if (Mandreel_window.opera)
-	{
-		var sver = Mandreel_window.opera.version();
-		rv = parseFloat(sver);
-	}
-	return rv;
-}
-/* The following code was removed for benchmarking:
-var __userAgent = navigator.userAgent;
-var __isIE =  navigator.appVersion.match(/MSIE/) != null;
-var __IEVersion = __getIEVersion();
-var __isIENew = __isIE && __IEVersion >= 8;
-var __isIEOld = __isIE && !__isIENew;
-var __isFireFox = __userAgent.match(/firefox/i) != null;
-var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || (__userAgent.match(/firefox\/1./i) != null));
-var __isFireFoxNew = __isFireFox && !__isFireFoxOld;
-var __isWebKit =  navigator.appVersion.match(/WebKit/) != null;
-var __isChrome =  navigator.appVersion.match(/Chrome/) != null;
-var __isOpera =  Mandreel_window.opera != null;
-var __operaVersion = __getOperaVersion();
-var __isOperaOld = __isOpera && (__operaVersion < 10); */
-function __parseBorderWidth(width)
-{
-	var res = 0;
-	if (typeof(width) == "string" && width != null && width != "" )
-	{
-		var p = width.indexOf("px");
-		if (p >= 0)
-		{
-			res = parseInt(width.substring(0, p));
-		}
-		else
-		{
-			//do not know how to calculate other values (such as 0.5em or 0.1cm) correctly now so just set the width to 1 pixel
-			res = 1;
-		}
-	}
-	return res;
-}
-function __getBorderWidth(element)
-{
-	var res = new Object();
-	res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
-	if (Mandreel_window.getComputedStyle)
-	{
-		//for Firefox
-		var elStyle = Mandreel_window.getComputedStyle(element, null);
-		res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));
-		res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));
-		res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));
-		res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));
-	}
-	else
-	{
-		//for other browsers
-		res.left = __parseBorderWidth(element.style.borderLeftWidth);
-		res.top = __parseBorderWidth(element.style.borderTopWidth);
-		res.right = __parseBorderWidth(element.style.borderRightWidth);
-		res.bottom = __parseBorderWidth(element.style.borderBottomWidth);
-	}
-	return res;
-}
-
-
-////////////////////////////////////////////
-// WebGL
-////////////////////////////////////////////
-	var imandreel_gl = null;
-	var imandreel_ctx_canvas = null;
-	var imandreel_is_ready = 0;
-	var imandreel_oldTime = Date_now();
-
-	function mandreel_wheel(event) { imandreel_onMouseWheel(event);event.preventDefault(); event.returnValue=false; }
-
-	////////////////////////////////////////////
-	function mandreelAppStartRenderWebGL()
-	{
-/* The following code was removed for benchmarking:
-		var canvas = document.getElementById(mandreelAppCanvasName);
-
-		mandreelAppCanvasWidth = canvas.width;
-		mandreelAppCanvasHeight = canvas.height;
-
-		// Register event handlers
-		if(window.addEventListener){ window.addEventListener('DOMMouseScroll',mandreel_wheel,false); }  window.onmousewheel=document.onmousewheel=mandreel_wheel;
-
-		window.addEventListener('mousedown',imandreel_onMouseDown,false);
-		window.addEventListener('mouseup',imandreel_onMouseUp,false);
-		window.addEventListener('mousemove',imandreel_onMouseMove,false);
-		window.addEventListener('dblclick',imandreel_onMouseDblClick,false);
-
-		document.body.oncontextmenu = function() { return false;};
-
-		var canvasDiv = document.getElementById(mandreelAppCanvasDiv);
-		canvasDiv.addEventListener('keydown',imandreel_onKeyDown,false);
-		canvasDiv.addEventListener('keyup',imandreel_onKeyUp,false);
-		canvasDiv.focus();*/
-
-		// Call mandreel app init funtion (__init())
-		mandreelAppInit();
-
-		// Start rendering
-		imandreel_is_ready = 1;
-		//imandreel_render();
-	}
-
-	////////////////////////////////////////////
-	function imandreel_render()
-	{
-		if( ABORT )
-			return;
-
-		var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
-		WebGLUtils.requestAnimationFrame(canvas, imandreel_render);
-
-
-		// Reshape
-		if (canvas.clientWidth != mandreelAppCanvasWidth || canvas.clientHeight != mandreelAppCanvasHeight)
-		{
-			mandreelAppCanvasWidth = canvas.clientWidth;
-			mandreelAppCanvasHeight = canvas.clientHeight;
-			imandreel_gl.viewport(0, 0, mandreelAppCanvasWidth, mandreelAppCanvasHeight);
-		}
-
-		// Set the focus to the canvas div
-		if (mandreelAppForceFocus)
-		{
-			var canvasDiv = Mandreel_document.getElementById(mandreelAppCanvasDiv);
-			canvasDiv.focus();
-		}
-
-		// Call mandreel app draw funtion (__draw())
-		var nowTime = Date_now();
-		if (!g_mandreel_frame_locked)
-		{
-			g_mandreel_frame_inframe = true;
-			if (!_imandreel_pause_game)
-				mandreelAppDraw(nowTime-imandreel_oldTime);
-			g_mandreel_frame_inframe = false;
-		}
-		imandreel_oldTime = nowTime;
-	}
-
-	function render()
-	{
-		// Call mandreel app draw funtion (__draw())
-		var nowTime = Date_now();
-		if (!g_mandreel_frame_locked)
-		{
-			g_mandreel_frame_inframe = true;
-			if (!_imandreel_pause_game)
-				mandreelAppDraw(nowTime-imandreel_oldTime);
-			g_mandreel_frame_inframe = false;
-		}
-		imandreel_oldTime = nowTime;
-	}
-
-	var imandreel_last_movex = 0;
-	var imandreel_last_movey = 0;
-
-	////////////////////////////////////////////
-	function imandreel_onMouseMove(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
-		var setX = e.clientX - pos.x;
-		var setY = e.clientY - pos.y;
-
-		  if(navigator.pointer && navigator.pointer.isLocked) {
-            var deltaX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
-            var deltaY = event.movementY || event.webkitMovementY || event.mozMovementX || 0;
-
-			setX = imandreel_last_movex+deltaX;
-			setY = imandreel_last_movey+deltaY;
-			}
-
-
-		imandreel_last_movex = setX;
-		imandreel_last_movey = setY;
-		mandreelAppMouseMove(setX,setY);
-	}
-
-	////////////////////////////////////////////
-	function imandreel_onMouseDblClick(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
-		var setX = e.clientX - pos.x;
-		var setY = e.clientY - pos.y;
-		mandreelAppMouseDblClick(setX,setY);
-	}
-
-	////////////////////////////////////////////
-	var mandreel_mouse_down = false;
-	var mandreel_rmouse_down = false;
-	function imandreel_onMouseDown(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var rightclick;
-		if (!e) var e = Mandreel_window.event;
-		if (e.which) rightclick = (e.which == 3);
-		else if (e.button) rightclick = (e.button == 2);
-
-		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
-		var setX = e.clientX - pos.x;
-		var setY = e.clientY - pos.y;
-
-		if (!rightclick)
-		{
-			if (mandreel_mouse_down)
-				return;
-
-			mandreel_mouse_down = true;
-			mandreelAppMouseButton(1,setX,setY);
-		}
-		else
-		{
-			if (mandreel_rmouse_down)
-				return;
-
-			mandreel_rmouse_down = true;
-			mandreelAppMouseButton(3,setX,setY);
-		}
-	}
-
-	////////////////////////////////////////////
-	function imandreel_onMouseUp(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var rightclick;
-		if (!e) var e = Mandreel_window.event;
-		if (e.which) rightclick = (e.which == 3);
-		else if (e.button) rightclick = (e.button == 2);
-
-		var pos = mandreelAppGetElementAbsolutePos(mandreelAppCanvasName);
-		var setX = e.clientX - pos.x;
-		var setY = e.clientY - pos.y;
-
-
-		if (!rightclick)
-		{
-			if (mandreel_mouse_down == false)
-				return;
-
-			mandreel_mouse_down = false;
-			mandreelAppMouseButton(0,setX,setY);
-		}
-		else
-		{
-			if (mandreel_rmouse_down == false)
-				return;
-
-			mandreel_rmouse_down = false;
-			mandreelAppMouseButton(2,setX,setY);
-		}
-	}
-
-	////////////////////////////////////////////
-	function imandreel_onMouseWheel(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		mandreelAppMouseWheel(e.wheelDelta);
-	}
-
-	////////////////////////////////////////////
-	function imandreel_onKeyUp(e)
-	{
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var KeyID = e.keyCode;
-		mandreelAppKeyEvent(0,KeyID);
-	}
-
-	////////////////////////////////////////////
-	Mandreel_window.onkeydown = function(e)
-	{
-		if (mandreelDisableSpaceKey == false && e.keyCode == 32)
-			return;
-		return !(e.keyCode == 32 || e.keyCode == 9);
-	};
-
-	////////////////////////////////////////////
-	function imandreel_onKeyDown(e)
-	{
-		if (e.which === 8) // disable back button on browser
-        {
-	        e.preventDefault();
-	    }
-		if (!imandreel_is_ready)
-			return;
-
-		if (_imandreel_pause_game)
-			return;
-
-		var KeyID = e.keyCode;
-		mandreelAppKeyEvent(1,KeyID);
-	}
-
-
-////////////////////////////////////////////
-// Flash
-////////////////////////////////////////////
-
-(function(){
-		try {
-			// Disabling SWFObject's Autohide feature
-			if (typeof swfobject.switchOffAutoHideShow === "function") {
-				swfobject.switchOffAutoHideShow();
-			}
-		} catch(e) {}
-	})();
-
-var imandreel_flash_global_sp = 0;
-var imandreel_flash_global_sp2 = 0;
-var imandreel_flash_current_sp = 0;
-
-function MandreelInterSwfLoaded2()
-{
-}
-function MandreelInterSwfLoaded()
-{
-	appStartState('scriptLoaded');
-	var flashMovie = swfobject.getObjectById(mandreelAppCanvasDiv)
-	dump(flashMovie.width);
-	flashMovie.MandreelInit();
-
-	imandreel_flash_global_sp = MandreelInterGetSWF().MandreelInterGetGlobalStack();
-	imandreel_flash_global_sp2 = MandreelInterGetSWF().MandreelInterGetGlobalStack2();
-	if ( mandreelAppStartStateFunc )
-		mandreelAppStartStateFunc("ready",mandreelAppCanvasWidth,mandreelAppCanvasHeight);
-}
-
-
-
-var g_mandreel_swf = null;
-
-function MandreelInterGetSWF()
-{
-	if (g_mandreel_swf)
-		return g_mandreel_swf;
-
-	g_mandreel_swf = swfobject.getObjectById(mandreelAppCanvasDiv)
-	return g_mandreel_swf;
-}
-
-function MandreelInterWriteInt(ptr, value)
-{
-	MandreelInterGetSWF().MandreelInterWriteInt(ptr,value);
-}
-
-function MandreelInterWriteFloat(ptr, value)
-{
-	MandreelInterGetSWF().MandreelInterWriteFloat(ptr,value);
-}
-
-function MandreelInterWriteString(ptr, value)
-{
-	MandreelInterGetSWF().MandreelInterWriteString(ptr,value);
-}
-
-function MandreelInterWriteWString(ptr, value)
-{
-	MandreelInterGetSWF().MandreelInterWriteWString(ptr,value);
-}
-
-function MandreelInterCallFunctionRaw(sp, func_name, returnType)
-{
-	return MandreelInterGetSWF().MandreelInterCallFunctionRaw(sp,func_name,returnType);
-}
-
-
-function assert(condition, _text) {
-//console.assert(condition, _text);
-    if (!condition) {
-      var text = "Assertion failed: " + _text;
-      alert(text + ':\n' + (new Error).stack);
-      ABORT = true;
-      throw "Assertion: " + text;
-    }
-  }
-
-
-
-function MandreelLockFrame()
-{
-	MandreelInterGetSWF().MandreelLockFrame();
-
-	imandreel_flash_current_sp += 300*1024;
-
-	assert(imandreel_flash_current_sp<1024*1024);
-
-	return imandreel_flash_current_sp;
-}
-
-function MandreelPause()
-{
-	MandreelInterGetSWF().MandreelPause();
-}
-
-function MandreelResume()
-{
-	MandreelInterGetSWF().MandreelResume();
-}
-
-
-function MandreelUnlockFrame()
-{
-	imandreel_flash_current_sp -= 300*1024;
-	MandreelInterGetSWF().MandreelUnlockFrame();
-}
-
-
-
-function MandreelInterCallFunctionAsync(func_name,param)
-{
-	return MandreelInterGetSWF().MandreelInterCallFunctionAsync(func_name, param);
-}
-
-
-function MandreelInterCallFunction(returnType,func_name)
-{
-	var size_params = 0;
-
-	var i;
-	var num_params = (arguments.length-2)/2;
-	num_params|=0;
-	for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				size_arg = 4;
-				break;
-			case 'float':
-				size_arg = 4;
-				break;
-			case 'string':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
-				break;
-			case 'wstring':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
-				break;
-			default:
-				assert(false);
-		}
-
-		size_params += size_arg;
-	}
-
-	// stack always 8 byte aligned
-	size_params=((size_params+7)& 0xfffffff8);
-
-	var sp = 0;
-
-	if (i<(arguments.length))
-		sp = arguments[i];
-	else
-	{
-		assert(false);
-	}
-
-
-	sp-=size_params;
-
-	MandreelLockFrame();
-
-	var offset = 0;
-	var ptr_data = num_params*4+sp;
-    for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				MandreelInterWriteInt((sp+offset),arguments[i+1]);
-				break;
-			case 'float':
-				MandreelInterWriteFloat((sp+offset),arguments[i+1]);
-				break;
-			case 'string':
-				{
-					MandreelInterWriteInt((sp+offset),ptr_data);
-					var string = arguments[i+1];
-					MandreelInterWriteString(ptr_data,string);
-
-					ptr_data += ((string.length + 4) & 0xfffffffc);
-				}
-				break;
-			case 'wstring':
-				{
-					MandreelInterWriteInt((sp+offset),ptr_data);
-					var string = arguments[i+1];
-					MandreelInterWriteWString(ptr_data,string);
-
-					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
-				}
-				break;
-			default:
-				assert(false);
-		}
-		offset+=4;
-	}
-
-	return_value = MandreelInterCallFunctionRaw(sp, func_name, returnType);
-
-	MandreelUnlockFrame();
-
-	if (returnType == 'int')
-		return parseInt(return_value);
-	else if (returnType == 'float')
-		return parseFloat(return_value);
-
-	return;
-}
-
-
-
-// file system
-
-var g_mandreel_timestamp_fs = 0;
-var g_mandreel_fs = null;
-
-function onMandreelQuotaOk(fs)
-{
-	g_mandreel_fs = fs;
-	dump('onMandreelQuotaOk');
-}
-
-
-function MandreelFsErrorHandler(e) {
-  var msg = '';
-
-  switch (e.code) {
-    case FileError.QUOTA_EXCEEDED_ERR:
-      msg = 'QUOTA_EXCEEDED_ERR';
-      break;
-    case FileError.NOT_FOUND_ERR:
-      msg = 'NOT_FOUND_ERR';
-      break;
-    case FileError.SECURITY_ERR:
-      msg = 'SECURITY_ERR';
-      break;
-    case FileError.INVALID_MODIFICATION_ERR:
-      msg = 'INVALID_MODIFICATION_ERR';
-      break;
-    case FileError.INVALID_STATE_ERR:
-      msg = 'INVALID_STATE_ERR';
-      break;
-    default:
-      msg = 'Unknown Error';
-      break;
-  };
-
-  dump('Error: ' + msg);
-  dump(e);
-}
-
-var indexedDB = Mandreel_window.indexedDB || Mandreel_window.webkitIndexedDB ||
-                Mandreel_window.mozIndexedDB;
-
-if ('webkitIndexedDB' in Mandreel_window) {
-  Mandreel_window.IDBTransaction = Mandreel_window.webkitIDBTransaction;
-  Mandreel_window.IDBKeyRange = Mandreel_window.webkitIDBKeyRange;
-}
-
-
-var mandreel_indexedDB = {};
-mandreel_indexedDB.db = null;
-mandreel_indexedDB.callback_init = false;
-
-mandreel_indexedDB.onerror = function(e) {
-  dump(e);
-};
-
-mandreel_indexedDB.init = function(callback)
-{
- try {
-	var request = indexedDB.open('my_cache', 2);
-
-	request.onerror = function(event) {
-		callback(false);
-		};
-	request.onupgradeneeded = function(event) {
-	dump('onupgradeneeded\n');
-	mandreel_indexedDB.db = event.target.result;
-    var db = mandreel_indexedDB.db;
-	var objectStore = db.createObjectStore("cache",{keyPath: "fileName"});
-	}
-
-  request.onsuccess = function(event) {
-  dump('onsuccess\n');
-    mandreel_indexedDB.db = event.target.result;
-    	callback(true);
-
-  };
-  }
-  catch(e)
-  {
-	callback(false);
-  }
-
-}
-
-function mandreel_fs_init(callback, size_bytes, url_time)
-{
-
-	g_mandreel_timestamp_fs = 99999999999999;
-
-
-
-
-	var aux = null;
-	try	{ aux = webkitStorageInfo; } catch(err) { aux = null; }
-	if (aux == null)
-	{
-		//callback(false);
-
-		var time_request = new XMLHttpRequest();
-	time_request.open('GET',url_time);
-	time_request.onreadystatechange = function()
-	{
-		if (time_request.readyState==4)
-		{
-			if (time_request.status==200 || time_request.status==0)
-			{
-
-				if (time_request.responseText)
-				{
-					g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
-					dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
-				}
-			}
-
-			mandreel_indexedDB.init(callback);
-		}
-	}
-	time_request.send();
-
-
-		return;
-	}
-
-	webkitStorageInfo.requestQuota(
-		webkitStorageInfo.PERSISTENT ,   // or PERSISTENT
-		size_bytes,
-		function(bytes) {  dump('request quota succeed');},
-		function () { dump('request quota failed');} );
-
-
-//	g_mandreel_timestamp_fs =0;
-
-	var time_request = new XMLHttpRequest();
-	time_request.open('GET',url_time);
-	time_request.onreadystatechange = function()
-	{
-		if (time_request.readyState==4)
-		{
-			if (time_request.status==200 || time_request.status==0)
-			{
-
-				if (time_request.responseText)
-				{
-					g_mandreel_timestamp_fs = parseFloat(time_request.responseText);
-					dump('mandreel_init_fs time ' + g_mandreel_timestamp_fs);
-				}
-			}
-
-			var my_requestFileSystem  = Mandreel_window.requestFileSystem || Mandreel_window.webkitRequestFileSystem;
-
-			my_requestFileSystem(Mandreel_window.PERSISTENT, size_bytes,
-				function(result)
-				{
-					onMandreelQuotaOk(result);
-
-
-					if (callback)
-						Mandreel_setTimeout(callback, 100, true);
-				} , function(e) { MandreelFsErrorHandler(e); if (callback) callback(false); } );
-		}
-	}
-	time_request.send();
-}
-
-
-mandreel_indexedDB.load = function(file_name, callback)
-{
-	var db = mandreel_indexedDB.db;
-	var trans = db.transaction(["cache"]);
-	var store = trans.objectStore("cache");
-
-	var key = file_name;
-
-	 var getReq = store.get(key);
-	   getReq.onsuccess = function (ev) {
-			if (getReq.result)
-	{
-	dump('chanka ' + g_mandreel_timestamp_fs + ' ' + getReq.result.timeStamp + '\n');
-				if (getReq.result.timeStamp>=g_mandreel_timestamp_fs)
-					callback(getReq.result.data);
-				else
-					callback(null);
-			}
-			else
-				callback(null);
-	   }
-	   getReq.onerror = function (ev) {
-		   console.log("index.get failed. Error: " + ev.message);
-	   }
-}
-
-function mandreel_fs_get_url(file_name, callback)
-{
-	if (mandreel_indexedDB.db)
-	{
-		callback(null);
-		return;
-	}
-
-
-	if (g_mandreel_fs == null)
-	{
-		callback(null);
-		return;
-	}
-
-	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
-
-	fileEntry.getMetadata(function(metaData){
-	var my_seconds = metaData.modificationTime.getTime()/1000;
-
-	if (g_mandreel_timestamp_fs>my_seconds)
-	{
-		callback(null);
-	}
-	else
-	{
-		//alert('mandreel_fscachefile2');
-
-
-		if (Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
-			callback(fileEntry.toURL());
-		else
-			callback(null);
-
-	}
-
-
-		}, MandreelFsErrorHandler);
-
-
-  }, function(error) {callback(null);});
-
-	 return;
-
-}
-
-function mandreel_fs_load_binary(file_name, callback)
- {
-	if (mandreel_indexedDB.db)
-	{
-		mandreel_indexedDB.load(file_name,callback);
-		return;
-	}
-
-
-	if (g_mandreel_fs == null)
-	{
-		callback(null);
-		return;
-	}
-
-
-	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
-
-	fileEntry.getMetadata(function(metaData){
-	var my_seconds = metaData.modificationTime.getTime()/1000;
-
-	if (g_mandreel_timestamp_fs>my_seconds)
-	{
-		dump('mandreel_fscachefile1');
-		Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
-		fileEntry.remove(function() {
-				callback(null);
-			}, MandreelFsErrorHandler);
-
-	}
-	else
-	{
-		//alert('mandreel_fscachefile2');
-		dump('mandreel_fscachefile2 ' + my_seconds);
-
-		fileEntry.file(function(file) {
-
-				var reader = new FileReader();
-
-
-			   reader.onloadend = function(e) {
-
-				   if (this.result.byteLength && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
-				   {
-						dump('mandreel_fs_loadFile ' + file_name);
-						callback(this.result);
-					}
-					else
-						callback(null);
-
-			   };
-
-
-				 reader.readAsArrayBuffer(file);
-
-
-			}, MandreelFsErrorHandler);
-
-	}
-
-
-		}, MandreelFsErrorHandler);
-
-
-  }, function(error) {dump('mandreel_fscachefile3');	callback(null);});
-
-	 return;
- }
-
-
- mandreel_indexedDB.save = function(file_name, data)
-{
-	var db = mandreel_indexedDB.db;
-
-
-  var trans = db.transaction(["cache"], IDBTransaction.READ_WRITE);
-  var store = trans.objectStore("cache");
-  var request = store.put({
-    "data": data,
-	"timeStamp" : Date_now()/1000,
-    "fileName" : file_name
-  });
-
-  request.onsuccess = function(e) {
-    // Re-render all the todo's
-   // html5rocks.indexedDB.getAllTodoItems();
-   dump('mandreel_indexedDB.save ok ');
-  };
-
-  request.onerror = function(e) {
-    dump('mandreel_indexedDB.save onerror ' + file_name);
-	dump(e);
-  };
-}
-
-function mandreel_fs_get_key(name)
-{
-	return 'mandreel_fs_' + name;
-}
-
-function mandreel_is_filesystem()
-{
-	if (mandreel_indexedDB.db)
-		return false;
-
-	if (!g_mandreel_fs)
-		return false;
-
-	return true;
-}
-
-function mandreel_is_indexeddb()
-{
-	if (mandreel_indexedDB.db)
-		return true;
-
-	return false;
-}
-
- function mandreel_fs_saveFile(name, my_arrayBuffer)
-{
-	if (mandreel_indexedDB.db)
-	{
-		mandreel_indexedDB.save(name,my_arrayBuffer);
-		return;
-	}
-
-	if (!g_mandreel_fs)
-		return;
-
-	Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(name));
-	g_mandreel_fs.root.getFile(name, {create: true}, function(fileEntry) {
-
-    // Create a FileWriter object for our FileEntry (log.txt).
-    fileEntry.createWriter(function(fileWriter) {
-
-      fileWriter.onwriteend = function(e) {
-		Mandreel_window.localStorage.setItem(mandreel_fs_get_key(name),'valid');
-        dump('Write completed.');
-      };
-
-      fileWriter.onerror = function(e) {
-        dump('Write failed: ' + e.toString());
-      };
-
-	  var my_BlobBuilder = Mandreel_window.MozBlobBuilder || Mandreel_window.WebKitBlobBuilder || Mandreel_window.BlobBuilder;
-
-	  var bb = new my_BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
-      bb.append(my_arrayBuffer);
-      fileWriter.write(bb.getBlob('text/plain'));
-
-
-
-    }, MandreelFsErrorHandler);
-
-  }, MandreelFsErrorHandler);
-}
-
-
-function mandreel_fs_load_text(file_name, callback)
- {
-
-	if (mandreel_indexedDB.db)
-	{
-		mandreel_indexedDB.load(file_name,callback);
-		return;
-	}
-
-	if (g_mandreel_fs == null)
-	{
-		callback(null);
-		return;
-	}
-
-
-	g_mandreel_fs.root.getFile(file_name, {}, function(fileEntry) {
-
-	fileEntry.getMetadata(function(metaData){
-	var my_seconds = metaData.modificationTime.getTime()/1000;
-
-	if (g_mandreel_timestamp_fs>my_seconds)
-	{
-		dump('mandreel_fscachefile1');
-		Mandreel_window.localStorage.removeItem(mandreel_fs_get_key(file_name));
-		fileEntry.remove(function() {
-				callback(null);
-			}, MandreelFsErrorHandler);
-
-	}
-	else
-	{
-		//alert('mandreel_fscachefile2');
-		dump('mandreel_fscachefile2 ' + my_seconds);
-
-		fileEntry.file(function(file) {
-
-				var reader = new FileReader();
-
-
-			   reader.onloadend = function(e) {
-
-
-				   if (this.result.length && Mandreel_window.localStorage.getItem(mandreel_fs_get_key(file_name)) != null)
-				   {
-						dump('mandreel_fs_loadFile ' + file_name);
-						callback(this.result);
-					}
-					else
-						callback(null);
-
-			   };
-
-
-				 reader.readAsText(file);
-
-
-			}, MandreelFsErrorHandler);
-
-	}
-
-
-		}, MandreelFsErrorHandler);
-
-
-  }, function(error) {dump('mandreel_fscachefile3');	callback(null);});
-
-	 return;
- }
-
-
- // full screen
-
-
-/* The following code was removed for benchmarking:
- var __screen = screen; */
-
-	try
-	{
-	(function(global) {
-    "use strict";
-	var elementPrototype = (global.HTMLElement || global.Element)["prototype"];
-
-	 // document.isFullScreen
-    if(!Mandreel_document.hasOwnProperty("fullscreenEnabled")) {
-        var getter = (function() {
-            // These are the functions that match the spec, and should be preferred
-            if("webkitIsFullScreen" in Mandreel_document) {
-                return function() { return Mandreel_document.webkitIsFullScreen; }
-            }
-            if("mozFullScreen" in Mandreel_document) {
-                return function() { return Mandreel_document.mozFullScreen; }
-            }
-            return function() { return false }; // not supported, never fullscreen
-        })();
-
-        Object.defineProperty(Mandreel_document, "fullscreenEnabled", {
-            enumerable: true, configurable: false, writeable: false,
-            get: getter
-        });
-    }
-
-    if(!Mandreel_document.hasOwnProperty("fullscreenElement")) {
-        var getter = (function() {
-            // These are the functions that match the spec, and should be preferred
-            if("webkitFullscreenElement" in Mandreel_document) {
-                return function() { return Mandreel_document.webkitFullscreenElement; }
-            }
-            if("mozFullscreenElemen" in Mandreel_document) {
-                return function() { return Mandreel_document.mozFullscreenElemen; }
-            }
-            return function() { return null }; // not supported
-        })();
-
-        Object.defineProperty(Mandreel_document, "fullscreenElement", {
-            enumerable: true, configurable: false, writeable: false,
-            get: getter
-        });
-    }
-
-    // Document event: fullscreenchange
-    function fullscreenchange(oldEvent) {
-        var newEvent = Mandreel_document.createEvent("CustomEvent");
-        newEvent.initCustomEvent("fullscreenchange", true, false, null);
-        // TODO: Any need for variable copy?
-        Mandreel_document.dispatchEvent(newEvent);
-    }
-    Mandreel_document.addEventListener("webkitfullscreenchange", fullscreenchange, false);
-    Mandreel_document.addEventListener("mozfullscreenchange", fullscreenchange, false);
-
-    // Document event: fullscreenerror
-    function fullscreenerror(oldEvent) {
-        var newEvent = Mandreel_document.createEvent("CustomEvent");
-        newEvent.initCustomEvent("fullscreenerror", true, false, null);
-        // TODO: Any need for variable copy?
-        Mandreel_document.dispatchEvent(newEvent);
-    }
-    Mandreel_document.addEventListener("webkitfullscreenerror", fullscreenerror, false);
-    Mandreel_document.addEventListener("mozfullscreenerror", fullscreenerror, false);
-
-    // element.requestFullScreen
-    if(!elementPrototype.requestFullScreen) {
-        elementPrototype.requestFullScreen = (function() {
-            if(elementPrototype.webkitRequestFullScreen) {
-                return function() {
-                    this.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
-                }
-            }
-
-            return  elementPrototype.mozRequestFullScreen    ||
-                    function(){ /* unsupported, fail silently */ };
-        })();
-    }
-
-    // document.cancelFullscreen
-    if(!Mandreel_document.cancelFullScreen) {
-        Mandreel_document.cancelFullScreen = (function() {
-            return  Mandreel_document.webkitCancelFullScreen ||
-                    Mandreel_document.mozCancelFullScreen ||
-                    function(){ /* unsupported, fail silently */ };
-        })();
-    }
-	})((typeof(exports) != 'undefined') ? global : Mandreel_window);
-	}
-	catch(e)
-	{
-	}
-
-
-try
-	{
-var __onErrorFullscreen = function() {
-  dump("Mouse lock was not successful.");
-};
-
-Mandreel_document.addEventListener('fullscreenchange', function(e) {
-
-var width;
-var height;
- var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
- if(Mandreel_document.fullscreenEnabled) {
-
-
-            width = __screen.width;
-            height = __screen.height;
-
-        } else {
-            width = mandreelAppWidthSrc;
-            height = mandreelAppHeightSrc;
-        }
-
-		canvas.width = width;
-		canvas.height = height;
-		mandreelAppResize(width, height);
-
-  if (Mandreel_document.fullscreenEnabled && navigator.pointer) {
-    navigator.pointer.lock(Mandreel_document.body, function() {
-      // Locked and ready to play.
-    }, __onErrorFullscreen);
-  }
-}, false);
-
-}
-catch(e)
-{
-}
-
-
-
-function mandreelAppFullscreen(enable)
-{
-	var canvas = Mandreel_document.getElementById(mandreelAppCanvasName);
-	if ( mandreelAppPlatform == "webgl" || mandreelAppPlatform == "canvas" )
-	{
-		if (canvas)
-		{
-			if (enable)
-				canvas.requestFullScreen();
-			else
-				Mandreel_document.cancelFullScreen();
-		}
-	}
-}
-
-
-function mandreelAppDisableForceFocus()
-{
-	mandreelAppForceFocus = false;
-}
-
-function mandreelAppEnableForceFocus()
-{
-	mandreelAppForceFocus = true;
-}
-
-var imandreel_base64 = {};
-imandreel_base64.PADCHAR = '=';
-imandreel_base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-
-imandreel_base64.makeDOMException = function() {
-    // sadly in FF,Safari,Chrome you can't make a DOMException
-    var e, tmp;
-
-    try {
-        return new DOMException(DOMException.INVALID_CHARACTER_ERR);
-    } catch (tmp) {
-        // not available, just passback a duck-typed equiv
-        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error
-        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error/prototype
-        var ex = new Error("DOM Exception 5");
-
-        // ex.number and ex.description is IE-specific.
-        ex.code = ex.number = 5;
-        ex.name = ex.description = "INVALID_CHARACTER_ERR";
-
-        // Safari/Chrome output format
-        ex.toString = function() { return 'Error: ' + ex.name + ': ' + ex.message; };
-        return ex;
-    }
-}
-
-imandreel_base64.getbyte64 = function(s,i) {
-    // This is oddly fast, except on Chrome/V8.
-    //  Minimal or no improvement in performance by using a
-    //   object with properties mapping chars to value (eg. 'A': 0)
-    var idx = imandreel_base64.ALPHA.indexOf(s.charAt(i));
-    if (idx === -1) {
-        throw imandreel_base64.makeDOMException();
-    }
-    return idx;
-}
-
-imandreel_base64.decode = function(s) {
-    // convert to string
-    s = '' + s;
-    var getbyte64 = imandreel_base64.getbyte64;
-    var pads, i, b10;
-    var imax = s.length
-    if (imax === 0) {
-        return s;
-    }
-
-    if (imax % 4 !== 0) {
-        throw imandreel_base64.makeDOMException();
-    }
-
-    pads = 0
-    if (s.charAt(imax - 1) === imandreel_base64.PADCHAR) {
-        pads = 1;
-        if (s.charAt(imax - 2) === imandreel_base64.PADCHAR) {
-            pads = 2;
-        }
-        // either way, we want to ignore this last block
-        imax -= 4;
-    }
-
-    var x = [];
-    for (i = 0; i < imax; i += 4) {
-        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) |
-            (getbyte64(s,i+2) << 6) | getbyte64(s,i+3);
-        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff));
-    }
-
-    switch (pads) {
-    case 1:
-        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | (getbyte64(s,i+2) << 6);
-        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff));
-        break;
-    case 2:
-        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12);
-        x.push(String.fromCharCode(b10 >> 16));
-        break;
-    }
-    return x.join('');
-}
-
-if (!Mandreel_window.atob) {
-Mandreel_window.atob = function(a) { return  imandreel_base64.decode(a); }
-}
-
-
-function imandreel_interop_callbridge(new_method, sp)
-{
-
-	var n = new Array();
-
-	for( var i = 2; i < arguments.length; i++ )
-	{
-
-		if (typeof arguments[i] == 'string')
-			n.push(atob(arguments[i]));
-		else
-			n.push(arguments[i]);
-	}
-
-	var total_args = arguments.length-2;
-
-	switch(total_args)
-	{
-		case 0:
-			return Mandreel_window[new_method](sp);
-		case 1:
-			return Mandreel_window[new_method](sp, n[0]);
-		case 2:
-			return Mandreel_window[new_method](sp, n[0], n[1]);
-		case 3:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2]);
-		case 4:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3]);
-		case 5:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4]);
-		case 6:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5]);
-		case 7:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6]);
-		case 8:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7]);
-		case 9:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8]);
-		case 10:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9]);
-		case 11:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10]);
-		case 12:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11]);
-		case 13:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12]);
-		case 14:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13]);
-		case 15:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13], n[14]);
-		case 16:
-			return Mandreel_window[new_method](sp, n[0], n[1], n[2], n[3], n[4], n[5], n[6], n[7], n[8], n[9], n[10], n[11], n[12], n[13], n[14], n[15]);
-		break;
-	}
-
-}
-function imandreel_as3_dump(param)
-{
-	dump(atob(param));
-}
-
-
-var mandreel_embed_plugin;
-
-function PluginMandreelInterWriteInt(ptr, value)
-{
-	mandreel_embed_plugin.MandreelInterCalls("WriteInt", ptr,value);
-}
-
-function PluginMandreelInterWriteFloat(ptr, value)
-{
-	mandreel_embed_plugin.MandreelInterCalls("WriteFloat", ptr,value);
-}
-
-function PluginMandreelInterWriteString(ptr, value)
-{
-	mandreel_embed_plugin.MandreelInterCalls("WriteString", ptr,value);
-}
-
-function PluginMandreelInterWriteWString(ptr, value)
-{
-	mandreel_embed_plugin.MandreelInterCalls("WriteWString", ptr,value);
-}
-
-var mandreel_plugin_current_sp = 0;
-
-function PluginMandreelLockFrame()
-{
-	var result = mandreel_embed_plugin.MandreelInterCalls("LockFrame");
-
-	mandreel_plugin_current_sp+=300*1024;
-
-	assert(mandreel_plugin_current_sp<1024*1024);
-
-	return result+mandreel_plugin_current_sp;
-}
-
-function PluginMandreelPause()
-{
-	mandreel_embed_plugin.MandreelInterCalls("Pause");
-}
-
-function PluginMandreelResume()
-{
-	mandreel_embed_plugin.MandreelInterCalls("Resume");
-}
-
-
-function PluginMandreelUnlockFrame()
-{
-	mandreel_embed_plugin.MandreelInterCalls("UnlockFrame");
-
-	mandreel_plugin_current_sp-=300*1024;
-}
-
-function PluginMandreelInterCallFunction()
-{
-	var total_args = arguments.length;
-
-	switch(total_args)
-	{
-		case 0:
-			return mandreel_embed_plugin.MandreelInterCallFunction();
-		case 1:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0]);
-		case 2:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1]);
-		case 3:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2]);
-		case 4:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3]);
-		case 5:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]);
-		case 6:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]);
-		case 7:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]);
-		case 8:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7]);
-		case 9:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8]);
-		case 10:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9]);
-		case 11:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10]);
-		case 12:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11]);
-		case 13:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12]);
-		case 14:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13]);
-		case 15:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13], arguments[14]);
-		case 16:
-			return mandreel_embed_plugin.MandreelInterCallFunction(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6], arguments[7], arguments[8], arguments[9], arguments[10], arguments[11], arguments[12], arguments[13], arguments[14], arguments[15]);
-		break;
-	}
-}
-
-function mandreel_plugin_draw()
-{
-	var canvas = Mandreel_document.getElementById('canvasDiv');
-	WebGLUtils.requestAnimationFrame(canvas, mandreel_plugin_draw);
-	mandreel_embed_plugin.MandreelInterCalls("AppDraw");
-
-}
-
-function mandreelInitPluginPlatform(params)
-{
-
-	if ( params.width != null )
-		mandreelAppWidthSrc = params.width;
-
-	if ( params.height != null )
-		mandreelAppHeightSrc = params.height;
-
-
-	mandreel_embed_plugin = Mandreel_document.createElement('embed');
-	mandreel_embed_plugin.setAttribute('width',mandreelAppWidthSrc);
-	mandreel_embed_plugin.setAttribute('height',mandreelAppHeightSrc);
-	mandreel_embed_plugin.setAttribute('type',"application/halfbrick-npruntime-scriptable-plugin");
-
-	var div = Mandreel_document.getElementById('canvasDiv');
-
-
-	var oChild=div.firstChild;
-
-	div.replaceChild(mandreel_embed_plugin, oChild);
-
-	var flashElement = Mandreel_document.getElementById('FlashWrapper');
-	if ( flashElement != null )
-	{
-		flashElement.style.visibility = "hidden";
-		flashElement.style.width = "0px";
-		flashElement.style.height = "0px";
-	}
-
-
-
-
-
-	Mandreel_window.MandreelInterWriteInt     = PluginMandreelInterWriteInt;
-	Mandreel_window.MandreelInterWriteFloat   = PluginMandreelInterWriteInt;
-	Mandreel_window.MandreelInterWriteString  = PluginMandreelInterWriteString;
-	Mandreel_window.MandreelInterWriteWString = PluginMandreelInterWriteWString;
-	Mandreel_window.MandreelLockFrame         = PluginMandreelLockFrame;
-	Mandreel_window.MandreelUnlockFrame       = PluginMandreelUnlockFrame;
-	Mandreel_window.MandreelInterCallFunction = PluginMandreelInterCallFunction;
-	Mandreel_window.MandreelPause 			 = PluginMandreelPause;
-	Mandreel_window.MandreelResume 			 = PluginMandreelResume;
-
-	Mandreel_setTimeout(function () {
-
-	if ( typeof(params.pluginSolutionName) != 'undefined' )
-		mandreel_embed_plugin.init(params.pluginDLL, params.pluginWorkingFolder,params.pluginSolutionName);
-	else
-		mandreel_embed_plugin.init(params.pluginDLL, params.pluginWorkingFolder);
-
-
-	mandreelAppStartStateFunc("ready",mandreelAppWidthSrc,mandreelAppHeightSrc);
-
-	Mandreel_setTimeout("mandreel_plugin_draw()", 16);
-	}, 100);
-
-}
-
-
-function MandreelInterSwfProgress(mode, percentage, bytes, totalbytes)
-{
-	imandreel_update_load(bytes, totalbytes);
-	if (mode == 'files')
-	{
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingData",percentage);
-	}
-	else if (mode == 'audio')
-	{
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingAudioUpdate",percentage);
-	}
-	else if (mode == 'textureasync')
-	{
-		if ( mandreelAppStartStateFunc )
-			mandreelAppStartStateFunc("loadingTextureAsyncPack",percentage);
-	}
-
-}
-
-function MandreelInterSwfCheckMethod(method)
-{
-	if (typeof(Mandreel_window[method])=="undefined")
-		return 0;
-	else
-		return 1;
-}
-
-// End of js/mandreelapp.js file.
-
-// Start of mandreel.js file.
-
-var mandreel_total_memory = 15908864;
-var mandreel_stack_memory = 1048576;
-var mandreel_heap_memory = 13591752; //init_memory = 744248
-/////////////////////////////////////////////
-// Heap
-/////////////////////////////////////////////
-var heap;
-var heap8;
-var heapU8;
-var heap16;
-var heapU16;
-var heap32;
-var heapU32;
-var heapFloat;
-var heapDouble;
-var heapNewPos = 512;
-
-var ABORT = false;
-
-var g_mandreel_cache_files = false;
-
-
-var g_mandreel_frame_locked = false;
-var g_mandreel_frame_inframe = false;
-
-var mandreel_cache_files = [];
-var g_mandreel_working_folder = 'DataPC/';
-var g_mandreel_datafiles_sufix = '.dat';
-var __FUNCTION_TABLE__ = [];
-var mandreel_pos_function_table = 1;
-function register_delegate(ptr_func)
-{
-	var functionId = mandreel_pos_function_table;
-	__FUNCTION_TABLE__[functionId] = ptr_func;
-
-	mandreel_pos_function_table++;
-	return functionId*4;
-}
-
-
-var g_addr_emit = 0;
-function emit_start(addr)
-{
-	g_addr_emit = addr;
-}
-
-function emit_8(data)
-{
-	heapU8[g_addr_emit] = data;
-	g_addr_emit++;
-}
-
-function emit_16(data)
-{
-	heapU16[g_addr_emit>>1] = data;
-	g_addr_emit+=2;
-}
-
-function emit_32(data)
-{
-	heapU32[g_addr_emit>>2] = data;
-	g_addr_emit+=4;
-}
-
-function emit_fill(data, size)
-{
-	var j;
-	for (j=0;j<size;j++)
-	{
-		heapU8[g_addr_emit] = data;
-		g_addr_emit++;
-	}
-}
-
-function emit_string(v)
-{
-	var j;
-	var len = v.length;
-	var data;
-
-	for(j = 0; j < len; j++)
-	{
-		data = v.charCodeAt(j);
-
-		heapU8[g_addr_emit] = data;
-		g_addr_emit++;
-	}
-}
-
-
-
-
-
-var g_stack_pointer = Malloc(mandreel_stack_memory);
-
-function assert_unalign()
-{
-	dump("fatal error: unaligned memory access detected!!!!");
-	assert(false);
-}
-
-function _assert(sp)
-{
-	var p0 = heap32[sp>>2];sp+=4;
-  var p1 = heap32[sp>>2];sp+=4;
-  var line = heap32[sp>>2];sp+=4;
-	var name = get_string_from_ptr(p0);
-	var file = get_string_from_ptr(p1);
-	assert(false, name + file + ' ' + line);
-}
-__cxa_pure_virtual.__index__ = 0;
-function __cxa_pure_virtual()
-{
-	assert(0);
-}
-
-// operator delete[]
-function _ZdaPv(sp)
-{
-	free(sp);
-}
-
-// operator delete
-function _ZdlPv(sp)
-{
-	free(sp);
-}
-
-// operator new[](unsigned int)
-function _Znaj(sp)
-{
-	malloc(sp);
-}
-// operator new[](unsigned int)
-function _Znwj(sp)
-{
-	malloc(sp);
-}
-
-function abort(sp)
-{
-	assert(0);
-}
-
-var r_g0 = 0;
-var r_g1 = 0;
-var f_g0 = 0;
-
-//isFinite(aux)
-//isNaN(aux)
-
-var tlsf_ptr = 0;
-
-
-function initHeap()
-{
-	heap = new ArrayBuffer(mandreel_total_memory);
-	heap8 = new Int8Array(heap);
-	heapU8 = new Uint8Array(heap);
-	heap16 = new Int16Array(heap);
-	heapU16 = new Uint16Array(heap);
-	heap32 = new Int32Array(heap);
-	heapU32 = new Uint32Array(heap);
-	heapFloat = new Float32Array(heap);
-	heapDouble = new Float64Array(heap);
-
-
-	for (var i=0;i<mandreel_total_memory/4;i++)
-	{
-		heapU32[i] = 0;
-	}
-}
-
-function Malloc(bytes)
-{
-	if ( heap == undefined )
-	{
-		//initHeap();
-	}
-	var newOffset = heapNewPos;
-	// Always 32 bit aligned
-	heapNewPos += ((bytes + 3) & 0xfffffffc);
-
-	if (heapNewPos>mandreel_total_memory)
-	{
-		assert(false);
-	}
-
-	return newOffset;
-}
-
-function assert(condition, _text) {
-//console.assert(condition, _text);
-    if (!condition) {
-      var text = "Assertion failed: " + _text;
-      alert(text + ':\n' + (new Error).stack);
-      ABORT = true;
-      throw "Assertion: " + text;
-    }
-  }
-
-  function my_assert(sp)
-  {
-	var p0 = heap32[sp>>2];sp+=4;
-  var p1 = heap32[sp>>2];sp+=4;
-	//var name = get_string_from_ptr(p1);
-
-	assert(false, 'hola');
-  }
-
-  function WriteHeapDouble(addr, value)
-  {
-  //assert((addr&7)==0);
-	heapDouble[addr>>3] = value;
-  }
-
-    function WriteHeapU64(addr, value)
-  {
-	heap32[addr>>2] = value.l;
-	heap32[(addr>>2)+1] = value.h;
-  }
-
-
-var arg_test_local = Malloc(8);
-function my_arg_test(sp)
-{
-	var ptr = heapU32[sp>>2];
-	var size = heapU32[(sp+4)>>2];
-
-	var arg = heapU32[ptr>>2];
-
-
-	if (size == 4)
-	{
-	heap32[ptr>>2] = arg+4;
-
-	arg = heap32[arg>>2];
-
-	heap32[arg_test_local>>2] = arg;
-
-	//dump('my_arg_test ' + arg + ' ' + ptr + '\n');
-
-	}
-	else
-	{
-		arg = (arg+7) & ~7;
-
-		heap32[ptr>>2] = arg+8;
-
-	//assert((arg&7)==0);
-	var value0 = heap32[arg>>2];
-	var value1 = heap32[(arg+4)>>2];
-	//arg = llvm_readDouble(arg);
-
-	//assert((arg_test_local&7)==0);
-
-	heap32[arg_test_local>>2] = value0;
-	heap32[(arg_test_local+4)>>2] = value1;
-
-	//llvm_writeDouble(arg_test_local,arg);
-
-	//dump('my_arg_test ' + arg + ' ' + ptr + '\n');
-
-
-	}
-
-
-
-
-	r_g0 = arg_test_local;
-}
-
-
-
-
-
-
-function uint(value) {
-    if (value >= 0) return value;
-    return 4294967296 + value;
-  }
-
-
-
-function puts(sp)
-{
-	var addr = heapU32[sp>>2];
-
-	var name = get_string_from_ptr(addr);
-
-	name+='\n';
-
-	dump(name);
-
-}
-
-function _Z11print_valued(_stack_pos, value)
-{
-	dump(value);
-	dump('\n');
-}
-
-function _Z11print_labelPKc(_stack_pos, addr)
-{
-	puts(_stack_pos,addr);
-	dump('\n');
-}
-
-
-
-
-function gettimeofday(sp)
-  {
-  var ptr = heap32[sp>>2];
-  var time_ms = Date_now();
-	heap32[ptr>>2] = time_ms/1000;
-	heap32[(ptr>>2)+1] = (time_ms%1000)*1000;
-	r_g0 = 0;
-  }
-
-
-  function free(sp)
-  {
-	var ptr = heapU32[sp>>2];
-  	sp-=8;
-
-	heap32[(sp)>>2] = tlsf_ptr;
-	heap32[(sp+4)>>2] = ptr;
-	tlsf_free(sp);
-  }
-
-  function malloc_size(sp)
-  {
-  var ptr = heapU32[sp>>2];
-
-	sp-=4;
-
-	heap32[(sp)>>2] = ptr;
-	tlsf_block_size(sp);
-  }
-
-
-  function realloc(sp)
-  {
-	var ptr = heapU32[sp>>2];
-	var size = heapU32[(sp+4)>>2];
-
-	//assert(ptr == 0);
-
-	sp-=12;
-
-	//dump('realloc ' + sp + ' ' + ptr + ' ' + size + '\n');
-
-	heap32[(sp)>>2] = tlsf_ptr;
-	heap32[(sp+4)>>2] = ptr;
-	heap32[(sp+8)>>2] = size;
-	tlsf_realloc(sp);
-
-	//dump('return ' + r_g0 + '\n');
-  }
-
-  var llvm_double_addr = Malloc(8);
-
-  function llvm_writeDouble(addr,src)
-  {
-  //assert((llvm_double_addr&7)==0);
-	heapDouble[llvm_double_addr>>3] = src;
-
-	//assert((addr&7)==0);
-
-	var val0 = heap32[(llvm_double_addr)>>2];
-	var val1 = heap32[(llvm_double_addr+4)>>2];
-
-	heap32[(addr)>>2] = val0;
-	heap32[(addr+4)>>2] = val1;
-  }
-
-  function llvm_readDouble(addr)
-  {
-  	//assert((addr&7)==0);
-
-	var val0 = heap32[(addr)>>2];
-	var val1 = heap32[(addr+4)>>2];
-
-	heap32[(llvm_double_addr)>>2] = val0;
-	heap32[(llvm_double_addr+4)>>2] = val1;
-
-
-//	assert((llvm_double_addr&7)==0);
-	var result = heapDouble[llvm_double_addr>>3];
-
-
-	return result;
-
-  }
-
-  function llvm_move_double(addr_dst, addr_src)
-  {
-
-	var val0 = heapU32[(addr_src)>>2];
-	var val1 = heapU32[(addr_src+4)>>2];
-
-	heapU32[(addr_dst)>>2] = val0;
-	heapU32[(addr_dst+4)>>2] = val1;
-
-  }
-
-  function llvm_move_float(addr_dst, addr_src)
-  {
-	heapU32[(addr_dst)] = heapU32[(addr_src)];
-  }
-
-  function malloc(sp)
-  {
-	var size = heapU32[sp>>2];
-
-	if (size == 0)
-	{
-		size = 4;
-	}
-
-
-	if (tlsf_ptr == 0)
-	{
-		var addr = Malloc(mandreel_heap_memory);
-
-		sp-=8;
-		heap32[(sp)>>2] = addr;
-		heap32[(sp+4)>>2] = mandreel_heap_memory;
-		tlsf_create(sp);
-		tlsf_ptr = r_g0;
-	}
-
-	sp-=8;
-
-	heap32[(sp)>>2] = tlsf_ptr;
-	heap32[(sp+4)>>2] = size;
-	tlsf_malloc(sp);
-
-	if (r_g0 == 0)
-	{
-		dump('malloc failed ' + size + '\n');
-		assert(false);
-	}
-  }
-
-
-   function log10f(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.log(value)/Math.LN10;
-  }
-
-   function log10(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.log(value)/Math.LN10;
-  }
-
-function logf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.log(value);
-  }
-
-  function log(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.log(value);
-  }
-
-
-
-  function cosf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.cos(value);
-	//assert (isNaN(f_g0) == false);
-  }
-
-  function acosf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.acos(value);
-  }
-
-  function asinf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.asin(value);
-  }
-
-  function asin(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.asin(value);
-  }
-
-  function acos(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.acos(value);
-  }
-
-  function floor(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.floor(value);
-  }
-
-  function floorf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.floor(value);
-  }
-
-  function round(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.round(value);
-  }
-
-  function roundf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.round(value);
-  }
-
-  function ceilf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.ceil(value);
-  }
-
-  function ceil(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.ceil(value);
-  }
-
-
-  function exp2(sp)
-  {
-  var value = heapDouble[sp>>3];
-
-	f_g0 = Math.pow(2,value);
-  }
-
-  function exp2f(sp)
-  {
-  var value = heapFloat[sp>>2];
-
-	f_g0 = Math.pow(2,value);
-  }
-
-
-
-  function pow(sp)
-  {
-  var value = heapDouble[sp>>3];
-  var value2 = heapDouble[(sp+8)>>3];
-	f_g0 = Math.pow(value,value2);
-  }
-
-  function powf(sp)
-  {
-  var value = heapFloat[sp>>2];
-  var value2 = heapFloat[(sp+4)>>2];
-	f_g0 = Math.pow(value,value2);
-  }
-
-  function cos(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.cos(value);
-	//assert (isNaN(f_g0) == false);
-  }
-
-  function tan(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.tan(value);
-	//assert (isNaN(f_g0) == false);
-  }
-
-   function sinf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.sin(value);
-
-	//assert (isNaN(f_g0) == false);
-  }
-
-  function expf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.exp(value);
-  }
-
-  function exp(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.exp(value);
-  }
-
-  function tanf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.tan(value);
-  }
-
- function atanf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.atan(value);
-  }
-
-  function atan(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.atan(value);
-  }
-
-  function abs(sp)
-  {
-  var value = heap32[sp>>2];
-  if (value<0)
-  r_g0 = -value;
-  else
-  r_g0 = value;
-  }
-
-  function sin(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.sin(value);
-  }
-
-  function sqrtf(sp)
-  {
-  var value = heapFloat[sp>>2];
-	f_g0 = Math.sqrt(value);
-  }
-
-  function sqrt(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.sqrt(value);
-  }
-
-  function fmod(sp)
-  {
-  var value = heapDouble[sp>>3];sp+=8;
-  var value2 = heapDouble[sp>>3];
-	f_g0 = value % value2;
-  }
-
-   function fmodf(sp)
-  {
-  var value = heapFloat[sp>>2];sp+=4;
-  var value2 = heapFloat[sp>>2];
-	f_g0 = value % value2;
-  }
-
-
-  function atan2f(sp)
-  {
-  var x = heapFloat[sp>>2];sp+=4;
-  var y = heapFloat[sp>>2];
-	f_g0 = Math.atan2(x,y);
-  }
-
-  function atan2(sp)
-  {
-  var x = heapDouble[sp>>3];
-  var y = heapDouble[(sp+8)>>3];
-	f_g0 = Math.atan2(x,y);
-  }
-
-  function fabs(sp)
-  {
-  var value = heapDouble[sp>>3];
-	f_g0 = Math.abs(value);
-  }
-
-
-  function _Z18OutputDebugStringAPKc(sp)
-  {
-  puts(sp);
-
-  }
-
-
-  function getenv(sp)
-  {
-  r_g0 = 0;
-  }
-
-
-  function mandreel_fcmp_ord(X, Y)
-  {
-	return (X == X && Y == Y);
-  }
-
-  function mandreel_fcmp_uno(X, Y)
-{
-
-        return (X != X || Y != Y);
-}
-
-var llvm_errno = Malloc(4);
-function _errno(sp)
-{
-	r_g0 = llvm_errno;
-}
-
-
-
-
-if (!Mandreel_window["dump"])
-	Mandreel_window["dump"] = function dump(str){console.log(str)} ;
-
-
-
-
-  function get_string_from_ptr(ptr)
-  {
-	var ret = "";
-
-	if (ptr == 0)
-		return ret;
-
-	var i = 0;
-	while (1) {
-  //    if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
-	if (heapU8[ptr + i] == 0)
-		break;
-
-      var t = String.fromCharCode(heapU8[ptr + i]);
-      ret += t;
-      i += 1;
-    }
-
-	return ret;
-  }
-
-  function fill_ptr_from_string(ptr, v)
-  {
-	var j;
-	var len = v.length;
-	var data;
-
-  	for(j = 0; j < len; j++)
-	{
-		data = v.charCodeAt(j);
-
-		heapU8[ptr] = data;
-		ptr++;
-	}
-		heapU8[ptr] = 0;
-	}
-
-  var file_ids = [];
-  var current_file_id = 20;
-
-  function create_file_id(buffer)
-  {
-	this.buffer = buffer;
-	this.offset = 0;
-	this.byteArray = new Uint8Array(buffer);
-  }
-
-  function mandreel_rewind(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-
-  file_ids[file_id].offset = 0;
-
-	r_g0 = 0;
-
-	//return 0;
-  }
-
-
-  function mandreel_fseek(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-  var pos = heap32[sp>>2];sp+=4;
-  var type = heap32[sp>>2];sp+=4;
-
-	if (type == 2)
-	{
-		file_ids[file_id].offset = file_ids[file_id].buffer.byteLength + pos;
-	}
-	else if (type == 1)
-	{
-		file_ids[file_id].offset = file_ids[file_id].offset + pos;
-
-	}
-	else if (type == 0)
-	{
-		file_ids[file_id].offset = pos;
-
-	}
-
-	r_g0 = 0;
-
-	//return 0;
-  }
-
-  function mandreel_fclose(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-
-	file_ids[file_id] = null;
-	r_g0 = 0;
-	//return 0;
-  }
-
-
-
-  function mandreel_feof(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-
-  var offset = file_ids[file_id].offset;
-  var total = file_ids[file_id].buffer.byteLength;
-
-  if (offset>=total)
-  r_g0 = 1;
-  else
-  r_g0 = 0;
-
-  }
-
-  function mandreel_getc(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-
-
-  var offset = file_ids[file_id].offset;
-
-
-	var buffer = file_ids[file_id].buffer;
-
-	var byteArray = file_ids[file_id].byteArray;
-
-	var total = 1;
-
-	var result;
-
-	if ((offset+total)>buffer.byteLength)
-	{
-		result = -1;
-	}
-	else
-	{
-		result = byteArray[offset];
-		file_ids[file_id].offset+=total;
-	}
-
-	r_g0 = result;
-  }
-
-
-
-  function mandreel_fread(sp)
-  {
-  var ptr = heap32[sp>>2];sp+=4;
-  var size = heap32[sp>>2];sp+=4;
-  var count = heap32[sp>>2];sp+=4;
-  var file_id = heap32[sp>>2];sp+=4;
-
-  var offset = file_ids[file_id].offset;
-
-  //dump('fread ' + ptr + ' ' + size + ' ' + count + ' ' + file_id + ' ' + offset + '\n');
-
-	var buffer = file_ids[file_id].buffer;
-
-	var total = size*count;
-
-	if ((offset+total)>buffer.byteLength)
-		total = buffer.byteLength-offset;
-
-	var byteArray = file_ids[file_id].byteArray;
-
-
-	var sub_array = byteArray.subarray(offset, offset+total);
-
-	heapU8.set(sub_array,ptr);
-
-
-	//heapU8.set(byteArray, ptr);
-	//for (var i=0;i<total;++i)
-	//{
-//		heapU8[ptr+i] = byteArray[i+offset];
-//	}
-
-
-	file_ids[file_id].offset+=total;
-
-	r_g0 = total/size;
-	//return total;
-  }
-
-  function mandreel_ftell(sp)
-  {
-  var file_id = heap32[sp>>2];sp+=4;
-
-	var value = file_ids[file_id].offset;
-	//dump('offset ftell ' + value + '\n');
-	r_g0 = value;
-	//return value;
-  }
-
-  function _Z30mandreel_fopen_enable_checkfatb(sp)
-  {
-  }
-
-  function mandreel_ungetc(sp)
-  {
-	var my_char = heap32[sp>>2];sp+=4;
-	var file_id = heap32[sp>>2];sp+=4;
-
-	var offset = file_ids[file_id].offset-1;
-
-	var byteArray = file_ids[file_id].byteArray;
-
-	assert(byteArray[offset] == my_char);
-
-	file_ids[file_id].offset = offset;
-
-	return my_char;
-  }
-  function mandreel_fopen(sp)
-  {
-  var ptr_name = heap32[sp>>2];sp+=4;
-  var ptr_flags = heap32[sp>>2];sp+=4;
-
-
-	var name = get_string_from_ptr(ptr_name);
-	var flags = get_string_from_ptr(ptr_flags);
-	//dump('fopen\n');
-	//dump(name);
-	//dump('\n');
-	//dump(flags);
-	//dump('\n');
-
-	var buffer;
-
-	var full_name;
-
-	name = name.toLowerCase();
-
-	name = name.replace(/\\/g,"/");
-
-	full_name	= g_mandreel_working_folder + name + g_mandreel_datafiles_sufix;
-
-
-	buffer =mandreel_cache_files[name];
-
-	if (buffer == null)
-	{
-	r_g0 = 0;
-	return;
-	}
-
-
-
-	//dump('\nopening file ' + full_name + ' ' + buffer.byteLength + '\n');
-
-
-	file_ids[current_file_id] = new create_file_id(buffer);
-
-	var old_id = current_file_id;
-	current_file_id++;
-
-	r_g0 = old_id;
-	//return old_id;
-  }
-
-  function llvm_store_unalign32_float(addr, value)
-  {
-	heapFloat[0] = value;
-	var data = heap32[0];
-	heap8[addr] = data&0xff;
-	heap8[addr+1] = (data>>>8)&0xff;
-	heap8[addr+2] = (data>>>16)&0xff;
-	heap8[addr+3] = (data>>>24)&0xff;
-  }
-  function llvm_store_unalign32(addr, value)
-  {
-	heap8[addr] = value&0xff;
-	heap8[addr+1] = (value>>>8)&0xff;
-	heap8[addr+2] = (value>>>16)&0xff;
-	heap8[addr+3] = (value>>>24)&0xff;
-  }
-
-  function llvm_read_unalign32(addr)
-  {
-	var value;
-	value = heapU8[addr];
-	value |= heapU8[addr+1]<<8;
-	value |= heapU8[addr+2]<<16;
-	value |= heapU8[addr+3]<<24;
-	return value;
-  }
-
-  function llvm_read_unalign32_float(addr)
-  {
-	var value;
-	value = heapU8[addr];
-	value |= heapU8[addr+1]<<8;
-	value |= heapU8[addr+2]<<16;
-	value |= heapU8[addr+3]<<24;
-
-	heap32[0] = value;
-	return  heapFloat[0];
-  }
-
-  function mandreel_getlocalstorage()
-  {
-	return Mandreel_window.localStorage;
-	//return Mandreel_window.sessionStorage;
-  }
-
-  function mandreel_openls(sp)
-  {
-	var ptr_name = heap32[sp>>2];sp+=4;
-
-	var key = get_string_from_ptr(ptr_name);
-
-	var my_localStorage = mandreel_getlocalstorage();
-
-	var value = my_localStorage.getItem(key);
-
-	if (value == null)
-	{
-		r_g0 = -1;
-		return;
-	}
-
-
-	var length = my_localStorage.getItem(key + '_size');
-
-	if (length == null)
-	{
-		r_g0 = -1;
-		return;
-	}
-
-
-
-
-	dump('mandreel_openls ' + key + ' return ' + length);
-
-
-	r_g0 = parseInt(length);
-
-
-
-	return;
-
-  }
-
-  function mandreel_readls(sp)
-  {
-	var ptr_name = heap32[sp>>2];sp+=4;
-	var data_dst = heap32[sp>>2];sp+=4;
-	var data_len = heap32[sp>>2];sp+=4;
-
-	var key = get_string_from_ptr(ptr_name);
-
-	var my_localStorage = mandreel_getlocalstorage();
-
-	var value = my_localStorage.getItem(key);
-
-	var data = JSON.parse(value);
-
-
-	for (var i=0;i<data_len;++i)
-	{
-		heapU8[data_dst+i] = data[i];
-	}
-
-	r_g0 =  data_len;
-	return;
-
-}
-
-function mandreel_removels(sp)
- {
- var ptr_name_a = heap32[sp>>2];sp+=4;
- var key_a = get_string_from_ptr(ptr_name_a);
-
- var my_localStorage = mandreel_getlocalstorage();
-
-	my_localStorage.removeItem(key_a);
-	my_localStorage.removeItem(key_a + '_size');
-	r_g0 = 0;
-
- }
-
-
-function mandreel_renamels(sp)
- {
- var ptr_name_a = heap32[sp>>2];sp+=4;
-  var ptr_name_b = heap32[sp>>2];sp+=4;
-
-  var key_a = get_string_from_ptr(ptr_name_a);
-  var key_b = get_string_from_ptr(ptr_name_b);
-
-  var my_localStorage = mandreel_getlocalstorage();
-
-
-  var value = my_localStorage.getItem(key_a);
-  var value2 = my_localStorage.getItem(key_a + '_size');
-
-  if (value != null && value2 != null)
-  {
-	my_localStorage.setItem(key_b, value);
-	my_localStorage.setItem(key_b + '_size', value2);
-
-	my_localStorage.removeItem(key_a);
-	my_localStorage.removeItem(key_a + '_size');
-
-
-	r_g0 = 0;
-}
-else
- r_g0 = -1;
- }
-
-function mandreel_writels(sp)
-  {
-	var ptr_name = heap32[sp>>2];sp+=4;
-	var data_src = heap32[sp>>2];sp+=4;
-	var data_len = heap32[sp>>2];sp+=4;
-
-	var key = get_string_from_ptr(ptr_name);
-
-
-
-	var data = new Uint8Array(heap,data_src,data_len);
-
-	var value = JSON.stringify(data);
-
-	var my_localStorage = mandreel_getlocalstorage();
-
-	try
-	{
-		my_localStorage.setItem(key, value);
-	} catch(e)
-	{
-		dump('error saving ' + key);
-		dump(e.message);
-		r_g0 =  0;
-		return;
-	}
-
-	try
-	{
-		my_localStorage.setItem(key + '_size', data_len);
-	} catch(e)
-	{
-		dump('error saving ' + key);
-		dump(e.message);
-		r_g0 =  0;
-		return;
-	}
-
-
-	r_g0 =  data_len;
-	return;
-
-}
-
-function mandreel_call_constructors(_ptr, size,stackPos)
-{
-var ptr = _ptr;
-
-ptr = ptr >> 2;
-
-for (var i=0;i<size;++i)
-{
-
-
-var tag = heap32[ptr];
-var ptr_id = heap32[ptr+1];
-
-__FUNCTION_TABLE__[(ptr_id)>>2](stackPos);
-
-ptr+=2;
-
-}
-}
-
-function get_string_from_wptr(ptr)
-  {
-	var ret = "";
-
-	if (ptr == 0)
-		return ret;
-
-	assert((ptr&1)==0);
-	ptr>>=1;
-	var i = 0;
-	while (1) {
-  //    if ((ptr.pos + i) >= ptr.slab.length) { return "<< Invalid read: " + (ptr.pos+i) + " : " + ptr.slab.length + " >>"; } else {}
-	if (heapU16[ptr + i] == 0)
-		break;
-
-      var t = String.fromCharCode(heapU16[ptr + i]);
-     // if (t == "\0") { break; } else {}
-      ret += t;
-      i += 1;
-    }
-
-	return ret;
-  }
-
-  function fill_wptr_from_string(ptr, v)
-  {
-	var j;
-	var len = v.length;
-	var data;
-
-	assert((ptr&1)==0);
-	ptr>>=1;
-
-  	for(j = 0; j < len; j++)
-	{
-		data = v.charCodeAt(j);
-
-		heapU16[ptr] = data;
-		ptr++;
-	}
-		heapU16[ptr] = 0;
-	}
-
-function mandreelInterGetParams(sp)
-{
-	var params = [];
-
-	var offset = 0;
-	for (i=1;i<arguments.length;++i)
-	{
-		var type = arguments[i];
-
-		switch(type)
-		{
-			case 'int':
-				params[i-1] = heap32[(sp+offset)>>2];
-				break;
-			case 'float':
-				params[i-1] = heapFloat[(sp+offset)>>2];
-				break;
-			case 'string':
-				params[i-1] = get_string_from_ptr(heap32[(sp+offset)>>2]);
-				break;
-			default:
-				assert(false);
-		}
-		offset+=4;
-	}
-
-	return params;
-}
-
-function mandreelInterRetParam(type, value)
-{
-	switch(type)
-	{
-		case 'int':
-			r_g0 = value;
-			break;
-		case 'float':
-			f_g0 = value;
-			break;
-		default:
-			assert(false);
-	}
-
-	return 0;
-}
-
-function MandreelInterGetFunctionPtr(value)
-{
-	return __FUNCTION_TABLE__[value >> 2];
-}
-
-
-function MandreelInterCallFunction(returnType,func_name)
-{
-	var size_params = 0;
-
-	var i;
-	var num_params = (arguments.length-2)/2;
-	num_params|=0;
-	for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				size_arg = 4;
-				break;
-			case 'float':
-				size_arg = 4;
-				break;
-			case 'string':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
-				break;
-			case 'wstring':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
-				break;
-			default:
-				assert(false);
-		}
-
-		size_params += size_arg;
-	}
-
-	// stack always 8 byte aligned
-	size_params=((size_params+7)& 0xfffffff8);
-
-	var sp = 0;
-
-	if (i<(arguments.length))
-		sp = arguments[i];
-	else
-	{
-		assert(false,"MandreelInterCallFunction missing stack pointer paramenter");
-		//assert(g_mandreel_frame_locked == true);
-		//sp = g_stack_pointer+800*1024;
-	}
-
-	sp-=size_params;
-
-	var offset = 0;
-	var ptr_data = num_params*4+sp;
-    for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				heap32[(sp+offset)>>2] = arguments[i+1];
-				break;
-			case 'float':
-				heapFloat[(sp+offset)>>2] = arguments[i+1];
-				break;
-			case 'string':
-				{
-					heap32[(sp+offset)>>2] = ptr_data;
-					var string = arguments[i+1];
-					fill_ptr_from_string(ptr_data,string);
-
-					ptr_data += ((string.length + 4) & 0xfffffffc);
-				}
-				break;
-			case 'wstring':
-				{
-					MandreelInterWriteInt((sp+offset),ptr_data);
-					var string = arguments[i+1];
-					MandreelInterWriteWString(ptr_data,string);
-
-					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
-				}
-				break;
-			default:
-				assert(false);
-		}
-		offset+=4;
-	}
-
-	Mandreel_window[func_name](sp);
-
-	if (returnType == 'int')
-		return r_g0;
-	else if (returnType == 'float')
-		return f_g0;
-	else
-	{
-		assert(returnType == 'void');
-		return;
-	}
-}
-
-
-function MandreelInterCallFunctionPtr(returnType,func_ptr)
-{
-	var size_params = 0;
-
-	var i;
-	var num_params = (arguments.length-2)/2;
-	num_params|=0;
-	for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				size_arg = 4;
-				break;
-			case 'float':
-				size_arg = 4;
-				break;
-			case 'string':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length + 4) & 0xfffffffc);
-				break;
-			case 'wstring':
-				size_arg = 4;
-				size_arg += ((arguments[i+1].length*2 + 4) & 0xfffffffc);
-				break;
-			default:
-				assert(false);
-		}
-
-		size_params += size_arg;
-	}
-
-	// stack always 8 byte aligned
-	size_params=((size_params+7)& 0xfffffff8);
-
-	var sp = 0;
-
-	if (i<(arguments.length))
-		sp = arguments[i];
-	else
-	{
-		assert(false);
-		//assert(g_mandreel_frame_locked == true);
-		//sp = g_stack_pointer+800*1024;
-	}
-
-	sp-=size_params;
-
-	var offset = 0;
-	var ptr_data = num_params*4+sp;
-    for (i=2;i<num_params*2+2;i+=2)
-	{
-		var type = arguments[i];
-
-		var size_arg = 0;
-		switch(type)
-		{
-			case 'int':
-				heap32[(sp+offset)>>2] = arguments[i+1];
-				break;
-			case 'float':
-				heapFloat[(sp+offset)>>2] = arguments[i+1];
-				break;
-			case 'string':
-				{
-					heap32[(sp+offset)>>2] = ptr_data;
-					var string = arguments[i+1];
-					fill_ptr_from_string(ptr_data,string);
-
-					ptr_data += ((string.length + 4) & 0xfffffffc);
-				}
-				break;
-			case 'wstring':
-				{
-					MandreelInterWriteInt((sp+offset),ptr_data);
-					var string = arguments[i+1];
-					MandreelInterWriteWString(ptr_data,string);
-
-					ptr_data += ((string.length*2 + 4) & 0xfffffffc);
-				}
-				break;
-			default:
-				assert(false);
-		}
-		offset+=4;
-	}
-
-	__FUNCTION_TABLE__[(func_ptr)>>2](sp);
-
-	if (returnType == 'int')
-		return r_g0;
-	else if (returnType == 'float')
-		return f_g0;
-	else
-	{
-		assert(returnType == 'void');
-		return;
-	}
-}
-
-
-var MANDREEL_HTTP_REQUEST_MODE_GET = 0;
-var MANDREEL_HTTP_REQUEST_MODE_POST = 1;
-var MANDREEL_HTTP_REQUEST_MODE_PUT = 2;
-
-var MANDREEL_HTTP_REQUEST_STATUS_ERROR = 0;
-var MANDREEL_HTTP_REQUEST_STATUS_BUSY = 1;
-var MANDREEL_HTTP_REQUEST_STATUS_FINISHED = 2;
-var MANDREEL_HTTP_REQUEST_STATUS_INIT = 3;
-
-
-var mandreel_js_mapping_ids = [];
-var mandreel_js_mapping_ids_free = [];
-
-
-function Mandreel_HttpRequest_Create(sp)
-{
-	var ptr_url = heap32[sp>>2];sp+=4;
-	var type = heap32[sp>>2];sp+=4;
-
-
-	var url = get_string_from_ptr(ptr_url);
-
-
-	var str_type = 'GET';
-	if (type == MANDREEL_HTTP_REQUEST_MODE_GET)
-		str_type = 'GET';
-	else if (type == MANDREEL_HTTP_REQUEST_MODE_PUT)
-		str_type = 'PUT';
-	else if (type == MANDREEL_HTTP_REQUEST_MODE_POST)
-		str_type = 'POST';
-
-	var xmlhttp_get = new XMLHttpRequest();
-	xmlhttp_get.open(str_type,url);
-
-	if("responseType" in xmlhttp_get)
-		xmlhttp_get.responseType="arraybuffer";
-    else
-	{
-		xmlhttp_get.overrideMimeType('text/plain; charset=x-user-defined');
-	}
-
-	if (mandreel_js_mapping_ids_free.length == 0)
-		mandreel_js_mapping_ids_free.push(mandreel_js_mapping_ids.length);
-
-	var new_id = mandreel_js_mapping_ids_free.pop();
-
-	var my_state = {
-	buffer : null,
-	httpRequest : xmlhttp_get,
-	status : MANDREEL_HTTP_REQUEST_STATUS_INIT,
-	offset_read : 0
-  };
-
-
-
-	mandreel_js_mapping_ids[new_id] = my_state;
-
-	r_g0 = new_id+1;
-}
-
-function Mandreel_HttpRequest_Send(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var ptr_data = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-	var data;
-
-	if (ptr_data)
-		data = get_string_from_ptr(ptr_data);
-	else
-		data = null;
-
-	var my_state = mandreel_js_mapping_ids[id];
-
-
-	my_state.status = MANDREEL_HTTP_REQUEST_STATUS_BUSY;
-
-	my_state.httpRequest.onreadystatechange = function()
-	{
-		if (my_state.httpRequest.readyState==4)
-		{
-			if (my_state.httpRequest.status==200)
-			{
-				var buffer;
-
-				if (my_state.httpRequest.responseType=="arraybuffer")
-					buffer=my_state.httpRequest.response;
-				else if (my_state.httpRequest.mozResponseArrayBuffer != null)
-					buffer = my_state.httpRequest.mozResponseArrayBuffer;
-				else
-					buffer=my_state.httpRequest.response;
-
-				my_state.status = MANDREEL_HTTP_REQUEST_STATUS_FINISHED;
-				my_state.buffer =  new Uint8Array(buffer);
-				//alert(my_state.buffer.length);
-
-				//alert(mandreel_js_mapping_ids[id].buffer);
-
-			}
-			else
-				my_state.status = MANDREEL_HTTP_REQUEST_STATUS_ERROR;
-		}
-	}
-
-	my_state.httpRequest.send(data);
-}
-
-
-function Mandreel_HttpRequest_Status(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-
-	r_g0 = mandreel_js_mapping_ids[id].status;
-}
-
-function Mandreel_HttpRequest_Read(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-	var size = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-	var remaining_bytes =  mandreel_js_mapping_ids[id].buffer.length - mandreel_js_mapping_ids[id].offset_read;
-
-	if (size>remaining_bytes)
-		size = remaining_bytes;
-
-	var sub_array = mandreel_js_mapping_ids[id].buffer.subarray(mandreel_js_mapping_ids[id].offset_read, mandreel_js_mapping_ids[id].offset_read+size);
-	heapU8.set(sub_array,ptr);
-
-	mandreel_js_mapping_ids[id].offset_read+=size;
-
-	r_g0 = size;
-}
-
-function Mandreel_HttpRequest_BytesAvalable(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-
-	if (mandreel_js_mapping_ids[id].buffer)
-		r_g0 = mandreel_js_mapping_ids[id].buffer.length - mandreel_js_mapping_ids[id].offset_read;
-	else
-		r_g0 = 0;
-}
-
-function Mandreel_HttpRequest_Close(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-	mandreel_js_mapping_ids[id] = null;
-	mandreel_js_mapping_ids_free.push(id);
-}
-
-function Mandreel_HttpRequest_SetRequestHeader(sp)
-{
-	var _id = heap32[sp>>2];sp+=4;
-	var ptr_a = heap32[sp>>2];sp+=4;
-	var ptr_b = heap32[sp>>2];sp+=4;
-	var id = _id-1;
-
-	var str_a = get_string_from_ptr(ptr_a);
-	var str_b = get_string_from_ptr(ptr_b);
-
-	var my_state = mandreel_js_mapping_ids[id];
-
-	my_state.httpRequest.setRequestHeader(str_a, str_b);
-}
-
-
-var Mandreel_TextureAsync_textures = 0;
-var Mandreel_TextureAsync_textures_loaded = 0;
-
-var Mandreel_TextureAsync_PackBufferData = new Array();
-
-function Mandreel_TextureAsync_SetData(sp)
-{
-	var texture_id = heap32[sp>>2];sp+=4;
-
-	var tex = array_ids_ogl[texture_id];
-
-	if ( mandreelAppPlatform != "canvas" )
-	{
-		imandreel_gl.texImage2D(imandreel_gl.TEXTURE_2D, 0, imandreel_gl.RGBA, imandreel_gl.RGBA, imandreel_gl.UNSIGNED_BYTE, tex.image);
-		tex.image = null;
-	}
-}
-
-function Mandreel_TextureAsync_CheckPending(sp)
-{
-	r_g0 = Mandreel_TextureAsync_textures - Mandreel_TextureAsync_textures_loaded;
-}
-
-function Mandreel_TextureAsync_GetProperties(sp)
-{
-	var texture_id = heap32[sp>>2];sp+=4;
-	var ptr_width = heap32[sp>>2];sp+=4;
-	var ptr_height = heap32[sp>>2];sp+=4;
-
-	var tex = array_ids_ogl[texture_id];
-
-	if (tex == null || tex.mandreel_width == undefined)
-		r_g0 = 0;
-	else
-	{
-		heap32[ptr_width>>2] = tex.mandreel_width;
-		heap32[ptr_height>>2] = tex.mandreel_height;
-		r_g0 = 1;
-	}
-}
-
-function mandreel_arrayBufferDataUri(offset, size, buffer) {
-var bytes = new Uint8Array(buffer,offset,size)
-   var ascii = '';
-   for (var i=0; i<bytes.length; i++)
-     ascii += String.fromCharCode(bytes[i]);
-   var base64 = btoa(ascii);
-
-  if (/^\x89PNG/.test(ascii))
-    return 'data:image/png;base64,'+base64;
-  else
-    return 'data:image/jpeg;base64,'+base64;
-  }
-
- function mandreel_texture_async_fix_name(name)
-{
-	var ascii = '';
-
-	var j;
-	var len = name.length;
-
-
-	for(j = 0; j < len; j++)
-	{
-		var my_char = name[j];
-
-		if (my_char == '/')
-			my_char = '_';
-
-		ascii+=my_char;
-
-	}
-
-   return ascii;
-}
-
-
-
-function Mandreel_TextureAsync_Load(sp)
-{
-	var ptr_name = heap32[sp>>2];sp+=4;
-	var texture_id = heap32[sp>>2];sp+=4;
-
-	var name = get_string_from_ptr(ptr_name);
-
-	var nameSrc = name;
-
-	name = name.toLowerCase();
-
-
-	var full_name	= g_mandreel_working_folder + name;
-
-	var image  = new Image();
-
-
-	Mandreel_TextureAsync_textures++;
-
-	var imgURL = null;
-
-
-
-
-	image.onerror = function() {
-          dump('error loading texture ' + image.src + '\n');
-		  Mandreel_TextureAsync_textures_loaded++;
-      }
-	image.onload = function()
-	{
-		if (imgURL)
-		{
-			var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
-			URL.revokeObjectURL(imgURL);
-		}
-		if ( mandreelAppPlatform == "canvas" )
-		{
-			array_ids_ogl[texture_id] = image;
-			Mandreel_TextureAsync_textures_loaded++;
-		}
-		else
-		{
-			var tex = array_ids_ogl[texture_id];
-			if (tex)
-			{
-				tex.image = image;
-				tex.mandreel_width = image.width;
-				tex.mandreel_height = image.height;
-				Mandreel_TextureAsync_textures_loaded++;
-
-				var sp = MandreelLockFrame();
-				MandreelInterCallFunction('void',"Mandreel_TextureAsync_Loaded",'int',texture_id,'int',image.width,'int',image.height, sp);
-				MandreelUnlockFrame();
-		}
-			else
-			{
-				dump('texture not valid ' + texture_id + ' ' + name + '\n');
-				Mandreel_TextureAsync_textures_loaded++;
-			}
-		}
-
-
-	}
-
-	var new_sp = sp-4096;
-
-	var packfile = new_sp + 2048;
-	var offset_ptr = new_sp + 2048+1024;
-	var size_ptr = new_sp + 2048+1024+4;
-
-	fill_ptr_from_string(new_sp + 1024,name);
-
-	heap32[(new_sp)>>2] = new_sp + 1024;
-	heap32[(new_sp+4)>>2] = offset_ptr;
-	heap32[(new_sp+8)>>2] = size_ptr;
-	heap32[(new_sp+12)>>2] = packfile;
-	iMandreel_TextureAsync_GetPackOffset(new_sp);
-
-
-	var image_src;
-
-	var image_src_valid = true;
-
-	if (r_g0)
-	{
-		var packfilename = get_string_from_ptr(packfile);
-		image_src = mandreel_arrayBufferDataUri(heap32[offset_ptr>>2],heap32[size_ptr>>2],Mandreel_TextureAsync_PackBufferData[packfilename]);
-	}
-	else
-	{
-
-		if (nameSrc.search('http:') != -1 || nameSrc.search('https:') != -1)
-		{
-			image.crossOrigin = 'anonymous'; // no credentials flag. Same as
-			image_src = nameSrc;
-		}
-		else
-		{
-			if (mandreel_is_filesystem())
-			{
-				image_src_valid = false;
-
-				var new_name = mandreel_texture_async_fix_name(full_name);
-				mandreel_fs_get_url(new_name, function Mandreel_TextureAsync_Load_FS(data) {
-					if (data)
-					{
-						image.src = data;
-					}
-					else
-					{
-						var packdata_request = new XMLHttpRequest();
-
-						packdata_request.open("GET", full_name, true);
-
-						if("responseType" in packdata_request)
-							packdata_request.responseType="arraybuffer";
-						else
-							packdata_request.overrideMimeType('text/plain; charset=x-user-defined');
-
-						packdata_request.onreadystatechange = function()
-						{
-							if (packdata_request.readyState != 4) return;
-
-							if (packdata_request.status == 200)
-							{
-								var buffer;
-								if (packdata_request.responseType=="arraybuffer")
-									buffer=packdata_request.response;
-								else if (packdata_request.mozResponseArrayBuffer != null)
-									buffer = packdata_request.mozResponseArrayBuffer;
-								else
-									buffer=packdata_request.response;
-
-								mandreel_fs_saveFile(new_name, buffer);
-
-								var uri = mandreel_arrayBufferDataUri(0,buffer.byteLength,buffer);
-
-								image.src = uri;
-
-							}
-							else
-							{
-
-								Mandreel_TextureAsync_textures_loaded++;
-
-							}
-						}
-
-						packdata_request.send();
-
-					}
-				}
-				);
-			}
-			else if (mandreel_is_indexeddb())
-			{
-				image_src_valid = false;
-
-				var new_name = mandreel_texture_async_fix_name(full_name);
-				mandreel_indexedDB.load(new_name,function Mandreel_TextureAsync_Load_IDB(data) {
-					if (data)
-					{
-						 var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
-
-
-						// Create and revoke ObjectURL
-						imgURL = URL.createObjectURL(data);
-
-						image.src = imgURL;
-					}
-					else
-					{
-						var packdata_request = new XMLHttpRequest();
-
-						packdata_request.open("GET", full_name, true);
-
-						 packdata_request.responseType = "blob";
-
-
-
-						packdata_request.onreadystatechange = function()
-						{
-							if (packdata_request.readyState != 4) return;
-
-							if (packdata_request.status == 200)
-							{
-								var buffer=packdata_request.response;
-
-								 var URL = Mandreel_window.URL || Mandreel_window.webkitURL;
-
-								// Create and revoke ObjectURL
-								imgURL = URL.createObjectURL(buffer);
-
-								image.src = imgURL;
-
-								mandreel_fs_saveFile(new_name, buffer);
-
-							}
-							else
-							{
-
-								Mandreel_TextureAsync_textures_loaded++;
-
-							}
-						}
-
-						packdata_request.send();
-					}
-
-				}
-				);
-			}
-			else
-				image_src = full_name;
-		}
-	}
-
-
-	if (image_src_valid)
-	{
-		setTimeout( function Mandreel_TextureAsync_Load_callback() {
-						image.src = image_src;
-					}, 1);
-	}
-}
-
-
-
-function __sandbox_OutputDebugString(sp)
-{
-	puts(sp);
-}
-
-
-
-
-var MANDREELCALLJS_TYPE_RETURN_VOID = 0;
-var MANDREELCALLJS_TYPE_INT = 1;
-var MANDREELCALLJS_TYPE_FLOAT =  2;
-var MANDREELCALLJS_TYPE_STRING =  3;
-var MANDREELCALLJS_TYPE_RETURN_INT =  4;
-var MANDREELCALLJS_TYPE_RETURN_FLOAT =  5;
-
-function MandreelInterWriteString(ptr, value)
-{
-	fill_ptr_from_string(ptr,value);
-}
-
-function MandreelInterWriteWString(ptr, value)
-{
-	fill_wptr_from_string(ptr, value);
-}
-
-function MandreelInterWriteFloat(ptr, value)
-{
-	heapFloat[ptr>>2] = value;
-}
-
-function MandreelPause()
-{
-	_imandreel_pause_game = true;
-}
-
-function MandreelResume()
-{
-	_imandreel_pause_game = false;
-}
-
-
-function MandreelLockFrame()
-{
-	assert(g_mandreel_frame_inframe == false, "calling lockframe during render frame");
-	assert(g_mandreel_frame_locked == false, "calling lockframe twice");
-	g_mandreel_frame_locked = true;
-
-	return g_stack_pointer+800*1024;
-}
-
-function MandreelUnlockFrame()
-{
-	assert(g_mandreel_frame_inframe == false);
-	g_mandreel_frame_locked = false;
-}
-
-
-function MandreelInterWriteInt(ptr, value)
-{
-	heap32[ptr>>2] = value;
-}
-
-function MandreelInterStringFromWPtr(ptr)
-{
-	return get_string_from_wptr(ptr);
-}
-
-function MandreelInterStringFromPtr(ptr)
-{
-	return get_string_from_ptr(ptr);
-}
-
-function mandreel_my_call_external_array(method, params)
-{
-	var result
-	var resultString;
-	try
-	{
-		switch(params.length)
-		{
-			case 1:
-				resultString = Mandreel_window[method](params[0]);
-				break;
-			case 2:
-				resultString = Mandreel_window[method](params[0],params[1]);
-				break;
-			case 3:
-				resultString = Mandreel_window[method](params[0],params[1],params[2]);
-				break;
-			case 4:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3]);
-				break;
-			case 5:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4]);
-				break;
-			case 6:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5]);
-				break;
-			case 7:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6]);
-				break;
-			case 8:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7]);
-				break;
-			case 9:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8]);
-				break;
-			case 10:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9]);
-				break;
-			case 11:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10]);
-				break;
-			case 12:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11]);
-				break;
-			case 13:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12]);
-				break;
-			case 14:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13]);
-				break;
-			case 15:
-				resultString = Mandreel_window[method](params[0],params[1],params[2],params[3],params[4],params[5],params[6],params[7],params[8],params[9],params[10],params[11],params[12],params[13],params[14]);
-				break;
-			default:
-				assert(false);
-		}
-		result = 0;
-	} catch(e) { dump('error calling ' + method + '\n'); dump(e); result = 1;}
-
-	return [result,resultString];
-}
-
-
-function Mandreel_InterJS_Call(sp)
-{
-	var new_sp = sp;
-	var method_ptr = heap32[sp>>2];sp+=4;
-	var method = get_string_from_ptr(method_ptr);
-
-	var params = new Array();
-
-
-	params.push(new_sp);
-
-	var var_int;
-	var var_string;
-	var var_double;
-
-	var return_type;
-	var return_ptr;
-	while (true)
-	{
-		var my_type = heap32[sp>>2];sp+=4;
-
-
-		if (my_type == MANDREELCALLJS_TYPE_RETURN_VOID)
-		{
-			return_type = my_type;
-			break;
-		}
-		else if (my_type == MANDREELCALLJS_TYPE_INT)
-		{
-			var_int = heap32[sp>>2];
-
-			params.push(var_int);
-			sp+=4;
-		}
-		else if (my_type == MANDREELCALLJS_TYPE_FLOAT)
-		{
-			sp = (sp+7) & ~7;
-
-			var_double = llvm_readDouble(sp);
-
-			params.push(var_double);
-			sp+=8;
-		}
-		else if (my_type == MANDREELCALLJS_TYPE_STRING)
-		{
-			var_int = heap32[sp>>2];
-			var_string = get_string_from_ptr(var_int);
-
-			params.push(var_string);
-			sp+=4;
-		}
-		else if (my_type == MANDREELCALLJS_TYPE_RETURN_INT)
-		{
-			return_type = my_type;
-			return_ptr = heap32[sp>>2];
-			break;
-		}
-		else if (my_type == MANDREELCALLJS_TYPE_RETURN_FLOAT)
-		{
-			return_type = my_type;
-			return_ptr = heap32[sp>>2];
-			break;
-		}
-		else
-		{
-			assert(false, "invalid arguments calling Mandreel_InterJS_Call");
-		}
-	}
-
-	var result = mandreel_my_call_external_array(method,params);
-
-	r_g0 = result[0];
-
-
-	if (r_g0 == 0)
-	{
-		if (return_type == MANDREELCALLJS_TYPE_RETURN_INT)
-		{
-			heap32[return_ptr>>2] = result[1];
-		}
-		else if (return_type == MANDREELCALLJS_TYPE_RETURN_FLOAT)
-		{
-			heapFloat[return_ptr>>2] = result[1];
-		}
-
-	}
-}
-
-function iMandreelRegisterExternalCallback()
-{
-}
-
-function __mandreel_internal_CreateWindow()
-{
-}
-
-var __mandreel_async_calls_mandreel = [];
-var __mandreel_async_calls_js = [];
-
-
-function Mandreel_InterJS_AsyncCall(sp)
-{
-	var method_ptr = heap32[sp>>2];sp+=4;
-	var _func_name = get_string_from_ptr(method_ptr);
-	var param_ptr = heap32[sp>>2];sp+=4;
-	var _param = get_string_from_ptr(param_ptr);
-
-	__mandreel_async_calls_js.push({func_name:_func_name,param:_param});
-}
-
-
-
-
-function MandreelInterCallFunctionAsync(_func_name, _param)
-{
-	__mandreel_async_calls_mandreel.push({func_name:_func_name,param:_param});
-
-
-}
-
-function __mandreel_process_async_calls()
-{
-	if (__mandreel_async_calls_mandreel.length)
-	{
-		var temp_list = __mandreel_async_calls_mandreel.slice(0);
-
-		__mandreel_async_calls_mandreel = [];
-
-		for (var i=0;i<temp_list.length;++i)
-		{
-			var param = temp_list[i].param;
-			var func_name = temp_list[i].func_name;
-
-			var size = ((param.length + 1)+7)&0xFFFFFFF8;
-
-			var sp = g_stack_pointer+800*1024;
-
-			var str_ptr = sp - size;
-			fill_ptr_from_string(str_ptr,param);
-
-			sp = str_ptr - 4;
-			heap32[sp>>2] = str_ptr;
-
-			Mandreel_window[func_name](sp);
-		}
-	}
-
-	if (__mandreel_async_calls_js.length)
-	{
-		var temp_list = __mandreel_async_calls_js.slice(0);
-
-		__mandreel_async_calls_js = [];
-
-		for (var i=0;i<temp_list.length;++i)
-		{
-			var param = temp_list[i].param;
-			var func_name = temp_list[i].func_name;
-
-			Mandreel_window[func_name](param);
-
-		}
-	}
-}
-
-function mandreel_internal_isCanvas(sp)
-{
-	if ( mandreelAppPlatform == "canvas" )
-		r_g0 = 1;
-	else
-		r_g0 = 0;
-}
-
-function Mandreel_Device_SetFullScreen(sp)
-{
-	var enable = heap32[sp>>2];sp+=4;
-	mandreelAppFullscreen(enable);
-}
-
-var array_ids_ogl = [];
-
-var max_ogl_id = 8192;
-
-var array_ids_ogl_enable = [];
-var g_current_program_id = 0;
-
-
-var uniformArrays2 = [];
-var uniformArrays3 = [];
-var uniformArrays4 = [];
-var uniformArraysCreated = 0;
-var mandreel_draw_enable = true;
-
-
-if (typeof imandreel_gl=="undefined")
-{
-	alert('using old template, update code');
-}
-
-function myglCreateUniformArrays()
-{
-	if ( uniformArraysCreated == 0 )
-	{
-		for(var i=0; i<256;i++ )
-		{
-			uniformArrays2[i] = new Float32Array(i*2);
-			uniformArrays3[i] = new Float32Array(i*3);
-			uniformArrays4[i] = new Float32Array(i*4);
-		}
-		uniformArraysCreated = 1;
-	}
-}
-
-var my_super_id = 1;
-function myglNewSlot()
-{
-	//var id = array_ids_ogl_enable.pop();
-	var id = my_super_id;
-	my_super_id++;
-	return id;
-}
-
-function myglFreeSlot(id)
-{
-	//array_ids_ogl_enable.push(id);
-}
-
-
-function myglCreateProgram(sp)
-{
-	var id = myglNewSlot();
-	var program = imandreel_gl.createProgram();
-
-	program.uniform_locations_current_id = 0;
-	program.array_uniform_locations = [];
-
-	array_ids_ogl[id] = program;
-
-
-	r_g0 = id;
-}
-
-function myglCreateShader(sp)
-{
-	var type = heap32[sp>>2];sp+=4;
-	var id = myglNewSlot();
-
-	array_ids_ogl[id] = imandreel_gl.createShader(type);
-
-	r_g0 = id;
-}
-
-function myglAttachShader(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var shader_id = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.attachShader(array_ids_ogl[program_id], array_ids_ogl[shader_id]);
-}
-
-function myglBindAttribLocation(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var index = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var string = get_string_from_ptr(ptr_string);
-
-	imandreel_gl.bindAttribLocation(array_ids_ogl[program_id], index, string);
-}
-
-function myglLinkProgram(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.linkProgram(array_ids_ogl[program_id]);
-}
-
-function myglShaderSource(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var shader = array_ids_ogl[id];
-
-	var shader_code = get_string_from_ptr(ptr_string);
-
-	//dump(shader_code);
-
-
-	imandreel_gl.shaderSource(shader, shader_code);
-}
-
-
-function myglDrawArrays(sp)
-{
-	var mode = heap32[sp>>2];sp+=4;
-	var first = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-
-	if (mandreel_draw_enable)
-		imandreel_gl.drawArrays(mode, first, count);
-
-
-	//dump('draw arrays ' + mode + ' ' + first + ' ' + count + '\n');
- }
-
-function myglDrawElements(sp)
-{
-	var mode = heapU32[sp>>2]; sp+=4;
-	var count = heapU32[sp>>2]; sp+=4;
-	var type = heapU32[sp>>2]; sp+=4;
-	var offset = heapU32[sp>>2]; sp+=4;
-
-
-	if (mandreel_draw_enable)
-		imandreel_gl.drawElements(mode, count, type, offset);
-
-
-
-}
-
-function myglCreateTexture(sp)
-{
-	var id = myglNewSlot();
-	array_ids_ogl[id] = imandreel_gl.createTexture();
-
-	r_g0 = id;
-}
-
-function myglCreateRenderBuffer(sp) {
-	var id = myglNewSlot();
-    array_ids_ogl[id] = imandreel_gl.createRenderbuffer();
-
-    r_g0 = id;
-}
-
-function myglCreateFrameBuffer(sp) {
-	var id = myglNewSlot();
-    array_ids_ogl[id] = imandreel_gl.createFramebuffer();
-
-    r_g0 = id;
-}
-
-function myglBindFramebuffer(sp)
-{
-    var target = heap32[sp >> 2]; sp += 4;
-    var framebuffer_id = heap32[sp >> 2]; sp += 4;
-
-	if (framebuffer_id != 0)
-	{
-		var framebuffer = array_ids_ogl[framebuffer_id];
-		imandreel_gl.bindFramebuffer(target,framebuffer);
-	}
-	else
-		imandreel_gl.bindFramebuffer(target,null);
-
-}
-
-function myglBindRenderbuffer(sp)
-{
-    var target = heap32[sp >> 2]; sp += 4;
-    var renderbuffer_id = heap32[sp >> 2]; sp += 4;
-
-    var renderbuffer = array_ids_ogl[renderbuffer_id];
-
-    imandreel_gl.bindRenderbuffer(target,renderbuffer);
-
-}
-
-
-function myglRenderbufferStorage(sp) {
-    var target = heap32[sp >> 2]; sp += 4;
-    var internalformat = heap32[sp >> 2]; sp += 4;
-    var witdth = heap32[sp >> 2]; sp += 4;
-    var height = heap32[sp >> 2]; sp += 4;
-
-    imandreel_gl.renderbufferStorage(target, internalformat, witdth, height);
-
-}
-
-function myglFramebufferRenderbuffer (sp)
-{
-  var target = heap32[sp>>2];sp+=4;
-  var attachment = heap32[sp>>2];sp+=4;
-  var renderbuffertarget = heap32[sp>>2];sp+=4;
-  var renderbuffer_id = heap32[sp>>2];sp+=4;
-
-    var renderbuffer = array_ids_ogl[renderbuffer_id];
-
-    imandreel_gl.framebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);
-
-}
-
-function myglFramebufferTexture2D (sp)
-{
-  var target = heap32[sp>>2];sp+=4;
-  var attachment = heap32[sp>>2];sp+=4;
-  var textarget = heap32[sp>>2];sp+=4;
-  var texture_id = heap32[sp>>2];sp+=4;
-  var level = heap32[sp>>2];sp+=4;
-
-  var texture = array_ids_ogl[texture_id];
-
-  imandreel_gl.framebufferTexture2D(target, attachment, textarget, texture, level);
-
-
-}
-
-function myglTexImage2D(sp)
- {
-  var target = heap32[sp>>2];sp+=4;
-  var level = heap32[sp>>2];sp+=4;
-  var internalFormat = heap32[sp>>2];sp+=4;
-  var width = heap32[sp>>2];sp+=4;
-  var height = heap32[sp>>2];sp+=4;
-  var border = heap32[sp>>2];sp+=4;
-  var format = heap32[sp>>2];sp+=4;
-  var type = heap32[sp>>2];sp+=4;
-  var data = heap32[sp>>2];sp+=4;
-
-  if (level>0 && target==imandreel_gl.TEXTURE_2D)
-	return;
-
-   if (data == 0)
-  {
-	//imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, null);
-	var buffer;
-	var bufferView;
-
-	if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
-    {
-		buffer = new ArrayBuffer(width*height*2);
-		bufferView = new Uint16Array(buffer);
-	}
-	else
-	{
-		var size;
-		if (format == imandreel_gl.LUMINANCE)
-			size = width*height;
-		else if (format == imandreel_gl.RGB)
-			size = width*height*3;
-		else if (format == imandreel_gl.RGBA)
-			size = width*height*4;
-		else if (format == imandreel_gl.ALPHA)
-			size = width*height;
-		else if (format == imandreel_gl.LUMINANCE_ALPHA)
-			size = width*height*2;
-
-		buffer = new ArrayBuffer(size);
-		bufferView = new Uint8Array(buffer);
-	}
-
-	imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, bufferView);
-	return;
-  }
-
-
-  	var bufferView;
-   if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
-   {
-		bufferView = new Uint16Array(heap,data,width*height);
-	}
-	else if (type == imandreel_gl.UNSIGNED_BYTE)
-	{
-		if (format == imandreel_gl.LUMINANCE)
-			bufferView = new Uint8Array(heap,data,width*height);
-		else if (format == imandreel_gl.RGB)
-			bufferView = new Uint8Array(heap,data,width*height*3);
-		else if (format == imandreel_gl.RGBA)
-			bufferView = new Uint8Array(heap,data,width*height*4);
-		else if (format == imandreel_gl.ALPHA)
-			bufferView = new Uint8Array(heap,data,width*height);
-		else if (format == imandreel_gl.LUMINANCE_ALPHA)
-			bufferView = new Uint8Array(heap,data,width*height*2);
-		else
-		{
-			dump('format unknown ' + format + '\n');
-			assert(false);
-		}
-	}
-	else
-	{
-	dump('type unknown ' + type + '\n');
-		assert(false);
-	}
-
-  imandreel_gl.texImage2D(target, level, internalFormat, width, height, border, format, type, bufferView);
-  if ((width&(width-1))==0 && (height&(height-1))==0)
-  {
-    if (target==imandreel_gl.TEXTURE_2D)
-	imandreel_gl.generateMipmap(target);
-}
- }
-  function myglStencilFunc(sp)
-  {
-  var func = heap32[sp>>2];sp+=4;
-  var ref = heap32[sp>>2];sp+=4;
-  var mask = heap32[sp>>2];sp+=4;
-
-  imandreel_gl.stencilFunc(func, ref, mask);
-  }
-
-  function myglStencilFuncSeparate(sp)
-  {
-  var face = heap32[sp>>2];sp+=4;
-  var func = heap32[sp>>2];sp+=4;
-  var ref = heap32[sp>>2];sp+=4;
-  var mask = heap32[sp>>2];sp+=4;
-
-  imandreel_gl.stencilFuncSeparate(face,func,ref,mask);
-  }
-
-  function myglStencilMaskSeparate(sp)
-  {
-  var face = heap32[sp>>2];sp+=4;
-   var mask = heap32[sp>>2];sp+=4;
-
-   imandreel_gl.stencilMaskSeparate(face,mask);
-  }
-
-  function myglStencilMask(sp)
-  {
-   var mask = heap32[sp>>2];sp+=4;
-
-   imandreel_gl.stencilMask(mask);
-  }
-  function myglStencilOp (sp)
-  {
-   var fail = heap32[sp>>2];sp+=4;
-  var zfail = heap32[sp>>2];sp+=4;
-   var zpass = heap32[sp>>2];sp+=4;
-
-  imandreel_gl.stencilOp(fail, zfail, zpass);
-  }
-
-  function myglStencilOpSeparate (sp)
-  {
-  var face = heap32[sp>>2];sp+=4;
-   var fail = heap32[sp>>2];sp+=4;
-  var zfail = heap32[sp>>2];sp+=4;
-   var zpass = heap32[sp>>2];sp+=4;
-
-  imandreel_gl.stencilOpSeparate(face, fail, zfail, zpass);
-  }
-
- function myglTexSubImage2D(sp)
- {
-  var target = heap32[sp>>2];sp+=4;
-  var level = heap32[sp>>2];sp+=4;
-  var xoffset = heap32[sp>>2];sp+=4;
-  var yoffset = heap32[sp>>2];sp+=4;
-  var width = heap32[sp>>2];sp+=4;
-  var height = heap32[sp>>2];sp+=4;
-  var format = heap32[sp>>2];sp+=4;
-  var type = heap32[sp>>2];sp+=4;
-  var data = heap32[sp>>2];sp+=4;
-
-
-
-  	var bufferView;
-   if (type == imandreel_gl.UNSIGNED_SHORT_5_6_5 || type == imandreel_gl.UNSIGNED_SHORT_4_4_4_4 || type == imandreel_gl.UNSIGNED_SHORT_5_5_5_1)
-   {
-		bufferView = new Uint16Array(heap,data,width*height);
-	}
-	else if (type == imandreel_gl.UNSIGNED_BYTE)
-	{
-		if (format == imandreel_gl.LUMINANCE)
-			bufferView = new Uint8Array(heap,data,width*height);
-		else if (format == imandreel_gl.RGB)
-			bufferView = new Uint8Array(heap,data,width*height*3);
-		else if (format == imandreel_gl.RGBA)
-			bufferView = new Uint8Array(heap,data,width*height*4);
-		else if (format == imandreel_gl.ALPHA)
-			bufferView = new Uint8Array(heap,data,width*height);
-	}
-
-  imandreel_gl.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, bufferView);
- }
-
-
-  function myglCreateBuffer(sp)
-{
-	var id = myglNewSlot();
-	array_ids_ogl[id] = imandreel_gl.createBuffer();
-
-	r_g0 = id;
-}
-
-var glBufferDataArray = [];
-
-function myglBufferData(sp)
-{
-	var target = heapU32[sp>>2]; sp+=4;
-	var size = heapU32[sp>>2]; sp+=4;
-	var data = heapU32[sp>>2]; sp+=4;
-	var usage = heapU32[sp>>2]; sp+=4;
-
-	if (data == 0)
-		imandreel_gl.bufferData(target, size, usage);
-	else
-	{
-		if (usage == imandreel_gl.STATIC_DRAW || true)
-		{
-			var buffer_data = new Int8Array(heap, data, size);
-			imandreel_gl.bufferData(target, buffer_data, usage);
-		}
-		else
-		{
-			var new_size = size/4;
-			var buffer_data = glBufferDataArray[new_size];
-
-			if (buffer_data == null)
-			{
-				buffer_data =  new Int32Array(new_size);
-				glBufferDataArray[new_size] = buffer_data;
-			}
-
-			var new_data = data>>2;
-
-			for ( var i = 0 ; i < new_size ; ++i )
-			{
-				buffer_data[i] = heap32[new_data+i];
-			}
-
-			imandreel_gl.bufferData(target, buffer_data, usage);
-		}
-	}
-}
-
-function myglBufferSubData(sp)
-{
-	var target = heapU32[sp>>2]; sp+=4;
-	var offset = heapU32[sp>>2]; sp+=4;
-	var size = heapU32[sp>>2]; sp+=4;
-	var data = heapU32[sp>>2]; sp+=4;
-
-
-	var buffer_data = new Int8Array(heap, data, size);
-	imandreel_gl.bufferSubData(target, offset, buffer_data);
-
-//	dump('buffer sub data ' + offset + ' ' + size + ' ' + data + '\n')
-
-}
-
-
-function myglBindBuffer(sp)
-{
-	var target = heapU32[sp>>2]; sp+=4;
-	var id = heapU32[sp>>2]; sp+=4;
-
-	imandreel_gl.bindBuffer(target, array_ids_ogl[id]);
-}
-
-
-function myglUseProgram(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-
-	g_current_program_id = program_id;
-
-	imandreel_gl.useProgram(array_ids_ogl[program_id]);
-
-}
-
-function myglDisableVertexAttribArray(sp)
-{
-	var idx = heapU32[sp>>2];sp+=4;
-	imandreel_gl.disableVertexAttribArray(idx);
-}
-function myglEnableVertexAttribArray(sp)
-{
-	var idx = heapU32[sp>>2];sp+=4;
-	imandreel_gl.enableVertexAttribArray(idx);
-}
-
-function myglVertexAttribPointer(sp)
-{
-	var idx = heapU32[sp>>2];sp+=4;
-	var size = heapU32[sp>>2];sp+=4;
-	var type = heapU32[sp>>2];sp+=4;
-	var normalized = heapU32[sp>>2];sp+=4;
-	var stride = heapU32[sp>>2];sp+=4;
-	var ptr = heapU32[sp>>2];sp+=4;
-
-	//dump(idx + ' ' + size + ' ' + type + ' ' + normalized + ' ' + stride + ' ' + ptr + '\n');
-
-
-	imandreel_gl.vertexAttribPointer(idx, size, type, normalized, stride, ptr);
-}
-
-function myglPolygonOffset(sp)
-{
-	var factor = heapFloat[sp>>2]; sp+=4;
-	var units = heapFloat[sp>>2]; sp+=4;
-	imandreel_gl.polygonOffset(factor, units);
-}
-
-function myglEnable(sp)
- {
-	var value = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.enable(value);
-  }
-
-function myglDisable(sp)
- {
-	var value = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.disable(value);
-  }
-
-  function myglDepthFunc(sp)
-  {
-	var func = heapU32[sp>>2];sp+=4;
-
-	imandreel_gl.depthFunc(func);
-
-  }
-
-  function myglGenerateMipmap(sp)
-  {
-	var texture_type = heap32[sp>>2];sp+=4;
-	imandreel_gl.generateMipmap(texture_type);
-  }
-
-  function myglPixelStorei (sp)
-  {
-	var pname = heap32[sp>>2];sp+=4;
-	var param = heap32[sp>>2];sp+=4;
-	imandreel_gl.pixelStorei(pname,param);
-  }
-
-
-  function myglBindTexture(sp)
-  {
-  var texture_type = heap32[sp>>2];sp+=4;
-  var texture_id = heap32[sp>>2];sp+=4;
-
-if (texture_id == 0)
-{
-	imandreel_gl.bindTexture(texture_type, null);
-}
-else
-{
-	var tex = array_ids_ogl[texture_id];
-	imandreel_gl.bindTexture(texture_type, tex);
-	}
-
-  }
-
-  function myglActiveTexture(sp)
-{
-	var param = heapU32[sp>>2];sp+=4;
-	imandreel_gl.activeTexture(param);
-}
-
-function myglCompileShader(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-
-	var shader = array_ids_ogl[id];
-
-	imandreel_gl.compileShader(shader);
-}
-
-function myglGetUniformLocation(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var string = get_string_from_ptr(ptr_string);
-	var program = array_ids_ogl[program_id];
-	var result = imandreel_gl.getUniformLocation(program, string);
-
-	if (result != null)
-	{
-		program.array_uniform_locations[program.uniform_locations_current_id] = result;
-		r_g0 = program.uniform_locations_current_id;
-		program.uniform_locations_current_id++;
-	}
-	else
-		r_g0 = -1;
-}
-
-function myglIsEnabled(sp)
-{
-	var cap = heap32[sp>>2];sp+=4;
-
-	r_g0 = imandreel_gl.isEnabled(cap);
-}
-
-
-function myglUniform1i(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var value = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform1i(uniform_value, value);
-}
-
-function myglUniform2i(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heap32[sp>>2];sp+=4;
-	var y = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform2i(uniform_value, x,y);
-}
-
-function myglUniform3i(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heap32[sp>>2];sp+=4;
-	var y = heap32[sp>>2];sp+=4;
-	var z = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform3i(uniform_value, x,y,z);
-}
-
-function myglUniform4i(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heap32[sp>>2];sp+=4;
-	var y = heap32[sp>>2];sp+=4;
-	var z = heap32[sp>>2];sp+=4;
-	var w = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform4i(uniform_value, x,y,z,w);
-}
-
-function myglUniform1f(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var value = heapFloat[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform1f(uniform_value, value);
-}
-
-function myglUniform3f(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-	var z = heapFloat[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform3f(uniform_value, x,y,z);
-}
-
-function myglUniform2f(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform2f(uniform_value, x,y);
-}
-
-
-function myglUniform4f(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-	var z = heapFloat[sp>>2];sp+=4;
-	var w = heapFloat[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-
-	imandreel_gl.uniform4f(uniform_value, x,y,z,w);
-}
-
-function myglUniform1fv(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count;
-	var bufferView = new Float32Array(new_count);
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heapFloat[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform1fv(uniform_value, bufferView);
-
-
-}
-
-function myglUniform1iv(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count;
-	var bufferView = new Int32Array(new_count);
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heap32[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform1iv(uniform_value, bufferView);
-}
-
-function myglUniform2iv(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count*2;
-	var bufferView = new Int32Array(new_count);
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heap32[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform2iv(uniform_value, bufferView);
-}
-
-function myglUniform3iv(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count*3;
-	var bufferView = new Int32Array(new_count);
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heap32[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform3iv(uniform_value, bufferView);
-}
-
-function myglUniform4iv(sp)
-{
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count*4;
-	var bufferView = new Int32Array(new_count);
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heap32[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform4iv(uniform_value, bufferView);
-}
-
-
-
-function myglUniform3fv(sp)
-{
-	myglCreateUniformArrays();
-
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-	var new_data = data>>2;
-	var new_count = count*3;
-	var bufferView = uniformArrays3[count];
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heapFloat[new_data+i];
-	}
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform3fv(uniform_value, bufferView);
-}
-
-function myglUniform2fv(sp)
-{
-	myglCreateUniformArrays();
-
-    var index = heap32[sp >> 2]; sp += 4;
-    var count = heap32[sp >> 2]; sp += 4;
-    var data = heap32[sp >> 2]; sp += 4;
-
-	var new_data = data>>2;
-	var new_count = count*2;
-	var bufferView = uniformArrays2[count];
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heapFloat[new_data+i];
-	}
-
-
-	var program = array_ids_ogl[g_current_program_id];
-    var uniform_value = program.array_uniform_locations[index];
-    imandreel_gl.uniform2fv(uniform_value, bufferView);
-}
-
-
-function myglUniform4fv(sp)
-{
-	myglCreateUniformArrays();
-
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var data = heap32[sp>>2];sp+=4;
-
-
-	var new_data = data>>2;
-	var new_count = count*4;
-	var bufferView = uniformArrays4[count];
-
-	for ( var i = 0 ; i < new_count ; ++i )
-	{
-		bufferView[i] = heapFloat[new_data+i];
-	}
-
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-	imandreel_gl.uniform4fv(uniform_value, bufferView);
-}
-
-
-function myglUniformMatrix4fv(sp)
-{
-	myglCreateUniformArrays();
-
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var transpose = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-
-	//var buffer_data = new Float32Array(heap, ptr, count*16);
-	for ( var i = 0 ; i < count*16 ; ++i )
-	{
-		uniformArrays4[count*4][i] = heapFloat[(ptr>>2)+i];
-	}
-
-	//imandreel_gl.uniformMatrix4fv(uniform_value, transpose, buffer_data);
-	//imandreel_gl.uniformMatrix4fv(uniform_value, transpose, heapFloat.subarray(ptr/4,(ptr/4)+(count*16)));
-	imandreel_gl.uniformMatrix4fv(uniform_value, transpose, uniformArrays4[count*4]);
-}
-
-function myglUniformMatrix3fv(sp)
-{
-	myglCreateUniformArrays();
-
-	var index = heap32[sp>>2];sp+=4;
-	var count = heap32[sp>>2];sp+=4;
-	var transpose = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[g_current_program_id];
-	var uniform_value = program.array_uniform_locations[index];
-
-	//var buffer_data = new Float32Array(heap, ptr, count*9);
-	for ( var i = 0 ; i < count*9 ; ++i )
-	{
-		uniformArrays3[count*3][i] = heapFloat[(ptr>>2)+i];
-	}
-
-	//imandreel_gl.uniformMatrix3fv(uniform_value, transpose, buffer_data);
-	//imandreel_gl.uniformMatrix3fv(uniform_value, transpose, heapFloat.subarray(ptr/4,(ptr/4)+(count*9)));
-	imandreel_gl.uniformMatrix3fv(uniform_value, transpose, uniformArrays3[count*3]);
-}
-
-
-
-function myglValidateProgram(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.validateProgram(array_ids_ogl[program_id]);
-}
-
-function myglGetAttribLocation(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var string = get_string_from_ptr(ptr_string);
-	var result = imandreel_gl.getAttribLocation(array_ids_ogl[program_id], string);
-
-	r_g0 = result;
-}
-
-function myglGetProgramInfoLogLength(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-
-	var info_log = imandreel_gl.getProgramInfoLog(array_ids_ogl[program_id]);
-
-	if (info_log)
-		r_g0 = info_log.length+1;
-	else
-		r_g0 = 0;
-}
-
-
-function myglGetProgramInfoLog(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var info_log = imandreel_gl.getProgramInfoLog(array_ids_ogl[program_id]);
-
-	fill_ptr_from_string(ptr_string, info_log);
-}
-
-function myglGetShaderInfoLogLength(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-
-	var info_log = imandreel_gl.getShaderInfoLog(array_ids_ogl[program_id]);
-
-	if (info_log)
-		r_g0 = info_log.length+1;
-	else
-		r_g0 = 0;
-}
-
-function myglGetShaderInfoLog(sp)
-{
-	var program_id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-
-	var info_log = imandreel_gl.getShaderInfoLog(array_ids_ogl[program_id]);
-
-	fill_ptr_from_string(ptr_string, info_log);
-}
-
-function myglViewport(sp) {
-    var x = heap32[sp >> 2]; sp += 4;
-    var y = heap32[sp >> 2]; sp += 4;
-    var width = heap32[sp >> 2]; sp += 4;
-    var height = heap32[sp >> 2]; sp += 4;
-
-    imandreel_gl.viewport(x,y,width,height);
-
-}
-
-function myglScissor(sp)
-{
-    var x = heap32[sp >> 2]; sp += 4;
-    var y = heap32[sp >> 2]; sp += 4;
-    var width = heap32[sp >> 2]; sp += 4;
-    var height = heap32[sp >> 2]; sp += 4;
-
-    imandreel_gl.scissor(x,y,width,height);
-}
-
-
-
-function myglClearColor(sp)
-{
-  var r = heapFloat[sp>>2];sp+=4;
-  var g = heapFloat[sp>>2];sp+=4;
-  var b = heapFloat[sp>>2];sp+=4;
-  var a = heapFloat[sp>>2];sp+=4;
-
-  imandreel_gl.clearColor(r,g,b,a);
-
-
-}
-
-function myglClearStencil(sp)
-{
-	var stencil = heap32[sp>>2];sp+=4;
-	imandreel_gl.clearStencil(stencil);
-}
-
-
-function myglClearDepthf(sp)
-{
-	var depth = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.clearDepth(depth);
-}
-
-function myglClear(sp)
-  {
-  var mask = heap32[sp>>2];sp+=4;
-
-
-  //dump('clear ' + mask + '\n');
-	if (mandreel_draw_enable)
-		imandreel_gl.clear(mask);
-  }
-
-  function myglGetError(sp)
-  {
-//	r_g0 = imandreel_gl.getError();
-	r_g0 = 0;
-  }
-
-  function myglGetProgramParameter(sp)
-  {
-	var program_id = heap32[sp>>2];sp+=4;
-	var pname = heap32[sp>>2];sp+=4;
-
-	r_g0 = imandreel_gl.getProgramParameter(array_ids_ogl[program_id], pname);
-  }
-
-  function myglGetActiveAttrib (sp)
-  {
-	var program_id = heap32[sp>>2];sp+=4;
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-
-	 var result = imandreel_gl.getActiveAttrib(array_ids_ogl[program_id], index);
-
-	 if (result != null)
-	 {
-		heap32[(ptr)>>2] = result.size;
-		heap32[(ptr+4)>>2] = result.type;
-		fill_ptr_from_string(ptr+8, result.name);
-		r_g0 = 0;
-	}
-	else
-	   r_g0 = 1;
-  }
-
-    function myglGetActiveUniform (sp)
-  {
-	var program_id = heap32[sp>>2];sp+=4;
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-
-	 var result = imandreel_gl.getActiveUniform(array_ids_ogl[program_id], index);
-
-	 if (result != null)
-	 {
-		heap32[(ptr)>>2] = result.size;
-		heap32[(ptr+4)>>2] = result.type;
-		fill_ptr_from_string(ptr+8, result.name);
-		r_g0 = 0;
-	}
-	else
-	   r_g0 = 1;
-  }
-
-  function myglTexParameterf (sp)
-  {
-	var target = heap32[sp>>2];sp+=4;
-	var pname = heap32[sp>>2];sp+=4;
-	var value = heapFloat[sp>>2];sp+=4;
-
-	imandreel_gl.texParameterf(target,pname,value);
-}
-
-function myglTexParameteri (sp)
-  {
-	var target = heap32[sp>>2];sp+=4;
-	var pname = heap32[sp>>2];sp+=4;
-	var value = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.texParameteri(target,pname,value);
-}
-
-function myglCullFace (sp)
- {
-	var mode = heap32[sp>>2];sp+=4;
-	imandreel_gl.cullFace(mode);
- }
-
- function myglDepthMask (sp)
- {
-	var flag = heap32[sp>>2];sp+=4;
-	imandreel_gl.depthMask(flag);
- }
-
- function myglDepthRangef (sp)
- {
-	var zNear = heapFloat[sp>>2];sp+=4;
-	var zFar = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.depthRange(zNear, zFar);
- }
-
-function myglFrontFace (sp)
- {
-	var mode = heap32[sp>>2];sp+=4;
-	imandreel_gl.frontFace(mode);
- }
-
- function myglBlendFunc (sp)
- {
-	var sfactor = heap32[sp>>2];sp+=4;
-	var dfactor = heap32[sp>>2];sp+=4;
-	imandreel_gl.blendFunc(sfactor,dfactor);
- }
-
- function myglBlendColor(sp)
- {
-	var red = heapFloat[sp>>2];sp+=4;
-	var green = heapFloat[sp>>2];sp+=4;
-	var blue = heapFloat[sp>>2];sp+=4;
-	var alpha = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.blendColor(red,green,blue,alpha);
- }
-
- function myglBlendEquation(sp)
- {
-	var mode = heap32[sp>>2];sp+=4;
-	imandreel_gl.blendEquation(mode);
- }
-
- function myglBlendEquationSeparate(sp)
- {
-	var modeRGB = heap32[sp>>2];sp+=4;
-	var modeAlpha = heap32[sp>>2];sp+=4;
-	imandreel_gl.blendEquationSeparate(modeRGB,modeAlpha);
- }
-
- function myglBlendFuncSeparate(sp)
- {
-	var srcRGB = heap32[sp>>2];sp+=4;
-	var dstRGB = heap32[sp>>2];sp+=4;
-	var srcAlpha = heap32[sp>>2];sp+=4;
-	var dstAlpha = heap32[sp>>2];sp+=4;
-
-	imandreel_gl.blendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha);
- }
-
-
- function myglColorMask (sp)
- {
-	var red = heap32[sp>>2];sp+=4;
-	var green = heap32[sp>>2];sp+=4;
-	var blue = heap32[sp>>2];sp+=4;
-	var alpha = heap32[sp>>2];sp+=4;
-	imandreel_gl.colorMask(red,green,blue,alpha);
- }
-
- function removeByElement(arrayName,arrayElement)
- {
-    for(var i=0; i<arrayName.length;i++ )
-     {
-        if(arrayName[i]==arrayElement)
-		{
-            arrayName.splice(i,1);
-			return;
-		}
-      }
-  }
-
-
- function mygetParameter(sp)
- {
-	var pname = heap32[sp>>2];sp+=4;
-	r_g0 = imandreel_gl.getParameter(pname);
- }
-
-
- function mygetProgramParameter(sp)
- {
- 	var program_id = heap32[sp>>2];sp+=4;
-	var pname = heap32[sp>>2];sp+=4;
-	r_g0 = imandreel_gl.getProgramParameter(array_ids_ogl[program_id], pname);
- }
-
- function mygetShaderParameter(sp)
- {
- 	var shader_id = heap32[sp>>2];sp+=4;
-	var pname = heap32[sp>>2];sp+=4;
-	r_g0 = imandreel_gl.getShaderParameter(array_ids_ogl[shader_id], pname);
- }
-
- function myglVertexAttrib1f(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.vertexAttrib1f(index,x);
- }
-
-  function myglVertexAttrib2f(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.vertexAttrib2f(index,x,y);
- }
-
-  function myglVertexAttrib3f(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-	var z = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.vertexAttrib3f(index,x,y,z);
- }
-
-  function myglVertexAttrib4f(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var x = heapFloat[sp>>2];sp+=4;
-	var y = heapFloat[sp>>2];sp+=4;
-	var z = heapFloat[sp>>2];sp+=4;
-	var w = heapFloat[sp>>2];sp+=4;
-	imandreel_gl.vertexAttrib4f(index,x,y,z,w);
- }
-
- function myglVertexAttrib1fv(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-	var x = heap32[ptr>>2];ptr+=4;
-	imandreel_gl.vertexAttrib1f(index,x);
- }
-
- function myglVertexAttrib2fv(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-	var x = heap32[ptr>>2];ptr+=4;
-	var y = heap32[ptr>>2];ptr+=4;
-
-	imandreel_gl.vertexAttrib2f(index,x,y);
- }
-
- function myglVertexAttrib3fv(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-	var x = heap32[ptr>>2];ptr+=4;
-	var y = heap32[ptr>>2];ptr+=4;
-	var z = heap32[ptr>>2];ptr+=4;
-
-	imandreel_gl.vertexAttrib3f(index,x,y,z);
- }
-
- function myglVertexAttrib4fv(sp)
- {
-	var index = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-	var x = heap32[ptr>>2];ptr+=4;
-	var y = heap32[ptr>>2];ptr+=4;
-	var z = heap32[ptr>>2];ptr+=4;
-	var w = heap32[ptr>>2];ptr+=4;
-
-	imandreel_gl.vertexAttrib4f(index,x,y,z,w);
- }
-
-
- function myglDeleteTexture (sp)
- {
-
-	var texture_id = heap32[sp>>2];sp+=4;
-
-	var texture = array_ids_ogl[texture_id];
-
-	imandreel_gl.deleteTexture(texture);
-
-	array_ids_ogl[texture_id] = null;
-
-	myglFreeSlot(texture_id);
- }
-
- function myglDeleteBuffer (sp)
- {
-
-	var buffer_id = heap32[sp>>2];sp+=4;
-
-	var buffer = array_ids_ogl[buffer_id];
-
-	imandreel_gl.deleteBuffer(buffer);
-
-	array_ids_ogl[buffer_id] = null;
-
-	myglFreeSlot(buffer_id);
- }
-
- function myglDeleteFrameBuffer (sp)
- {
-	var framebuffer_id = heap32[sp>>2];sp+=4;
-
-	var framebuffer = array_ids_ogl[framebuffer_id];
-
-	imandreel_gl.deleteFramebuffer(framebuffer);
-
-	array_ids_ogl[framebuffer_id] = null;
-
-	myglFreeSlot(framebuffer_id);
- }
-
-
- function myglDeleteProgram (sp)
- {
-	var program_id = heap32[sp>>2];sp+=4;
-
-	var program = array_ids_ogl[program_id];
-
-	imandreel_gl.deleteProgram(program);
-
-	array_ids_ogl[program_id] = null;
-
-	myglFreeSlot(program_id);
- }
-
- function myglDeleteRenderBuffer (sp)
- {
-	var renderbuffer_id = heap32[sp>>2];sp+=4;
-
-	var renderbuffer = array_ids_ogl[renderbuffer_id];
-
-	imandreel_gl.deleteRenderbuffer(renderbuffer);
-
-	array_ids_ogl[renderbuffer_id] = null;
-
-	myglFreeSlot(renderbuffer_id);
- }
-
- function myglDeleteShader (sp)
- {
-	var shader_id = heap32[sp>>2];sp+=4;
-
-	var shader = array_ids_ogl[shader_id];
-
-	imandreel_gl.deleteShader(shader);
-
-	array_ids_ogl[shader_id] = null;
-
-	myglFreeSlot(shader_id);
- }
-
- function myglInit(sp)
- {
-
-	for (var i=0;i<max_ogl_id;++i)
-	{
-		array_ids_ogl_enable.push(i+1);
-	}
- }
-
- function myglReadPixels(sp)
- {
-  var x = heap32[sp>>2];sp+=4;
-  var y = heap32[sp>>2];sp+=4;
-  var width = heap32[sp>>2];sp+=4;
-  var height = heap32[sp>>2];sp+=4;
-  var format = heap32[sp>>2];sp+=4;
-  var type = heap32[sp>>2];sp+=4;
-  var pixels = heap32[sp>>2];sp+=4;
-
-	var bufferView = new Uint8Array(heap,pixels,width*height*4);
-  imandreel_gl.readPixels(x,y,width,height,format,type,bufferView);
-}
-
-function mandreel_internal_DrawSprite(sp)
-{
-	if ( imandreel_ctx_canvas == null )
-	{
-		console.log("Mandreel_2D_DrawSprite error: canvas context is null");
-		return;
-	}
-
-	var hw_id = heap32[sp>>2]; sp+=4;
-	var u0 = heapFloat[sp>>2]; sp+=4;
-	var u1 = heapFloat[sp>>2]; sp+=4;
-	var v0 = heapFloat[sp>>2]; sp+=4;
-	var v1 = heapFloat[sp>>2]; sp+=4;
-	//var x = heapFloat[sp>>2]; sp+=4;
-	//var y = heapFloat[sp>>2]; sp+=4;
-	var sx = heapFloat[sp>>2]; sp+=4;
-	var sy = heapFloat[sp>>2]; sp+=4;
-	//var rot = heapFloat[sp>>2]; sp+=4;
-	var m11 = heapFloat[sp>>2]; sp+=4;
-	var m12 = heapFloat[sp>>2]; sp+=4;
-	var m21 = heapFloat[sp>>2]; sp+=4;
-	var m22 = heapFloat[sp>>2]; sp+=4;
-	var tx = heapFloat[sp>>2]; sp+=4;
-	var ty = heapFloat[sp>>2]; sp+=4;
-	var color = heap32[sp>>2]; sp+=4;
-
-	//ctx_canvas.fillStyle="#FF0000";
-	//ctx_canvas.fillRect(tx,ty,sx,sy);
-	var texture = array_ids_ogl[hw_id];
-
-	if ( texture == null )
-	{
-		console.log("Mandreel_2D_DrawSprite error: texture invalid ("+hw_id+") or loading yet...");
-		return;
-	}
-
-	var width = (u1-u0)*texture.width;
-	var height = (v1-v0)*texture.height;
-
-	if (width == 0)
-		return;
-	if (height == 0)
-		return;
-
-	var x_offset = u0*texture.width;
-	var y_offset = v0*texture.height;
-
-	//dump(x_offset + ' ' + y_offset + ' ' + texture.width + ' ' + texture.height + ' ' + x + ' ' +y + ' ' + width + ' ' + height + '\n');
-
-	x_offset = x_offset % texture.width;
-	y_offset = y_offset % texture.height;
-
-	var scale_x, scale_y;
-	if (sx<0)
-		scale_x = -1;
-	else
-		scale_x = 1;
-	if (sy<0)
-		scale_y = -1;
-	else
-		scale_y = 1;
-
-	var simple_draw = false;//scale_x == 1 && scale_y == 1 && rot == 0;
-	var x_pos = (0.5*sx + tx/* + 240*/);
-	var y_pos = (/*320*/ + ((0.5*sy + ty) /*+ 160*/));
-	var new_sx = sx;
-	var new_sy = sy;
-
-	imandreel_ctx_canvas.globalAlpha = (color>>>24)/255;
-
-	if (!simple_draw)
-	{
-		imandreel_ctx_canvas.save()
-		/*ctx_canvas.translate(x_pos + new_sx/2, y_pos + new_sy/2)
-		ctx_canvas.rotate(-rot*Math.PI/180);
-		ctx_canvas.scale(scale_x, scale_y);
-		ctx_canvas.translate(-(x_pos + new_sx/2), -(y_pos + new_sy/2))*/
-		imandreel_ctx_canvas.setTransform(m11,m12,m21,m22,tx,ty);
-	}
-
-	/*if (x_offset<0 || y_offset<0 || (x_offset+width)>texture.width || (y_offset+height)>texture.height)
-	{
-		dump(x_offset + ' ' + y_offset + ' ' + texture.width + ' ' + texture.height + ' ' + x + ' ' +y + ' ' + width + ' ' + height + '\n');
-	}*/
-
-	if (new_sx<0)
-	{
-		x_pos += new_sx;
-		new_sx = -new_sx;
-	}
-	if (new_sy<0)
-	{
-		y_pos += new_sy;
-		new_sy = -new_sy;
-	}
-
-	//ctx_canvas.drawImage(texture,x_offset,y_offset, width, height, x_pos, y_pos , new_sx, new_sy);
-	imandreel_ctx_canvas.drawImage(texture,x_offset,y_offset, width, height, 0,0, 1,1);
-
-	if (!simple_draw)
-		imandreel_ctx_canvas.restore()
-}
-
-function mandreel_internal_UpdateTexture(sp)
-{
-	if ( imandreel_ctx_canvas == null )
-	{
-		console.log("Mandreel_2D_UpdateTexture error: canvas context is null");
-		return;
-	}
-
-	var hw_id = heap32[sp>>2]; sp+=4;
-	var dataptr = heap32[sp>>2]; sp+=4;
-	var width = heap32[sp>>2]; sp+=4;
-	var height = heap32[sp>>2]; sp+=4;
-
-	var imageData = imandreel_ctx_canvas.getImageData(0,0,width,height);
-	var data = imageData.data;
-	for (var y = 0; y < (height*width*4); ++y)
-	{
-		data[y] = heapU8[dataptr + y];
-	}
-	imandreel_ctx_canvas.putImageData(imageData,0,0);
-
-	var dataurl = imandreel_ctx_canvas.canvas.toDataURL();
-
-	var image = new Image();
-	image.onerror = function()
-	{
-		dump('error updating texture '+hw_id+'\n');
-    }
-	image.onload = function()
-	{
-		//dump('texture '+hw_id+' updated\n'+'width '+image.width+' height '+image.height);
-		array_ids_ogl[hw_id] = image;
-	}
-	image.src = dataurl;
-}
-
-function mandreel_internal_WriteFramebuffer(sp)
-{
-	if ( imandreel_ctx_canvas == null )
-	{
-		console.log("Mandreel_2D_UpdateTexture error: canvas context is null");
-		return;
-	}
-
-	var dataptr = heap32[sp>>2]; sp+=4;
-	var width = heap32[sp>>2]; sp+=4;
-	var height = heap32[sp>>2]; sp+=4;
-
-	var imageData = imandreel_ctx_canvas.getImageData(0,0,width,height);
-	if ( imageData != null )
-	{
-		var data = imageData.data;
-		if ( data != null )
-		{
-			var size = (height*width*4);
-			if ( typeof imageData.data.set != "undefined" )
-			{
-				var sub = heapU8.subarray(dataptr,dataptr+size);
-				imageData.data.set(sub);
-			}
-			else
-			{
-				for (var y = 0; y < size; ++y)
-				{
-					data[y] = heapU8[dataptr + y];
-				}
-			}
-
-			imandreel_ctx_canvas.putImageData(imageData,0,0);
-		}
-		else
-		{
-			dump("WriteFramebuffer canvas data null");
-		}
-	}
-	else
-	{
-		dump("WriteFramebuffer canvas imageData null");
-	}
-}
-var mandreel_audio_init = null_mandreel_audio;
-var mandreel_audio_end = null_mandreel_audio;
-var mandreel_audio_update = null_mandreel_audio;
-var mandreel_audio_createBuffer = null_mandreel_audio;
-var mandreel_audio_playChannel = null_mandreel_audio;
-var mandreel_audio_stopChannel = null_mandreel_audio;
-var mandreel_audio_setChannelVolume = null_mandreel_audio;
-var mandreel_audio_setChannelPan = null_mandreel_audio;
-var mandreel_audio_setChannelPitch = null_mandreel_audio;
-var mandreel_audio_playMusic = null_mandreel_audio;
-var mandreel_audio_stopMusic = null_mandreel_audio;
-var mandreel_audio_useMusicFunctions = _mandreel_audio_useMusicFunctions;
-var mandreel_audio_checkBuffersPending = null_mandreel_audio;
-var mandreel_audio_setMusicVol = null_mandreel_audio;
-
-var mandreel_audio_startedFunction = 0;
-
-var MandreelAudioDriver = "null";
-
-function mandreel_start_audio(audioServer, audioUrl,startedFunction)
-{
-	mandreel_audio_startedFunction = startedFunction;
-
-	// Check audio driver data availability
-	var webAudioDataAvailable = false;
-	var flashAudioDataAvailable = false;
-	var flashLiteAudioDataAvailable = false;
-	var audiotagsDataAvailable = false;
-	var FatLines = mandreelFatData.split('\n');
-	for ( var i=0;i<FatLines.length;++i )
-	{
-		var params = FatLines[i].split(',');
-		if ( params[0] == "audiodriver" )
-		{
-			var data = params[1];
-			data = data.replace('\r','');
-			if ( data == "webaudio" )
-				webAudioDataAvailable = true;
-			else if ( data == "flash" )
-				flashAudioDataAvailable = true;
-			else if ( data == "flashlite" )
-				flashLiteAudioDataAvailable = true;
-			else if ( data == "audiotag" )
-				audiotagsDataAvailable = true;
-		}
-	}
-
-
-	// Init audio driver
-	{
-		// webaudio
-		if ( webAudioDataAvailable && MandreelAudioDriver == "null" )
-		{
-			try	{ webAudioContext = new webkitAudioContext(); } catch(err) { webAudioContext = 0; }
-			if ( webAudioContext )
-			{
-				wa_MainAudioDriver();
-				MandreelAudioDriver = "webAudio";
-			}
-		}
-		// flash
-		if ( flashAudioDataAvailable && MandreelAudioDriver == "null" )
-		{
-			MandreelAudioDriver = "flash";
-			if ( audioServer == null )
-			{
-				audioServer = "";
-				audioUrl = "";
-			}
-			fl_MainAudioDriver(audioServer,audioUrl);
-		}
-		// flashlite
-		if ( flashLiteAudioDataAvailable && MandreelAudioDriver == "null" )
-		{
-			MandreelAudioDriver = "flashlite";
-			mandreel_flashaudio_lite = true;
-			fl_MainAudioDriver("","");
-		}
-		// audiotags
-		if ( audiotagsDataAvailable && MandreelAudioDriver == "null" )
-		{
-			MandreelAudioDriver = "audiotag";
-			at_MainAudioDriver();
-		}
-		// null
-		if ( MandreelAudioDriver == "null" )
-		{
-			null_MainAudioDriver();
-		}
-	}
-	dump("AudioDriver ("+MandreelAudioDriver+")");
-}
-
-function mandreel_audio_isLogEnabled(sp)
-{
-	r_g0 = 0;
-}
-
-function _mandreel_audio_useMusicFunctions(sp)
-{
-	r_g0 = 0;
-}
-
-function MandreelAudioStarted()
-{
-	setTimeout(mandreel_audio_startedFunction, 10);
-}
-
-
-function mandreel_audio_getAudioDriverName(sp)
-{
-	var name_ptr = heap32[sp>>2];sp+=4;
-	fill_ptr_from_string(name_ptr, MandreelAudioDriver);
-}
-var webAudioUseMusicFunctions = true;
-
-function wa_mandreel_audio_init(sp)
-{
-}
-
-function wa_mandreel_audio_end(sp)
-{
-}
-
-function wa_mandreel_audio_update(sp)
-{
-}
-
-function wa_mandreel_audio_checkBuffersPending(sp)
-{
-	r_g0 = wa_imp_mandreel_audio_checkBuffersPending();
-}
-
-function wa_mandreel_audio_createBuffer(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var maxChannels = heap32[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	wa_imp_mandreel_audio_createBuffer(fileName);
-
-	r_g0 = 0;
-}
-
-function wa_mandreel_audio_playChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-	var loop = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	wa_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch);
-	r_g0 = 0;
-}
-
-function wa_mandreel_audio_stopChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var index = heapFloat[sp>>2];sp+=4;
-	wa_imp_mandreel_audio_stopChannel(channel);
-}
-
-function wa_mandreel_audio_setChannelVolume(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-	wa_imp_mandreel_audio_setChannelVolume(channel,vol);
-}
-
-function wa_mandreel_audio_setChannelPan(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pan = heapFloat[sp>>2];sp+=4;
-	wa_imp_mandreel_audio_setChannelPan(channel,pan);
-}
-
-function wa_mandreel_audio_setChannelPitch(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	wa_imp_mandreel_audio_setChannelPitch(channel,pitch);
-}
-
-function wa_mandreel_audio_useMusicFunctions(sp)
-{
-	r_g0 = webAudioUseMusicFunctions ? 1 : 0;
-}
-
-function wa_mandreel_audio_playMusic(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	wa_imp_mandreel_audio_playMusic(fileName);
-}
-
-function wa_mandreel_audio_stopMusic(sp)
-{
-	wa_imp_mandreel_audio_stopMusic();
-}
-
-function wa_mandreel_audio_setMusicVol(sp)
-{
-	var vol = heapFloat[sp>>2];sp+=4;
-	wa_imp_mandreel_audio_setMusicVol(vol);
-}
-
-function wa_MainAudioDriver()
-{
-	mandreel_audio_init = wa_mandreel_audio_init;
-	mandreel_audio_end = wa_mandreel_audio_end;
-	mandreel_audio_update = wa_mandreel_audio_update;
-	mandreel_audio_createBuffer = wa_mandreel_audio_createBuffer;
-	mandreel_audio_playChannel = wa_mandreel_audio_playChannel;
-	mandreel_audio_stopChannel = wa_mandreel_audio_stopChannel;
-	mandreel_audio_setChannelVolume = wa_mandreel_audio_setChannelVolume;
-	mandreel_audio_setChannelPan = wa_mandreel_audio_setChannelPan;
-	mandreel_audio_setChannelPitch = wa_mandreel_audio_setChannelPitch;
-	mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
-	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
-	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
-	mandreel_audio_checkBuffersPending = wa_mandreel_audio_checkBuffersPending;
-	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
-
-	setTimeout("mandreel_webAudio_PreloadAssets()", 10);
-}
-
-
-var webAudioBuffers = new Array();
-var webAudioChannels = new Array(32);
-var webAudioGain = new Array(32);
-var webAudioContext = 0;
-
-
-function wa_initWebAudio()
-{
-	if ( preCreatedWebAudioContext != null )
-	{
-		webAudioContext = preCreatedWebAudioContext;
-	}
-	else
-	{
-		try	{ webAudioContext = new webkitAudioContext(); } catch(err) { webAudioContext = 0; }
-	}
-}
-
-function wa_imp_callfunction(params)
-{
-	if ( params[0] == "#MandreelAudio" )
-	{
-		if ( params[1] == "playChannel" )
-			wa_imp_mandreel_audio_playChannel(params[2],params[3],params[4],params[5],params[6],params[7]);
-		else if ( params[1] == "stopChannel" )
-			wa_imp_mandreel_audio_stopChannel(params[2]);
-		else if ( params[1] == "setChannelVol" )
-			wa_imp_mandreel_audio_setChannelVol(params[2],params[3]);
-		else if ( params[1] == "setChannelPan" )
-			wa_imp_mandreel_audio_setChannelPan(params[2],params[3]);
-		else if ( params[1] == "playMusic" )
-			wa_imp_mandreel_audio_playMusic(params[2]);
-		else if ( params[1] == "stopMusic" )
-			wa_imp_mandreel_audio_stopMusic(params[2]);
-		else if ( params[1] == "setMusicVol" )
-			wa_imp_mandreel_audio_setMusicVol(params[2]);
-
-		return true;
-	}
-	return false;
-}
-
-function wa_getFileNameNoExt(fileName)
-{
-	var fileNameNoExt = fileName.toLowerCase();
-	var indexDot = fileNameNoExt.lastIndexOf('.');
-	if ( indexDot != -1 )
-		fileNameNoExt = fileNameNoExt.substr(0,indexDot);
-	fileNameNoExt = fileNameNoExt.replace(/\\/g,"/");
-	if ( fileNameNoExt.length > 0 )
-	{
-		if ( fileNameNoExt.charAt(0) == "/" )
-		{
-			if (fileNameNoExt.length > 1 )
-				fileNameNoExt = fileNameNoExt.substr(1,fileNameNoExt.length-1);
-			else
-				fileNameNoExt = "";
-		}
-	}
-	return fileNameNoExt;
-}
-
-var wa_mandreel_cache_audio_files = false;
-var wa_mandreel_cache_audio_files_path = '';
-
-function mandreel_webAudio_reloadfile(fileName,callback)
-{
-	var fileNameNoExt = wa_getFileNameNoExt(fileName);
-	var url = wa_mandreel_cache_audio_files_path+fileNameNoExt+".ogg";
-	dump("webAudio: loading buffer ("+fileName+") url("+url+")");
-	var request = new XMLHttpRequest();
-	request.open("GET", url, true);
-	request.responseType = "arraybuffer";
-	request.onreadystatechange = function()
-	{
-		if (request.readyState == 4)
-		{
-
-			if (request.status == 404) callback(null);
-
-			callback(request.response);
-
-		}
-	}
-	request.send();
-}
-
-Mandreel_window.BlobBuilder = Mandreel_window.MozBlobBuilder || Mandreel_window.WebKitBlobBuilder || Mandreel_window.BlobBuilder;
-
-function mandreel_webaudio_saveFile(name, my_arrayBuffer)
-{
-	dump('mandreel_webaudio_saveFile ' + name);
-	g_mandreel_fs.root.getFile(name, {create: true}, function(fileEntry) {
-
-    // Create a FileWriter object for our FileEntry (log.txt).
-    fileEntry.createWriter(function(fileWriter) {
-
-      fileWriter.onwriteend = function(e) {
-        dump('Write completed.');
-      };
-
-      fileWriter.onerror = function(e) {
-        dump('Write failed: ' + e.toString());
-      };
-
-	  var bb = new Mandreel_window.BlobBuilder(); // Note: window.WebKitBlobBuilder in Chrome 12.
-      bb.append(my_arrayBuffer);
-      fileWriter.write(bb.getBlob('text/plain'));
-
-
-
-    }, function(e) { dump('error 1 mandreel_webaudio_saveFile ' + name);MandreelFsErrorHandler(e) });
-
-  }, function(e) { dump('error 2 mandreel_webaudio_saveFile ' + name);MandreelFsErrorHandler(e) });
-}
-
-function mandreel_webaudio_loadFile(name, callback, callback2)
-{
-	g_mandreel_fs.root.getFile(name, {}, function(fileEntry) {
-
-	fileEntry.file(function(file) {
-
-		var reader = new FileReader();
-
-
-       reader.onloadend = function(e) {
-
-	   dump('mandreel_fs_loadFile ' + name);
-	   if (this.result.byteLength)
-		callback(this.result);
-	   else
-	   callback2(this.result);
-
-       };
-
-
-	   	reader.readAsArrayBuffer(file);
-
-
-
-	}, function(e) { dump('error 1 webaudio_loadFile ' + name);MandreelFsErrorHandler(e) } );
-
-  }, function(e) { dump('error 2 webaudio_loadFile ' + name);MandreelFsErrorHandler(e) } );
-}
-
-
-function mandreel_webAudio_cacheFile(fileName, callback)
-{
-	if (!g_mandreel_fs)
-	{
-		mandreel_webAudio_reloadfile(fileName, callback);
-
-		return;
-	}
-	fileName = fileName.toLowerCase();
-
-	fileName = fileName.replace(/\\/g,"/");
-
-	if (fileName[0] == '/')
-		fileName = fileName.substring(1);
-
-	dump('chanka name ' + fileName);
-
-	g_mandreel_fs.root.getFile(fileName, {}, function(fileEntry) {
-
-	fileEntry.getMetadata(function(metaData){
-	var my_seconds = metaData.modificationTime.getTime()/1000;
-
-	if (g_mandreel_timestamp_fs>my_seconds)
-	{
-		dump('mandreel_webAudio_cacheFile1 ');
-		fileEntry.remove(function() {
-				mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );
-			}, function(e) { dump('error 1 mandreel_webAudio_cacheFile ' + fileName);MandreelFsErrorHandler(e); mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );});
-
-	}
-	else
-	{
-		//alert('mandreel_fscachefile2');
-		dump('mandreel_webAudio_cacheFile2');
-		mandreel_webaudio_loadFile(fileName, function(response) { callback(response);  } ,
-		function() {
-				mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); } );
-			}
-		);
-
-
-
-	}
-
-
-		}, function(e) { dump('error 2 mandreel_webAudio_cacheFile ' + fileName);MandreelFsErrorHandler(e) });
-
-
-  }, function(error) {dump('mandreel_webAudio_cacheFile3');	mandreel_webAudio_reloadfile(fileName, function(response) { callback(response); if (response) mandreel_webaudio_saveFile(fileName, response); });});
-}
-
-function mandreel_webAudio_queueLoadBuffer(fileName, callback)
-{
-	//dump("mandreel_webAudio_queueLoadBuffer "+fileName);
-	if ( webAudioContext )
-	{
-		var fileNameNoExt = wa_getFileNameNoExt(fileName);
-		var buffer = webAudioBuffers[fileNameNoExt];
-		if ( buffer == null && buffer != "invalid" )
-		{
-			if ( fileNameNoExt != "" )
-			{
-				if (wa_mandreel_cache_audio_files == true)
-				{
-					webAudioBuffers[fileNameNoExt] = "invalid";
-
-					mandreel_webAudio_cacheFile(fileName, function(response) {
-
-						if (callback != null)
-							callback();
-
-						if ( response != null )
-							webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(response, false);
-						else
-							webAudioBuffers[fileNameNoExt] = "invalid";
-					} );
-					return;
-				}
-
-				var url = g_mandreel_working_folder+fileNameNoExt+".ogg";
-				dump("webAudio: loading buffer ("+fileName+") url("+url+")");
-				webAudioBuffers[fileNameNoExt] = "invalid";
-				var request = new XMLHttpRequest();
-				request.open("GET", url, true);
-				request.responseType = "arraybuffer";
-				request.onreadystatechange = function()
-				{
-					if (request.readyState == 4)
-					{
-						if (callback != null)
-							callback();
-
-						if (request.status == 404) return;
-						//dump("webAudio: loaded buffer "+request.status);
-						if ( request.response != null )
-							webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(request.response, false);
-						else
-							webAudioBuffers[fileNameNoExt] = "invalid";
-					}
-				}
-				request.send();
-			}
-			else
-				webAudioBuffers[fileNameNoExt] = "invalid";
-		}
-	}
-}
-
-var webAudioPreloadAudioFiles = new Array();
-var webAudioPreloadBytes = null;
-var webAudioPreloadCurrentFile = 0;
-var webAudioPreloadAsync = false;
-
-function webAudioParsePreloadFile(response)
-{
-	var pos = 4;
-	var bytes = new Uint8Array(response);
-	var i = 0;
-	if ( webAudioPreloadAsync )
-		webAudioPreloadBytes = bytes;
-	while ( pos < bytes.byteLength )
-	{
-		// filename
-		var fileName = "";
-		while ( bytes[pos] != 0 )
-		{
-			fileName += String.fromCharCode(bytes[pos]);
-			pos++;
-		}
-		pos++;
-		// filesize
-		var filesize = bytes[pos] | (bytes[pos+1]<<8) | (bytes[pos+2]<<16) | (bytes[pos+3]<<24);
-		pos += 4;
-
-		// contents
-		var fileNameNoExt = wa_getFileNameNoExt(fileName);
-		if ( webAudioPreloadAsync )
-		{
-			var audioFile =
-			{
-				fileName : fileNameNoExt,
-				fileSize : filesize,
-				position : pos
-			};
-			webAudioPreloadAudioFiles[i] = audioFile;
-		}
-		else
-		{
-			var bufferdata = new Uint8Array(filesize);
-			bufferdata.set(bytes.subarray(pos,pos+filesize));
-			webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(bufferdata.buffer, false);
-			dump("preload audio file ("+fileName+")");
-		}
-
-		pos += filesize;
-		i++;
-	}
-	if ( webAudioPreloadAsync )
-	{
-		dump("started preloading audio files async");
-		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
-	}
-}
-
-function mandreel_webAudio_preloadNextAudioFile()
-{
-	if ( webAudioPreloadAudioFiles.length > webAudioPreloadCurrentFile )
-	{
-		var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
-		if ( audioFile.fileName == null )
-		{
-			webAudioPreloadCurrentFile++;
-			setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
-		}
-		else
-		{
-			var bufferdata = new Uint8Array(audioFile.fileSize);
-			bufferdata.set(webAudioPreloadBytes.subarray(audioFile.position,audioFile.position+audioFile.fileSize));
-			dump("async preload audio file ("+audioFile.fileName+")");
-			webAudioContext.decodeAudioData(bufferdata.buffer,mandreel_webAudio_preloadNextAudioFileOK,mandreel_webAudio_preloadNextAudioFileError);
-		}
-	}
-	else
-	{
-		webAudioPreloadAudioFiles = null;
-		webAudioPreloadBytes = null;
-		dump("finished preloading audio files async");
-	}
-}
-
-function mandreel_webAudio_preloadNextAudioFileOK(audioBuffer)
-{
-	var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
-	webAudioPreloadCurrentFile++;
-	if ( audioFile.fileName != null )
-	{
-		webAudioBuffers[audioFile.fileName] = audioBuffer;
-		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
-	}
-}
-
-function mandreel_webAudio_preloadNextAudioFileError()
-{
-	var audioFile = webAudioPreloadAudioFiles[webAudioPreloadCurrentFile];
-	webAudioPreloadCurrentFile++;
-	if ( audioFile.fileName != null )
-		dump("FAILED async preload audio file ("+audioFile.fileName+")");
-	setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
-}
-
-function mandreel_webAudio_queueLoadPackedBuffers(fileName, callback)
-{
-	if ( webAudioContext )
-	{
-		// TODO
-		/*if (wa_mandreel_cache_audio_files == true)
-		{
-			webAudioBuffers[fileNameNoExt] = "invalid";
-
-			mandreel_webAudio_cacheFile(fileName, function(response) {
-
-				if (callback != null)
-					callback();
-
-				if ( response != null )
-					webAudioBuffers[fileNameNoExt] = webAudioContext.createBuffer(response, true);
-				else
-					webAudioBuffers[fileNameNoExt] = "invalid";
-			} );
-			return;
-		}*/
-
-		mandreel_fs_load_binary(fileName, function mandreel_webAudio_queueLoadPackedBuffers_cb(data){
-
-		if (data)
-		{
-			if (callback != null)
-				callback();
-			webAudioParsePreloadFile(data);
-		}
-		else
-		{
-			var url = g_mandreel_working_folder+fileName;
-			dump("webAudio: loading preload buffers ("+fileName+") url("+url+")");
-			var request = new XMLHttpRequest();
-			request.open("GET", url, true);
-			request.responseType = "arraybuffer";
-			var last_loaded_size = 0;
-			request.onreadystatechange = function()
-			{
-				if (request.readyState == 4)
-				{
-					if (callback != null)
-						callback();
-
-					if (request.status == 404)
-						return;
-					if ( request.response != null )
-					{
-						mandreel_fs_saveFile(fileName, request.response);
-						webAudioParsePreloadFile(request.response);
-					}
-				}
-			}
-			request.onprogress = function(e)
-			{
-				var delta_size = e.loaded - last_loaded_size;
-				last_loaded_size = e.loaded;
-
-				imandreel_update_load(delta_size,0);
-
-				var percentage = ((100*e.loaded)/mandreel_total_pogfile_size)|0;
-
-				if (percentage>100)
-					percentage = 100;
-
-				if ( mandreelAppStartStateFunc )
-					mandreelAppStartStateFunc("loadingAudioUpdate",percentage);
-			}
-			request.send();
-		}
-		});
-	}
-}
-
-
-
-var wa_mandreel_audio_buffers_num = 0;
-var wa_mandreel_audio_buffers_loaded = 0;
-
-function wa_imp_mandreel_audio_checkBuffersPending()
-{
-	return wa_mandreel_audio_buffers_num - wa_mandreel_audio_buffers_loaded;
-}
-
-function wa_imp_mandreel_audio_createBuffer(fileName)
-{
-	if ( webAudioContext )
-	{
-		var fileNameNoExt = wa_getFileNameNoExt(fileName);
-		var buffer = webAudioBuffers[fileNameNoExt];
-		if ( buffer == null && buffer != "invalid" )
-		{
-			wa_mandreel_audio_buffers_num++;
-			mandreel_webAudio_queueLoadBuffer(fileName, function () {wa_mandreel_audio_buffers_loaded++;});
-		}
-	}
-}
-
-function wa_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch)
-{
-	if ( webAudioContext )
-	{
-		var fileNameNoExt = wa_getFileNameNoExt(fileName);
-		var buffer = webAudioBuffers[fileNameNoExt];
-		if ( buffer == null || buffer == "invalid" )
-		{
-			if ( webAudioPreloadAudioFiles != null )
-			{
-				var i = 0;
-				while ( i < webAudioPreloadAudioFiles.length )
-				{
-					var audioFile = webAudioPreloadAudioFiles[i];
-					if ( audioFile.fileName == fileNameNoExt )
-					{
-						var bufferdata = new Uint8Array(audioFile.fileSize);
-						bufferdata.set(webAudioPreloadBytes.subarray(audioFile.position,audioFile.position+audioFile.fileSize));
-						webAudioBuffers[audioFile.fileName] = webAudioContext.createBuffer(bufferdata.buffer, false);
-						dump("**** preload audio file ("+audioFile.fileName+"), forced by playChannel");
-						audioFile.fileName = null;
-						i = webAudioPreloadAudioFiles.length;
-					}
-					else
-					{
-						++i;
-					}
-				}
-			}
-		}
-		if ( buffer == null || buffer == "invalid" )
-		{
-			mandreel_webAudio_queueLoadBuffer(fileName);
-			buffer = webAudioBuffers[fileNameNoExt];
-		}
-		if ( buffer != null && buffer != "invalid" )
-		{
-			var chn = webAudioContext.createBufferSource();
-			var gain = webAudioContext.createGainNode();
-			if ( chn && gain )
-			{
-				webAudioChannels[channel] = chn;
-				webAudioGain[channel] = gain;
-				chn.buffer = buffer;
-				chn.connect(gain);
-				gain.connect(webAudioContext.destination);
-				var bLoop = loop != 0;
-				chn.loop = bLoop;
-				gain.gain.value = vol;
-				chn.playbackRate.value = pitch;
-				chn.noteOn(0);
-				//dump("webAudio: PlayChannel "+channel+" "+fileName+" "+vol+" "+bLoop+" "+pitch);
-			}
-		}
-	}
-}
-
-function wa_imp_mandreel_audio_stopChannel(channel)
-{
-	if ( webAudioContext )
-	{
-		var chn = webAudioChannels[channel];
-		if ( chn != null )
-		{
-			//dump("webAudio: StopChannel "+channel);
-			chn.noteOff(0);
-			webAudioChannels[channel] = null;
-			webAudioGain[channel] = null;
-		}
-	}
-}
-
-function wa_imp_mandreel_audio_setChannelVolume(channel,vol)
-{
-	if ( webAudioContext )
-	{
-		var gain = webAudioGain[channel];
-		if ( gain != null )
-			gain.gain.value = vol;
-	}
-}
-
-function wa_imp_mandreel_audio_setChannelPan(channel,pan)
-{
-	if ( webAudioContext )
-	{
-	}
-}
-
-function wa_imp_mandreel_audio_setChannelPitch(channel,pitch)
-{
-	if ( webAudioContext )
-	{
-		var chn = webAudioChannels[channel];
-		if ( chn != null )
-		{
-			chn.playbackRate.value = pitch;
-		}
-	}
-}
-
-var mwebAudioPreloadState = "start";
-//var mwebAudioPreloadRequest = 0;
-var mwebAudioPreloadAssets = 0;
-var mwebAudioCurrentPreloadAsset = 0;
-var mwebAudioAsyncFiles = '';
-var mwebListAudioAsyncFiles ='';
-var mwebListAudioAsyncFilesPos = 0;
-var mwebTotalPreloadingFiles = 0;
-var mwebCurrentPreloadingFiles = 0;
-function mwebCallbackAsync()
-{
-	mwebListAudioAsyncFilesPos++;
-	if ( mwebListAudioAsyncFilesPos >= mwebListAudioAsyncFiles.length )
-	{
-		mwebListAudioAsyncFiles = null;
-		mwebAudioAsyncFiles = null;
-		return;
-	}
-
-	setTimeout("mandreel_webAudio_queueLoadBuffer(mwebListAudioAsyncFiles[mwebListAudioAsyncFilesPos], mwebCallbackAsync);",10);
-}
-
-function mwebCallbackAsyncPreload()
-{
-	mwebCurrentPreloadingFiles++;
-}
-
-function mandreel_webAudio_PreloadAssets()
-{
-	/*if ( mwebAudioPreloadState == "start" )
-	{
-		//dump("webaudio start");
-			mwebAudioPreloadRequest = new XMLHttpRequest();
-			var url = g_mandreel_working_folder+"mandreel.fat.dat";
-			mwebAudioPreloadRequest.open("GET", url, true);
-			mwebAudioPreloadRequest.onreadystatechange = function()
-			{
-				if (mwebAudioPreloadRequest.readyState != 4) return;
-				if ( mwebAudioPreloadRequest.status != 404 && mwebAudioPreloadRequest.response != null )
-					mwebAudioPreloadState = "parseFat";
-				else
-				{
-					mwebAudioPreloadState = "done";
-					dump("error pre-loading audio assets, status("+mwebAudioPreloadRequest.status+")");
-				}
-			}
-			mwebAudioPreloadState = "loadingFat";
-			mwebAudioPreloadRequest.send();
-	}
-	else if ( mwebAudioPreloadState == "parseFat" )*/
-	if ( mwebAudioPreloadState == "start" )
-	{
-		//mwebAudioPreloadAssets = mwebAudioPreloadRequest.response.split('\n');
-		//mwebAudioPreloadRequest = 0;
-		mwebAudioPreloadAssets = mandreelFatData.split('\n');
-		mwebAudioCurrentPreloadAsset = 0;
-		mwebAudioPreloadState = "preloading";
-	}
-	else if ( mwebAudioPreloadState == "preloading" )
-	{
-		//dump("webaudio preloading");
-		var queued = false;
-		while ( !queued && mwebAudioPreloadState != "done" )
-		{
-			if ( mwebAudioCurrentPreloadAsset < mwebAudioPreloadAssets.length )
-			{
-				var params = mwebAudioPreloadAssets[mwebAudioCurrentPreloadAsset].split(',');
-				if ( params[0] == "audiofile" && params[1])
-				{
-					var sync_load = true;
-					if (params[2] && (params[2]&1) == 0)
-						sync_load = false;
-
-					if (sync_load)
-					{
-						mandreel_webAudio_queueLoadBuffer(params[1],mwebCallbackAsyncPreload);
-						mwebTotalPreloadingFiles++;
-						queued = true;
-					}
-
-				}
-				else if ( params[0] == "audiopreloadfile" )
-				{
-					mandreel_webAudio_queueLoadPackedBuffers(params[1],mwebCallbackAsyncPreload);
-					var size_pog_file = parseInt(params[2], 10);
-					mandreel_total_pogfile_size = size_pog_file;
-					mwebTotalPreloadingFiles++;
-					queued = true;
-				}
-				else if ( params[0] == "audiopreloadasync" )
-				{
-					webAudioPreloadAsync = true;
-				}
-				mwebAudioCurrentPreloadAsset++;
-			}
-			else
-				queued = true;
-
-			if ( mwebAudioCurrentPreloadAsset >= mwebAudioPreloadAssets.length )
-			{
-				if (mwebCurrentPreloadingFiles == mwebTotalPreloadingFiles)
-				{
-					mwebAudioPreloadState = "done";
-					mwebAudioPreloadAssets = 0;
-				}
-			}
-		}
-	}
-
-	if ( mwebAudioPreloadState == "done" )
-	{
-		if ( mandreelAppPlatform == "nacl" )
-			setTimeout("MandreelAudioStartedNacl()", 10);
-		else
-			setTimeout("MandreelAudioStarted()", 10);
-	}
-	else
-		setTimeout("mandreel_webAudio_PreloadAssets()", 10);
-}
-
-var wa_mandreelMusicElement = null;
-var wa_mandreelMusicElementFilename = "";
-var wa_mandreelMusicElementVolume = 1.0;
-function wa_imp_mandreel_audio_playMusic(fileName)
-{
-	var fileNameNoExt = wa_getFileNameNoExt(fileName);
-	var fileNameFull = g_mandreel_working_folder + fileNameNoExt + ".ogg";
-
-	if ( wa_mandreelMusicElementFilename != fileNameFull )
-	{
-		wa_imp_mandreel_audio_stopMusic(0);
-		var audio = document.createElement("audio");
-		var type = fileNameFull.slice(fileNameFull.lastIndexOf(".")+1);
-		switch(type){
-			case "mp3" : type = "mpeg"; break;
-			case "ogg" : type = "ogg"; break;
-			case "wav" : type = "wav"; break;
-			default : throw("'" + fileNameFull + "' is not a recognized audio file");
-		}
-
-		// set correct id for lookup, loading method and data types
-		audio.setAttribute("type", "audio/" + type);
-		var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
-		if ( is_chrome )
-			audio.setAttribute("loop", "loop");
-		else
-			audio.addEventListener('ended', function(){this.currentTime = 0;}, false);
-		audio.volume = wa_mandreelMusicElementVolume;
-		audio.setAttribute("autoplay", "true");
-		audio.setAttribute("src", fileNameFull);
-
-
-		// include into list and document
-		document.body.appendChild(audio);
-		wa_mandreelMusicElement = audio;
-		wa_mandreelMusicElementFilename = fileNameFull;
-	}
-}
-
-function wa_imp_mandreel_audio_stopMusic()
-{
-	if ( wa_mandreelMusicElement != null )
-	{
-		document.body.removeChild(wa_mandreelMusicElement);
-		wa_mandreelMusicElement = null;
-		wa_mandreelMusicElementFilename = "";
-	}
-}
-
-function wa_imp_mandreel_audio_setMusicVol(vol)
-{
-	wa_mandreelMusicElementVolume = vol;
-	if ( wa_mandreelMusicElement != null )
-	{
-		wa_mandreelMusicElement.volume = wa_mandreelMusicElementVolume;
-	}
-}
-
-var mandreel_audio_stream_func_ptr = 0;
-function mandreel_audio_stream_process(e)
-{
-	var l = e.outputBuffer.getChannelData(0);
-	var l2 = e.outputBuffer.getChannelData(1);
-	var n = e.outputBuffer.length;
-
-	var offset2 = 0;
-	var inc = 44.1 / 48.0;
-	while ( n > 0 )
-	{
-		var n2 = ((n*inc)|0)/4;
-		if ( n2 > 1024 )
-			n2 = 1024;
-
-		var sp = g_stack_pointer+100*1024;
-		var ptr = g_stack_pointer+200*1024;
-		var _sp = sp>>2;
-		heap32[_sp]=ptr;
-		heap32[_sp+1]=n2*4;
-		__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
-
-		var offset = ptr>>2;
-		var size = n2*4;
-		/*for (var i=0;i<size;++i)
-		{
-			l[i+offset2] = heapFloat[offset+(i*2)];
-			l2[i+offset2] = heapFloat[offset+(i*2)+1];
-		}*/
-		var i = 0;
-		var j = 0;
-		while ( i < size )
-		{
-			l[j+offset2] = heapFloat[offset+((i|0)*2)];
-			l2[j+offset2] = heapFloat[offset+((i|0)*2)+1];
-			i += inc;
-			j++;
-		}
-
-		//offset2 += n2*4;
-		//n -= n2*4;
-		offset2 += j;
-		n -= j;
-	}
-}
-
-function mandreel_Audio_requestSoundData(soundData)
-{
-	var n = soundData.length/2;
-	var offset2 = 0;
-	while ( n > 0 )
-	{
-		var n2 = n;
-		if ( n2 > 1024 )
-			n2 = 1024;
-		var sp = g_stack_pointer+100*1024;
-		var ptr = g_stack_pointer+200*1024;
-		var _sp = sp>>2;
-		heap32[_sp]=ptr;
-		heap32[_sp+1]=n2;
-		__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
-
-		var offset = ptr>>2;
-		var size = n2*2;
-		var buf = heapFloat.subarray(offset,offset+size);
-		soundData.set(buf,offset2);
-		/*for (var i=0; i<size; i++)
-		  soundData[i+offset2] = heapFloat[offset+i];*/
-		offset2 += n2*2;
-		n -= n2;
-	}
- }
-
-var __Mandreel_Audio_CreateStream_created = false;
-function Mandreel_Audio_CreateStream(sp)
-{
-	if ( !__Mandreel_Audio_CreateStream_created )
-	{
-		if (webAudioContext)
-		{
-			mandreel_audio_stream_func_ptr = heap32[sp>>2];
-			var source =  webAudioContext.createJavaScriptNode(1024*4, 0, 2);
-			source.connect(webAudioContext.destination);
-			source.onaudioprocess = mandreel_audio_stream_process;
-		}
-		else
-		{
-			mandreel_audio_stream_func_ptr = heap32[sp>>2];
-			AudioDataDestination(44100,mandreel_Audio_requestSoundData);
-		}
-		__Mandreel_Audio_CreateStream_created = true;
-	}
-}
-function mandreel_webAudio_dummyStream()
-{
-	var sp = g_stack_pointer+100*1024;
-	var ptr = g_stack_pointer+200*1024;
-	var _sp = sp>>2;
-	heap32[_sp]=ptr;
-	heap32[_sp+1]=4096;
-	__FUNCTION_TABLE__[(mandreel_audio_stream_func_ptr)>>2](sp);
-	setTimeout("mandreel_webAudio_dummyStream()",10);
-}
-
-function AudioDataDestination(sampleRate, readFn)
-{
-	// Initialize the audio output.
-	var audio = new Audio();
-	if ( audio.mozSetup == null )
-	{
-		setTimeout("mandreel_webAudio_dummyStream()",10);
-		return;
-	}
-	audio.mozSetup(2, sampleRate);
-
-	var currentWritePosition = 0;
-	var prebufferSize = sampleRate / 2; // buffer 500ms
-	var tail = null, tailPosition;
-
-	// The function called with regular interval to populate
-	// the audio output buffer.
-	setInterval(function() {
-	  var written;
-	  // Check if some data was not written in previous attempts.
-	  if(tail) {
-		written = audio.mozWriteAudio(tail.subarray(tailPosition));
-		currentWritePosition += written;
-		tailPosition += written;
-		if(tailPosition < tail.length) {
-		  // Not all the data was written, saving the tail...
-		  return; // ... and exit the function.
-		}
-		tail = null;
-	  }
-
-	  // Check if we need add some data to the audio output.
-	  var currentPosition = audio.mozCurrentSampleOffset();
-	  var available = currentPosition + prebufferSize - currentWritePosition;
-	  if(available > 0) {
-		// Request some sound data from the callback function.
-		var soundData = new Float32Array(available);
-		readFn(soundData);
-
-		// Writting the data.
-		written = audio.mozWriteAudio(soundData);
-		if(written < soundData.length) {
-		  // Not all the data was written, saving the tail.
-		  tail = soundData;
-		  tailPosition = written;
-		}
-		currentWritePosition += written;
-	  }
-	}, 100);
-}
-var mandreel_flashaudio_server = "";
-var mandreel_flashaudio_lite = false;
-var mandreel_flashaudio_musicaudiotag = true;
-
-function as3Error(str)
-{
-	var params = str.split(' ');
-	if ( params[0] == "createdBuffer" )
-		mandreel_audio_flash_lastBufferCreatedSwf = parseInt(params[1]);
-	dump("as3Log: "+str);
-}
-
-function mandreel_audio_getFlashMovieObject(movieName)
-{
-	if (Mandreel_window.document[movieName])
-	{
-		return Mandreel_window.document[movieName];
-	}
-	if (navigator.appName.indexOf("Microsoft Internet")==-1)
-	{
-		if (document.embeds && document.embeds[movieName])
-			return document.embeds[movieName];
-	}
-	else
-	{
-		return document.getElementById(movieName);
-	}
-}
-
-function mandreel_sendmsg_flash(msg)
-{
-	if ( mandreel_flashaudio_server != "" )
-	{
-		var iframeWin = document.getElementById("ninja-iframe").contentWindow;
-		iframeWin.postMessage(msg,mandreel_flashaudio_server);
-	}
-	else
-	{
-		var flashMovie=mandreel_audio_getFlashMovieObject("FlashDivAudio");
-		if ( flashMovie != null )
-			flashMovie.receiveMessage(msg);
-		else
-			dump("error: flashMovie not found");
-	}
-}
-
-function fl_mandreel_audio_init(sp)
-{
-	mandreel_sendmsg_flash("init "+g_mandreel_working_folder);
-}
-
-function fl_mandreel_audio_end(sp)
-{
-}
-
-function fl_mandreel_audio_update(sp)
-{
-}
-
-function mandreel_flashaudiolite_createBuffer(fileName)
-{
-	mandreel_audio_flash_lastBufferCreated++;
-	mandreel_sendmsg_flash("createBuffer "+wa_getFileNameNoExt(fileName)+" "+mandreel_audio_flash_lastBufferCreated);
-}
-
-var mandreel_audio_flash_lastBufferCreated = 0;
-function fl_mandreel_audio_createBuffer(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	mandreel_flashaudiolite_createBuffer(fileName);
-}
-
-function fl_internal_mandreel_audio_checkBuffersPending()
-{
-	return mandreel_flashaudio_lite && (mandreel_audio_flash_lastBufferCreatedSwf != mandreel_audio_flash_lastBufferCreated);
-}
-
-var mandreel_audio_flash_lastBufferCreatedSwf = 0;
-function fl_mandreel_audio_checkBuffersPending(sp)
-{
-	r_g0 = 0;
-	if ( fl_internal_mandreel_audio_checkBuffersPending() )
-		r_g0 = 1;
-	dump("fl_mandreel_audio_checkBuffersPending ("+r_g0+") ("+mandreel_audio_flash_lastBufferCreatedSwf+") ("+mandreel_audio_flash_lastBufferCreated+")");
-}
-
-
-function fl_mandreel_audio_playChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-	var loop = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	mandreel_sendmsg_flash("playChannel "+fileName+" "+channel+" "+loop+" "+vol+" "+pitch);
-	r_g0 = 0;
-}
-
-function fl_mandreel_audio_stopChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var index = heapFloat[sp>>2];sp+=4;
-
-	mandreel_sendmsg_flash("stopChannel "+channel);
-}
-
-function fl_mandreel_audio_setChannelVolume(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-
-	mandreel_sendmsg_flash("setChannelVolume "+channel+" "+vol);
-}
-
-function fl_mandreel_audio_setChannelPan(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pan = heapFloat[sp>>2];sp+=4;
-	mandreel_sendmsg_flash("setChannelPan "+channel+" "+pan);
-}
-
-function fl_mandreel_audio_setChannelPitch(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	mandreel_sendmsg_flash("setChannelPitch "+channel+" "+pitch);
-}
-
-
-function mandreel_audio_load_flash()
-{
-	var failed = "";
-
-
-	try
-	{
-		var mandreelAudioSwf = g_mandreel_working_folder+"mandreelaudio.swf";
-		if ( mandreel_flashaudio_lite )
-			mandreelAudioSwf = g_mandreel_working_folder+"mandreelaudiolite.swf";
-		var swf = swfobject.createSWF({ data:mandreelAudioSwf, width:"0", height:"0", allowScriptAccess:"always" }, { menu:"false" }, "FlashDivAudio");
-		if ( !swf )
-			failed  = "swfobject.js not avaiable or Unable to open "+mandreelAudioSwf;
-	}
-	catch(err)
-	{
-		failed  = err;
-	}
-
-	if (failed == "" && !swfobject.hasFlashPlayerVersion("9.0.0"))
-		failed = "flash player not found";
-
-	if ( failed != "" )
-	{
-		dump("Failed to create flash audio driver ("+failed+"). Null driver will be used.");
-		MandreelAudioDriver = "null";
-		null_MainAudioDriver();
-	}
-}
-
-function fl_MainAudioDriver(audioServer, audioUrl)
-{
-	mandreel_flashaudio_server = audioServer;
-	if ( mandreel_flashaudio_lite )
-		mandreel_flashaudio_server = "";
-	if ( mandreel_flashaudio_server != "" )
-	{
-		Mandreel_window.addEventListener("message", receiveMessage2, false);
-		var el = document.createElement("iframe");
-		el.setAttribute('id', 'ninja-iframe');
-		el.setAttribute('width', '0');
-		el.setAttribute('height', '0');
-		el.setAttribute('frameborder', '0');
-		document.body.appendChild(el);
-		el.onerror = function(message) { alert(message); };
-		el.setAttribute('src', audioServer+audioUrl+"/MandreelAudio.html");
-		setTimeout("CheckNinjaFrameReady()", 1000);
-	}
-	else
-	{
-		setTimeout("mandreel_audio_load_flash()", 10);
-	}
-}
-var ninjaLoaded = false;
-function CheckNinjaFrameReady()
-{
-	try
-	{
-		mandreel_sendmsg_flash("loadFlash");
-	}
-	catch(err)
-	{
-	}
-	if ( !ninjaLoaded )
-		setTimeout("CheckNinjaFrameReady()", 1000);
-}
-
-function fl_map_mandreel_audio_functions()
-{
-	mandreel_audio_init = fl_mandreel_audio_init;
-	mandreel_audio_end = fl_mandreel_audio_end;
-	mandreel_audio_update = fl_mandreel_audio_update;
-	mandreel_audio_createBuffer = fl_mandreel_audio_createBuffer;
-	mandreel_audio_playChannel = fl_mandreel_audio_playChannel;
-	mandreel_audio_stopChannel = fl_mandreel_audio_stopChannel;
-	mandreel_audio_setChannelVolume = fl_mandreel_audio_setChannelVolume;
-	mandreel_audio_setChannelPan = fl_mandreel_audio_setChannelPan;
-	mandreel_audio_setChannelPitch = fl_mandreel_audio_setChannelPitch;
-	if ( mandreel_flashaudio_musicaudiotag )
-	{
-		mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
-		mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
-		mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
-		mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
-	}
-	else
-		dump("WARNING: flash music functions not supported");
-	mandreel_audio_checkBuffersPending = fl_mandreel_audio_checkBuffersPending;
-}
-
-function receiveMessage2(event)
-{
-	ninjaLoaded = true;
-	fl_map_mandreel_audio_functions();
-	setTimeout("MandreelAudioStarted()", 10);
-}
-
-function mandreel_flashlite_checkPreloadFinished()
-{
-	if ( !fl_internal_mandreel_audio_checkBuffersPending() )
-		MandreelAudioStarted();
-	else
-		setTimeout("mandreel_flashlite_checkPreloadFinished()", 10);
-}
-
-function mandreel_flashlite_startPreload()
-{
-	mandreel_sendmsg_flash("init "+g_mandreel_working_folder);
-	// preload sounds
-	var FatLines = mandreelFatData.split('\n');
-	for ( var i=0;i<FatLines.length;++i )
-	{
-		var params = FatLines[i].replace('\r','').split(',');
-		if ( params[0] == "audiofile" && params[1] )
-		{
-			var sync_load = true;
-			if (params[2] && (params[2]&1) == 0)
-				sync_load = false;
-
-			if (sync_load)
-			{
-
-				mandreel_flashaudiolite_createBuffer(params[1]);
-			}
-		}
-	}
-	setTimeout("mandreel_flashlite_checkPreloadFinished()", 10);
-}
-
-function flashReady()
-{
-	fl_map_mandreel_audio_functions();
-	setTimeout("mandreel_flashlite_startPreload()",10);
-}
-
-function null_mandreel_audio(sp)
-{
-	r_g0 = 0;
-}
-
-function null_MainAudioDriver()
-{
-	mandreel_audio_init = null_mandreel_audio;
-	mandreel_audio_end = null_mandreel_audio;
-	mandreel_audio_update = null_mandreel_audio;
-	mandreel_audio_createBuffer = null_mandreel_audio;
-	mandreel_audio_playChannel = null_mandreel_audio;
-	mandreel_audio_stopChannel = null_mandreel_audio;
-	mandreel_audio_setChannelVolume = null_mandreel_audio;
-	mandreel_audio_setChannelPan = null_mandreel_audio;
-	mandreel_audio_setChannelPitch = null_mandreel_audio;
-	mandreel_audio_useMusicFunctions = wa_mandreel_audio_useMusicFunctions;
-	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
-	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
-	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
-	setTimeout("MandreelAudioStarted()", 10);
-}
-function at_mandreel_audio_init(sp)
-{
-}
-
-function at_mandreel_audio_end(sp)
-{
-}
-
-function at_mandreel_audio_update(sp)
-{
-	for ( i = 0 ; i < 32 ; ++i )
-	{
-		var end = maudioChannelEnd[i];
-		if ( end != null )
-		{
-			var sound = maudiotagChannels[i];
-			if ( sound != null )
-			{
-				if ( sound.currentTime > end )
-				{
-					sound.pause();
-					maudioChannelEnd[i] = null;
-				}
-			}
-		}
-	}
-}
-
-function at_mandreel_audio_checkBuffersPending(sp)
-{
-	r_g0 = 0;//wa_imp_mandreel_audio_checkBuffersPending();
-}
-
-function at_mandreel_audio_createBuffer(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var maxChannels = heap32[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	//wa_imp_mandreel_audio_createBuffer(fileName);
-
-	r_g0 = 0;
-}
-
-function at_mandreel_audio_playChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-	var loop = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	var fileName = get_string_from_ptr(ptr_fileName).toLowerCase();
-	at_imp_mandreel_audio_playChannel(fileName,channel,vol,loop,pitch);
-	r_g0 = 0;
-}
-
-function at_mandreel_audio_stopChannel(sp)
-{
-	var ptr_fileName = heap32[sp>>2];sp+=4;
-	var channel = heap32[sp>>2];sp+=4;
-	var index = heapFloat[sp>>2];sp+=4;
-	at_imp_mandreel_audio_stopChannel(channel);
-}
-
-function at_mandreel_audio_setChannelVolume(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var vol = heapFloat[sp>>2];sp+=4;
-	//wa_imp_mandreel_audio_setChannelVolume(channel,vol);
-}
-
-function at_mandreel_audio_setChannelPan(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pan = heapFloat[sp>>2];sp+=4;
-	//wa_imp_mandreel_audio_setChannelPan(channel,pan);
-}
-
-function at_mandreel_audio_setChannelPitch(sp)
-{
-	var channel = heap32[sp>>2];sp+=4;
-	var pitch = heapFloat[sp>>2];sp+=4;
-	//wa_imp_mandreel_audio_setChannelPitch(channel,pitch);
-}
-
-function at_mandreel_audio_useMusicFunctions(sp)
-{
-	r_g0 = 1;
-}
-
-function at_MainAudioDriver()
-{
-	mandreel_audio_init = at_mandreel_audio_init;
-	mandreel_audio_end = at_mandreel_audio_end;
-	mandreel_audio_update = at_mandreel_audio_update;
-	mandreel_audio_createBuffer = at_mandreel_audio_createBuffer;
-	mandreel_audio_playChannel = at_mandreel_audio_playChannel;
-	mandreel_audio_stopChannel = at_mandreel_audio_stopChannel;
-	mandreel_audio_setChannelVolume = at_mandreel_audio_setChannelVolume;
-	mandreel_audio_setChannelPan = at_mandreel_audio_setChannelPan;
-	mandreel_audio_setChannelPitch = at_mandreel_audio_setChannelPitch;
-	mandreel_audio_useMusicFunctions = at_mandreel_audio_useMusicFunctions;
-	mandreel_audio_playMusic = wa_mandreel_audio_playMusic;
-	mandreel_audio_stopMusic = wa_mandreel_audio_stopMusic;
-	mandreel_audio_checkBuffersPending = at_mandreel_audio_checkBuffersPending;
-	mandreel_audio_setMusicVol = wa_mandreel_audio_setMusicVol;
-
-	setTimeout("mandreel_audiotag_PreloadAssets()", 10);
-}
-
-var maudiotagPreloadState = "start";
-var maudiotagPreloadAssets = 0;
-var maudiotagCurrentPreloadAsset = 0;
-var maudiotagPreloadAsync = false;
-var maudiotagDurations = Array();
-var maudiotagChannelsCreated = 0;
-var maudiotagChannels = Array();
-var maudiotagChannelsLoaded = Array();
-var maudiotagAudioSpriteFound = false;
-var maudiotagAvailableChannels = new Array();
-var maudioSecondsPos = new Array();
-var maudioChannelEnd = new Array();
-
-function mandreel_audiotag_PreloadAssets()
-{
-	if ( maudiotagPreloadState == "start" )
-	{
-		maudiotagPreloadAssets = mandreelFatData.split('\n');
-		maudiotagCurrentPreloadAsset = 0;
-		maudiotagPreloadState = "preloading";
-	}
-	else if ( maudiotagPreloadState == "preloading" )
-	{
-		var queued = false;
-		while ( !queued && maudiotagPreloadState != "done" )
-		{
-			if ( maudiotagCurrentPreloadAsset < maudiotagPreloadAssets.length )
-			{
-				var params = maudiotagPreloadAssets[maudiotagCurrentPreloadAsset].split(',');
-				if ( params[0] == "audiofile" && params[1])
-				{
-					var duration = params[3];
-					var fileNameNoExt = wa_getFileNameNoExt(params[1]);
-					maudiotagDurations[fileNameNoExt] = duration|0;
-					dump("audiotag duration ("+params[1]+") "+duration);
-				}
-				else if ( params[0] == "audiotagfile" )
-				{
-					var type = params[1];
-					var filesize = params[3];
-					var numsounds = params[4];
-					var at = new Audio();
-					if ( !maudiotagAudioSpriteFound && at.canPlayType && at.canPlayType("audio/"+type) != "" )
-					{
-						maudiotagLoadPackFile(params[2],filesize,numsounds,type);
-						maudiotagAudioSpriteFound = true;
-						queued = true;
-					}
-				}
-				else if ( params[0] == "audiopreloadasync" )
-				{
-					maudiotagPreloadAsync = true;
-				}
-				maudiotagCurrentPreloadAsset++;
-			}
-			else
-				queued = true;
-
-			if ( maudiotagCurrentPreloadAsset >= maudiotagPreloadAssets.length )
-			{
-				maudiotagPreloadState = "done";
-				maudiotagPreloadAssets = 0;
-			}
-		}
-	}
-
-	if ( maudiotagPreloadState == "done" )
-	{
-		setTimeout("MandreelAudioStarted()", 10);
-	}
-	else
-		setTimeout("mandreel_audiotag_PreloadAssets()", 10);
-}
-
-function maudiotagLoadPackFile(filename,filesize,numsounds,atype)
-{
-	dump("audiotag packfile ("+filename+") ("+filesize+") ("+numsounds+")");
-	var url = g_mandreel_working_folder+filename;
-	dump("audiotag: loading packed data ("+filename+") url("+url+")");
-	var request = new XMLHttpRequest();
-	request.open("GET", url, true);
-	request.responseType = "arraybuffer";
-	request.onreadystatechange = function()
-	{
-		if (request.readyState == 4)
-		{
-			if (request.status == 404)
-				return;
-			if ( request.response != null )
-				audiotagParsePreloadFile(request.response,numsounds,atype);
-		}
-	}
-	request.send();
-}
-
-function audiotagParsePreloadFile(response,numsounds,atype)
-{
-	var pos = 0;
-	var bytes = new Uint8Array(response);
-	var i = 0;
-	if ( webAudioPreloadAsync )
-		webAudioPreloadBytes = bytes;
-	var secondsPos = 0.0;
-	while ( pos < bytes.byteLength && i < numsounds)
-	{
-		// filename
-		var fileName = "";
-		while ( bytes[pos] != 0 )
-		{
-			fileName += String.fromCharCode(bytes[pos]);
-			pos++;
-		}
-		pos++;
-		// filesize
-		var filesize = bytes[pos] | (bytes[pos+1]<<8) | (bytes[pos+2]<<16) | (bytes[pos+3]<<24);
-		pos += 4;
-		var fileNameNoExt = wa_getFileNameNoExt(fileName);
-		var duration = maudiotagDurations[fileNameNoExt];
-		dump("afile ("+fileName+") duration("+duration+") posseconds("+secondsPos+")");
-		maudioSecondsPos[fileNameNoExt] = secondsPos;
-		secondsPos += duration / 1000.0;
-		secondsPos += 0.25;
-		dump("second "+i+" "+secondsPos);
-
-		i++;
-	}
-
-	// contents
-	var contentSize = bytes.byteLength - pos;
-	var bufferdata = new Uint8Array(contentSize);
-	bufferdata.set(bytes.subarray(pos,pos+contentSize));
-	var ascii = '';
-	for (var i=0; i<bufferdata.length; i++)
-		ascii += String.fromCharCode(bufferdata[i]);
-	var base64 = btoa(ascii);
-	audiotagAudioSprite = "data:audio/"+atype+";base64," + base64;
-
-	if ( webAudioPreloadAsync )
-	{
-		dump("started preloading audio files async");
-		setTimeout("mandreel_webAudio_preloadNextAudioFile()",10);
-	}
-
-	audiotagCreateChannel(0);
-}
-
-function audiotagCreateChannel(index)
-{
-	console.log("audiotagCreateChannel "+index);
-	var sound = new Audio();
-	sound.addEventListener("canplaythrough",function()
-	{
-		if ( maudiotagChannelsLoaded[index] == null )
-		{
-			maudiotagChannelsLoaded[index] = sound;
-			maudiotagAvailableChannels.push(sound);
-			console.log("************** loaded channel "+index);
-			if ( index < 8 )
-				setTimeout("audiotagCreateChannel("+index+"+1)", 10);
-		}
-	}, false);
-	sound.addEventListener("error",function()
-	{
-		console.log("************** error loading channel "+index);
-	}, false);
-	//sound.src = "data:audio/mp3;base64,//uQxAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAABFAAA0igAHDBERFhsbHyIiJioqLTE1NTk8PEBEREpPT1JWWlpeYmJmaWltcXF1eXl8gISEh4yMj5OTl5qanqGlpamsrK+ysra5ub3AwMTHysrN0NDU19fa3t7h5Ofn6+7u8vX1+fv7/f8AAAA5TEFNRTMuOThyAqUAAAAALjQAABRAJAXKQgAAQAAANIqLReuqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//uAxAAACgjJYRQhAAN1ru+3N6ADNAEAASM2QkOAABKvqQjEIQjSE+pyEJ/5znoc5znP//QgAAEachCN85/oQDB9QIAg8oCEHAQcXfKBjEAIS4IAgclAQBA5BAMZQEHfgmD4fwf5HQ6HQ6HY7HQ7GQrDQPvZToNx37zcYsbgZnqEkTWnZsm+DxpKLDUMfs3A4zHKdzz8+wAWXmmL1KaHf35z0oOjnISA5pYpJmW9w/woDIDpmTxpDRYGwmDH/rUv97+xaWZ9eZkqAiZl+xsj8pszk1ZtY73/+UhDNvTHmxgMROhU0DBzwRq/MQ1Jbn///l4FEGHFFYIElBkORAUcAEZYRjfrSuiv1rWf6/e///Z8mnLXAgFiMOwakw0OepsaDVS5RdrxqT///////8hys3t58nrFS3lWt6/uXec73+46u0oA4ZEXCYUYY+p6C4/B89FZVEYXJqaW+eGCSYJfJOnpq7WadTtuzhoUjsP/+2DEFQOPrW1oPYMAAecorQmDIaE0qGThDsZRhGCCZyF03ZkXKRPVQEMTdeftOw84ncZ4XR/ZoO3JoyPFVtHePkemlrf5f740VGbMspMynd2NrG/h8//u58dsf2jWLnygUiASkXwFfQAw7MEGiSdlDDj7wJCnkpYu+0iqRU2SIo3RAkznFnYGqMYXMtXGhsYWLKMZzg4NSb1Jepcx7ohTx6PUlnSLHuY4vRK3VtWOymoix0TSesWjbseTdsYnvHf0v/Ks8NI0+O+Ge/Z4xkpZ/1rQS4QMHvMPSieYYfONUp/9VQBOCRaIS9okqeKzDCwz2wA0pok7D0mlEAxaelsP1uRm4hT/+2DEEQOQ5XtkLCRz2h00bImEjjlpio6TEqIL4ikSEeJRY1GhlJzTySOlrtqTXhIeh5vmvJqpiXFikoyd4tXBbGHzyo6hae6OHIxuoRjkJWu+okBoZoEDZvFrFN5LiAyxW9TEnnbyz/H/erAb3Ok2y9BVcOnGOv1kzQEgZxr0spQBWdNNJtvXQak+7mL2yf92oalcRhf0oCLJoWidC+awoNrOuFDy2UYNkk+X1a3VBuuTU604pNtS082afizat2f7nunbfdAnawhbPRmEEk5BKECSI7QPXcneTeHfYcEeUrhB0ReamhSlihEAA2DNS+LCVT8zyyPk7m1ml9iLJT5RfWoABPT/+2DEAYAO0V9oTBhvSckr7ejzDaFQT7CIuu6UuevrnRqQWnrosaeHIHIghzTLiApnBWKBykEGRpeaek5WfbQUGm4HvmEc0Z1cNji/jZ03yrg3dGpBRMPChoDGxkHJHP7VZTvlNkkJWY4SOeaqpKaEcrGeaOZFjmOK2LrMLo3/rolzs58SeHt/wAEwAASk5VsmKoQpfyl60V7xyRN9YRKhDS5djhmMfOuYFuxqX1zVE5QQourDCCMeGIHAIIUbK7yOTsRCQZHMruhiQ6ubRh3gIpxYGwfA+/SXh1Viy23s9cxzoKluDQyU+GSomumKPZMdvcKttEc5lxwsFgJAEElytfKhnMr/+2DEBQANdX9u7CRnyay0L7TDDHyX4Oe3pdCccMm/2jMqn6UihdVNPrGTu/Bj9Q3PQETiWC9S8qqOeSsLMp8BQQRIyZGPw2Ps9eVdSt+n+adikmCZSatTjtnZVhEcMzIoiCjdUztJftuGf+IcKZ/6jZjP+wMK6AwjI62203Lw5K7jYUcvoY0QuV6WVTGpKZEs2rKAmBHBArQ8zhvcKbPnoh/+ikScXJArWnwz0dRH02ADU83GEKXl9LQihFi4CPca2wmlvSyLvlVzdBi6p7pDrF7FQmbwjrv8MptOSnNYpWYKAQQQS3MVRtHIskSAIxmUqsMDbMzsMz+Ni4Ffzvr5Q9yTSQj/+0DEEYAKzMty55higVaSr3RgjgSW/8JJAbI8zlbL/t2+fNvGY4PAb3QOFQvSZoLuDsswgQShTAEXHWaY4JEgipiC1WKKOXUAMGOMtMpJOa0oG2pD4UpRq0awhk4dx07DMuCOEpePVSlwuybfziMR1YtHAB8NLRSswL0EVQk9rzoiPCrQbW4qJDYFc6RPsaskKrp1KS90BHdklWipyRV/jqVF0xGGVFm2s3wcwJl9iheX1CGxlP/7QMQMAAqVAYEklG6xVp4syYMNoFoBztJLiJErk7s7/ft/L6IUjCstJlNDOLTdacOt8LO8N/PmVLTiVF8UbwKJnIRTZHo6OsibDzCcv5F7U1AADT5grCxWpvZNskfeQ3o/g3KD5kMyRY7D1zEBZmvbnG7attnJEJGyJAw8pOUUioM3JxtTvZQhc/Sp7L9/Tzm/5+qHPmMKA6WFTryqnsjHP3SP6HWFqgIAAJJSTcH0nhFugclK//tAxAcBCsyvdUWEsNlDDO1M8wzgFJ121UStsnY5UgwO1jgVbsqChv1zojMpnddXBB27nidTTezt9utjvF2+1xUPI/Ey0X9uwe7XVbfR//+tI+W1Jwmcz9Qs/3b/gABKdodQEmZN1hwSr4WFFECvsmmpI4e5kjZKXVCXwRegXNTUxg4dDjow9OCc3JvDgsMvc5wGhRx59hDPA/QUNrr2R7C9am9r3ukxrJGc7Kal1QAAVJQIJCz/+1DEA4OKwPVoZ6RowUoWbIWGGOqbqsvVUvK6OV7AWklGA+pJ7Gw4ca1RiBPhqRr2HF4D8OjfMtXi5wtOwoXW1rfSEe+r2FCXH82z8zbufoKMwSD5wMGb6nuVm6fP3veVEYrpOCSJeL3jTiPov2HAJG0MZ0b1+4SW3YGG/HkPnllc8HPrdH/9CoZM1r6snzmMxGn6WfXz7ua/X/p9JtRzBsA0rFiibYj1jRSHKg0LOGxUkzv/+PUAAaCx0Aa2HcdVkRWwH1qaQeNn33jQOkWL//tAxAyACrRrZEwwxRFULG2o9JQowvUkzUH+pKox7BX+mE4aMztJ5bLGCZsBgpkiCyRSLBsXDzhAVJLP8zWOEbC735yposneBlNZ5LLMkvt4oAECgJJbu59jTGmHsHaGFNsY/kD7qQjkS5Gs6CBju7XoJK5N3I+7I9OyWVevVHnuOyt1S7dEWR1f+nCLyvIrIdWtQyk0zNejsiWIm2nv0sUa5tj/R1IAEAykii7wAQbhWMVBhxz/+0DEB4AKiG1xRhkAIVcULqTEDGaoGHbV4Xj9pl06dhBFNDriPVZrtHz0y7DhFQmfLAYTGL0HQyhOswFXtn4uJA0TFjbU3vCWHzJNQ6H16rRhY0SNUMvu8KuBRVYWUXCpwnvmKF2V6OCa+4xBi0yfQTXPjLrjfR0XhWBi97JhmvImhlbC3oFngKAZUnElyw0xaUOlzDQQNKBQEQKJGr4dULSJux1q3SRR5mjQH5vA6AEVG2q3I//7UMQDAAqw7YejDE/xTKzvKICLFmnKCn338dXIS04/UQUr/QREYmhCdS0v0iFGhKVEZ56wzPlYRdGK2OxfeuP+zpfdW22X7AwcQH4kFEGy4pdFRj1vNAYRUsESwpLqeBfSnyiAgeqKSJBUBUChJdReku5OStSYuNo3r4iXjboq+YVCuxmhyugjzIlbR6QrpXYXZidV9tqm7bWshCyl2O0zOo+/W/6nptP/7vkzAxrGqYAj+moJOJUFyRySySSOTP0NVxWTey+N2SzvTNz0b8b/+0DEDAAKpPWLowR4cVYiLA2DCbBMcCju992OtVI9P6eYSAVCsPDMOS5/qYpE9HLWGXKebH+uZ/qVBgDDRMNeAQyHBVr7t5hjP6QggRIZ7KcSgAEByF7QCVC1nTXajAXjiGcennLpq54XiiEz19DZx1Plm59L+9rmLfLsxPH7KyXRLuw70Itl/VV2X2foqUR/7XMDU2bUrM3EkDIaOYSKBpTP9ZV//1oAkoCCii5hbhGVWlD7qv/7QMQHAAp1NWtHmEbhOxEsTYSIcHonOiRI/atyhLVmNyqKuPt1Oz76Gal6mWZLiyqnoyNq6Kyu6m1WNuQtqzU6cHFHHKrWDqOjtVddjI/fcLaKfwPFTlN1P1AAFJ2gZJIAs3QJCIrgqJmVig/PNUabt5iyI7shRZgA2H7nc3WVv28thQLlVHCwcuCwFpIhfBNpEyTFVwKbJGzYGkYJM7aECVhL7+o+v/1VAQWYVUbGsl033UaF//tQxAYAixlpcSeMR/FeoexNgwkoEPUwTQlyR7yAARPpSHdyD7JYvBIX0z5UI4YgUFsxWYLzbIiaWa97AyuqJ3S3MO0EIaRilYMioZz1pQhL2mBIyKqshdPulW7ikY3q9aU7uD6oiLejkTgeBpfEaUzIuBnKdXuupcw1NdVCWDPaqb4oh20tXdlkZzXn3dpqsWqrWnroR3vdt7pYyoU45TujlTUUbFaALO3tGLpHzqYmKHCZ87y+yJ3KFD+tJtNOUPnhqUpmVk5ZLRt1j3VhEf/7UMQLAA0JaXlGFG8xoy2t6PMVfk0plEVrRyKjwmm6mKsc0HjnlzGO26EwoVnz0+DmCE21DBxd288LT+w9kdX5V6sDyc2ACBDmp5a1PPdkKhxnyHT73kWrcrrRTigOCjXE4vPR7YeAAWcpIkJQiWt3EpIu7t+a4ce3hRyEvn5xl2TU3YlPLMumKKmM1+Ue06Z3pPGLRhA97OqlEzOVmuwwY8lkbdGPs8utGrUYjkKgwxzOUJHVjiSNrVyvInZEsW3TTVdZGDxRxRRiGyQ5nBv/+2DEAAAOXT9vRiTB8aAs65z0jSgUKtyU0inA/MQ3azBbVKY6QFrPSI1gRdH+4JpZLwkcrK5e58ry6+5Vr35Vq3KoYZRwHtHxzrhGj7mKqzQJrO940WkVMc7wb1LfZz5t6/QzLHPnnzkv7J539vpaVN0Gd0LnaCNB8AsJhYRpvDoSZMpx/QwaAEApN3csIrwaRwHqziRqYl5/MmxEGjceGpD8J3rAwG663CuwpeQ6RhwitkVBK0D75hB7BQOuctyvacP4ouiEi0WZ5E3wZq3ND3NqUUgLRdqvod6DM6X+MnV+UtmIz//+TL+wh7tDfyUAoEKWgEAlAn5a9EkjnLaTPoQFZqr/+2DECoMM+WlcbBkJ4bUiak2UjbiCpVzs2UqxZsbtdrKOUzO+3TPbip6yaP+rhdbH1RFT3E/XeQ6FqhHE33jY+4Z/nnhuP6oIlea+tZaraCO6uri7ipifRUSe0/+q5hv3slTrEfmPoAAALsILTzDf5hsOOwFh2FCEZ6cIqrO0+OJNACEo3Fd0mAMhMja9FGVyBAZ65P6pJN+yykaj53njcXnoUlJIOKPkOExjtkvDIKHVGQ5iz8wyLXaedY5NjHJzhqxgnJWlE6yTnZFI0PVZQHvDKRUJpWOOuSSOWnFDZ9CgfJfVaB+mbSzG9zPSRrNQ+GHqlRLcoDRCoUBq2RX6Zcc2hsf/+0DEGAAMVTF/pIzVsYImq52EmGSh3MGANrxh2JPvBC5sZAlp6+a3yRAZ6gyVeI/u81hNX2Zu+mtTb+UtIbS0qwDhpm63/0AhCJJLgCl0Dk9lNxQXBGzJl1CO06ZcjHWy2XTa2VlRUlpI3906cx2aNZo1859dr/s4hWpy7crXzMb7O3219Zvl3mu2/czfv3t9IApxJKW8k/md5RTZ3/fuzu7dmXgdi3WqCcdktstsku1KCrwzUf/7UMQGgAsVN4WjGGPxXyautGGb1qsjAsRbKxruCj80UsQ2vLwAE/ChFSsEHY/nwb/woievMiDEf6u9p0s+nhXRxZF95k2ZmQAGYJu+Yy0hieg3lP+lsXyAhlELzHYBuKglOJuNNtJOAAgBJ0FqQBBGEZnnUgkZvVdmZ/mtHP3ePxvL1SX78ZTtvaf8ycvXiw+/H/w3/LfI/py9K00o5K38yhcchUr6XtJVvdxWdzlp9yZ1qDAcTfPVAABYlJJShiJO2M+XUsVH7VyKNTqmLbb/+0DEC4AKmRNjR5ip0Vam7ajDDD5SgUhRxz0rlIvk/e6R6E0Uotm86XdXUVI+5sg5LyjVsm1lP9dP++owHGkGM7KJIgprGuIsYdQGQUEQfO7IBBFbtJIoqAVBKAVHxBsmxHR6qtFK1b4MXJFbQDQ4LZHyK7RQhAsvzjn+vST6XmbFHVAcQX2WTIR1GUPI3/uxGRuC9Vzpsdmfhy/nSAz6P0yE1zz+gWJKACQSU7gfMF8E82sstv/7UMQGgAtlEVbsJGlBYCet6PQNvlNDDKiT/KlFBJExEihdVd9MTRpLhH6s87wdkbKQlM28sHkacu3mfDiFOajGakZ+QRzMicfZgRlkSqeZBBZg0U/VmJ/cGakUnlh2BHr9d4qNXpppJQEUlnCE0XgS3vnsSV6F130dxidKq6RmM6LPVbt44+5OmbRZyQpXSFOTN+b7GeVcly3kM7WwWiAIQCEjFHRiL9vbuXDlrfSbv/8hqrsARYQ3jxFVBGFtqZsCJVrjiaHnOoMt+qtrLzP/+0DECgALCTNpJ5ir8V+mbGTxlnble8QU2f4Dx3ELd6Qc/zfelQ7X1HNVCIZTrLoitiREMUhSse7K2VRIyFKrbVJlERwSDgyxkYcVF0Exd5MpNUezRV7WeggAVmVRwFcBuQ9qvZdWcrSeDNet64p6b+GsvQK4CiCzB61ygzo1wfPW3gcfy5FCCj3DQw9PN/KjE9LWPmr4ilvYy37gdms+dlTRDKjd4qisrxgfEods5gwqATVZVf/7UMQCAArVM2MnjQ/xR6KspJMM/0oHAjWLLFAQ20HWojbW+aM8U4RHBRBGuCYEhYW1KqeU8YjpXyrZd65FISloCTdGGNn/d/2n/bXPd3Wk/9nBUPnHDKWDR8XbFDCDGlb59o+IgepAASLNSliMDI+GG1SaZ2gAcLQrXXievH5yMsnu3Ik50kkcUhMXghfnIcMGe28D9HPXuwUjp51Ppl/H7x34+Ween+4IUB5tmcBXmzCCbmuMvfgDujAEaSSSKgMwZRKOosc1VCDiRTVCTjP/+0DECwAKuTVnR6RgcWAmbSjDIC9RxP1zFDgLtAyubnkky6n32yLh1xYcJVBVZQyFL0EwY3POBCBJMs+VEO+6f+oci9uERfeBf//44B6ow4lBHxWwCZaym0jICsLCgVacE7XsCYuylheYelWUq9cbGk+qio0bo9lBmYhm5TlMslXcgek3umWtw1ObxdIiXGvf2Puf+fib+ix4S72eNLT4vYWENmGTeMbjn/KlmgRVWKlbAZJuQP/7UMQEgArJNWEnjLPxXKYtKMMgH4s8efDDaDBg/5ixrX3bP1BFh1WwsL4cPy4hkNbwNLh4Vy+wnoCCQ7nTgLpH1FJTM+KGMlK0cZmHh5TCn2BwdxhdnLvuoTRVWmrN1MEqgVdrTbSTgFQzLhDQzlUli4YLjWSnWoxJvUnDi8VrjersRj7xm2Zpxc8jRNb90ww+/bh7FemTmSF4/vmuKdJitV47iObYqCw4SXqma4t5qm2nle4qOcjTdQBpraSSMgFhLI9fbfq/FWNjHv2O/bb/+0DECwAKkTVpRgjT8VQia6WHoAauT4wqpQEAO4x0IZnM6F2qrVfqVvorC1VqMEAlu7FCkIrU6/Oqt9CN8yQwySviU0aXkywrCkZdn3w8t5pHEIABAJWUkHlh0ClYwQs0aZAhjXH3Ewhsz3KFy8JAioUZcNNRjBl38ySc+l3i8U1Q4+vadnehptJc8TpMa8Tj7rhc2u/2u655JHEsrO9+PnsZiLRIXt6VBumtJtJOApdJWJR7B//7QMQGgApFNWdHmGf5YaItNJMh3yRBqMIEkn2PnrJ+pTdQ/kHnUBnJoUsaIECnzp3rvHZKWc1Wgm35Dxh8i/sLTgYh4SkV6ZEWTZOTNsRLfOi0+z8iks1Bc4BDSacabbUgBvAy9tvbJQEtFJrkrgzsa7wogFI10HGHWhX35BtPMztJnPFJvf42YLJ6uYiwl1Xn9rf+2kiedZNqI7/q1rlFCAOj1MRJmkdLnERET+n7nYClAIQw//tQxAGCCsD3UqwlAvFNompFgyE2ok/uTNcYJjqYVQWKUYoiUHAJixBU35R60nOVU30P6IHIsJ3BL1xcx47+3gsoypi+zhWuElBWB9ot/xVFNh04/ZoX04uqaBMcbJsiMDjWHz4nn+k1jVAoqXJUmxSUPnGb0D0hqgfHWTnG1oleTupqraymueBuVr7mrTom/Ymvvs9z1n61luazDhU8jimhKd+LgiKGb19wWzdWNCi1T1Pc6Q0IHp1vXWoAIKck/BvmgTNb0aTrd5pESpabkf/7QMQKAApo8U7sjK2BU6KsaMGifloZiaHCgT40DAzGcKDp4xBcol7HrcSuseyahzshlcBrysSgk2r1KKnKhJ2u+6uqKvsZeqACB1g6FUHRUMO+6oEar0201GAaAeP2DJ+1aZD6w29u+y78e05Irjw1fx+B2IwQAEKbwGLvKXc6TeKIfh2FNaoM5g2MC3V5GbN4w5Bsv5y39KAEFxdDu1jPT5xKLO8gW8fVAAAJJQQEMtWdnL9W//tAxAYCCpUVUS0gT/ldnmkNthjZIlUnaeG7nI5LsqtWtaHI+6DYc2ySpJaXWuKp2Fj2xxtVrXMqRNXTKUFzChi2W5QdvBNVM9u115kHBvt2RnuhQoN0ehiP9XBq2AknMAYpNGTEqmjkNhSShhMYrAdLR8E3NmSAtLrTvKM3GY9RIVW19f2lnd4c4gpnfv/A3/L1zGm+74/Lbdm7ZbTN79nG/azzqr78/q6be+BBRaFXvv/ACgD/+1DEAIIKrRVZLCTBsVqiqI2jIeAFbqqcBCVjQkcjOrIiOScUCilTHDohtN0QHOJ+cwxXpNe7EMY9xc9Sc43/ukd+us1WKhnk6GFbPxRp7z2f8xzJ+v91Ctjv/9rP7s0lBu/PLS396xlBFpOgAoAddoMDpM/TdKZUxMAqxl6YnZduGYxGbPL7GIhQ47jnxMUDZJJVXkWhM1NLosebvPCdF078LF32K91tAiLEJxt7dVCr8f/dzU/QUmu+P26+6NUFEN4AU0OFgLmoSXiZTNNT//tAxAgACqEVQmykq4Ffoquo8yG2UUnmkTQFnx2QaBBJEbUJmF0ibG9QwWSWr7Tr6WK7YwQYzr2FbFdHRbI/oPLIx0LFipXk6IVFf0xY7rwUejPJLlalxx0qAC6tONtMA5SYqCDSXMeDqFBRhbmkxCzao7Hu55svitIPsIq6ZxaBo8u9MHB578tRZHtDQYXI2XurwANttRRimz5DwTd28ZNK1pH31stKOMVVuV+av9hhsCSTJwD/+1DEAgAKwPlEbI0zyV2f6eWRmX/3+N2lSKRzBZIxd321pZRXfu1D9apailmks5b1ShnSqzwItoZCqAcOkh0UPJ/rqW/Pift8AjypDgJidTe2ijk0HKGhF2lPIgYIbfrE5Fl5r0H7ABQYWZgNqMQmwRInJlfYjFpdHLRAgMGESxPSDOihxuNClBk1M6a5Wiv69nlsPaWZZSMI1tO/hDwRgoJlx1MiRnah8yuv3jpx9ztWPJdDH1v2NqLGcDVklQAFeKTSUAMoEoHOjJwgifjN//tAxAiCCp0VV0wZA/lsImgNpiD1oGOg0/5u0NSk4bGfKww+44Ni2Ksme+W+T7i5JO9pOg85ut9omqW4qlTrv5RvkbWPt1+EU6Y0lh5kWlprCXeciBE0vEQBRKgB6F4CviUJWpe6kVBXEDR85N2TZEceHjZFRttt67HVe/zzBsUlaKQMqZhpqBG6MiZGWfV1DzY6n2jqTLRZmLV6mLpKn7i4F6rRuJeVjrMBcnKz8c/c48dMABD/+1DEAQAK+QFPLCTF+U6WZ02zDdgcqqwI3s0Ij3oIkDBjS6NpSSuaS1s8q2lhORoZPl/P1ZJrhqan8tZi8ufn/W37aUfasyHkvkNvaxsZU5jatqnuVS2SQxf/3rjtsoCzHp75cwgqmyuncAJUlAOKNzFCoWTBZaRUL/MUjCBsanoadBypuanXHJpjUjGBRRJZp0ZBROVV+tRgYVS9YnMuNIXzNhA08paZkJrwhQuljJgJPWKB4fjxWJRCE+utFQAirKB3rFoigBi72KKtfZpE//tAxAiCChjVQsykafFTFeaNt40xLD4th43M00oYihvyUQvarZHVz1Q4VajV5XPMwiwh/1gslMJgzDoXcF0HTZDhsENvLXfDJwUYxriUDmT5l/RYSABlwAOYmQqkmBg4GNAsGp5Bgo3QLBqbxdyUhij+cj9UROV2wQ2PbDdhIY/jYi0S3g3gmYvajI0KeN+Dm15fh5BFRSVc63fIgGPuLKHZalYCO6mdoOUAILbsABu5RnOhd5T/+0DEBgIJhL8+7TBnUVgWZk3MoDjJn9di0NpwKnBWE84SXWHyQ/r72XO0HAXmVfhAjjbmAggFVjHMoS4ARmJQ4Rm+X4mHvMcSEQTscUEcB9CEOsI0AF3YAGXLeYcP52RiSCNQGRECSOsuUOas7SmqlzPGav/BXXjik+H+HIKbD2Q9VVFCBAFcY8NjM27S6Pvs2lrs3i0uFSLh+1Oi/VZpFGNMrBLOZ5RcyMQqACdAAOmWPPlOwv/7QMQFAgpssyxtMG8JUZhmHaSOSPMwXJrgiDExM0J0wYIkApfpETKRTCV9p0QOAVUWBKsHIlkAwQCGY3jJ6gqwwRJfznXamZZmAlb7qh3yI8ODfriPk+o2F2CpfH4BALnoAPx+OmzMszX0HKhpiYQUBh7E2QL8V63JcixJlH51HfizXX1tU08o4IoH1E4KKH07z2Kkjlc4cOHVIAcpul38j/3IqRhgZiDCQviBnPQdOu+mADmo//tAxAGCCmSzLm2kbsE1GGddphiyAMZZDhbFkgOPlPpZJzDQOu0RgaBbWW5l7kFFTKONniRoiiekINBkxLRcsHyx1HKANVnEIcHfUU5d6WvmAw4ZvtkVzLWmwURB3MUeeqxM+7SUFOWAA3bs9AIt4BQLIlvC4Mi2VlDrZILKmR+VG4jX1qR5C0dB2pdFVpQva76xTvT9Cu9osfq8qYb0yezuu/uMdNinvnx8udsDwI+zxNUFXfD/+0DEAYMJYLMybbBswUSX5c22DagAFyBpY+mWrxhZaVc6ETFGl08UXKwCYYXjEVhXYrvfEdI/id4YQVhMEHvcEdRfAm6eCN2EthmzVlVKtuh+OUXYMLGGsKzUYq0BS+AA/0vNjNTLWJLwaAEqgEDEwHIC9kCOShyQUYkOQVjiOyYyJ1CbQpQYdoncXQyzfupf2VOnQ5Hgx5m0W0TGX+SyGvqpEj0gMPbacMEQdRQqBU/AAPecDf/7QMQDgwoIwS5tsG1JNhdljbYJ4WiYwJECDkEBSJAOHZMttPttX7Z7DLExSAIceNVzBW7YTrMNFKL22U97QPxLJYctbHIwNkpTw5fDaaBw1BG9qDJoRIIYkdVqQTFBUmAAOzhykiM1Lh5ISgSHMTCQMJpPrdZ1D69m8h2EqOvuO4LvSSbpROIqb2IH4Ngeu3W9KJPwiAnuw6GBBUaQtjPJs6tXfOyQdkoC4lIG8AOU/jTEI5IN//tAxAUDCTCVLE2kbxk2j6TNzCRxKqHHkeUBay2JJBvczBWyIpiQKpGLBkhLmQ8bgHxaC62xOroEcYnmviTdvunWHvSygnmXowvYGZxUAmga3cu/MAOQAA4KxTFjMEjSCicisanG1Js66oWOytu8BJ7I4v5FmgtycZXk5YoOCA3bQoPitEmeapQobr0+v9qPdv+1eVFpOqTkquvtbv31+GOu1QCnAADtRVMUOUzcBDI44AZZm8r/+zDECYIKJHckbmUDyRwVpx2mGN9QESCJIGKcVSwiBToIjZpcCF7CaVqMxTxeQp2ALALFKeEoaB4RRhiBid24ZS+dPefJzydMzFU++nhJxJP+iayXGwADllB5qRG1RJArgXyvwWGK59GkQHUxMTMLhcJsZUastOC/Tf/4s8cQ001DMzBIXkogTl+E61/M5qcan2y/JsyOWMajKgD/+zDEAIBISIVLrCTH+QuP5c28GC0BDE3JdaAATILYttbu1srFrEJrscMAWhxKoTZ6cqSVbGSSCjdn2k2uSwhFVmsjjGTMTeBliVv9gkXAGRMu1f/Lg4KWnLoIk1gtAsFgyVygwUQ6bM4/FKZ1m4iAgMAgUwMVJEmmz6xfMJM3ZF+Ufz3m1WZDybpeWMT4j2+u+OvuxmLvml1VADj/+0DEAQMI/FEibmUhyVETY83cIHnAANoYoylIgxU63lOmfm0wNcBQwAnJoLBlvGKKDOe5S75toLYZlsoBgFAkaKG0S9KKyRvdqMOhesadwNNJthPrUPvR3922AZEAAY5TaCEFM6CjMQw3AwBBhENOEueONAUltI1AYScTDK7J3oYQ0V3nQ3A6nIfBwHAYCEVD84MOUNCsSNg/Raq49bFSGqWds2aeqWDqgY8VDsz9qgLAA2jh4//7QMQDAwnsfxxO6MXJMI/kDcygeDgV0zfBUeGsMBcwpC44zYUBBmUVLNuJKxoQoKgSi7DmR3ptX7sOVHKdmKkJa3sfukVjao3gZRmsDPNRmsV/pB87MX8nkRV03pugKRgAH1h2ZLFA0vjBIdHlhFSxtEcwBEP23ayrVHVBGnMrhiTtdl9PFZTkqqCKFHiQaOKIIpBg5e9jpfqHheIH2xrHgcYcAgrgvrVc+gAAgSYnLGAAB4mY//swxAWACLCHO6ywxfkbjuSNthkZg0ZUi97wVRnpCHOJhJEh1drR1ynUKpEZ0Zl140f8MpMZhsyhplPZ6NuMXemWbckcNLwSazA8CH69/6Be1AANwLD9kAvAJAqw6dKV6XaaiM4KGYDxOHFoNDcsCGWF5E4EJI6CXtwmNnyQr8xXyMmMWNZ1mI82VXLka2IqQhbfsfvSlQuQA8k7//tAxAKDCaRrGE5lg4k2kONJ3SQ4xLxGoBOZ8AI6CZkJtnCZ5MSPIMvSLByAqQgpfjTwqqwKxNzgUXLScHpmc8XmUXv+xp+/l4Gf5qGN263hpQHkRj5VH7/39f79g/ABz2yxhiHJs+pqDCNqS4BDmRIN+VQMaXOgLR1EIB4FkIfylMpl73guFQRA8M4SkM3EkoQ8Qr1s+3ubl2xcPCoyq8l3txvDqXhQc+mpACEs0AAeSDoGyJn/+0DEBYJI+IUi7jzHaSuQ4oncsGiMTCMQoDkRS25fIkQGA/TkGw8W1EX9HM7KkJGDuJ0kbK1AkXn16CFo28ckVHdu3vpQlGOUed6Wa9PbLudsHT2FWzSQFzNUCAMCxzan+4YQqRyZQJNRdWQMGkwBeBR1RB0SUIo4llgXiITxgOKeGB012Djjj5621dg/tr0GW3bUm+1tm45acStaAGpdGAAaxfERmd0POoow4vyxAHRIfLI0Av/7MMQMgggQaybt4YChMw1iidykeGPlkNAbghZYZejZ22cx2bq9tnustgtbsn6NecCJ54eCciNSaoenToBoADU6HzWkdDLQNgAIxuDl1RQ8BSC9BokMSKwUEpKEGKP8wpl6OFG20acKWPe86GaNNAmOyWz2tLXwzGalng/pCBM2Bi8rE9YiJ+xyKhuQA/acDBIZMkjEw6IgG6dJiv/7MMQJAwjEbRZOZSOBHo0iid0wKKpmEGgEOEozxcucx4axkjCWhQK0x1nzWNiEkWYe1K5N5F9ptw93mS2t7muLBWKwBnXir/UPgAHChzGsyMG8OHjmjV0HbSKSZ4YW1HBCA6HEvUGELB/OggEQCyglFgrkgYnLBbVtxKObddmC1/rHzP7bGng2DATW8iE//6YGAAM/c7MXT/GgIP/7QMQFg0nwaxBO5SPBLAuiSdwYeMGhOFUDH/EiCdEILDGZ1QwKtAUYEAl3UqUi0x3XSwlsFzz0OEIUAaaISAI04xKKcq9vqV577sOmp8PERD+39//7f/2eoGTbGTDAoojEkHgEJZ5MWAlsAyh1SXaglkxQADCSTaGxhdynUMxV7I1EJVI/I5a6l0Zdl/KaekIhwqMQEBoqwZL3Pb/////////+6h9AA8Mdkw3Kow2JMxDEwwBA//swxAiCSMBrEk7lg0EMDSLZ3LAshwC0GtCGBiIFNRNNIouq/SwDVVWkcJFSxoOLauKmQ3XT/xduRbamR413s2fiGgUJNJD9lWkK+HKorGF5mhTEAxkRpqhGIdbe9Vagla1YvGD0SFwUFM3RoR1el1l2pSGsLNWsSTvy99vot+i8kOB0gRiwT1YtbfsoAAAAAgkjAAB6LNGViYcf//swxAeCSRxrF65lIYkxDWHF3CRypEkRRCSBjpIqO6u91WYMuXyt1gELiYCkjMcjAHBEKiQ0CMY6nCKOsS7ZSnRnOEWOVkBz0w3UufZH0mMa5zM5VkMTCPMeRSMpQxhq8Nfh5dC74gFAreCKLxZq/DgQ5doGBVombOHRdEpCcqq5wdls+8hvx0hdoImT7CSqtfxF9P9nb/q///XV//tAxAACychPDk7pIcENCeHV3Jg4GgADkOnDHgMj/STUCRUABVBiBRn2RMaSLgoLgy1zDSIKyh2mIsrfeJwkgGlVzPYacxO24WicCgwRg2NKCHRNJ/Rvd8q51H7rv/6v/+n6QnnSng52T5HAI4skQMroBZSF6mDS00gYC1sMBpG71HmkLV9880ACsutaMVeQmZATUmxwqwUQl5ER3f/////9GBf9fvUAAAl4AA7XJw03CAy6Daf/+zDEB4JIrF8PLuUhgRkNYdnMIHDUCLkgIIOnJji7zYWYqTYUv2Lwa7TZkBlD4noHhNEgMG4EMVc+XP+T+k8sFiYSZCbA2Hr9aaEhPg9RlDI5JFAsEJQLeHFAoIt9CJmLYJIlyz+HZNTuZAkzDtPJlAMzDQ/pOT5NkdVe6LvD7kjD6FSRL//////q/r6f/1eQaj5AAKymYkEocAn/+0DEBQNI6F0OTukhQSoMIYnMmHCaJWLQC14oDARtHJXz7MwWd79MCADQKhQEVGloiD6y+SVtw3wI5VHHtvYSKixCTsFBdSX////7//935X9zR0PR9Y1sNwNBSgYHEMIhQASDk3LUNQNfdHBZbOY3YfGBJdFsQAD0QdGdcqNNfzPZTRvLsBigw4kc15f9Hu42i/9fV/t7f/d7uzhGYA5QTcwJB85PTGAHlTseEbaOKnTxLvn2TP/7MMQMg0k0Zwou5MHRKg0hSd0YMEgbeOJp/pPD9Hwmfg+BZb0ZeXs7CzrpmZ20+VXcnvei7vpFv9qf/sv+izWxCvo/20roPgWZBlUbhQHyFKIoQDWYNxLmuS3rMLKeLbvC7IWE4tEyiCFz3fliL+ZT/Phu6QpCQSC6bI1Hr/09FFKLLuP/1I+zq6T73X9Py9UALUgAe82GmSZiyv/7QMQFgklIOQzN5MGBN4bhSbykKKHOyWlTfAwkbUqg94Iu4bLIw8DbD4CUmq7GnicEAWFmpDkChMOjzo4GSA1gu0WYBjikft/6un/1/o39F77e+hZDZj04wLPMEchCPl6sjAgBQEwN+YmvBxaUBRsUIKFdZuqsh954WLlV3gdhkXfHrF1Jj1u1uusFiiU1/kndSW3fWnr2nEWbEI6b61MFdKoAbUAAfChHevBsG8wYpeURSQbZ//swxAmCyIA1DM3hIMELi2FBvIw4wFlROygCwYM5SPVrpkCmwyokZIiQ0YQwksiJmqc9i1zH4p6vXPf0dHu/Zb7NlXq2aDzCoxVVMTY9TSIllKvChxlT1xrUESW9JZu/Zj/cMFA3VR5mRL0sGw20aBlmwMgghALv7Gt/9m7/ovq2Xf1r+28ZZ9MZAANHxTDlIWCKHUPCxVWF7ToJ//tAxAmDSmwrCE3h4IEkDeEJvBQoRI0DLViebmFUs7a8Ax4iZBfAhEakAkyQ0qDzWGCQaYm1pmKSTsa2voFd7C59NNcczoUxl5lLmr6YpbQ2S9iGLUUhr9QauLniwHGoOhwWQoK5kFwBLYYktdsPBAVTVDKuTfO53YjXIl3S4vUhqS9XPX2JurasU+6pl70i3jmHEPSjc30+a9F9Y3JqZQADlG0x5LQAI4KrssSoQEgyQGgaGxD/+zDEC4NJdHMITaRnARULYMmmDOCspDmloyhzQ96zWWlQYjM3TnlHhQGGWlZQoh0pOXsnUUInfQ+UehNbVrFn6l00UXs7/5zqWSh9TokeIliKCgaerGHvGRPNX0nrMs8is9cjVle7tElMOJwdWi0jlg6IwMaLB4KAdpJpze3wJVK7CUbW0xv//V/0Ju/o2xjEFiqXKIb6K8SGkYT/+0DEBoNKDEEEDTBmwS2QIIW3oFBKb6J5fNIW6VBhKX6CzIEBxABBQ8aBIc4mYEYaHBNUcYFgCGRY4liwHGKSlAVl3rbIkaEE7uw9Zc+511r2rQunR7WdXjcJtliCroK5IIohxDn+YDymsKmmsZF7vWN6i3OlxUebCPUWrTVZeYl1mPFmLPrLARTj1sLNUYW7ih+XsNDWvucCB1v91nZdt/0/oUAOdeC0iQMDN0XvDSVzr1ZoFf/7QMQJAko0ZwItmGiBMJRgWaYYSCKSNP5JQWsYWlWoCXEPj+muEUWOCAwMlYjWWEQ8cTEjECQxMvSfLJ1HWHjTklUy4Xfimp86QbwlI4vvs09er1hak+0kRExoGsriy+LyBJg5wk2DZlVWbi7EeCzabvJ5IV0q1I3T9fIedIn4Rfy3MTTwxvt1refeGI0WaRdS9+V2Jo2fFF7P0v3Zj9mlOKkBQ9mzuCLZAF5iibnjhBTIWkIS//tAxAqDygx0/g0wwwEyCd9BlhiQiTSyC9cimcnE0SbtiDvMvOu23layJQHRC8JqRCRsBzKxjAdHUiyBIfONSWqKtlkVbV7RSjT23apX6m3DZCZqAtNRi8GFV4shUW3oHESCqLCZxVwTKgwk0kkdj6mAwqyChgMJOkQMfEJ5oTOPlCKhaksNBO0e/ELiiJYclNa9+y7b3V7OtPb/1CAMMEooCVMbJgMgk4dPkoVYIUQpk9zS01v/+yDEDINJzG74LCRjwIIE3ISTGBUFVVlJloCUOOVnmMHEC0sgwEBwcJRw41CjQVFSoSSxgNXLKqktCjSpo09t6NvUmxTa/+/o/awKlCaC0SQKKAiaC1JInGlgaoMShu//qmWCagxYJKX/+0xBTUUzLjk4LjJVVVVVVVVVVVVVVVVV//sQxAuDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDENQPAAAGkAAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==";
-	sound.src = audiotagAudioSprite;
-	sound.load();
-	console.log("--audiotagCreateChannel "+index);
-}
-
-function at_imp_mandreel_audio_playChannel(filename,channel,vol,loop,pitch)
-{
-	at_imp_mandreel_audio_stopChannel(channel);
-	var fileNameNoExt = wa_getFileNameNoExt(filename);
-	var time = maudioSecondsPos[fileNameNoExt];
-	if ( time != null )
-	{
-		console.log("play "+fileNameNoExt+" "+time);
-		if ( maudiotagAvailableChannels.length > 0 )
-		{
-			var sound = maudiotagAvailableChannels.pop();
-			var duration = maudiotagDurations[fileNameNoExt];
-			sound.currentTime = time;
-			console.log("OK "+sound.currentTime);
-			sound.play();
-			maudiotagChannels[channel] = sound;
-			maudioChannelEnd[channel] = time+(duration/1000.0);
-		}
-	}
-	else
-	{
-		console.log("not found play "+fileNameNoExt);
-	}
-}
-
-function at_imp_mandreel_audio_stopChannel(channel)
-{
-	var sound = maudiotagChannels[channel];
-	if ( sound != null )
-	{
-		sound.pause();
-		maudiotagAvailableChannels.push(sound);
-		maudiotagChannels[channel] = null;
-	}
-}
-
-var mandreel_flash_socket_callback = null
-
-function mandreel_flash_sockets_load_flash(callback)
-{
-	mandreel_flash_socket_callback = callback;
-	var failed = "";
-	try
-	{
-		var mandreelSocketsSwf = g_mandreel_working_folder+"mandreelflashsockets.swf";
-		var swf = swfobject.createSWF({ data:mandreelSocketsSwf, width:"0", height:"0", allowScriptAccess:"always" }, { menu:"false" }, "FlashDivSockets");
-		if ( !swf )
-			failed  = "Unable to open MandreelFlashSockets.swf";
-	}
-	catch(err)
-	{
-		failed  = err;
-	}
-}
-
-var js_mandreel_flash_socket_swf_loaded = false;
-
-function js_mandreel_flash_socket_ready()
-{
-	js_mandreel_flash_socket_swf_loaded = true;
-	if (mandreel_flash_socket_callback)
-		mandreel_flash_socket_callback();
-}
-
-
-function Mandreel_Socket_InitLibrary(sp)
-{
-	//mandreel_flash_sockets_load_flash();
-}
-
-
-function mandreel_flash_sockets_getFlashMovieObject(movieName)
-{
-	if (Mandreel_window.document[movieName])
-	{
-		return Mandreel_window.document[movieName];
-	}
-	if (navigator.appName.indexOf("Microsoft Internet")==-1)
-	{
-		if (document.embeds && document.embeds[movieName])
-			return document.embeds[movieName];
-	}
-	else
-	{
-		return document.getElementById(movieName);
-	}
-}
-
-function js_mandreel_flash_socket_onError(message)
-{
-	var id = parseInt(message);
-
-	var sp = g_stack_pointer+512*1024;
-
-	dump('on error ' + id);
-
-	heap32[sp>>2] = id;
-	mandreel_flash_tcp_onError(sp);
-
-}
-function js_mandreel_flash_socket_onConnect(message)
-{
-	var id = parseInt(message);
-
-	var sp = g_stack_pointer+512*1024;
-
-	dump('connected ' + id);
-
-	heap32[sp>>2] = id;
-	mandreel_flash_tcp_onConnect(sp);
-}
-
-function js_mandreel_flash_tcp_receive_callbak(message)
-{
-	var strings = message.split(' ');
-
-	var id = parseInt(strings[0]);
-	var data = strings[1];
-
-	var sp = g_stack_pointer+512*1024;
-
-	var data_ptr = sp + 1024;
-	fill_ptr_from_string(data_ptr,data);
-
-	heap32[sp>>2] = id;
-	heap32[(sp+4)>>2] = data_ptr;
-	mandreel_flash_tcp_receive_callbak(sp);
-}
-
-function js_mandreel_flash_tcp_update(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-	var size = heap32[sp>>2];sp+=4;
-
-	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
-	flashMovie.receiveMessage("receive " + id + " " + size);
-}
-
-function js_mandreel_flash_tcp_create(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-
-	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
-	flashMovie.receiveMessage("create " + id);
-}
-
-function js_mandreel_flash_tcp_connectTo(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-	var ptr_string = heap32[sp>>2];sp+=4;
-	var port = heap32[sp>>2];sp+=4;
-
-	var server_name = get_string_from_ptr(ptr_string);
-
-	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
-	flashMovie.receiveMessage("connect " + id + " " + server_name + " " + port);
-}
-
-function js_mandreel_flash_tcp_close(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-
-
-	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
-	flashMovie.receiveMessage("close " + id);
-	dump("js_mandreel_flash_tcp_close " + id);
-}
-function js_mandreel_flash_tcp_write(sp)
-{
-	var id = heap32[sp>>2];sp+=4;
-	var ptr = heap32[sp>>2];sp+=4;
-
-	var message = get_string_from_ptr(ptr);
-
-	dump('js_mandreel_flash_tcp_write ' + message);
-
-	var flashMovie=mandreel_flash_sockets_getFlashMovieObject("FlashDivSockets");
-	r_g0 = flashMovie.receiveMessage("send " + id + " " + message);
-}
-
-
-
-function js_mandreel_flash_tcp_dump(msg)
-{
-	dump(msg);
-}
-
-function _GLOBAL__I_Landscape02Vtx(sp)
-{
-	var i7;
-	var fp = sp>>2;
-	var r0;
-var __label__ = 0;
-	i7 = sp + -8;var g0 = i7>>2; // save stack
-	r0 = _ZL10raycastBar;
-	heap32[(g0)] = 8;
-	r0 = r0 >> 2;
-	_Znwj(i7);
-	heap32[(r0+10006)] = r_g0;
-	heap32[(g0)] = r_g0;
-	heap32[(g0+1)] = 0;
-	gettimeofday(i7);
-	heap32[(r0+10001)] = 0;
-	heap32[(r0+10005)] = 0;
-	heap32[(r0+10004)] = 9999;
-	heap32[(r0+10003)] = 0;
-	heap32[(r0+10002)] = 0;
-	return;
-}
-
-function _GLOBAL__D_Landscape02Vtx(sp)
-{
-	var i7;
-	var fp = sp>>2;
-	var r0;
-var __label__ = 0;
-	i7 = sp + -8;var g0 = i7>>2; // save stack
-	r0 = _ZL10raycastBar;
-	r0 = r0 >> 2;
-	r0 = heap32[(r0+10006)];
-	heap32[(g0)] = r0;
-	_ZdlPv(i7);
-	return;
-}
-
-function _ZN15DemoApplication6myinitEv(sp)
-{
-	var i7;
-	var fp = sp>>2;
-var __label__ = 0;
-	i7 = sp + 0;var g0 = i7>>2; // save stack
-	return;
-}
-
-function _ZN15DemoApplication16getDynamicsWorldEv(sp)
-{
-	var i7;
-	var fp = sp>>2;
-	var r0;
-var __label__ = 0;
-	i7 = sp + 0;var g0 = i7>>2; // save stack
-	r0 = heap32[(fp)];
-	r0 = r0 >> 2;
-	r0 = heap32[(r0+1)];
-	r_g0 = r0;
-	return;
-}
-
-function _ZNK16btCollisionWorld17RayResultCallback14needsCollisionEP17btBroadphaseProxy(sp)
-{
-	var i7;
-	var fp = sp>>2;
-	var r0;
-	var r1;
-	var r2;
-	var r3;
-var __label__ = 0;
-	i7 = sp + 0;var g0 = i7>>2; // save stack
-	r0 = heap32[(fp)];
-	r1 = heap32[(fp+1)];
-	r2 = heapU16[(r0+14)>>1];
-	r3 = heapU16[(r1+4)>>1];
-	r2 = r2 & r3;
-	r2 = r2 & 65535;
-	if(r2 ==0) //_LBB4_2
-{
-	r0 = 0;
-	r_g0 = r0;
-	return;
-}
-else{
-	r1 = heapU16[(r1+6)>>1];
-	r0 = heapU16[(r0+12)>>1];
-	r0 = r1 & r0;
-	r0 = r0 & 65535;
-	r1 = 0;
-	r0 = r0 != r1;
-	r0 = r0 & 1;
-	r_g0 = r0;
-	return;
-}
-}
-
-function _ZN16btCollisionWorld24ClosestRayResultCallbackD1Ev(sp)
-{
-	var i7;
-	var fp = sp>>2;
-	var r0;
-	var r1;
-var __label__ = 0;
-	i7 = sp + 0;var g0 = i7>>2; // save stack
-	r0 = heap32[(fp)];
-	r1 = _ZTVN16btCollisionWorld24ClosestRayResultCallbackE;
-	r0 = r0 >> 2;
-	r1 = (r1 + 8)|0;
-	heap32[(r0)] = r1;
-	return;
-}
-
-function _ZN16btCollisionWorld24ClosestRayResultCallbackD0Ev(sp)