[
  {
    "path": ".agignore",
    "content": "lib/*\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\non: [push, pull_request]\nenv:\n    CI: 'true'\n\njobs:\n    test:\n        name: Test on ${{ matrix.os }} LANG ${{ matrix.lang }}\n        runs-on: ${{ matrix.os }}\n        env:\n          LANG: ${{ matrix.lang }}\n          LC_ALL: ${{ matrix.lang }}\n        strategy:\n            matrix:\n                include:\n                    - { os: ubuntu-latest, lang: en_US.UTF-8 }\n                    - { os: ubuntu-latest, lang: de_DE.UTF-8}\n                    - { os: ubuntu-latest, lang: hi_IN.UTF-8 }\n\n                    - { os: macos-latest, lang: en_US.UTF-8 }\n                    - { os: windows-latest, lang: en_US.UTF-8 }\n\n        steps:\n            - name: Checkout source code\n              uses: actions/checkout@master\n              with:\n                fetch-depth: 10\n\n            - name: Set up Node ${{ matrix.node }}\n              uses: actions/setup-node@master\n\n            - name: Install deps\n              run:\n                npm install --no-optional\n\n            - name: Test\n              run:\n                npm test\n"
  },
  {
    "path": ".gitignore",
    "content": "# use glob syntax\n*~\n*.swp\n*.tmp\n*.orig\n*.pyj-cached\nnode_modules\ndev\nself.cpuprofile\npackage-lock.json\n"
  },
  {
    "path": "=template.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: %YEAR%, %USER% <%MAIL%>\nfrom __python__ import hash_literals\n\n%HERE%\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "version 0.7.23\n=======================\n\n  * Fix consecutive of f-strings without concatenation operator causing a syntax error\n \nversion 0.7.22\n=======================\n\n  * Fix assignment operators other than the plain = not working with overload_getitem\n  * Fix dict.popitem() removing the first rather than the last item\n\nversion 0.7.21\n=======================\n\n  * class decorators are now called after the class prototype is populated\n  * Fix len(range()) giving incorrect results\n  * Add support for {var=} to format strings\n  * Fix unary operators discarding parentheses\n  * Add a __module__ property to function objects\n  * Get isinstance working for int and float\n\nversion 0.7.20\n========================\n\n  * lint: Fix using a tuple for destructuring assignment not registering the defined symbols\n  * Add head and body and base to elementmaker\n  * Make the gettext tools available in the embedded compiler\n  * re.pyj: Allow lookbehind assertions since they are supported in modern JS engines\n\nversion 0.7.19 \n========================\n\n  * Fix calling super-class methods in a method accepting `*args` not working\n  * Fix list.pypop() removing the first instead of the last element\n  * Fix exponentiation operator being used when js-version >= 6 rather than 7\n  * Disallow assignments in while conditionals\n  * Avoid unnecessary function annotations for functions that have empty signatures\n  * Fix handing of \"not in\" operator when LHS is also a binary operator with higher precedence\n  * Dont accept while statements without a trailing colon\n  * msgfmt: fix parsing of escapes in msg strings\n  * Fix missing enclosing brackets when translating an assert to an AssertionError\n  * Fix comments at the bottom of the file not being output\n  * Fix comments before first statement not being output for imported modules\n  * Fix outputting top-level comments preventing output of baselib\n  * Allow using NaN with the is operator\n  * Fix anonymous function definitions inside class definitions hoisting their variables into the class prototype.\n  * Fix gettext catalog generation when plurals are present\n  * Fix int() not working correctly on floating point numbers which have exponential string representations.\n  * Fix encoding of \\u00ad\n  * Fir repeated calls to random.seed() with the same seed not fully resetting the RNG.\n  * Fix an error in handling chained binary operators involving comparison operators and an equality operator.\n  * Ensure repr() of set is always correct\n\nversion 0.7.18\n==================\n\n  * Support the else: clause for try: statements\n  * Use the JS ** operator instead of Math.pow() when --js-version > 5\n  * Detect syntax errors of the form atomic token followed by atomic token\n  * Fix ** operator not working with parenthesized unary expressions\n  * Handle changed output from newer version of regenerator\n  * Detect missing indentation for blocks as a syntax error\n  * Linter: recognize pow() as a global function\n\nversion 0.7.17\n==================\n\n  * Fix attempts to access calss variables from inside instance methods not\n    working\n  * Fix stdlib random.random() method not working in the Edge browser\n\nversion 0.7.16\n==================\n\n  * Fix using function generators not working if installed version of uglify-js >= 3\n  * Speedup the compiler slightly by making reading options more efficient\n\nversion 0.7.15\n==================\n\n  * Fix , flag for str.format thousands grouping not working\n  * Fix iteration over TouchList not working in Safari\n  * Fix }} escapes not being converted to } in f-strings\n\nversion 0.7.14\n==================\n\n  * Fix }} escapes not being processed correctly in format strings\n  * Fix function definitions inside loops causing errors on ancient JS engines\n  * Fix --js-version command line argument not working\n\nversion 0.7.13\n==================\n\n  * A uuid module for the standard library\n  * Implement the full python interface for the min() and max() functions\n  * Implement the full python interface for rangeobjects\n  * Implement the divmod function from python\n\nversion 0.7.12\n==================\n\n  * Fix == failing when one of the arguments is None and the other is an object\n  * Make the range() function return an object that behaves like the python range() object\n  * Fix de-structuring assignment not working with iterators\n\nversion 0.7.11\n==================\n\n* Fix slice assignment not working\n* Implement the global keyword\n* Make list.pysort a stable sort on all JS engines\n* Fix a typo that broke the REPL when XDG_CACHE_HOME is an absolute path\n\nversion 0.7.10\n==================\n\n* Fix passing of keyword args to the dict() function not working\n* Improve the string representation of dicts and HTMLElements\n\nversion 0.7.9\n==============\n\n* BACWARDS INCOMPATIBLE: Make the `type()` function behave more like python's\n  `type()` function. It now return the class of the passed in argument, instead\n  of a string type name. For existing code that use `type()`, replace `type()` by\n  `jstype()`\n\n* Fix multiple newlines not being properly escaped in interpolated string literals\n\nversion 0.7.8\n==============\n\n* Fix --cache-dir option defaulting to current working directory instead of being disabled\n* Fix display of option names containing more than a single hyphen\n* Fix including backslashes and/or newlines in interpolated string literals\n* Fix spurious error message from linter when using interpolated string literals\n\nversion 0.7.7\n==============\n\n* Implement literal string interpolation (PEP 498)\n* Fix incorrect method binding when using the `bound_methods` scoped flag and calling the super-class `__init__()` method\n* elementmaker: Ignore kwargs that have types other than bool, string or func\n* gettext: Allow registering callbacks for notification when new translation data is installed\n* Fix a rare crash in the linter\n\nversion 0.7.6\n==============\n\n* Fix nested imports beyond two levels not working\n* Fix iteration over NodeList/HTMLCollection not working with ES 6 output in Edge and Chrome < 51\n* Add WebSocket to the list of known global class names\n\nversion 0.7.5\n==============\n\n* Add an option to have the compiler generate all its cache files in a central\n  directory. Use --cache-dir if you dislike having the `*.pyj-cached` files spread\n  throughout your source code\n\nversion 0.7.4\n==============\n\n* Fix piping data into rapydscript for compilation not working\n\nversion 0.7.3\n==============\n\n* Fix extra-semicolon after chain assignment, and also avoid using a temp\n  variable for non-destructuring chain assignments\n\n* Fix a bug in the compiler cache system that could cause the compiler to\n  output incorrect code when re-compiling a previously cached module that was\n  imported from more than one other module.\n\n* Add the builtin `pow()` function from python\n\n* Workaround for a bug in the latest release of Chrome that broke the web REPL\n  and embedded compiler.\n\nversion 0.7.2\n==============\n\n* Fix multiline string literals not working in some contexts, such as after\n  return or yield keywords\n\n* Add a scoped flag `hash_literals` to control whether `{}` literals generate\n  JavaScript arrays or JavaScript hashes. Note that the `dict_literals` scoped\n  flag takes precedence over this flag.\n\n* Add a builtin function `get_module()` to get a reference to the module dicts\n  for a previously imported module.\n\n* Nicer error messages when web-repl-export is not called correctly\n\nversion 0.7.1\n==============\n\n* Make importing of non-aliased submodules `import module.submodule` work just\n  like in python (the submodule name is bound into the parent namespace at\n  the import statement rather than at import time)\n\n* Fix referring to class variables not working. Now there is no need to use \n  `A.prototype.x` one can just do `A.x` and the compiler will handle it automatically,\n  provided it knows that A is a class.\n\n* Fix a regression in 0.6.0 that broke using @staticmethod for methods that accept arguments\n\nversion 0.7.0\n==============\n\nNew features\n-------------\n\n * Implement the existential operator, see the README for details.\n * Add the any() and all() builtin functions from python\n * Drop support for the JavaScript form of the conditional ternary operator\n   (backwards incompatible). This was done mainly to free up the `?` operator for use\n   as the existential operator.\n * Add a traceback module to the standard library that works like the python\n   one \n * Full support for negative indices on lists: `a=-1; b[a] is b[-1]`\n\nBug fixes\n------------\n * Fix local variables in except: blocks not being declared\n * Make defining custom exception classes work just as in python (just subclass\n   Exception and you are done)\n * Make the default `__repr__()` method use the base class implementation when available\n * Fix the del operator: Now your can use it to delete slices of arrays,\n   variable names, etc.\n * Make the use of javascript reserved words as identifiers a compile time error, instead of a runtime error\n * Fix optimization of range() causing incorrect behavior when the stop expression is dynamic\n\nversion 0.6.4\n==============\n\n * Support for docstrings in modules, classes and functions, just like python.\n   By default the docstrings are discarded (except in the REPL). There is a\n   compiler option to keep the docstrings as the `__doc__` attribute in the\n   output JavaScript.\n\n * Add hexlify()/unhexlify() to the encodings stdlib module\n\n * Object literals now produce JavaScript objects that have no prototype. This\n   makes them more like python dicts, in that there is no need to use\n   Object.keys() and Object.hasOwnProperty() to iterate/test their keys.\n\nversion 0.6.3\n==============\n\n * Add a module to the standard library to easily add python string methods to the JavaScript String object, if needed.\n * Fix isinstance('a', str) not working\n * Prevent an infinite loop in str.count() when needle is an empty string\n * Fix default values for function args not working when combined with annotations\n * Change the prefix used internally for RapydScript private symbols from `_$rapyd$_` to `ρσ_` as it makes the output JavaScript easier to read\n\nversion 0.6.2\n==============\n\n * Support multiple inheritance, just as in python\n * Support method auto-binding for classes, just as in python, via an optional scoped flag. See the Method binding section in the README for details\n\nversion 0.6.1\n==============\n\nBug fix release, fixing a couple of regressions in 0.6.0\n\n * Fix a regression caused by the new kwargs code that caused incorrect construction of classes when called with kwargs\n * Fix a regression when calling super class methods with kwargs\n\nversion 0.6.0\n==============\n\nNew features\n--------------------\n\n * Support for function type annotations, just like in Python 3. You can now\n   create optional type annotation in RapydScript, exactly as you would in\n   Python 3.\n\n * Support for *scoped flags* -- a mechanism to change the behavior of the\n   compiler in sections of code using simple statements in the code. These work\n   like compiler pragmas in C/C++ but have the additional feature that they are\n   local to a scope -- i.e. they are automatically reset when leaving the scope\n   they are defined in, which could be a function or a module or even a class.\n\n * Support for python style dicts using the exact same syntax as in python. The\n   default syntax still creates JavaScript objects, but you can switch to\n   python dicts using a scoped flag:\n   ```py\n   from __python__ import dict_literals, overload_getitem\n   ```\n   This will cause the default syntax to generate python dicts.\n\n * Add an **encodings.pyj** module to the stdlib which is very useful to convert\n   between utf-8 bytearrays, base64 encoded strings, and native strings.\n\n * Implement repeating of string literals with the * operator\n   `'a' * 3 == 'aaa'`\n\n\nBugfixes\n----------\n\n * Enable use of keyword arguments/values when calling all functions, even if\n   they have not been defined with keyword arguments.\n\n * Fix use of `*args/**kw` when calling functions that are the result of a\n   complex expression, causing the expression to be evaluated twice.\n \n * Fix negative const index on expression containing a function call causing\n   the function call to be executed twice\n\n * Fix --import-dirs not being used when recursively processing imports\n\nversion 0.5.2\n==============\n\n * New module in stdlib: **aes.pyj** that implements the symmetric encryption\n   ciphers: AES-GCM, AES-CBC, AES-CTR\n\n * Improved support for TypedArrays -- you can now iterate over them just like\n   normal arrays and also repr() wors for them.\n\n * elementmaker.pyj: Allow setting HTML 5 boolean attributes using True/False.\n   Fix E.iframe() not working.\n\n * Make the equality operators also work with javascript dicts (when\n   javascript objects are used as dicts)\n\n\nversion 0.5.1\n==============\n\nFix a bug that caused the equality operators to not work for lists. Also,\nfix the new equality operators causing their arguments to be evaluated twice\nwhen the arguments are expressions, such as function calls, generators, object\nliterals, etc.\n\nversion 0.5.0\n==============\n\nBelow are listed all the major new features and backwards incompatible changes\nsince the creation of the rapydscript-ng fork, up to version 0.5.0\n\nBackwards incompatible changes:\n--------------------------------------------------------------\n\n* A new module/import system that works just like python's, with modules in\n  ``.pyj`` files and packages in directories with an ``__init__.pyj`` file.\n\n* The equality operators now work with all container types (list/set/dict) as\n  well as user defined classes that implement the `__eq__()` method, just as in\n  python. \n\n* Remove the `to` and `til` operators\n\n* Change syntax for embedded JavaScript literals. Now one uses a normal string\n  literal, with the **v** prefix, for example:\n  ```py\n  for v'i = 0; i < 10; i++':\n    pass\n  ```\n  The old compile time magic function `JS()` used for JavaScript literals has been removed.\n\n* String literals now behave exactly like python. You can use raw string\n  literal, escapes for unicode such as `\\u2122` or `\\N{...}` etc.\n\n* Dict literals now do not treat identifiers as strings, so you can use arbitrary expressions as keys.\n\n* Remove the ``@kwargs`` decorator. Keyword arguments now work seamlessly, just\n  as in python.\n\nMajor new features:\n--------------------\n\n* There is now an in browser REPL (Read-Eval-Print-Loop) for RapydScript,\n  available at: https://sw.kovidgoyal.net/rapydscript/repl/\n\n* There is now a linter that performs pyflakes style of undefined/unused\n  checks.\n\n* Instructions for easily embedding the RapydScript compiler in a webapp are\n  now in the README.\n\n* A new stdlib module: **elementmaker.pyj** that allows for easy creation of\n  DOM trees within RapydScript code. For example:\n  ```py\n  from elementmaker import E\n  E.div(class_='mydiv', title='A tooltip', data_special='xxx',\n\tE.a(href='javascript: void(0)', onclick=def():\n\t\t# handle the click event\n\t),\n\t'Some text'\n  )\n  ```\n\n* All the python string functions are now available, including `format()`. However, for reasons of\n  compatibility with external javascript code, they are not implemented as\n  methods on string objects, instead, use the global ```str``` object, for\n  example:\n  ```py\n  str.format('{:02d} {}', 1, \"wow\") == '01 wow'\n  ```\n  There is a convenience module in the stdlib to add these functions to the\n  JavaScript String object, if needed.\n\n* Support dict and set comprehensions\n\n* Support the python conditional operator syntax: ```a if b else c```\n\nNew features\n-------------------------\n\n* Implement `str()` and `repr()` functions that work well for JavaScript arrays and\n  Objects as well as your own custom classes that define the `__repr__()` and\n  `__str__()` methods\n\n* A builtin `sorted()` function that behaves like python's\n\n* A builtin `id()` function that behaves like python's (only for objects\n  defined in RapydScript)\n\n* Support for dynamic properties just as in python with the `@property` decorator\n\n* Allow trailing commas in function calls and function definitions\n\n* Allow specifying multiple locations to search for modules to import\n\n* Allow iteration `(for x in ...)` to work for DOM based array like containers\n  such as `NodeList` and `NamedNodeMap` even when they come from a different frame.\n\n* Support for internationalization, works just like in python (see README for\n  details).\n\n* Linter: Allow suppressing errors at file level as well\n\n* Automatic concantenation of neighboring string literals: '1' '2' == '12'\n\n* Support for arbitrary expressions as decorators\n\n* Support for generator comprehensions\n\n* The stdlib's `re.pyj` module has been greatly enhanced. It's functionality is\n  now much closer to python's re module.\n\n* Added support for the with statement (context managers)\n\n* Support for binary number literals\n\n* A builtin set type and set literals\n\n* Support recursive destructuring in assignments and for loop expressions.\n\n* Add a new ES 6 output mode that emits faster code for ES 6 compatible\n  runtimes\n\n\nIn addition there have been hundreds of bug fixes.\n"
  },
  {
    "path": "CONTRIBUTORS",
    "content": "This project is officially supported by Kovid Goyal.\n\nMain Developers\n---------------\nKovid Goyal\n\nOther Contributors\n------------------\nAlexander Tsepkov (main developer of the original RapydScript)\nCharles Law\nTobias Weber\nSalvatore Di Dio\nTuomas Laakkonen\n"
  },
  {
    "path": "HACKING.md",
    "content": "Hacking the RapydScript compiler\n=================================\n\nThe RapydScript compiler is written in RapydScript itself and uses the\nRapydScript import system to modularize its code. The compiler source code is\nin the `src` directory. The compiled compiler is by default in the `release`\ndirectory. \n\nIn order to start hacking on the compiler, run the command\n\n```\nbin/rapydscript self --complete --test\n```\n\nThis will generate a build of the compiler in the `dev` directory. Now, the\nrapydscript command will automatically use this build, rather than the one in\nrelease. If you want to go back to the release build, simply delete the `dev`\ndirectory.\n\n\nCode organization\n-------------------\n\nThe way the compiler works, given some RapydScript source code:\n\n* The source code is lexed into a stream of tokens (`src/tokenzier.pyj`)\n\n* The tokens are parsed into a Abstract Syntax Tree (`src/parse.pyj and src/ast.pyj`)\n\n* During parsing any import statement are resolved (this is different from\n  python, where imports happen at run-time, not compile time).\n\n* The Abstract Syntax Tree is transformed into the output JavaScript (`src/output/*.pyj`)\n\n* Various bits of functionality in RapydScript depend upon the *Base Library*\n  (`src/baselib*.pyj`). This includes things like the basic container types\n  (list/set/dict) string functions such as `str.format()`, etc. The baselib\n  is automatically inserted into the start of the output JavaScript.\n\nThe RapydScript standard library can be found in `src/lib`. The various tools,\nsuch as the linter, gettext support, the REPL, etc. are in the `tools`\ndirectory.\n\nTests\n--------\n\nThe tests are in the test directory and can be run using the command:\n```\nrapydscript test\n```\n\nYou can run individual test files by providing the name of the file, as\n\n```\nrapydscript test classes\n```\n\nModifying the compiler\n-------------------------\n\nEdit the files in the `src` directory to make your changes, then use the\n`./try` script to test them.  This script will compile an updated version of\nthe compiler with your changes, if any, and use it to run the snippet of code\nyou pass to it.\n\nFor example:\n\n```\n./try 'print(\"Hello world\")'\n```\n\nwill compile `print (\"Hello world\")` and show you the output on stdout. You can\ntell it to omit the baselib, so you can focus on the output, with the `-m`\nswitch, like this:\n\n```\n./try -m 'print(\"Hello world\")'\n```\n\nYou can also have it not print out the JavaScript, instead directly executing the output\nJavaScript with the `-x` switch, like this\n\n```\n./try -x 'print(\"Hello world\")'\n```\n\nIf you want to test longer sections of code, you can use the `-f` switch to\npass in the path to a RapydScript file to compile, like this:\n\n```\n./try -f myfile.pyj\n```\n\nOnce you are happy with your changes, you can build the compiler and run the\ntest suite, all with a single command:\n\n```\n./build\n```\n\nThis will build the compiler with the updated version of itself and then run\nthe test suite. If all test pass you can commit your changes and send a pull\nrequest :)\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2015-, Kovid Goyal <kovid@kovidgoyal.net>\nCopyright (c) 2013-2014, Alexander Tsepkov <atsepkov@pyjeon.com>\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "RapydScript\n===========\n\n\n[![Build Status](https://github.com/ebook-utils/kovidgoyal/rapydscript-ng/CI/badge.svg)](https://github.com/kovidgoyal/rapydscript-ng/actions?query=workflow%3ACI)\n[![Downloads](https://img.shields.io/npm/dm/rapydscript-ng.svg)](https://www.npmjs.com/package/rapydscript-ng)\n[![Current Release](https://img.shields.io/npm/v/rapydscript-ng.svg)](https://www.npmjs.com/package/rapydscript-ng)\n[![Known Vulnerabilities](https://snyk.io/test/github/kovidgoyal/rapydscript-ng/badge.svg)](https://snyk.io/test/github/kovidgoyal/rapydscript-ng)\n\nThis is a fork of the original RapydScript that adds many new (not always\nbackwards compatible) features. For more on the forking, [see the bottom of this file](#reasons-for-the-fork)\n\n[Try RapydScript-ng live via an in-browser REPL!](https://sw.kovidgoyal.net/rapydscript/repl/)\n\n<!-- START doctoc generated TOC please keep comment here to allow auto update -->\n<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->\n**Contents**\n\n- [What is RapydScript?](#what-is-rapydscript)\n- [Installation](#installation)\n- [Compilation](#compilation)\n- [Getting Started](#getting-started)\n- [Leveraging other APIs](#leveraging-other-apis)\n- [Anonymous Functions](#anonymous-functions)\n- [Decorators](#decorators)\n- [Self-Executing Functions](#self-executing-functions)\n- [Chaining Blocks](#chaining-blocks)\n- [Function calling with optional arguments](#function-calling-with-optional-arguments)\n- [Inferred Tuple Packing/Unpacking](#inferred-tuple-packingunpacking)\n- [Operators and keywords](#operators-and-keywords)\n- [Literal JavaScript](#literal-javascript)\n- [Containers (lists/sets/dicts)](#containers-listssetsdicts)\n  - [Container comparisons](#container-comparisons)\n- [Loops](#loops)\n- [List/Set/Dict Comprehensions](#listsetdict-comprehensions)\n- [Strings](#strings)\n- [The Existential Operator](#the-existential-operator)\n- [Regular Expressions](#regular-expressions)\n- [Creating DOM trees easily](#creating-dom-trees-easily)\n- [Classes](#classes)\n  - [External Classes](#external-classes)\n  - [Method Binding](#method-binding)\n- [Iterators](#iterators)\n- [Generators](#generators)\n- [Modules](#modules)\n- [Exception Handling](#exception-handling)\n- [Scope Control](#scope-control)\n- [Available Libraries](#available-libraries)\n- [Linter](#linter)\n- [Making RapydScript even more pythonic](#making-rapydscript-even-more-pythonic)\n- [Advanced Usage Topics](#advanced-usage-topics)\n    - [Browser Compatibility](#browser-compatibility)\n    - [Tabs vs Spaces](#tabs-vs-spaces)\n    - [External Libraries and Classes](#external-libraries-and-classes)\n    - [Embedding the RapydScript compiler in your webpage](#embedding-the-rapydscript-compiler-in-your-webpage)\n- [Internationalization](#internationalization)\n- [Gotchas](#gotchas)\n- [Reasons for the fork](#reasons-for-the-fork)\n\n<!-- END doctoc generated TOC please keep comment here to allow auto update -->\n\n\nWhat is RapydScript?\n--------------------\n\nRapydScript (pronounced 'RapidScript') is a pre-compiler for JavaScript,\nsimilar to CoffeeScript, but with cleaner, more readable syntax. The syntax is\nalmost identical to Python, but RapydScript has a focus on performance and\ninteroperability with external JavaScript libraries. This means that the\nJavaScript that RapydScript generates is performant and quite close to hand\nwritten JavaScript.\n\nRapydScript allows to write your front-end in Python without the overhead that\nother similar frameworks introduce (the performance is the same as with pure\nJavaScript). To those familiar with CoffeeScript, RapydScript is like\nCoffeeScript, but inspired by Python's readability rather than Ruby's\ncleverness. To those familiar with Pyjamas, RapydScript brings many of the same\nfeatures and support for Python syntax without the same overhead. Don't worry\nif you've never used either of the above-mentioned compilers, if you've ever\nhad to write your code in pure JavaScript you'll appreciate RapydScript.\nRapydScript combines the best features of Python as well as JavaScript,\nbringing you features most other Pythonic JavaScript replacements overlook.\nHere are a few features of RapydScript:\n\n- classes that work and feel similar to Python\n- an import system for modules/packages that works just like Python's\n- optional function arguments that work similar to Python\n- inheritance system that's both, more powerful than Python and cleaner than JavaScript\n- support for object literals with anonymous functions, like in JavaScript\n- ability to invoke any JavaScript/DOM object/function/method as if it's part of the same framework, without the need for special syntax\n- variable and object scoping that make sense (no need for repetitive 'var' or 'new' keywords)\n- ability to use both, Python's methods/functions and JavaScript's alternatives\n- similar to above, ability to use both, Python's and JavaScript's tutorials (as well as widgets)\n- it's self-hosting, that means the compiler is itself written in RapydScript and compiles into JavaScript\n\nLet's not waste any more time with the introductions, however. The best way to\nlearn a new language/framework is to dive in.\n\n\nInstallation\n------------\n\n[Try RapydScript-ng live via an in-browser REPL!](https://sw.kovidgoyal.net/rapydscript/repl/)\n\nFirst make sure you have installed the latest version of [node.js](https://nodejs.org/) (You may need to restart your computer after this step). \n\nFrom NPM for use as a command line app:\n\n\tnpm install rapydscript-ng -g\n\nFrom NPM for use in your own node project:\n\n\tnpm install rapydscript-ng\n\nFrom Git:\n\n\tgit clone https://github.com/kovidgoyal/rapydscript-ng.git\n\tcd rapydscript-ng\n\tsudo npm link .\n\tnpm install  # This will automatically install the dependencies for RapydScript\n\nIf you're using OSX, you can probably use the same commands (let me know if\nthat's not the case). If you're using Windows, you should be able to follow\nsimilar commands after installing node.js, npm and git on your system.\n\n\nCompilation\n-----------\nOnce you have installed RapydScript, compiling your application is as simple as\nrunning the following command:\n\n\trapydscript [options] <location of main file>\n\nBy default this will dump the output to STDOUT, but you can specify the output\nfile using `--output` option. The generated file can then be referenced in your\nhtml page the same way as you would with a typical JavaScript file. If you're\nonly using RapydScript for classes and functions, then you're all set. For more\nhelp, use ```rapydscript -h```.\n\nGetting Started\n---------------\n\nRapydScript comes with its own Read-Eval-Print-Loop (REPL). Just run\n``rapydscript`` without any arguments to get started trying out the code\nsnippets below.\n\nLike JavaScript, RapydScript can be used to create anything from a quick\nfunction to a complex web-app. RapydScript can access anything regular\nJavaScript can, in the same manner. Let's say we want to write a function that\ngreets us with a \"Hello World\" pop-up. The following code will do it:\n\n```python\ndef greet():\n\talert(\"Hello World!\")\n```\n\nOnce compiled, the above code will turn into the following JavaScript:\n\n```javascript\nfunction greet() {\n\talert(\"Hello World!\");\n}\n```\n\nNow you can reference this function from other JavaScript or the page itself\n(using \"onclick\", for example). For our next example, let's say you want a\nfunction that computes factorial of a number:\n\n```python\ndef factorial(n):\n\tif n == 0:\n\t\treturn 1\n\treturn n * factorial(n-1)\n```\n\nNow all we need is to tie it into our page so that it's interactive. Let's add an input field to the page body and a cell for displaying the factorial of the number in the input once the input loses focus.\n\n```html\n\t<input id=\"user-input\" onblur=\"computeFactorial()\"></input>\n\t<div id=\"result\"></div>\n```\n\n**NOTE:** To complement RapydScript, I have also written RapydML (<https://bitbucket.org/pyjeon/rapydml>), which is a pre-compiler for HTML (just like RapydScript is a pre-compiler for JavaScript). \n\nNow let's implement computeFactorial() function in RapydScript:\n\n```python\ndef computeFactorial():\n\tn = document.getElementById(\"user-input\").value\n\tdocument.getElementById(\"result\").innerHTML = factorial(n)\n```\n\nAgain, notice that we have access to everything JavaScript has access to, including direct DOM manipulation. Once compiled, this function will look like this:\n\n```javascript\nfunction computeFactorial() {\n\tvar n;\n\tn = document.getElementById(\"user-input\").value;\n\tdocument.getElementById(\"result\").innerHTML = factorial(n);\n}\n```\n\nNotice that RapydScript automatically declares variables in local scope when\nyou try to assign to them. This not only makes your code shorter, but saves you\nfrom making common JavaScript mistake of overwriting a global. For more\ninformation on controlling variable scope, see `Scope Control` section.\n\n\nLeveraging other APIs\n---------------------\n\nAside from Python-like stdlib, RapydScript does not have any of its own APIs.\nNor does it need to, there are already good options available that we can\nleverage instead. If we wanted, for example, to rewrite the above factorial\nlogic using jQuery, we could easily do so:\n\n```python\ndef computeFactorial():\n\tn = $(\"#user-input\").val()\n\t$(\"#result\").text(factorial(n))\n```\n\nMany of these external APIs, however, take object literals as input. Like with\nJavaScript, you can easily create those with RapydScript, the same way you\nwould create a dictionary in Python:\n\n```javascript\nstyles = {\n\t'background-color':\t'#ffe',\n\t'border-left':\t\t'5px solid #ccc',\n\t'width':\t\t\t50,\n}\n```\n\nNow you can pass it to jQuery:\n\n```python\n$('#element').css(styles)\n```\n\nAnother feature of RapydScript is ability to have functions as part of your\nobject literal. JavaScript APIs often take callback/handler functions as part\nof their input parameters, and RapydScript lets you create such object literal\nwithout any quirks/hacks:\n\n```js\nparams = {\n\t'width':\t50,\n\t'height':\t30,\n\t'onclick':\tdef(event):\n\t\talert(\"you clicked me\"),\n\t'onmouseover':\tdef(event):\n\t\t$(this).css('background', 'red')\n\t,\n\t'onmouseout':\tdef(event):\n\t\t# reset the background\n\t\t$(this).css('background', '')\n}\n```\n\nNote the comma on a new line following a function declaration, it needs to be\nthere to let the compiler know there are more attributes in this object\nliteral, yet it can't go on the same line as the function since it would get\nparsed as part of the function block. Like Python, however, RapydScript\nsupports new-line shorthand using a `;`, which you could use to place the comma\non the same line:\n\n```js\nhash = {\n\t'foo':\tdef():\n\t\tprint('foo');,\n\t'bar':\tdef():\n\t\tprint('bar')\n}\n```\n\nIt is because of easy integration with JavaScript's native libraries that RapydScript keeps its own libraries to a minimum. \n\nAnonymous Functions\n-------------------\n\nLike JavaScript, RapydScript allows the use of anonymous functions. In fact,\nyou've already seen the use of anonymous functions in previous section when\ncreating an object literal ('onmouseover' and 'onmouseout' assignments). This\nis similar to Python's lambda function, except that the syntax isn't awkward\nlike lambda, and the function isn't limited to one line. The following two\nfunction declarations are equivalent:\n\n```js\ndef factorial(n):\n\tif n == 0:\n\t\treturn 1\n\treturn n * factorial(n-1)\n\nfactorial = def(n):\n\tif n == 0:\n\t\treturn 1\n\treturn n * factorial(n-1)\n```\n\nThis might not seem like much at first, but if you're familiar with JavaScript,\nyou know that this can be extremely useful to the programmer, especially when\ndealing with nested functions, which are a bit syntactically awkward in Python\n(it's not immediately obvious that those can be copied and assigned to other\nobjects). To illustrate the usefulness, let's create a method that creates and\nreturns an element that changes color while the user keeps the mouse pressed on\nit.\n\n```js\ndef makeDivThatTurnsGreen():\n\tdiv = $('<div></div>')\n\tturnGreen = def(event):\n\t\tdiv.css('background', 'green')\n\tdiv.mousedown(turnGreen)\n\tresetColor = def(event):\n\t\tdiv.css('background', '')\n\tdiv.mouseup(resetColor)\n\treturn div\n```\n\nAt first glance, anonymous functions might not seem that useful. We could have\neasily created nested functions and assigned them instead. By using anonymous\nfunctions, however, we can quickly identify that these functions will be bound\nto a different object. They belong to the div, not the main function that\ncreated them, nor the logic that invoked it. The best use case for these is\ncreating an element inside another function/object without getting confused\nwhich object the function belongs to.\n\nAdditionally, as you already noticed in the previous section, anonymous\nfunctions can be used to avoid creating excessive temporary variables and make\nyour code cleaner:\n\n```js\nmath_ops = {\n\t'add':\tdef(a, b): return a+b;,\n\t'sub':\tdef(a, b): return a-b;,\n\t'mul':\tdef(a, b): return a*b;,\n\t'div':\tdef(a, b): return a/b;,\n\t'roots':\tdef(a, b, c):\n\t\tr = Math.sqrt(b*b - 4*a*c)\n\t\td = 2*a\n\t\treturn (-b + r)/d, (-b - r)/d\n}\n```\n\nI'm sure you will agree that the above code is cleaner than declaring 5\ntemporary variables first and assigning them to the object literal keys after.\nNote that the example puts the function header (def()) and content on the same\nline. I'll refer to it as function inlining. This is meant as a feature of\nRapydScript to make the code cleaner in cases like the example above. While you\ncan use it in longer functions by chaining statements together using `;`, a\ngood rule of thumb (to keep your code clean) is if your function needs\nsemi-colons ask yourself whether you should be inlining, and if it needs more\nthan 2 semi-colons, the answer is probably no (note that you can also use\nsemi-colons as newline separators within functions that aren't inlined, as in\nthe example in the previous section).\n\n\nDecorators\n----------\nLike Python, RapydScript supports decorators. \n\n```py\ndef makebold(fn):\n\tdef wrapped():\n\t\treturn \"<b>\" + fn() + \"</b>\"\n\treturn wrapped\n\ndef makeitalic(fn):\n\tdef wrapped():\n\t\treturn \"<i>\" + fn() + \"</i>\"\n\treturn wrapped\n\n@makebold\n@makeitalic\ndef hello():\n\treturn \"hello world\"\n\nhello() # returns \"<b><i>hello world</i></b>\"\n```\n\nClass decorators are also supported with the caveat that the class properties\nmust be accessed via the prototype property. For example:\n\n```py\n\ndef add_x(cls):\n\tcls.prototype.x = 1\n\n@add_x\nclass A:\n   pass\n\nprint(A.x)  # will print 1\n```\n\n\nSelf-Executing Functions\n------------------------\nRapydScript wouldn't be useful if it required work-arounds for things that\nJavaScript handled easily. If you've worked with JavaScript or jQuery before,\nyou've probably seen the following syntax:\n\n```js\n(function(args){\n\t// some logic here\n})(args)\n```\n\nThis code calls the function immediately after declaring it instead of\nassigning it to a variable. Python doesn't have any way of doing this. The\nclosest work-around is this:\n\n```py\ndef tmp(args):\n\t# some logic here\ntmp.__call__(args)\n```\n\nWhile it's not horrible, it did litter our namespace with a temporary variable.\nIf we have to do this repeatedly, this pattern does get annoying. This is where\nRapydScript decided to be a little unorthodox and implement the JavaScript-like\nsolution:\n\n```js\n(def(args):\n\t# some logic here\n)()\n```\n\nA close cousin of the above is the following code (passing current scope to the function being called):\n\n```js\nfunction(){\n\t// some logic here\n}.call(this);\n```\n\nWith RapydScript equivalent of:\n\n```js\ndef():\n\t# some logic here\n.call(this)\n```\n\nThere is also a third alternative, that will pass the arguments as an array:\n\n```js\ndef(a, b):\n\t# some logic here\n.apply(this, [a, b])\n```\n\n\nChaining Blocks\n---------------\nAs seen in previous section, RapydScript will bind any lines beginning with `.` to the outside of the block with the matching indentation. This logic isn't limited to the `.call()` method, you can use it with `.apply()` or any other method/property the function has assigned to it. This can be used for jQuery as well:\n\n```js\n$(element)\n.css('background-color', 'red')\n.show()\n```\n\nThe only limitation is that the indentation has to match, if you prefer to indent your chained calls, you can still do so by using the `\\` delimiter:\n\n```js\n$(element)\\\n\t.css('background-color', 'red')\\\n\t.show()\n```\n\nSome of you might welcome this feature, some of you might not. RapydScript always aims to make its unique features unobtrusive to regular Python, which means that you don't have to use them if you disagree with them. Recently, we have enhanced this feature to handle `do/while` loops as well:\n\n```js\na = 0\ndo:\n\tprint(a)\n\ta += 1\n.while a < 1\n```\n\nFunction calling with optional arguments\n-------------------------------------------\n\nRapydScript supports the same function calling format as Python. You can have\nnamed optional arguments, create functions with variable numbers of arguments\nand variable numbers of named arguments. Some examples will illustrate this\nbest:\n\n```py\n\tdef f1(a, b=2):\n\t   return [a, b]\n\n\tf1(1, 3) == f1(1, b=3) == [1, 3]\n\n\tdef f2(a, *args):\n\t\treturn [a, args]\n\n\tf2(1, 2, 3) == [1, [2, 3]]\n\n\tdef f3(a, b=2, **kwargs):\n\t    return [a, b, kwargs]\n\n\tf3(1, b=3, c=4) == [1, 3, {c:4}]\n\n\tdef f4(*args, **kwargs):\n\t\treturn [args, kwargs]\n\n\tf4(1, 2, 3, a=1, b=2):\n\t\treturn [[1, 2, 3], {a:1, b:2}]\n```\n\nOne difference between RapydScript and Python is that RapydScript is not as\nstrict as Python when it comes to validating function arguments. This is both\nfor performance and to make it easier to interoperate with other JavaScript\nlibraries. So if you do not pass enough arguments when calling a function, the\nextra arguments will be set to undefined instead of raising a TypeError, as in\nPython. Similarly, when mixing ``*args`` and optional arguments, RapydScript\nwill not complain if an optional argument is specified twice.\n\nWhen creating callbacks to pass to other JavaScript libraries, it is often the\ncase that the external library expects a function that receives an *options\nobject* as its last argument. There is a convenient decorator in the standard\nlibrary that makes this easy:\n\n```py\n@options_object\ndef callback(a, b, opt1=default1, opt2=default2):\n\tconsole.log(opt1, opt2)\n\ncallback(1, 2, {'opt1':'x', 'opt2':'y'})  # will print x, y\n```\n\nNow when you pass callback into the external library and it is called with an\nobject containing options, they will be automatically converted by RapydScript\ninto the names optional parameters you specified in the function definition.\n\n\nInferred Tuple Packing/Unpacking\n--------------------------------\nLike Python, RapydScript allows inferred tuple packing/unpacking and assignment. While inferred/implicit logic is usually bad, it can sometimes make the code cleaner, and based on the order of statements in the Zen of Python, 'beautiful' takes priority over 'explicit'. For example, if you wanted to swap two variables, the following looks cleaner than explicitly declaring a temporary variable:\n\n```py\na, b = b, a\n```\n\nLikewise, if a function returns multiple variables, it's cleaner to say:\n\n```py\na, b, c = fun()\n```\n\nrather than:\n\n```py\ntmp = fun()\na = tmp[0]\nb = tmp[1]\nc = tmp[2]\n```\n\nSince JavaScript doesn't have tuples, RapydScript uses arrays for tuple packing/unpacking behind the scenes, but the functionality stays the same. Note that unpacking only occurs when you're assigning to multiple arguments:\n\n```py\na, b, c = fun()\t\t# gets unpacked\ntmp = fun()\t\t\t# no unpacking, tmp will store an array of length 3\n```\n\nUnpacking can also be done in `for` loops (which you can read about in later section):\n\n```py\nfor index, value in enumerate(items):\n\tprint(index+': '+value)\n```\n\nTuple packing is the reverse operation, and is done to the variables being assigned, rather than the ones being assigned to. This can occur during assignment or function return:\n\n```py\ndef fun():\n\treturn 1, 2, 3\n```\n\nTo summarize packing and unpacking, it's basically just syntax sugar to remove obvious assignment logic that would just litter the code. For example, the swap operation shown in the beginning of this section is equivalent to the following code:\n\n```py\ntmp = [b, a]\na = tmp[0]\nb = tmp[1]\n```\n\n\nOperators and keywords\n------------------------\n\nRapydScript uses the python form for operators and keywords. Below is the\nmapping from RapydScript to JavaScript.\n\nKeywords:\n\n\tRapydScript\t\tJavaScript\n\t\n\tNone\t\t\tnull\n\tFalse\t\t\tfalse\n\tTrue\t\t\ttrue\n\tundefined\t\tundefined\n\tthis\t\t\tthis\n\nOperators:\n\n\tRapydScript\t\tJavaScript\n\t\n\tand\t\t\t\t&&\n\tor\t\t\t\t||\n\tnot\t\t\t\t!\n\tis\t\t\t\t===\n\tis not\t\t\t!==\n\t+=1\t\t\t\t++\n\t-=1\t\t\t\t--\n\t**\t\t\t\tMath.pow()\n\t\nAdmittedly, `is` is not exactly the same thing in Python as `===` in JavaScript, but JavaScript is quirky when it comes to comparing objects anyway.\n\n\nLiteral JavaScript\n-----------------------\n\nIn rare cases RapydScript might not allow you to do what you need to, and you\nneed access to pure JavaScript, this is particularly useful for performance\noptimizations in inner loops. When that's the case, you can use a *verbatim\nstring literal*.  That is simply a normal RapydScript string prefixed with the\n```v``` character. Code inside a verbatim string literal is not a sandbox, you\ncan still interact with it from normal RapydScript:\n\n```py\nv'a = {foo: \"bar\", baz: 1};'\nprint(a.foo)\t# prints \"bar\"\n\nfor v'i = 0; i < arr.length; i++':\n   print (arr[i])\n```\n\nContainers (lists/sets/dicts)\n------------------------------\n\n### Lists\n\nLists in RapydScript are almost identical to lists in Python, but are also\nnative JavaScript arrays. The only small caveats are that the ``sort()`` and\n``pop()`` methods are renamed to ``pysort()`` and ``pypop()``. This is so that\nyou can pass RapydScript lists to external JavaScript libraries without any\nconflicts. Note that even list literals in RapydScript create python like list\nobjects, and you can also use the builtin ``list()`` function to create lists\nfrom other iterable objects, just as you would in python.  You can create a\nRapydScript list from a plain native JavaScript array by using the ``list_wrap()``\nfunction, like this:\n\n```py\na = v'[1, 2]'\npya = list_wrap(a)\n # Now pya is a python like list object that satisfies pya === a\n```\n\n### Sets\n\nSets in RapydScript are identical to those in python. You can create them using\nset literals or comprehensions and all set operations are supported. You can\nstore any object in a set, the only caveat is that RapydScript does not support\nthe ``__hash__()`` method, so if you store an arbitrary object as opposed to a\nprimitive type, object equality will be via the ``is`` operator.\n\nNote that sets are not a subclass of the ES 6 JavaScript Set object, however,\nthey do use this object as a backend, when available. You can create a set from\nany enumerable container, like you would in python\n\n```py\ns = set(list or other set or string)\n```\n\nYou can also wrap an existing JavaScript Set object efficiently, without\ncreating a copy with:\n\n```py\njs_set = Set()\npy_set = set_wrap(js_set)\n```\n\nNote that using non-primitive objects as set members does not behave the\nsame way as in Python. For example:\n\n```py\na = [1, 2]\ns = {a}\na in s  # True\n[1, 2] in s # False\n```\n\nThis is because, as noted above, object equality is via the ```is```\noperator, not hashes.\n\n### Dicts\n\ndicts are the most different in RapydScript, from Python. This is because\nRapydScript uses the JavaScript Object as a dict, for compatibility with\nexternal JavaScript libraries and performance. This means there are several\ndifferences between RapydScript dicts and Python dicts.\n\n    - You can only use primitive types (strings/numbers) as keys in the dict\n    - If you use numbers as keys, they are auto-converted to strings\n    - You can access the keys of the dict as attributes of the dict object\n    - Trying to access a non-existent key returns ``undefined`` instead of\n      raising a KeyError\n    - dict objects do not have the same methods as python dict objects:\n      ``items(), keys(), values(), get(), pop(), etc.`` You can however use\n      RapydScript dict objects in ```for..in``` loops.\n\nFortunately, there is a builtin ```dict``` type that behaves just like Python's\n```dict``` with all the same methods. The only caveat is that you have to add\na special line to your RapydScript code to use these dicts, as shown below:\n\n```py\nfrom __python__ import dict_literals, overload_getitem\na = {1:1, 2:2}\na[1]  # == 1\na[3] = 3\nlist(a.keys()) == [1, 2, 3]\na['3'] # raises a KeyError as this is a proper python dict, not a JavaScript object\n```\n\nThe special line, called a *scoped flag* tells the compiler that from\nthat point on, you want it to treat dict literals and the getitem operator `[]`\nas they are treated in python, not JavaScript. \n\nThe scoped flags are local to each scope, that means that if you use it in a\nmodule, it will only affect code in that module, it you use it in a function,\nit will only affect code in that function. In fact, you can even use it to\nsurround a few lines of code, like this:\n\n```py\nfrom __python__ import dict_literals, overload_getitem\na = {1:1, 2:2}\nisinstance(a, dict) == True\nfrom __python__ import no_dict_literals, no_overload_getitem\na = {1:1, 2:2}\nisinstance(a, dict) == False # a is a normal JavaScript object\n```\n\n\n### Container comparisons\n\nContainer equality (the `==` and `!=` operators) work for lists and sets and\nRapydScript dicts (but not arbitrary javascript objects). You can also define\nthe ``__eq__(self, other)`` method in your classes to have these operators work\nfor your own types.\n\nRapydScript does not overload the ordering operators ```(>, <, >=,\n<=)``` as doing so would be a big performance impact (function calls in\nJavaScript are very slow). So using them on containers is useless. \n\nLoops\n-----\nRapydScript's loops work like Python, not JavaScript. You can't, for example\nuse ```for(i=0;i<max;i++)``` syntax. You can, however, loop through arrays\nusing 'for ... in' syntax without worrying about the extra irrelevant\nattributes regular JavaScript returns.\n\n```py\nanimals = ['cat', 'dog', 'mouse', 'horse']\nfor animal in animals:\n\tprint('I have a '+animal)\n```\n\t\t\nIf you need to use the index in the loop as well, you can do so by using enumerate():\n\n```py\nfor index, animal in enumerate(animals):\n\tprint(\"index:\"+index, \"animal:\"+animal)\n```\n\nLike in Python, if you just want the index, you can use range:\n\n```py\nfor index in range(len(animals)):\t\t\t# or range(animals.length)\n\tprint(\"animal \"+index+\" is a \"+animals[index])\n```\n\nWhen possible, RapydScript will automatically optimize the loop for you into\nJavaScript's basic syntax, so you're not missing much by not being able to call\nit directly.\n\n\nList/Set/Dict Comprehensions\n-------------------------------\n\nRapydScript also supports comprehensions, using Python syntax. Instead of the following, for example:\n\n```py\nmyArray = []\nfor index in range(1,20):\n\tif index*index % 3 == 0:\n\t\tmyArray.append(index*index)\n```\n\nYou could write this:\n\n```py\nmyArray = [i*i for i in range(1,20) if i*i%3 == 0]\n```\n\nSimilarly for set and dict comprehensions:\n\n```py\nmyDict = {x:x+1 for x in range(20) if x > 2}\nmySet = {i*i for i in range(1,20) if i*i%3 == 0}\n```\n\nStrings\n---------\n\nFor reasons of compatibility with external JavaScript and performance,\nRapydScript does not make any changes to the native JavaScript string type.\nHowever, all the useful Python string methods are available on the builtin\n``str`` object. This is analogous to how the functions are available in the\n``string`` module in Python 2.x.  For example,\n\n```py\nstr.strip(' a ') == 'a'\nstr.split('a b') == ['a', 'b']\nstr.format('{0:02d} {n}', 1, n=2) == '01 2'\n...\n```\n\nHowever, if you want to make the python string methods available on string\nobjects, there is a convenience method in the standard library to do so. Use\nthe following code:\n\n```py\nfrom pythonize import strings\nstrings()\n```\n\nAfter you call the `strings()` function, all python string methods will be\navailable on string objects, just as in python. The only caveat is that two\nmethods: `split()` and `replace()` are left as the native JavaScript versions,\nas their behavior is not compatible with that of the python versions. You can\ncontrol which methods are not copied to the JavaScript String object by passing\ntheir names to the `strings()` function, like this:\n\n```py\nstrings('split', 'replace', 'find', ...)\n# or\nstrings(None)  # no methods are excluded\n```\n\nOne thing to keep in mind is that in JavaScript string are UTF-16, so they\nbehave like strings in narrow builds of Python 2.x. This means that non-BMP\nunicode characters are represented as surrogate pairs. RapydScript includes\nsome functions to make dealing with non-BMP unicode characters easier:\n\n  - ``str.uchrs(string, [with_positions])`` -- iterate over unicode characters in string, so, for example:\n\n\t```py\n\tlist(str.uchrs('s🐱a')) == ['s', \"🐱\", 'a']\n\t```\n\n\tYou can also get positions of individual characters:\n\n\t```py\n\tlist(str.uchrs('s🐱a', True)) == [[0, 's'], [1, \"🐱\"], [3, 'a']]\n\t```\n\tNote that any broken surrogate pairs in the underlying string are returned\n\tas the unicode replacement character U+FFFD\n\n  - ``str.uslice(string, [start, [stop]])`` -- get a slice based on unicode character positions, for example:\n\n\t```py\n\tstr.uslice('s🐱a', 2') == 'a'  # even though a is at index 3 in the native string object\n\t```\n\n  - ``str.ulen(string)`` -- return the number of unicode characters in the string\n\nThe Existential Operator\n---------------------------\n\nOne of the annoying warts of JavaScript is that there are two \"null-like\"\nvalues: `undefined` and `null`. So if you want to test if a variable is not\nnull you often have to write a lengthy expression that looks like\n\n```py\n(var !== undefined and var !== None)\n```\n\nSimply doing `bool(var)` will not work because zero and empty strings are also\nFalse.\n\nSimilarly, if you need to access a chain of properties/keys and dont want a\n`TypeError` to be raised, if one of them is undefined/null then you have\nto do something like:\n\n```py\nif a and a.b and a.b.c:\n\tans = a.b.c()\nelse:\n\tans = undefined\n```\n\nTo ease these irritations, RapydScript borrows the *Existential operator* from\nCoffeeScript. This can be used to test if a variable is null-like, with a\nsingle character, like this:\n\n```py\nyes = True if no? else False\n# Which, without the ? operator becomes\nyes = True if no is not undefined and no is not None else False\n```\n\nWhen it comes to long chains, the `?` operator will return the expected value\nif all parts of the chain are ok, but cause the entire chaning to result in\n`undefined` if any of its links are null-like. For example:\n\n```py\nans = a?.b?[1]?()\n# Which, without the ? operator becomes\nans = undefined\nif a is not undefined and a is not None and a.b is not undefined and a.b is not None and jstype(a.b[1]) is 'function':\n\tans = a.b[1]()\n```\n\nFinally, you can also use the existential operator as shorthand for the\nconditional ternary operator, like this:\n\n```py\na = b ? c\n# is the same as\na = c if (b is undefined or b is None) else b\n```\n\nRegular Expressions\n----------------------\n\nRapydScript includes a ```re``` module that mimics the interface of the Python\nre module. However, it uses the JavaScript regular expression functionality\nunder the hood, which has several differences from the Python regular\nexpression engine. Most importantly:\n\n  - it does not support lookbehind and group existence assertions\n  - it does not support unicode (on ES 6 runtimes, unicode is supported, but\n\twith a different syntax). You can test for the presence of unicode support with\n\t```re.supports_unicode```. \n  - The ``MatchObject``'s ``start()`` and ``end()`` method cannot return correct values\n    for subgroups for some kinds of regular expressions, for example, those\n\twith nested captures. This is because the JavaScript regex API does not expose\n\tthis information, so it has to be guessed via a heuristic.\n\nYou can use the JavaScript regex literal syntax, including verbose regex\nliterals, as shown below. In verbose mode, whitespace is ignored and # comments\nare allowed (except inside character classes -- verbose mode works in the same\nway as in python, except you use the JavaScript Regex literal syntax).\n\n```py\nimport re\nre.match(/a(b)/, 'ab') == re.match('a(b)', 'ab')\n\nre.match(///\n  a  # a comment\n  b  # Another comment\n  ///, 'ab')\n```\n\nCreating DOM trees easily\n---------------------------------\n\nRapydScript includes a small module in its standard library to create DOM tress\nefficiently. It leverages the powerful support for python style function\ncalling. Best illustrated with an example:\n\n```py\nfrom elementmaker import E\n\nE.div(id=\"container\", class_=\"xxx\",\n\tE.div('The Heading', data_heading=\"1\"),\n\tE.p('Some text ',\n\t\tE.i('with italics'),\n\t\tE('custom', ' and a csutom tag'),\n\t)\n)\n```\n\nThis is equivalent to:\n\n```html\n<div id=\"container\" class=\"xxx\">\n\t<div data-heading=\"1\">The Heading</div>\n\t<p>Some text <i>with italics</i><custom> and a custom tag</custom></p>\n</div>\n```\n\nBasically, you create text nodes and children as positional arguments and\nattributes as keyword arguments. Note that if an attribute name is a reserved\nkeyword in RapydScript, you can postfix it with an underscore. So ```class_```\nbecomes ```class```. Also, underscores are automatically replaced by hyphens,\nso ```data-*``` attributes can be created. Finally, if you need a non-standard\ntag, you simply use the ```E()``` function by itself with the first argument\nbeing the tag name.\n\nAnother great feature is that you can pass functions as event handlers\ndirectly, so for example:\n\n```py\nE.a(onclick=def():\n\tpass  # do something on the click event\n)\n```\n\nClasses\n-------\nThis is where RapydScript really starts to shine. JavaScript is known for having really crappy class implementation (it's basically a hack on top of a normal function, most experienced users suggest using external libraries for creating those instead of creating them in pure JavaScript). Luckily RapydScript fixes that. Let's imagine we want a special text field that takes in a user color string and changes color based on it. Let's create such field via a class.\n\n```js\nclass ColorfulTextField:\n\tdef __init__(self):\n\t\tfield = $('<input></input>')\n\t\tchangeColor = def(event):\n\t\t\tfield.css('backround', field.val())\n\t\tfield.keydown(changeColor)\n\t\tself.widget = field\n```\n\nThis class abuses DOM's tolerant behavior, where it will default to the original setting when the passed-in color is invalid (saving us the extra error-checking logic). To append this field to our page we can run the following code:\n\n```py\ntextfield = ColorfulTextField()\n$('body').append(textfield.widget)\n```\n\nIf you're used to JavaScript, the code above probably set off a few red flags in your head. In pure JavaScript, you can't create an object without using a 'new' operator. Don't worry, the above code will compile to the following:\n\n```js\nvar textfield;\ntextfield = new ColorfulTextField()\n$('body').append(textfield.widget);\n```\n\nRapydScript will automatically handle appending the 'new' keyword for you, assuming you used 'class' to create the class for your object. This also holds when creating an object inside a list or returning it as well. You could easily do the following, for example:\n\n```\nfields = [ColorfulTextField(), ColorfulTextField(), ColorfulTextField()]\n```\n\nThis is very useful for avoiding a common JavaScript error of creating 'undefined' objects by forgetting this keyword. One other point to note here is that regular DOM/JavaScript objects are also covered by this. So if you want to create a DOM image element, you should not use the 'new' keyword either:\n\n```py\nmyImage = Image()\n```\n\nBut RapydScript's capability doesn't end here. Like Python, RapydScript allows inheritance. Let's say, for example, we want a new field, which works similar to the one above. But in addition to changing color of the field, it allows us to change the color of a different item, with ID of 'target' after we press the 'apply' button, located right next to it. Not a problem, let's implement this guy:\n\n```js\n\nclass TextFieldAffectingOthers(ColorfulTextField):\n\tdef __init__(self):\n\t\tColorfulTextField.__init__(self)\n\t\tfield = self.widget\n\t\tsubmit = $('<button type=\"button\">apply</button>')\n\t\tapplyColor = def(event):\n\t\t\t$('#target').css('background', field.val())\n\t\tsubmit.click(applyColor)\n\t\tself.widget = $('<div></div>')\\\n\t\t\t.append(field)\\\n\t\t\t.append(submit)\n```\n\nA couple of things to note here. We can invoke methods from the parent class\nthe same way we would in Python, by using `Parent.method(self, ...)` syntax.\nThis allows us to control when and how (assuming it requires additional\narguments) the parent method gets executed. Also note the use of `\\` operator\nto break up a line. This is something Python allows for keeping each line short\nand legible. Likewise, RapydScript, being indentation-based, allows the same.\n\nLike Python, RapydScript allows multiple inheritance. The only caveat is that \nthe internal semantics of how it works are pretty different from python, since\nit is built on JavaScript's prototypical inheritance. For the most part you\nwont notice any differences from python, except, if you have a very complex\ninheritance hierarchy, especially, one with cycles. In this (rare) case you may\nfind that the method-resolution-order in RapydScript is different from Python.\n\nLike Python, RapydScript allows static methods. Marking the method static with\n`@staticmethod` decorator will compile that method such that it's not bound to\nthe object instance, and ensure all calls to this method compile into static\nmethod calls:\n\n```py\nclass Test:\n\tdef normalMethod(self):\n\t\treturn 1\n\n\t@staticmethod\n\tdef staticMethod(a):\n\t\treturn a+1\n```\n\n### External Classes\n\nRapydScript will automatically detect classes declared within the same scope (as long as the declaration occurs before use), as well as classes properly imported into the module (each module making use of a certain class should explicitly import the module containing that class). RapydScript will also properly detect native JavaScript classes (String, Array, Date, etc.). Unfortunately, RapydScript has no way of detecting classes from third-party libraries. In those cases, you could use the `new` keyword every time you create an object from such class. Alternatively, you could mark the class as external.\n\nMarking a class as external is done via `external` decorator. You do not need to fill in the contents of the class, a simple `pass` statement will do:\n\n```py\n@external\nclass Alpha:\n\tpass\n```\n\nRapydScript will now treat `Alpha` as if it was declared within the same scope, auto-prepending the `new` keyword when needed and using `prototype` to access its methods (see `casperjs` example in next section to see how this can be used in practice). You don't need to pre-declare the methods of this class (unless you decide to for personal reference, the compiler will simply ignore them) unless you want to mark certain methods as static:\n\n```py\n@external\nclass Alpha:\n\t@staticmethod\n\tdef one():\n\t\tpass\n```\n\n`Alpha.one` is now a static method, every other method invoked on `Alpha` will still be treated as a regular class method. While not mandatory, you could pre-declare other methods you plan to use from `Alpha` class as well, to make your code easier to read for other developers, in which case this `external` declaration would also serve as a table of contents for `Alpha`:\n\n```py\n@external\nclass Alpha:\n\tdef two(): pass\n\tdef three(): pass\n\n\t@staticmethod\n\tdef one(): pass\n```\n\nAs mentioned earlier, this is simply for making your code easier to read. The compiler itself will ignore all method declarations except ones marked with `staticmethod` decorator.\n\nYou could also use `external` decorator to bypass improperly imported RapydScript modules. However, if you actually have control of these modules, the better solution would be to fix those imports.\n\n\n### Method Binding\n\nBy default, RapydScript does not bind methods to the classes they're declared under. This behavior is unlike Python, but very much like the rest of JavaScript. For example, consider this code:\n\n```py\nclass Boy:\n\tdef __init__(self, name):\n\t\tself.name = name\n\n\tdef greet(self):\n\t\tif self:\n\t\t\tprint('My name is' + self.name)\n\ntod = Boy('Tod')\ntod.greet()                 # Hello, my name is Tod\ngetattr(tod, 'greet')()     # prints nothing\n```\n\nIn some cases, however, you may wish for the functions in the class to be\nautomatically bound when the objects of that class are instantiated. In order\nto do that, use a *scoped flag*, which is a simple instruction to the compiler\ntelling it to auto-bind methods, as shown below:\n\n```py\n\nclass AutoBound:\n\tfrom __python__ import bound_methods\n\n\tdef __init__(self):\n\t\tself.a = 3\n\n\tdef val(self):\n\t\treturn self.a\n\ngetattr(AutoBound(), 'val')() == 3\n```\n\nIf you want all classes in a module to be auto-bound simply put the scoped flag\nat the top of the module. You can even choose to have only a few methods of the\nclass auto-bound, like this:\n\n```py\nclass C:\n\n\tdef unbound1(self):\n\t\tpass # this method will not be auto-bound\n\n\tfrom __python__ import bound_methods\n\t# Methods below this line will be auto-bound\n\n\tdef bound(self):\n\t   pass # This method will be auto-bound\n\n\tfrom __python__ import no_bound_methods\n\t# Methods below this line will not be auto-bound\n\n\tdef unbound2(self):\n\t\tpass  # this method will be unbound\n```\n\nScoped flags apply only to the scope they are defined in, so if you define them\ninside a class declaration, they only apply to that class. If you define it at\nthe module level, it will only apply to all classes in the module that occur\nbelow that line, and so on.\n\nIterators\n----------\n\nRapydScript supports iterators, just like python, with a few differences to\nmake interoperating with other JavaScript code nicer. You can make an iterator\nfrom an array or object by simply calling the builtin ``iter()`` function, just\nas you would in python. The result of the function is a javascript iterator\nobject, that works both in RapydScript's for..in loops and ES6 JavaScript\nfor..of loops. Indeed they will work with any vanilla JavaScript code that\nexpects an iterable object. You can make your own classes iterable by defining\nan ``__iter__`` method, just as you would in python. For example:\n\n```python\n\tclass A:\n\n\t\tdef __init__(self):\n\t\t\tself.items = [1, 2, 3]\n\n\t\tdef __iter__(self):\n\t\t\treturn iter(self.items)\n\n\tfor x in A():\n\t   print (x)  # Will print 1, 2, 3\n```\n\nNote that unlike python, an iterators ``next()`` method does not return\nthe next value, but instead an object with two properties: ``done and value``.\n``value`` is the next value and done will be ``True`` when the iterator is\nexhausted. No ``StopIteration`` exception is raised. These choices were\nmade so that the iterator works with other JavaScript code.\n\nGenerators\n------------\n\nRapydScript supports generators (the python yield keyword). For example:\n\n```py\ndef f():\n\tfor i in range(3):\n\t\tyield i\n\n[x for x in f()] == [1, 2, 3]\n```\n\nThere is full support for generators including the Python 3, ```yield from```\nsyntax. \n\nGenerators create JavaScript iterator objects. For differences between python\nand JavaScript iterators, see the section on iterators above. \n\nCurrently, generators are down-converted to ES 5 switch statements. In the\nfuture, when ES 6 support is widespread, they will be converted to native\nJavaScript ES 6 generators.\n\nModules\n-------\n\nRapydScript's module system works almost exactly like Python's. Modules are\nfiles ending with the suffix ```.pyj``` and packages are directories containing\nan ```__init__.pyj``` file. The only caveat is that star imports are not\ncurrently supported (this is by design, star imports are easily abused).\nYou can import things from modules, just like you would in python:\n\n```py\nfrom mypackage.mymodule import something, something_else\n```\n\nWhen you import modules, the RapydScript compiler automatically generates a\nsingle large JavaScript file containing all the imported packages/modules and\ntheir dependencies, recursively. This makes it very easy to integrate the\noutput of RapydScript into your website.\n\nModules are searched for by default in the rapydscript builtin modules\ndirectory and the directory of the rapydscript file that you are\ncompiling. You can add additional directories to the searched locations via\nthe RAPYDSCRIPT_IMPORT_PATH environment variable or the --import-path option \nto the RapydScript compiler. See the documentation of the option for details.\n\nException Handling\n------------------\n\nException handling in RapydScript works just like it does in python. \n\nAn example:\n\n```py\ntry:\n\tsomefunc()\nexcept Exception as e:\n\timport traceback\n\ttraceback.print_exc()\nelse:\n    print('no exception occurred')\nfinally:\n    cleanup()\n```\n\nYou can create your own Exception classes by inheriting from `Exception`, which\nis the JavaScript Error class, for more details on this, see (the MDN documentation)[https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Error]. \n\n```py\nclass MyError(Exception):\n\tdef __init__(self, message):\n\t\tself.name = 'MyError'\n\t\tself.message = message\n\nraise MyError('This is a custom error!')\n```\n\nYou can lump multiple errors in the same except block as well:\n\n```py\ntry:\n\tprint(foo)\nexcept ReferenceError, TypeError as e:\n\tprint(e.name + ':' + e.message)\n\traise # re-raise the exception\n```\n\nBasically, `try/except/finally` in RapydScript works very similar to the way it does in Python 3. \n\nScope Control\n-------------\n\nScope refers to the context of a variable. For example, a variable declared inside a function is not seen by the code outside the function. This variable's scope is local to the function. JavaScript controls scope via `var` keyword. Any variable that you start using without declaring with a `var` first will try to reference inner-most variable with the same name, if one doesn't exist, it will create a global variable with that name. For example, the following JavaScript code will not only return `a` incremented by 1, but also overwrite the global variable `a` with `a+1`:\n\n```py\na = 1;\na_plus_1 = function() {\n\treturn ++a;\n};\n```\n\nBasically, JavaScript defaults to outer or global scope if you omit `var`. This behavior can introduce some very frustrating bugs in large applications. To avoid this problem, RapydScript's scope preference works in reverse (same as Python's). RapydScript will prefer local-most scope, always creating a local variable if you perform any sort of assignment on it in a function (this is called variable shadowing). Shadowing can create another annoyance, however, of function's variable changes getting discarded. For example, at first, it looks like the following code will set `a` to 2:\n\n```py\na = 1\nb = 1\nincrement = def():\n\ta += b\nincrement()\n```\n\nWhen executed, however, increment() function will discard any changes to `a`. This is because, like Python, RapydScript will not allow you to edit variables declared in outer scope. As soon as you use any sort of assignment with `a` in the inner scope, RapydScript will declare it as an internal variable, shadowing `a` in the outer scope. One way around this is to use the `global` keyword, declaring `a` as a global variable. This, however, must be done in every function that edits `a`. It also litters global scope, which it frowned upon because it can accidentally overwrite an unrelated variable with the same name (declared by someone else or another library). RapydScript solves this by introducing `nonlocal` keyword (just like Python 3):\n\n```py\na = 1\nb = 1\nincrement = def():\n\tnonlocal a\n\ta += b\nincrement()\n```\n\nNote that `b` is not affected by shadowing. It's the assignment operator that triggers shadowing, you can read outer-scope variables without having to use `nonlocal`. You can combine multiple non-local arguments by separating them with a comma: `nonlocal a, b, c`. You can also chain `nonlocal` declarations to escape multiple scopes:\n\n```py\ndef fun1():\n\ta = 5\n\tb = fun2():\n\t\tnonlocal a\n\t\ta *= 2\n\t\tc = fun3():\n\t\t\tnonlocal a\n\t\t\ta += 1\n```\n\nShadowing is preferred in most cases, since it can't accidentally damage outside logic, and if you want to edit an external variable, you're usually better off assigning function's return value to it. There are cases, however, when using `nonlocal` makes the code cleaner. For compatibility with Python code, RapydScript also supports the `global` keyword, with the exception that if a variable is present both in the outer scope and the global scope, the variable from the outer scope will be used, rather than the variable from the global scope. This situation is rare in practice, and implementing it in RapydScript would require significant work, so RapydScript `global` remains a little incompatible with Python `global`.\n\n\nAvailable Libraries\n-------------------\n\nOne of Python's main strengths is the number of libraries available to the developer. This is something very few other `Python-in-a-browser` frameworks understand. In the browser JavaScript is king, and no matter how many libraries the community for the given project will write, the readily-available JavaScript libraries will always outnumber them. This is why RapydScript was designed with JavaScript and DOM integration in mind from the beginning. Indeed, plugging `underscore.js` in place of RapydScript's `stdlib` will work just as well, and some developers may choose to do so, after all, `underscore.js` is very Pythonic and very complete. \n\nIt is for that reason that I try to keep RapydScript bells and whistles to a minimum. RapydScript's main strength is easy integration with JavaScript and DOM, which allows me to stay sane and not rewrite my own versions of the libraries that are already available. That doesn't mean, however, that pythonic libraries can't be written for RapydScript. To prove that, I have implemented lightweight clones of several popular Python libraries and bundled them into RapydScript, you can find them in `src` directory. The following libraries are included:\n\n\tmath                # replicates almost all of the functionality from Python's math library\n\tre                  # replicates almost all of the functionality from Python's re library\n\trandom              # replicates most of the functionality from Python's random library\n\telementmaker        # easily construct DOM trees\n\taes                 # Implement AES symmetric encryption\n\tencodings           # Convert to/from UTF-8 bytearrays, base64 strings and native strings\n\tgettext             # Support for internationalization of your RapydScript app\n\toperator            # a subset of python;s operator module\n\nFor the most part, the logic implemented in these libraries functions identically to the Python versions.  I'd be happy to include more libraries, if other members of the community want to implement them (it's fun to do, `re.pyj` is a good example), but I want to reemphasize that unlike most other Python-to-JavaScript compilers, RapydScript doesn't need them to be complete since there are already tons of available JavaScript libraries that it can use natively.\n\nLinter\n---------\n\nThe RapydScript compiler includes its own, built in linter. The linter is\nmodeled on pyflakes, it catches instances of unused/undefined variables,\nfunctions, symbols, etc. While this sounds simple, it is surprisingly effective\nin practice. To run the linter:\n\n\trapydscript lint file.pyj\n\nIt will catch many errors, for example,\n\n```py\ndef f():\n\tsomevar = 1\n\treturn someva\n```\n\nThe linter will catch the typo above, saving you from having to discover it at\nruntime. Another example:\n\n```py\ndef f(somevar1):\n\tsomevar2 = somevar1 * 2\n\treturn somevar1\n```\n\nHere, you probably meant to return ``somevar2`` not ``somevar1``. The linter\nwill detect that somevar2 is defined but not used and warn you about it.\n\nThe linter is highly configurable, you can add to the list of built-in names\nthat the linter will not raise undefined errors for. You can turn off\nindividual checks that you do not find useful. See ``rapydscript lint -h`` for\ndetails.\n\nMaking RapydScript even more pythonic\n---------------------------------------\n\nRapydScript has three main goals: To be as fast as possible, to be as close to\npython as possible, to interoperate with external javascript libraries.\nSometimes these goals conflict and RapydScript chooses to be less pythonic in\nservice to the other two goals. Fortunately, there are many optional flags you\ncan use to reverse these compromises. The most important of these are called\n*scoped flags*. \n\nThe scoped flags are local to each scope, that means that if you use it in a\nmodule, it will only affect code in that module, it you use it in a function,\nit will only affect code in that function. In fact, you can even use it to\nsurround a few lines of code. There are many scoped flags, described else where\nin this document, see the sections on Method Auto-binding and the section on Dicts\nin this document.\n\nAnother common complaint is that in RapydScript strings dont have all the\nstring methods that python strings do. Fortunately, there is solution for that\nas well, described in the section on strings in this document.\n\n\nAdvanced Usage Topics\n---------------------\n\n#### Browser Compatibility\n\nRapydScript compiles your code such that it will work on browsers that are\ncompatible with the ES 5 JavaScript standard. The compiler has a \n``--js-version`` option that can also be used to output ES 6 only code. This\ncode is smaller and faster than the ES 5 version, but is not as widely\ncompatible.\n\n#### Tabs vs Spaces\n\nThis seems to be a very old debate. Python code conventions suggest 4-space\nindent. The old version of RapydScript relied on tabs, new one uses spaces\nsince that seems to be more consistent in both Python and JavaScript\ncommunities. Use whichever one you prefer, as long as you stay consistent. If\nyou intend to submit your code to RapydScript, it must use spaces to be\nconsistent with the rest of the code in the repository.\n\n#### External Libraries and Classes\n\nRapydScript will pick up any classes you declare yourself as well as native\nJavaScript classes. It will not, however, pick up class-like objects created by\noutside frameworks. There are two approaches for dealing with those. One is via\n`@external` decorator, the other is via `new` operator when declaring such\nobject. To keep code legible and consistent, I strongly prefer the use of\n`@external` decorator over the `new` operator for several reasons, even if it\nmay be more verbose:\n\n- `@external` decorator makes classes declared externally obvious to anyone looking at your code\n- class declaration that uses `@external` decorator can be exported into a reusable module\n- developers are much more likely to forget a single instance of `new` operator when declaring an object than to forget an import, the errors due to omitted `new` keyword are also likely to be more subtle and devious to debug\n\n#### Embedding the RapydScript compiler in your webpage\n\nYou can embed the RapydScript compiler in your webpage so that you can have\nyour webapp directly compile user supplied RapydScript code into JavaScript.\nTo do so, simply include the [embeddable rapydscript compiler](https://sw.kovidgoyal.net/rapydscript/repl/rapydscript.js) \nin your page, and use it to compile arbitrary RapydScript code. \n\nYou create the compiler by calling: `RapydScript.create_embedded_compiler()` and compile\ncode with `compiler.compile(code)`. You can execute the resulting JavaScript\nusing the standard `eval()` function. See the sample\nHTML below for an example.\n\n```html\n<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\">\n        <title>Test embedded RapydScript</title>\n        <script charset=\"UTF-8\" src=\"https://sw.kovidgoyal.net/rapydscript/repl/rapydscript.js\"></script>\n        <script>\nvar compiler = RapydScript.create_embedded_compiler();\nvar js = compiler.compile(\"def hello_world():\\n a='RapydScript is cool!'\\n print(a)\\n alert(a)\");\nwindow.onload = function() {\n    document.body.textContent = js;\n    eval(js);\n    eval('hello_world()');\n};\n        </script>\n    </head>\n    <body style=\"white-space:pre-wrap\"></body>\n</html>\n```\n\nThere are a couple of caveats when using the embedded compiler:\n\n* It only works when run in a modern browser (one that supports ES6) so no\n  Internet Explorer. You can have it work in an ES 5 runtime by passing\n  an option to the compile() method, like this:\n  ```\n  compiler.compile(code, {js_version:5})\n  ```\n  Note that doing this means that you cannot use generators and the\n  yield keyword in your RapydScript code.\n\n* Importing of modules only works with the standard library modules. There is\n  currently no way to make your own modules importable.\n\n* To generate the embedded compiler yourself (rapydscript.js) from a source\n  checkout of rapydscript, follow the instructions above for installing from\n  source, then run `bin/web-repl-export /path/to/export/directory`\n\nInternationalization\n-------------------------\n\nRapydScript includes support for internationalization -- i.e. the translation\nof user interface strings defined in the RapydScript source code. The interface\nfor this is very similar to Python's gettext module.  Suppose you have some\ncode that needs internalization support, the first step is to mark all\nuser-viewable strings as translatable:\n\n```py\nfrom gettext import gettext as _\ncreate_button(_('My Button'))\ncreate_button(_('Another Button'))\n```\n\nNow we need to extract these string from the source code into a .pot file which\ncan be used to create translations. To do that, run:\n\n```\nrapydscript gettext file.pyj > messages.pot\n```\n\nNow send the `messages.pot` file to your translators. Suppose you get back a\n`de.po` file from the translators with German translations. You now need to\ncompile this into a format that can be used by RapydScript (RapydScript uses a\nJSON based format for easy operation over HTTP). Simply run:\n\n```\nrapydscript msgfmt < messages.pot > messages.json\n```\n\nNow, suppose you load up the translation data in your application. Exactly how\nyou do that is upto you. You can load it via Ajax or using a `<script>` tag. To\nactivate the loaded data, simply run:\n\n```py\nfrom gettext import install\n\ninstall(translation_data)\n```\n\nNow everywhere in your program that you have calls to the `_()` function, you\nwill get translated output. So make sure you install the translation data\nbefore building the rest of your user-interface.\n\nJust as in python, you also have a `ngettext()` function for translating\nstrings that depend on a count.\n\n\nGotchas\n---------\n\nRapydScript has a couple of mutually conflicting goals: Be as close to python\nas possible, while also generating clean, performant JavaScript and making\ninterop with external JavaScript libraries easy.\n\nAs a result, there are some things in RapydScript that might come as surprises\nto an experienced Python developer. The most important such gotchas are listed\nbelow:\n\n- Truthiness in JavaScript is very different from Python. Empty lists and dicts\n  are ``False`` in Python but ``True`` in JavaScript. The compiler could work\n  around that, but not without a significant performance cost, so it is best to\n  just get used to checking the length instead of the object directly.\n\n- Operators in JavaScript are very different from Python. ``1 + '1'`` would be\n  an error in Python, but results in ``'11'`` in JavaScript. Similarly, ``[1] +\n  [1]`` is a new list in Python, but a string in JavaScript. Keep that in mind\n  as you write code. RapydScript does not implement operator overloading, as\n  method calls in JavaScript are very slow compared to raw operators.\n\n- There are many more keywords than in Python. Because RapydScript compiles\n  down to JavaScript, the set of keywords is all the keywords of Python + all\n  the keywords of JavaScript. For example, ``default`` and ``switch`` are\n  keywords in RapydScript. See [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords)\n  for a list of JavaScript keywords.\n\n- Method binding in RS is not automatic. So ``someobj.somemethod()`` will do the\n  right thing, but ``x = someobj.somethod; x()`` will not. You can turn method binding on\n  via a scoped flag. See the section above on method binding for details.\n\n- Nested comprehensions are not supported. So you cannot do this:\n\t[a for a in b for b in c]\n\n- RapydScript automatically appends 'new' keyword when using classes generated\n  by it, native JavaScript objects like `Image` and `RegExp` and classes from\n  other libraries marked as external. However, automatic new insertion depends\n  on the compiler being able to detect that a symbol resolves to a class.\n  Because of the dynamic nature of JavaScript this is not possible to do with\n  100% accuracy. So it is best to get in the habit of using the `new` keyword\n  yourself. Similarly, the compiler will try to convert SomeClass.method() into\n  SomeClass.prototype.method() for you, but again, this is not 100% reliable.\n\n- The {\"a\":b} syntax is used to create JavaScript hashes. These do not behave\n  like python dictionaries. To create python like dictionary objects, you\n  should use a scoped flag. See the section on dictionaries above for details.\n\n\nReasons for the fork\n----------------------\n\nThe fork was initially created because the original developer of RapydScript\ndid not have the time to keep up with the pace of development. Since then, \ndevelopment on the original RapydScript seems to have stalled completely.\nAlso, there are certain disagreements on the future direction of RapydScript.\n\nRegardless, this fork is not a hostile fork, if development on the original\never resumes, they are welcome to use the code from this fork. I have kept all\nnew code under the same license, to make that possible.\n\nSee the [Changelog](https://github.com/kovidgoyal/rapydscript-ng/blob/master/CHANGELOG.md)\nfor a list of changes to rapydscript-ng since the fork.\n\nFor some discussion surrounding the fork, see \n[this bug report](https://github.com/kovidgoyal/rapydscript-ng/issues/15)\n"
  },
  {
    "path": "add-toc-to-readme",
    "content": "#!/bin/sh\nexec node_modules/doctoc/doctoc.js --title '**Contents**' README.md\n"
  },
  {
    "path": "bin/export",
    "content": "#!/usr/bin/env node \n// vim:ft=javascript:ts=4:et\n\n\"use strict\";\n\nvar fs = require('fs');\nvar path = require('path');\nvar crypto = require('crypto');\n\nvar base = path.join(path.dirname(__dirname));\nvar meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));\nvar compiler_dir = path.join(base, 'dev');\nif (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');\n\nvar manifest = {}, total = 0;\n['compiler.js', 'baselib-plain-pretty.js', 'baselib-plain-ugly.js'].forEach(function(x) {\n    manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});\n    total += manifest[x].length;\n});\n\n['web_repl.js', 'repl.js', 'completer.js', 'utils.js', 'gettext.js', 'msgfmt.js'].forEach(function(x) {\n    x = 'tools/' + x;\n    manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});\n    total += manifest[x].length;\n});\n\n\nvar dedup = {};\n\nfunction path_exists(path) {\n    try {\n        fs.statSync(path);\n        return true;\n    } catch(e) {\n        if (e.code != 'ENOENT') throw e;\n    }\n}\n\nfunction sha1sum(data) { \n    var h = crypto.createHash('sha1');\n    h.update(data);\n    return h.digest('hex');\n}\n\nfunction process_dir(name) {\n    var dpath = path.join(base, name);\n    var items = fs.readdirSync(dpath);\n    items.forEach(function (x) {\n        var iname = name + '/' + x;\n        var ipath = path.join(dpath, x);\n        var s = fs.statSync(ipath);\n        if (s.isDirectory()) return process_dir(iname);\n        var raw = fs.readFileSync(ipath, {'encoding':'utf-8'});\n        var sig = sha1sum(raw);\n        if (dedup.hasOwnProperty(sig)) {\n            manifest[iname] = [dedup[sig]];\n        } else {\n            manifest[iname] = raw;\n            dedup[sig] = iname;\n            total += s.size;\n        }\n    });\n}\n\nObject.keys(meta.dependencies).forEach(function (x) {\n    process_dir('node_modules/' + x);\n});\nconsole.log('// vim:fileencoding=utf-8');\nconsole.log('(function() {');\nconsole.log('var rs_version = ' + JSON.stringify(meta.version) + ';');\nconsole.log('var data = ' + JSON.stringify(manifest) + ';');\nconsole.log();\nconsole.log(fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'}));\nconsole.log('})()');\nconsole.error('RapydScript compiler (uncompressed) size: ' + (total/(1024 * 1024)).toFixed(1) + ' MB');\n"
  },
  {
    "path": "bin/rapydscript",
    "content": "#!/usr/bin/env node \n// vim:ft=javascript:ts=4:et\n\n\"use strict\";\n\nfunction load(mod) {\n    return require('../tools/' + mod);\n}\n\nvar utils = load('utils');\n\n// We need ES 6 generators so relaunch with the --harmony flag\nif (!utils.generators_available()) {\n    if (process.execArgv.indexOf('--harmony') != -1) {\n        console.error('RapydScript needs ES 6 generators, update your version of nodejs');\n        process.exit(1);\n    }\n    var args = ['--harmony', module.filename].concat(process.argv.slice(2));\n    require('child_process').spawn(process.execPath, args, {stdio:'inherit'}).on('exit', function(code, signal) {\n        process.exit(code);\n    });\n} else {\n\n    var start_time = new Date().getTime();\n    var path = require('path');\n\n    var argv = load('cli').argv;\n\n    var base_path = path.normalize(path.join(path.dirname(module.filename), \"..\"));\n    var src_path = path.join(base_path, 'src');\n    var lib_path = path.join(base_path, 'dev');\n    if (!utils.path_exists(path.join(lib_path, 'compiler.js'))) lib_path = path.join(base_path, 'release');\n\n    if (argv.mode === 'self') {\n        if (argv.files.length > 0) {\n            console.error(\"WARN: Ignoring input files since --self was passed\");\n        }\n        load('self')(base_path, src_path, lib_path, argv.complete, argv.profile);\n        if (argv.test) {\n            console.log('\\nRunning test suite...\\n');\n            argv.files = [];  // Ensure all tests are run\n            load('test')(argv, base_path, src_path, path.join(base_path, 'dev'));\n        }\n        process.exit(0);\n    } else \n\n    if (argv.mode === 'test') {\n        load('test')(argv, base_path, src_path, lib_path);\n    } else \n\n    if (argv.mode === 'lint') {\n        load('lint').cli(argv, base_path, src_path, lib_path);\n    } else\n\n    if (argv.mode === 'repl') {\n        load('repl')({'lib_path':lib_path, 'imp_path':path.join(src_path, 'lib'), show_js:!argv.no_js});\n    } else \n    \n    if (argv.mode === 'gettext') {\n        load('gettext').cli(argv, base_path, src_path, lib_path);\n    } else\n    \n    if (argv.mode === 'msgfmt') {\n        load('msgfmt').cli(argv, base_path, src_path, lib_path);\n    } else\n    \n    {\n        load('compile')(start_time, argv, base_path, src_path, lib_path);\n    }\n}\n"
  },
  {
    "path": "bin/web-repl-export",
    "content": "#!/usr/bin/env node \n// vim:ft=javascript:ts=4:et\n\n\"use strict\";\n\nvar fs = require('fs');\nvar path = require('path');\n\nvar base = path.normalize(path.resolve(path.join(path.dirname(__dirname))));\nvar meta = JSON.parse(fs.readFileSync(path.join(base, 'package.json'), {'encoding':'utf-8'}));\nvar commit_sha = fs.readFileSync(path.join(base, '.git', 'refs', 'heads', 'master'), {'encoding':'utf-8'}).trim();\nvar compiler_dir = path.join(base, 'dev');\nif (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');\n\nvar manifest = {}, total = 0;\n['compiler.js', 'baselib-plain-pretty.js'].forEach(function(x) {\n    manifest[x] = fs.readFileSync(path.join(compiler_dir, x), {'encoding':'utf-8'});\n    total += manifest[x].length;\n});\n\n['web_repl.js', 'embedded_compiler.js', 'utils.js', 'completer.js', 'msgfmt.js', 'gettext.js'].forEach(function(x) {\n    x = 'tools/' + x;\n    manifest[x] = fs.readFileSync(path.join(base, x), {'encoding':'utf-8'});\n    total += manifest[x].length;\n});\n\nvar stdlib = path.join(base, 'src', 'lib');\n\nfunction path_exists(path) {\n    try {\n        fs.statSync(path);\n        return true;\n    } catch(e) {\n        if (e.code != 'ENOENT') throw e;\n    }\n}\n\nfunction process_dir(relpath) {\n    var fullpath = (relpath) ? path.join(stdlib, relpath) : stdlib;\n    fs.readdirSync(fullpath).forEach(function (x) {\n        var q = path.join(fullpath, x);\n        var s = fs.statSync(q);\n        if (s.isDirectory()) return process_dir(relpath + '/' + x);\n        if (!x.endsWith('.pyj')) return;\n        var iname = path.normalize('__stdlib__' + '/' + relpath + '/' + x);\n        var raw = fs.readFileSync(q, {'encoding':'utf-8'});\n        manifest[iname] = raw;\n        total += s.size;\n    });\n}\nprocess_dir('');\n\n\nvar rs = '// vim:fileencoding=utf-8\\n';\nrs += '(function(external_namespace) {\\n';\nrs += '\"use strict;\"\\n';\nrs += 'var rs_version = ' + JSON.stringify(meta.version) + ';\\n';\nrs += 'var rs_commit_sha = ' + JSON.stringify(commit_sha) + ';\\n';\nrs += '\\n// Embedded modules {{{\\n';\nrs += 'var data = ' + JSON.stringify(manifest) + ';\\n\\n';\nrs += '// End embedded modules }}}\\n\\n';\nrs += fs.readFileSync(path.join(base, 'web-repl', 'env.js'));\nrs += '\\n// Embedded sha1 implementation {{{\\n';\nrs += '(function() {\\n';\nrs += fs.readFileSync(path.join(base, 'web-repl', 'sha1.js'));\nrs += '}).call(jsSHA);\\n';\nrs += '// End embedded sha1 implementation }}}\\n\\n';\nrs += 'var exports = namespace;\\n';\nrs += fs.readFileSync(path.join(base, 'tools', 'export.js'), {'encoding':'utf-8'});\nrs += 'external_namespace.RapydScript = namespace;\\n';\nrs += '})(this);\\n';\n\n\nvar base_dir = process.argv.slice(-1)[0];\nif (process.argv.length !== 3) {\n    console.error('Usage: web-repl-export /path/to/export/directory');\n    process.exit(1);\n}\n\nbase_dir = path.normalize(path.resolve(base_dir));\n\ntry {\n    fs.mkdirSync(base_dir);\n} catch(e) {\n    if (e.code !== 'EEXIST') throw e;\n}\n\ntry {\n    process.chdir(base_dir);\n} catch(e) {\n    if (e.code === 'ENOTDIR') { console.error(base_dir + ' is not a directory'); process.exit(1); }\n    throw e;\n}\nfs.writeFileSync('rapydscript.js', rs, {'encoding':'utf-8'});\nvar web_repl = path.join(base, 'web-repl');\nfs.readdirSync(web_repl).forEach(function(x) {\n    if (['sha1.js', 'env.js'].indexOf(x) !== -1) return;\n    var data = fs.readFileSync(path.join(web_repl, x), {'encoding':'utf-8'});\n    fs.writeFileSync(x, data, {'encoding':'utf-8'});\n});\nconsole.log('RapydScript compiler (uncompressed) size: ' + (total/(1024)).toFixed(1) + ' KB');\nconsole.log('web-repl exported to: ' + base_dir);\n"
  },
  {
    "path": "build",
    "content": "#!/bin/sh\nexec bin/rapydscript self --complete --test\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"rapydscript-ng\",\n  \"description\": \"Pythonic JavaScript that doesn't suck\",\n  \"homepage\": \"https://github.com/kovidgoyal/rapydscript-ng\",\n  \"keywords\": [\n    \"javascript\",\n    \"rapydscript\",\n    \"language\",\n    \"compiler\"\n  ],\n  \"main\": \"tools/compiler.js\",\n  \"scripts\": {\n    \"test\": \"node bin/rapydscript self --complete --test\",\n    \"start\": \"node bin/rapydscript\",\n    \"build-self\": \"node bin/rapydscript self --complete\"\n  },\n  \"version\": \"0.7.23\",\n  \"license\": \"BSD-2-Clause\",\n  \"engines\": {\n    \"node\": \">=0.12.0\"\n  },\n  \"maintainers\": [\n    {\n      \"name\": \"Kovid Goyal\",\n      \"email\": \"kovid@kovidgoyal.net\"\n    }\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/kovidgoyal/rapydscript-ng.git\"\n  },\n  \"dependencies\": {\n    \"regenerator\": \">= 0.12.1\",\n    \"uglify-js\": \">= 3.0.15\"\n  },\n  \"optionalDependencies\": {\n    \"v8-profiler\": \">= 5.2.9\"\n  },\n  \"bin\": {\n    \"rapydscript\": \"bin/rapydscript\"\n  }\n}\n"
  },
  {
    "path": "publish.py",
    "content": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\nimport subprocess\nimport os\nimport shutil\nimport json\n\n# Load metadata\nbase = os.path.dirname(os.path.abspath(__file__))\nsubprocess.check_call([os.path.join(base, 'build')])\nwith open('package.json', 'rb') as f:\n    m = json.load(f)\nversion = m['version']\n\n# Update the files in release/ from dev/\nshutil.rmtree(os.path.join(base, 'release'))\nshutil.copytree(os.path.join(base, 'dev'), os.path.join(base, 'release'))\nsubprocess.check_call(['git', 'add', os.path.join(base, 'release')])\nif subprocess.check_output(\n        'git status --porcelain --untracked-files release'.split()).strip():\n    subprocess.check_call([\n        'git', 'commit', '-m', 'Updating release build of compiler'])\n    subprocess.check_call('git push'.split())\n\n# Tag the release\nsubprocess.check_call('git tag -s v{0} -m version-{0}'.format(version).split())\nsubprocess.check_call(['git', 'push', 'origin', 'v'+version])\n\n# Update the web REPL\ngh_pages = os.path.join(os.path.dirname(base), 'kovidgoyal.github.io')\nsubprocess.check_call([os.path.join(gh_pages, 'update-rapyd-repl.py')])\n\n# Publish to NPM\nsubprocess.check_call(['npm', 'login'])\nsubprocess.check_call(['npm', 'publish', base])\n"
  },
  {
    "path": "release/baselib-plain-pretty.js",
    "content": "var ρσ_len;\nfunction ρσ_bool(val) {\n    return !!val;\n};\nif (!ρσ_bool.__argnames__) Object.defineProperties(ρσ_bool, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_print() {\n    var parts;\n    if (typeof console === \"object\") {\n        parts = [];\n        for (var i = 0; i < arguments.length; i++) {\n            parts.push(ρσ_str(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]));\n        }\n        console.log(parts.join(\" \"));\n    }\n};\nif (!ρσ_print.__module__) Object.defineProperties(ρσ_print, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_int(val, base) {\n    var ans;\n    if (typeof val === \"number\") {\n        ans = val | 0;\n    } else {\n        ans = parseInt(val, base || 10);\n    }\n    if (isNaN(ans)) {\n        throw new ValueError(\"Invalid literal for int with base \" + (base || 10) + \": \" + val);\n    }\n    return ans;\n};\nif (!ρσ_int.__argnames__) Object.defineProperties(ρσ_int, {\n    __argnames__ : {value: [\"val\", \"base\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_float(val) {\n    var ans;\n    if (typeof val === \"number\") {\n        ans = val;\n    } else {\n        ans = parseFloat(val);\n    }\n    if (isNaN(ans)) {\n        throw new ValueError(\"Could not convert string to float: \" + arguments[0]);\n    }\n    return ans;\n};\nif (!ρσ_float.__argnames__) Object.defineProperties(ρσ_float, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_arraylike_creator() {\n    var names;\n    names = \"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".split(\" \");\n    if (typeof HTMLCollection === \"function\") {\n        names = names.concat(\"HTMLCollection NodeList NamedNodeMap TouchList\".split(\" \"));\n    }\n    return (function() {\n        var ρσ_anonfunc = function (x) {\n            if (Array.isArray(x) || typeof x === \"string\" || names.indexOf(Object.prototype.toString.call(x).slice(8, -1)) > -1) {\n                return true;\n            }\n            return false;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"x\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n};\nif (!ρσ_arraylike_creator.__module__) Object.defineProperties(ρσ_arraylike_creator, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction options_object(f) {\n    return (function() {\n        var ρσ_anonfunc = function () {\n            if (typeof arguments[arguments.length - 1] === \"object\") {\n                arguments[ρσ_bound_index(arguments.length - 1, arguments)][ρσ_kwargs_symbol] = true;\n            }\n            return f.apply(this, arguments);\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n};\nif (!options_object.__argnames__) Object.defineProperties(options_object, {\n    __argnames__ : {value: [\"f\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_id(x) {\n    return x.ρσ_object_id;\n};\nif (!ρσ_id.__argnames__) Object.defineProperties(ρσ_id, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_dir(item) {\n    var arr;\n    arr = ρσ_list_decorate([]);\n    for (var i in item) {\n        arr.push(i);\n    }\n    return arr;\n};\nif (!ρσ_dir.__argnames__) Object.defineProperties(ρσ_dir, {\n    __argnames__ : {value: [\"item\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_ord(x) {\n    var ans, second;\n    ans = x.charCodeAt(0);\n    if (55296 <= ans && ans <= 56319) {\n        second = x.charCodeAt(1);\n        if (56320 <= second && second <= 57343) {\n            return (ans - 55296) * 1024 + second - 56320 + 65536;\n        }\n        throw new TypeError(\"string is missing the low surrogate char\");\n    }\n    return ans;\n};\nif (!ρσ_ord.__argnames__) Object.defineProperties(ρσ_ord, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_chr(code) {\n    if (code <= 65535) {\n        return String.fromCharCode(code);\n    }\n    code -= 65536;\n    return String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n};\nif (!ρσ_chr.__argnames__) Object.defineProperties(ρσ_chr, {\n    __argnames__ : {value: [\"code\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_callable(x) {\n    return typeof x === \"function\";\n};\nif (!ρσ_callable.__argnames__) Object.defineProperties(ρσ_callable, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_bin(x) {\n    var ans;\n    if (typeof x !== \"number\" || x % 1 !== 0) {\n        throw new TypeError(\"integer required\");\n    }\n    ans = x.toString(2);\n    if (ans[0] === \"-\") {\n        ans = \"-\" + \"0b\" + ans.slice(1);\n    } else {\n        ans = \"0b\" + ans;\n    }\n    return ans;\n};\nif (!ρσ_bin.__argnames__) Object.defineProperties(ρσ_bin, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_hex(x) {\n    var ans;\n    if (typeof x !== \"number\" || x % 1 !== 0) {\n        throw new TypeError(\"integer required\");\n    }\n    ans = x.toString(16);\n    if (ans[0] === \"-\") {\n        ans = \"-\" + \"0x\" + ans.slice(1);\n    } else {\n        ans = \"0x\" + ans;\n    }\n    return ans;\n};\nif (!ρσ_hex.__argnames__) Object.defineProperties(ρσ_hex, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_enumerate(iterable) {\n    var ans, iterator;\n    ans = {\"_i\":-1};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    if (ρσ_arraylike(iterable)) {\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i < iterable.length) {\n                    return {'done':false, 'value':[this._i, iterable[this._i]]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans[\"_iterator\"] = iterator;\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                var r;\n                r = this._iterator.next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                this._i += 1;\n                return {'done':false, 'value':[this._i, r.value]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    return ρσ_enumerate(Object.keys(iterable));\n};\nif (!ρσ_enumerate.__argnames__) Object.defineProperties(ρσ_enumerate, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_reversed(iterable) {\n    var ans;\n    if (ρσ_arraylike(iterable)) {\n        ans = {\"_i\": iterable.length};\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i -= 1;\n                if (this._i > -1) {\n                    return {'done':false, 'value':iterable[this._i]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    throw new TypeError(\"reversed() can only be called on arrays or strings\");\n};\nif (!ρσ_reversed.__argnames__) Object.defineProperties(ρσ_reversed, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_iter(iterable) {\n    var ans;\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        return (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n    }\n    if (ρσ_arraylike(iterable)) {\n        ans = {\"_i\":-1};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i < iterable.length) {\n                    return {'done':false, 'value':iterable[this._i]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    return ρσ_iter(Object.keys(iterable));\n};\nif (!ρσ_iter.__argnames__) Object.defineProperties(ρσ_iter, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_range_next(step, length) {\n    var ρσ_unpack;\n    this._i += step;\n    this._idx += 1;\n    if (this._idx >= length) {\n        ρσ_unpack = [this.__i, -1];\n        this._i = ρσ_unpack[0];\n        this._idx = ρσ_unpack[1];\n        return {'done':true};\n    }\n    return {'done':false, 'value':this._i};\n};\nif (!ρσ_range_next.__argnames__) Object.defineProperties(ρσ_range_next, {\n    __argnames__ : {value: [\"step\", \"length\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_range(start, stop, step) {\n    var length, ans;\n    if (arguments.length <= 1) {\n        stop = start || 0;\n        start = 0;\n    }\n    step = arguments[2] || 1;\n    length = Math.max(Math.ceil((stop - start) / step), 0);\n    ans = {start:start, step:step, stop:stop};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            var it;\n            it = {\"_i\": start - step, \"_idx\": -1};\n            it.next = ρσ_range_next.bind(it, step, length);\n            it[ρσ_iterator_symbol] = (function() {\n                var ρσ_anonfunc = function () {\n                    return this;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return it;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.count = (function() {\n        var ρσ_anonfunc = function (val) {\n            if (!this._cached) {\n                this._cached = list(this);\n            }\n            return this._cached.count(val);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.index = (function() {\n        var ρσ_anonfunc = function (val) {\n            if (!this._cached) {\n                this._cached = list(this);\n            }\n            return this._cached.index(val);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__len__ = (function() {\n        var ρσ_anonfunc = function () {\n            return length;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__repr__ = (function() {\n        var ρσ_anonfunc = function () {\n            return \"range(\" + ρσ_str.format(\"{}\", start) + \", \" + ρσ_str.format(\"{}\", stop) + \", \" + ρσ_str.format(\"{}\", step) + \")\";\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__str__ = ans.toString = ans.__repr__;\n    if (typeof Proxy === \"function\") {\n        ans = new Proxy(ans, (function(){\n            var ρσ_d = {};\n            ρσ_d[\"get\"] = (function() {\n                var ρσ_anonfunc = function (obj, prop) {\n                    var iprop;\n                    if (typeof prop === \"string\") {\n                        iprop = parseInt(prop);\n                        if (!isNaN(iprop)) {\n                            prop = iprop;\n                        }\n                    }\n                    if (typeof prop === \"number\") {\n                        if (!obj._cached) {\n                            obj._cached = list(obj);\n                        }\n                        return (ρσ_expr_temp = obj._cached)[(typeof prop === \"number\" && prop < 0) ? ρσ_expr_temp.length + prop : prop];\n                    }\n                    return obj[(typeof prop === \"number\" && prop < 0) ? obj.length + prop : prop];\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"obj\", \"prop\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return ρσ_d;\n        }).call(this));\n    }\n    return ans;\n};\nif (!ρσ_range.__argnames__) Object.defineProperties(ρσ_range, {\n    __argnames__ : {value: [\"start\", \"stop\", \"step\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_getattr(obj, name, defval) {\n    var ret;\n    try {\n        ret = obj[(typeof name === \"number\" && name < 0) ? obj.length + name : name];\n    } catch (ρσ_Exception) {\n        ρσ_last_exception = ρσ_Exception;\n        if (ρσ_Exception instanceof TypeError) {\n            if (defval === undefined) {\n                throw new AttributeError(\"The attribute \" + name + \" is not present\");\n            }\n            return defval;\n        } else {\n            throw ρσ_Exception;\n        }\n    }\n    if (ret === undefined && !(name in obj)) {\n        if (defval === undefined) {\n            throw new AttributeError(\"The attribute \" + name + \" is not present\");\n        }\n        ret = defval;\n    }\n    return ret;\n};\nif (!ρσ_getattr.__argnames__) Object.defineProperties(ρσ_getattr, {\n    __argnames__ : {value: [\"obj\", \"name\", \"defval\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_setattr(obj, name, value) {\n    obj[(typeof name === \"number\" && name < 0) ? obj.length + name : name] = value;\n};\nif (!ρσ_setattr.__argnames__) Object.defineProperties(ρσ_setattr, {\n    __argnames__ : {value: [\"obj\", \"name\", \"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_hasattr(obj, name) {\n    return name in obj;\n};\nif (!ρσ_hasattr.__argnames__) Object.defineProperties(ρσ_hasattr, {\n    __argnames__ : {value: [\"obj\", \"name\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_len = (function() {\n    var ρσ_anonfunc = function () {\n        function len(obj) {\n            if (ρσ_arraylike(obj)) {\n                return obj.length;\n            }\n            if (typeof obj.__len__ === \"function\") {\n                return obj.__len__();\n            }\n            if (obj instanceof Set || obj instanceof Map) {\n                return obj.size;\n            }\n            return Object.keys(obj).length;\n        };\n        if (!len.__argnames__) Object.defineProperties(len, {\n            __argnames__ : {value: [\"obj\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function len5(obj) {\n            if (ρσ_arraylike(obj)) {\n                return obj.length;\n            }\n            if (typeof obj.__len__ === \"function\") {\n                return obj.__len__();\n            }\n            return Object.keys(obj).length;\n        };\n        if (!len5.__argnames__) Object.defineProperties(len5, {\n            __argnames__ : {value: [\"obj\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        return (typeof Set === \"function\" && typeof Map === \"function\") ? len : len5;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_get_module(name) {\n    return ρσ_modules[(typeof name === \"number\" && name < 0) ? ρσ_modules.length + name : name];\n};\nif (!ρσ_get_module.__argnames__) Object.defineProperties(ρσ_get_module, {\n    __argnames__ : {value: [\"name\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_pow(x, y, z) {\n    var ans;\n    ans = Math.pow(x, y);\n    if (z !== undefined) {\n        ans %= z;\n    }\n    return ans;\n};\nif (!ρσ_pow.__argnames__) Object.defineProperties(ρσ_pow, {\n    __argnames__ : {value: [\"x\", \"y\", \"z\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_type(x) {\n    return x.constructor;\n};\nif (!ρσ_type.__argnames__) Object.defineProperties(ρσ_type, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_divmod(x, y) {\n    var d;\n    if (y === 0) {\n        throw new ZeroDivisionError(\"integer division or modulo by zero\");\n    }\n    d = Math.floor(x / y);\n    return [d, x - d * y];\n};\nif (!ρσ_divmod.__argnames__) Object.defineProperties(ρσ_divmod, {\n    __argnames__ : {value: [\"x\", \"y\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_max() {\n    var kwargs = arguments[arguments.length-1];\n    if (kwargs === null || typeof kwargs !== \"object\" || kwargs [ρσ_kwargs_symbol] !== true) kwargs = {};\n    var args = Array.prototype.slice.call(arguments, 0);\n    if (kwargs !== null && typeof kwargs === \"object\" && kwargs [ρσ_kwargs_symbol] === true) args.pop();\n    var args, x;\n    if (args.length === 0) {\n        if (kwargs.defval !== undefined) {\n            return kwargs.defval;\n        }\n        throw new TypeError(\"expected at least one argument\");\n    }\n    if (args.length === 1) {\n        args = args[0];\n    }\n    if (kwargs.key) {\n        args = (function() {\n            var ρσ_Iter = ρσ_Iterable(args), ρσ_Result = [], x;\n            for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                x = ρσ_Iter[ρσ_Index];\n                ρσ_Result.push(kwargs.key(x));\n            }\n            ρσ_Result = ρσ_list_constructor(ρσ_Result);\n            return ρσ_Result;\n        })();\n    }\n    if (!Array.isArray(args)) {\n        args = list(args);\n    }\n    if (args.length) {\n        return this.apply(null, args);\n    }\n    if (kwargs.defval !== undefined) {\n        return kwargs.defval;\n    }\n    throw new TypeError(\"expected at least one argument\");\n};\nif (!ρσ_max.__handles_kwarg_interpolation__) Object.defineProperties(ρσ_max, {\n    __handles_kwarg_interpolation__ : {value: true},\n    __module__ : {value: \"__main__\"}\n});\n\nvar abs = Math.abs, max = ρσ_max.bind(Math.max), min = ρσ_max.bind(Math.min), bool = ρσ_bool, type = ρσ_type;\nvar float = ρσ_float, int = ρσ_int, arraylike = ρσ_arraylike_creator(), ρσ_arraylike = arraylike;\nvar print = ρσ_print, id = ρσ_id, get_module = ρσ_get_module, pow = ρσ_pow, divmod = ρσ_divmod;\nvar dir = ρσ_dir, ord = ρσ_ord, chr = ρσ_chr, bin = ρσ_bin, hex = ρσ_hex, callable = ρσ_callable;\nvar enumerate = ρσ_enumerate, iter = ρσ_iter, reversed = ρσ_reversed, len = ρσ_len;\nvar range = ρσ_range, getattr = ρσ_getattr, setattr = ρσ_setattr, hasattr = ρσ_hasattr;function ρσ_equals(a, b) {\n    var ρσ_unpack, akeys, bkeys, key;\n    if (a === b) {\n        return true;\n    }\n    if (a && typeof a.__eq__ === \"function\") {\n        return a.__eq__(b);\n    }\n    if (b && typeof b.__eq__ === \"function\") {\n        return b.__eq__(a);\n    }\n    if (ρσ_arraylike(a) && ρσ_arraylike(b)) {\n        if ((a.length !== b.length && (typeof a.length !== \"object\" || ρσ_not_equals(a.length, b.length)))) {\n            return false;\n        }\n        for (var i=0; i < a.length; i++) {\n            if (!(((a[(typeof i === \"number\" && i < 0) ? a.length + i : i] === b[(typeof i === \"number\" && i < 0) ? b.length + i : i] || typeof a[(typeof i === \"number\" && i < 0) ? a.length + i : i] === \"object\" && ρσ_equals(a[(typeof i === \"number\" && i < 0) ? a.length + i : i], b[(typeof i === \"number\" && i < 0) ? b.length + i : i]))))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    if (typeof a === \"object\" && typeof b === \"object\" && a !== null && b !== null && (a.constructor === Object && b.constructor === Object || Object.getPrototypeOf(a) === null && Object.getPrototypeOf(b) === null)) {\n        ρσ_unpack = [Object.keys(a), Object.keys(b)];\n        akeys = ρσ_unpack[0];\n        bkeys = ρσ_unpack[1];\n        if (akeys.length !== bkeys.length) {\n            return false;\n        }\n        for (var j=0; j < akeys.length; j++) {\n            key = akeys[(typeof j === \"number\" && j < 0) ? akeys.length + j : j];\n            if (!(((a[(typeof key === \"number\" && key < 0) ? a.length + key : key] === b[(typeof key === \"number\" && key < 0) ? b.length + key : key] || typeof a[(typeof key === \"number\" && key < 0) ? a.length + key : key] === \"object\" && ρσ_equals(a[(typeof key === \"number\" && key < 0) ? a.length + key : key], b[(typeof key === \"number\" && key < 0) ? b.length + key : key]))))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n};\nif (!ρσ_equals.__argnames__) Object.defineProperties(ρσ_equals, {\n    __argnames__ : {value: [\"a\", \"b\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_not_equals(a, b) {\n    if (a === b) {\n        return false;\n    }\n    if (a && typeof a.__ne__ === \"function\") {\n        return a.__ne__(b);\n    }\n    if (b && typeof b.__ne__ === \"function\") {\n        return b.__ne__(a);\n    }\n    return !ρσ_equals(a, b);\n};\nif (!ρσ_not_equals.__argnames__) Object.defineProperties(ρσ_not_equals, {\n    __argnames__ : {value: [\"a\", \"b\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar equals = ρσ_equals;\nfunction ρσ_list_extend(iterable) {\n    var start, iterator, result;\n    if (Array.isArray(iterable) || typeof iterable === \"string\") {\n        start = this.length;\n        this.length += iterable.length;\n        for (var i = 0; i < iterable.length; i++) {\n            (ρσ_expr_temp = this)[ρσ_bound_index(start + i, ρσ_expr_temp)] = iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i];\n        }\n    } else {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        result = iterator.next();\n        while (!result.done) {\n            this.push(result.value);\n            result = iterator.next();\n        }\n    }\n};\nif (!ρσ_list_extend.__argnames__) Object.defineProperties(ρσ_list_extend, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_index(val, start, stop) {\n    start = start || 0;\n    if (start < 0) {\n        start = this.length + start;\n    }\n    if (start < 0) {\n        throw new ValueError(val + \" is not in list\");\n    }\n    if (stop === undefined) {\n        stop = this.length;\n    }\n    if (stop < 0) {\n        stop = this.length + stop;\n    }\n    for (var i = start; i < stop; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === val || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], val))) {\n            return i;\n        }\n    }\n    throw new ValueError(val + \" is not in list\");\n};\nif (!ρσ_list_index.__argnames__) Object.defineProperties(ρσ_list_index, {\n    __argnames__ : {value: [\"val\", \"start\", \"stop\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_pop(index) {\n    var ans;\n    if (this.length === 0) {\n        throw new IndexError(\"list is empty\");\n    }\n    if (index === undefined) {\n        index = -1;\n    }\n    ans = this.splice(index, 1);\n    if (!ans.length) {\n        throw new IndexError(\"pop index out of range\");\n    }\n    return ans[0];\n};\nif (!ρσ_list_pop.__argnames__) Object.defineProperties(ρσ_list_pop, {\n    __argnames__ : {value: [\"index\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_remove(value) {\n    for (var i = 0; i < this.length; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === value || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], value))) {\n            this.splice(i, 1);\n            return;\n        }\n    }\n    throw new ValueError(value + \" not in list\");\n};\nif (!ρσ_list_remove.__argnames__) Object.defineProperties(ρσ_list_remove, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_to_string() {\n    return \"[\" + this.join(\", \") + \"]\";\n};\nif (!ρσ_list_to_string.__module__) Object.defineProperties(ρσ_list_to_string, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_insert(index, val) {\n    if (index < 0) {\n        index += this.length;\n    }\n    index = min(this.length, max(index, 0));\n    if (index === 0) {\n        this.unshift(val);\n        return;\n    }\n    for (var i = this.length; i > index; i--) {\n        (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] = (ρσ_expr_temp = this)[ρσ_bound_index(i - 1, ρσ_expr_temp)];\n    }\n    (ρσ_expr_temp = this)[(typeof index === \"number\" && index < 0) ? ρσ_expr_temp.length + index : index] = val;\n};\nif (!ρσ_list_insert.__argnames__) Object.defineProperties(ρσ_list_insert, {\n    __argnames__ : {value: [\"index\", \"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_copy() {\n    return ρσ_list_constructor(this);\n};\nif (!ρσ_list_copy.__module__) Object.defineProperties(ρσ_list_copy, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_clear() {\n    this.length = 0;\n};\nif (!ρσ_list_clear.__module__) Object.defineProperties(ρσ_list_clear, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_as_array() {\n    return Array.prototype.slice.call(this);\n};\nif (!ρσ_list_as_array.__module__) Object.defineProperties(ρσ_list_as_array, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_count(value) {\n    return this.reduce((function() {\n        var ρσ_anonfunc = function (n, val) {\n            return n + (val === value);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"n\", \"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })(), 0);\n};\nif (!ρσ_list_count.__argnames__) Object.defineProperties(ρσ_list_count, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort_key(value) {\n    var t;\n    t = typeof value;\n    if (t === \"string\" || t === \"number\") {\n        return value;\n    }\n    return value.toString();\n};\nif (!ρσ_list_sort_key.__argnames__) Object.defineProperties(ρσ_list_sort_key, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort_cmp(a, b, ap, bp) {\n    if (a < b) {\n        return -1;\n    }\n    if (a > b) {\n        return 1;\n    }\n    return ap - bp;\n};\nif (!ρσ_list_sort_cmp.__argnames__) Object.defineProperties(ρσ_list_sort_cmp, {\n    __argnames__ : {value: [\"a\", \"b\", \"ap\", \"bp\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort() {\n    var key = (arguments[0] === undefined || ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_list_sort.__defaults__.key : arguments[0];\n    var reverse = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_list_sort.__defaults__.reverse : arguments[1];\n    var ρσ_kwargs_obj = arguments[arguments.length-1];\n    if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"key\")){\n        key = ρσ_kwargs_obj.key;\n    }\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"reverse\")){\n        reverse = ρσ_kwargs_obj.reverse;\n    }\n    var mult, keymap, posmap, k;\n    key = key || ρσ_list_sort_key;\n    mult = (reverse) ? -1 : 1;\n    keymap = dict();\n    posmap = dict();\n    for (var i=0; i < this.length; i++) {\n        k = (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n        keymap.set(k, key(k));\n        posmap.set(k, i);\n    }\n    this.sort((function() {\n        var ρσ_anonfunc = function (a, b) {\n            return mult * ρσ_list_sort_cmp(keymap.get(a), keymap.get(b), posmap.get(a), posmap.get(b));\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"a\", \"b\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })());\n};\nif (!ρσ_list_sort.__defaults__) Object.defineProperties(ρσ_list_sort, {\n    __defaults__ : {value: {key:null, reverse:false}},\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"key\", \"reverse\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_concat() {\n    var ans;\n    ans = Array.prototype.concat.apply(this, arguments);\n    ρσ_list_decorate(ans);\n    return ans;\n};\nif (!ρσ_list_concat.__module__) Object.defineProperties(ρσ_list_concat, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_slice() {\n    var ans;\n    ans = Array.prototype.slice.apply(this, arguments);\n    ρσ_list_decorate(ans);\n    return ans;\n};\nif (!ρσ_list_slice.__module__) Object.defineProperties(ρσ_list_slice, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_iterator(value) {\n    var self;\n    self = this;\n    return (function(){\n        var ρσ_d = {};\n        ρσ_d[\"_i\"] = -1;\n        ρσ_d[\"_list\"] = self;\n        ρσ_d[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._list.length) {\n                    return (function(){\n                        var ρσ_d = {};\n                        ρσ_d[\"done\"] = true;\n                        return ρσ_d;\n                    }).call(this);\n                }\n                return (function(){\n                    var ρσ_d = {};\n                    ρσ_d[\"done\"] = false;\n                    ρσ_d[\"value\"] = (ρσ_expr_temp = this._list)[ρσ_bound_index(this._i, ρσ_expr_temp)];\n                    return ρσ_d;\n                }).call(this);\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n};\nif (!ρσ_list_iterator.__argnames__) Object.defineProperties(ρσ_list_iterator, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_len() {\n    return this.length;\n};\nif (!ρσ_list_len.__module__) Object.defineProperties(ρσ_list_len, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_contains(val) {\n    for (var i = 0; i < this.length; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === val || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], val))) {\n            return true;\n        }\n    }\n    return false;\n};\nif (!ρσ_list_contains.__argnames__) Object.defineProperties(ρσ_list_contains, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_eq(other) {\n    if (!ρσ_arraylike(other)) {\n        return false;\n    }\n    if ((this.length !== other.length && (typeof this.length !== \"object\" || ρσ_not_equals(this.length, other.length)))) {\n        return false;\n    }\n    for (var i = 0; i < this.length; i++) {\n        if (!((((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === other[(typeof i === \"number\" && i < 0) ? other.length + i : i] || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], other[(typeof i === \"number\" && i < 0) ? other.length + i : i]))))) {\n            return false;\n        }\n    }\n    return true;\n};\nif (!ρσ_list_eq.__argnames__) Object.defineProperties(ρσ_list_eq, {\n    __argnames__ : {value: [\"other\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_decorate(ans) {\n    ans.append = Array.prototype.push;\n    ans.toString = ρσ_list_to_string;\n    ans.inspect = ρσ_list_to_string;\n    ans.extend = ρσ_list_extend;\n    ans.index = ρσ_list_index;\n    ans.pypop = ρσ_list_pop;\n    ans.remove = ρσ_list_remove;\n    ans.insert = ρσ_list_insert;\n    ans.copy = ρσ_list_copy;\n    ans.clear = ρσ_list_clear;\n    ans.count = ρσ_list_count;\n    ans.concat = ρσ_list_concat;\n    ans.pysort = ρσ_list_sort;\n    ans.slice = ρσ_list_slice;\n    ans.as_array = ρσ_list_as_array;\n    ans.__len__ = ρσ_list_len;\n    ans.__contains__ = ρσ_list_contains;\n    ans.__eq__ = ρσ_list_eq;\n    ans.constructor = ρσ_list_constructor;\n    if (typeof ans[ρσ_iterator_symbol] !== \"function\") {\n        ans[ρσ_iterator_symbol] = ρσ_list_iterator;\n    }\n    return ans;\n};\nif (!ρσ_list_decorate.__argnames__) Object.defineProperties(ρσ_list_decorate, {\n    __argnames__ : {value: [\"ans\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_constructor(iterable) {\n    var ans, iterator, result;\n    if (iterable === undefined) {\n        ans = [];\n    } else if (ρσ_arraylike(iterable)) {\n        ans = new Array(iterable.length);\n        for (var i = 0; i < iterable.length; i++) {\n            ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i];\n        }\n    } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans = ρσ_list_decorate([]);\n        result = iterator.next();\n        while (!result.done) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n    } else if (typeof iterable === \"number\") {\n        ans = new Array(iterable);\n    } else {\n        ans = Object.keys(iterable);\n    }\n    return ρσ_list_decorate(ans);\n};\nif (!ρσ_list_constructor.__argnames__) Object.defineProperties(ρσ_list_constructor, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_list_constructor.__name__ = \"list\";\nvar list = ρσ_list_constructor, list_wrap = ρσ_list_decorate;\nfunction sorted() {\n    var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n    var key = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? sorted.__defaults__.key : arguments[1];\n    var reverse = (arguments[2] === undefined || ( 2 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? sorted.__defaults__.reverse : arguments[2];\n    var ρσ_kwargs_obj = arguments[arguments.length-1];\n    if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"key\")){\n        key = ρσ_kwargs_obj.key;\n    }\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"reverse\")){\n        reverse = ρσ_kwargs_obj.reverse;\n    }\n    var ans;\n    ans = ρσ_list_constructor(iterable);\n    ans.pysort(key, reverse);\n    return ans;\n};\nif (!sorted.__defaults__) Object.defineProperties(sorted, {\n    __defaults__ : {value: {key:null, reverse:false}},\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"iterable\", \"key\", \"reverse\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar ρσ_global_object_id = 0, ρσ_set_implementation;\nfunction ρσ_set_keyfor(x) {\n    var t, ans;\n    t = typeof x;\n    if (t === \"string\" || t === \"number\" || t === \"boolean\") {\n        return \"_\" + t[0] + x;\n    }\n    if (x === null) {\n        return \"__!@#$0\";\n    }\n    ans = x.ρσ_hash_key_prop;\n    if (ans === undefined) {\n        ans = \"_!@#$\" + (++ρσ_global_object_id);\n        Object.defineProperty(x, \"ρσ_hash_key_prop\", (function(){\n            var ρσ_d = {};\n            ρσ_d[\"value\"] = ans;\n            return ρσ_d;\n        }).call(this));\n    }\n    return ans;\n};\nif (!ρσ_set_keyfor.__argnames__) Object.defineProperties(ρσ_set_keyfor, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_set_polyfill() {\n    this._store = {};\n    this.size = 0;\n};\nif (!ρσ_set_polyfill.__module__) Object.defineProperties(ρσ_set_polyfill, {\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_set_polyfill.prototype.add = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (!Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size += 1;\n            (ρσ_expr_temp = this._store)[(typeof key === \"number\" && key < 0) ? ρσ_expr_temp.length + key : key] = x;\n        }\n        return this;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.clear = (function() {\n    var ρσ_anonfunc = function (x) {\n        this._store = {};\n        this.size = 0;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.delete = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size -= 1;\n            delete this._store[key];\n            return true;\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.has = (function() {\n    var ρσ_anonfunc = function (x) {\n        return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.values = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nif (typeof Set !== \"function\" || typeof Set.prototype.delete !== \"function\") {\n    ρσ_set_implementation = ρσ_set_polyfill;\n} else {\n    ρσ_set_implementation = Set;\n}\nfunction ρσ_set(iterable) {\n    var ans, s, iterator, result, keys;\n    if (this instanceof ρσ_set) {\n        this.jsset = new ρσ_set_implementation;\n        ans = this;\n        if (iterable === undefined) {\n            return ans;\n        }\n        s = ans.jsset;\n        if (ρσ_arraylike(iterable)) {\n            for (var i = 0; i < iterable.length; i++) {\n                s.add(iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i]);\n            }\n        } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n            iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n            result = iterator.next();\n            while (!result.done) {\n                s.add(result.value);\n                result = iterator.next();\n            }\n        } else {\n            keys = Object.keys(iterable);\n            for (var j=0; j < keys.length; j++) {\n                s.add(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j]);\n            }\n        }\n        return ans;\n    } else {\n        return new ρσ_set(iterable);\n    }\n};\nif (!ρσ_set.__argnames__) Object.defineProperties(ρσ_set, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_set.prototype.__name__ = \"set\";\nObject.defineProperties(ρσ_set.prototype, (function(){\n    var ρσ_d = {};\n    ρσ_d[\"length\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsset.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    ρσ_d[\"size\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsset.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    return ρσ_d;\n}).call(this));\nρσ_set.prototype.__len__ = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsset.size;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.has = ρσ_set.prototype.__contains__ = (function() {\n    var ρσ_anonfunc = function (x) {\n        return this.jsset.has(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.add = (function() {\n    var ρσ_anonfunc = function (x) {\n        this.jsset.add(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.clear = (function() {\n    var ρσ_anonfunc = function () {\n        this.jsset.clear();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.copy = (function() {\n    var ρσ_anonfunc = function () {\n        return ρσ_set(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.discard = (function() {\n    var ρσ_anonfunc = function (x) {\n        this.jsset.delete(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype[ρσ_iterator_symbol] = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsset.values();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.difference = (function() {\n    var ρσ_anonfunc = function () {\n        var ans, s, iterator, r, x, has;\n        ans = new ρσ_set;\n        s = ans.jsset;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            has = false;\n            for (var i = 0; i < arguments.length; i++) {\n                if (arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    has = true;\n                    break;\n                }\n            }\n            if (!has) {\n                s.add(x);\n            }\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.difference_update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, remove, iterator, r, x;\n        s = this.jsset;\n        remove = [];\n        iterator = s.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            for (var i = 0; i < arguments.length; i++) {\n                if (arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    remove.push(x);\n                    break;\n                }\n            }\n            r = iterator.next();\n        }\n        for (var j = 0; j < remove.length; j++) {\n            s.delete(remove[(typeof j === \"number\" && j < 0) ? remove.length + j : j]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.intersection = (function() {\n    var ρσ_anonfunc = function () {\n        var ans, s, iterator, r, x, has;\n        ans = new ρσ_set;\n        s = ans.jsset;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            has = true;\n            for (var i = 0; i < arguments.length; i++) {\n                if (!arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    has = false;\n                    break;\n                }\n            }\n            if (has) {\n                s.add(x);\n            }\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.intersection_update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, remove, iterator, r, x;\n        s = this.jsset;\n        remove = [];\n        iterator = s.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            for (var i = 0; i < arguments.length; i++) {\n                if (!arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    remove.push(x);\n                    break;\n                }\n            }\n            r = iterator.next();\n        }\n        for (var j = 0; j < remove.length; j++) {\n            s.delete(remove[(typeof j === \"number\" && j < 0) ? remove.length + j : j]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.isdisjoint = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (other.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.issubset = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (!other.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.issuperset = (function() {\n    var ρσ_anonfunc = function (other) {\n        var s, iterator, r, x;\n        s = this.jsset;\n        iterator = other.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (!s.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.pop = (function() {\n    var ρσ_anonfunc = function () {\n        var iterator, r;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        if (r.done) {\n            throw new KeyError(\"pop from an empty set\");\n        }\n        this.jsset.delete(r.value);\n        return r.value;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.remove = (function() {\n    var ρσ_anonfunc = function (x) {\n        if (!this.jsset.delete(x)) {\n            throw new KeyError(x.toString());\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.symmetric_difference = (function() {\n    var ρσ_anonfunc = function (other) {\n        return this.union(other).difference(this.intersection(other));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.symmetric_difference_update = (function() {\n    var ρσ_anonfunc = function (other) {\n        var common;\n        common = this.intersection(other);\n        this.update(other);\n        this.difference_update(common);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.union = (function() {\n    var ρσ_anonfunc = function () {\n        var ans;\n        ans = ρσ_set(this);\n        ans.update.apply(ans, arguments);\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, iterator, r;\n        s = this.jsset;\n        for (var i=0; i < arguments.length; i++) {\n            iterator = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i][ρσ_iterator_symbol]();\n            r = iterator.next();\n            while (!r.done) {\n                s.add(r.value);\n                r = iterator.next();\n            }\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.toString = ρσ_set.prototype.__repr__ = ρσ_set.prototype.__str__ = ρσ_set.prototype.inspect = (function() {\n    var ρσ_anonfunc = function () {\n        return \"{\" + list(this).join(\", \") + \"}\";\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.__eq__ = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r;\n        if (!other instanceof this.constructor) {\n            return false;\n        }\n        if (other.size !== this.size) {\n            return false;\n        }\n        if (other.size === 0) {\n            return true;\n        }\n        iterator = other[ρσ_iterator_symbol]();\n        r = iterator.next();\n        while (!r.done) {\n            if (!this.has(r.value)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nfunction ρσ_set_wrap(x) {\n    var ans;\n    ans = new ρσ_set;\n    ans.jsset = x;\n    return ans;\n};\nif (!ρσ_set_wrap.__argnames__) Object.defineProperties(ρσ_set_wrap, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar set = ρσ_set, set_wrap = ρσ_set_wrap;\nvar ρσ_dict_implementation;\nfunction ρσ_dict_polyfill() {\n    this._store = {};\n    this.size = 0;\n};\nif (!ρσ_dict_polyfill.__module__) Object.defineProperties(ρσ_dict_polyfill, {\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_dict_polyfill.prototype.set = (function() {\n    var ρσ_anonfunc = function (x, value) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (!Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size += 1;\n        }\n        (ρσ_expr_temp = this._store)[(typeof key === \"number\" && key < 0) ? ρσ_expr_temp.length + key : key] = [x, value];\n        return this;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.clear = (function() {\n    var ρσ_anonfunc = function (x) {\n        this._store = {};\n        this.size = 0;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.delete = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size -= 1;\n            delete this._store[key];\n            return true;\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.has = (function() {\n    var ρσ_anonfunc = function (x) {\n        return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.get = (function() {\n    var ρσ_anonfunc = function (x) {\n        try {\n            return (ρσ_expr_temp = this._store)[ρσ_bound_index(ρσ_set_keyfor(x), ρσ_expr_temp)][1];\n        } catch (ρσ_Exception) {\n            ρσ_last_exception = ρσ_Exception;\n            if (ρσ_Exception instanceof TypeError) {\n                return undefined;\n            } else {\n                throw ρσ_Exception;\n            }\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.values = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]][1]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.keys = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]][0]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.entries = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nif (typeof Map !== \"function\" || typeof Map.prototype.delete !== \"function\") {\n    ρσ_dict_implementation = ρσ_dict_polyfill;\n} else {\n    ρσ_dict_implementation = Map;\n}\nfunction ρσ_dict() {\n    var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n    var kw = arguments[arguments.length-1];\n    if (kw === null || typeof kw !== \"object\" || kw [ρσ_kwargs_symbol] !== true) kw = {};\n    if (this instanceof ρσ_dict) {\n        this.jsmap = new ρσ_dict_implementation;\n        if (iterable !== undefined) {\n            this.update(iterable);\n        }\n        this.update(kw);\n        return this;\n    } else {\n        return ρσ_interpolate_kwargs_constructor.call(Object.create(ρσ_dict.prototype), false, ρσ_dict, [iterable].concat([ρσ_desugar_kwargs(kw)]));\n    }\n};\nif (!ρσ_dict.__handles_kwarg_interpolation__) Object.defineProperties(ρσ_dict, {\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_dict.prototype.__name__ = \"dict\";\nObject.defineProperties(ρσ_dict.prototype, (function(){\n    var ρσ_d = {};\n    ρσ_d[\"length\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsmap.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    ρσ_d[\"size\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsmap.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    return ρσ_d;\n}).call(this));\nρσ_dict.prototype.__len__ = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.size;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.has = ρσ_dict.prototype.__contains__ = (function() {\n    var ρσ_anonfunc = function (x) {\n        return this.jsmap.has(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.set = ρσ_dict.prototype.__setitem__ = (function() {\n    var ρσ_anonfunc = function (key, value) {\n        this.jsmap.set(key, value);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__delitem__ = (function() {\n    var ρσ_anonfunc = function (key) {\n        this.jsmap.delete(key);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.clear = (function() {\n    var ρσ_anonfunc = function () {\n        this.jsmap.clear();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.copy = (function() {\n    var ρσ_anonfunc = function () {\n        return ρσ_dict(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.keys = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.keys();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.values = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.values();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.items = ρσ_dict.prototype.entries = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.entries();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype[ρσ_iterator_symbol] = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.keys();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__getitem__ = (function() {\n    var ρσ_anonfunc = function (key) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            throw new KeyError(key + \"\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.get = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            return (defval === undefined) ? null : defval;\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.set_default = ρσ_dict.prototype.setdefault = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var j;\n        j = this.jsmap;\n        if (!j.has(key)) {\n            j.set(key, defval);\n            return defval;\n        }\n        return j.get(key);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.fromkeys = ρσ_dict.prototype.fromkeys = (function() {\n    var ρσ_anonfunc = function () {\n        var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n        var value = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_anonfunc.__defaults__.value : arguments[1];\n        var ρσ_kwargs_obj = arguments[arguments.length-1];\n        if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n        if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"value\")){\n            value = ρσ_kwargs_obj.value;\n        }\n        var ans, iterator, r;\n        ans = ρσ_dict();\n        iterator = iter(iterable);\n        r = iterator.next();\n        while (!r.done) {\n            ans.set(r.value, value);\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__defaults__) Object.defineProperties(ρσ_anonfunc, {\n        __defaults__ : {value: {value:null}},\n        __handles_kwarg_interpolation__ : {value: true},\n        __argnames__ : {value: [\"iterable\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.pop = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            if (defval === undefined) {\n                throw new KeyError(key);\n            }\n            return defval;\n        }\n        this.jsmap.delete(key);\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.popitem = (function() {\n    var ρσ_anonfunc = function () {\n        var last, e, r;\n        last = null;\n        e = this.jsmap.entries();\n        while (true) {\n            r = e.next();\n            if (r.done) {\n                if (last === null) {\n                    throw new KeyError(\"dict is empty\");\n                }\n                this.jsmap.delete(last.value[0]);\n                return last.value;\n            }\n            last = r;\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.update = (function() {\n    var ρσ_anonfunc = function () {\n        var m, iterable, iterator, result, keys;\n        if (arguments.length === 0) {\n            return;\n        }\n        m = this.jsmap;\n        iterable = arguments[0];\n        if (Array.isArray(iterable)) {\n            for (var i = 0; i < iterable.length; i++) {\n                m.set(iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i][0], iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i][1]);\n            }\n        } else if (iterable instanceof ρσ_dict) {\n            iterator = iterable.items();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else if (typeof Map === \"function\" && iterable instanceof Map) {\n            iterator = iterable.entries();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n            iterator = iterable[ρσ_iterator_symbol]();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else {\n            keys = Object.keys(iterable);\n            for (var j=0; j < keys.length; j++) {\n                if (keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j] !== ρσ_iterator_symbol) {\n                    m.set(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], iterable[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], iterable)]);\n                }\n            }\n        }\n        if (arguments.length > 1) {\n            ρσ_dict.prototype.update.call(this, arguments[1]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.toString = ρσ_dict.prototype.inspect = ρσ_dict.prototype.__str__ = ρσ_dict.prototype.__repr__ = (function() {\n    var ρσ_anonfunc = function () {\n        var entries, iterator, r;\n        entries = [];\n        iterator = this.jsmap.entries();\n        r = iterator.next();\n        while (!r.done) {\n            entries.push(ρσ_repr(r.value[0]) + \": \" + ρσ_repr(r.value[1]));\n            r = iterator.next();\n        }\n        return \"{\" + entries.join(\", \") + \"}\";\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__eq__ = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        if (!(other instanceof this.constructor)) {\n            return false;\n        }\n        if (other.size !== this.size) {\n            return false;\n        }\n        if (other.size === 0) {\n            return true;\n        }\n        iterator = other.items();\n        r = iterator.next();\n        while (!r.done) {\n            x = this.jsmap.get(r.value[0]);\n            if (x === undefined && !this.jsmap.has(r.value[0]) || x !== r.value[1]) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.as_object = (function() {\n    var ρσ_anonfunc = function (other) {\n        var ans, iterator, r;\n        ans = {};\n        iterator = this.jsmap.entries();\n        r = iterator.next();\n        while (!r.done) {\n            ans[ρσ_bound_index(r.value[0], ans)] = r.value[1];\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nfunction ρσ_dict_wrap(x) {\n    var ans;\n    ans = new ρσ_dict;\n    ans.jsmap = x;\n    return ans;\n};\nif (!ρσ_dict_wrap.__argnames__) Object.defineProperties(ρσ_dict_wrap, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar dict = ρσ_dict, dict_wrap = ρσ_dict_wrap;// }}}\nvar NameError;\nNameError = ReferenceError;\nfunction Exception() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    Exception.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(Exception, Error);\nException.prototype.__init__ = function __init__(message) {\n    var self = this;\n    self.message = message;\n    self.stack = (new Error).stack;\n    self.name = self.constructor.name;\n};\nif (!Exception.prototype.__init__.__argnames__) Object.defineProperties(Exception.prototype.__init__, {\n    __argnames__ : {value: [\"message\"]},\n    __module__ : {value: \"__main__\"}\n});\nException.__argnames__ = Exception.prototype.__init__.__argnames__;\nException.__handles_kwarg_interpolation__ = Exception.prototype.__init__.__handles_kwarg_interpolation__;\nException.prototype.__repr__ = function __repr__() {\n    var self = this;\n    return self.name + \": \" + self.message;\n};\nif (!Exception.prototype.__repr__.__module__) Object.defineProperties(Exception.prototype.__repr__, {\n    __module__ : {value: \"__main__\"}\n});\nException.prototype.__str__ = function __str__ () {\n    if(Error.prototype.__str__) return Error.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(Exception.prototype, \"__bases__\", {value: [Error]});\n\nfunction AttributeError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    AttributeError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(AttributeError, Exception);\nAttributeError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nAttributeError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nAttributeError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(AttributeError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction IndexError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    IndexError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(IndexError, Exception);\nIndexError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nIndexError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nIndexError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(IndexError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction KeyError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    KeyError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(KeyError, Exception);\nKeyError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nKeyError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nKeyError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(KeyError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction ValueError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    ValueError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(ValueError, Exception);\nValueError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nValueError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nValueError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(ValueError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction UnicodeDecodeError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    UnicodeDecodeError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(UnicodeDecodeError, Exception);\nUnicodeDecodeError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nUnicodeDecodeError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nUnicodeDecodeError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(UnicodeDecodeError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction AssertionError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    AssertionError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(AssertionError, Exception);\nAssertionError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nAssertionError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nAssertionError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(AssertionError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction ZeroDivisionError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    ZeroDivisionError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(ZeroDivisionError, Exception);\nZeroDivisionError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nZeroDivisionError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nZeroDivisionError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(ZeroDivisionError.prototype, \"__bases__\", {value: [Exception]});\n\nvar ρσ_in, ρσ_desugar_kwargs, ρσ_exists;\nfunction ρσ_eslice(arr, step, start, end) {\n    var is_string;\n    if (typeof arr === \"string\" || arr instanceof String) {\n        is_string = true;\n        arr = arr.split(\"\");\n    }\n    if (step < 0) {\n        step = -step;\n        arr = arr.slice().reverse();\n        if (typeof start !== \"undefined\") {\n            start = arr.length - start - 1;\n        }\n        if (typeof end !== \"undefined\") {\n            end = arr.length - end - 1;\n        }\n    }\n    if (typeof start === \"undefined\") {\n        start = 0;\n    }\n    if (typeof end === \"undefined\") {\n        end = arr.length;\n    }\n    arr = arr.slice(start, end).filter((function() {\n        var ρσ_anonfunc = function (e, i) {\n            return i % step === 0;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"e\", \"i\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })());\n    if (is_string) {\n        arr = arr.join(\"\");\n    }\n    return arr;\n};\nif (!ρσ_eslice.__argnames__) Object.defineProperties(ρσ_eslice, {\n    __argnames__ : {value: [\"arr\", \"step\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_delslice(arr, step, start, end) {\n    var is_string, ρσ_unpack, indices;\n    if (typeof arr === \"string\" || arr instanceof String) {\n        is_string = true;\n        arr = arr.split(\"\");\n    }\n    if (step < 0) {\n        if (typeof start === \"undefined\") {\n            start = arr.length;\n        }\n        if (typeof end === \"undefined\") {\n            end = 0;\n        }\n        ρσ_unpack = [end, start, -step];\n        start = ρσ_unpack[0];\n        end = ρσ_unpack[1];\n        step = ρσ_unpack[2];\n    }\n    if (typeof start === \"undefined\") {\n        start = 0;\n    }\n    if (typeof end === \"undefined\") {\n        end = arr.length;\n    }\n    if (step === 1) {\n        arr.splice(start, end - start);\n    } else {\n        if (end > start) {\n            indices = [];\n            for (var i = start; i < end; i += step) {\n                indices.push(i);\n            }\n            for (var i = indices.length - 1; i >= 0; i--) {\n                arr.splice(indices[(typeof i === \"number\" && i < 0) ? indices.length + i : i], 1);\n            }\n        }\n    }\n    if (is_string) {\n        arr = arr.join(\"\");\n    }\n    return arr;\n};\nif (!ρσ_delslice.__argnames__) Object.defineProperties(ρσ_delslice, {\n    __argnames__ : {value: [\"arr\", \"step\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_flatten(arr) {\n    var ans, value;\n    ans = ρσ_list_decorate([]);\n    for (var i=0; i < arr.length; i++) {\n        value = arr[(typeof i === \"number\" && i < 0) ? arr.length + i : i];\n        if (Array.isArray(value)) {\n            ans = ans.concat(ρσ_flatten(value));\n        } else {\n            ans.push(value);\n        }\n    }\n    return ans;\n};\nif (!ρσ_flatten.__argnames__) Object.defineProperties(ρσ_flatten, {\n    __argnames__ : {value: [\"arr\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_unpack_asarray(num, iterable) {\n    var ans, iterator, result;\n    if (ρσ_arraylike(iterable)) {\n        return iterable;\n    }\n    ans = [];\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        result = iterator.next();\n        while (!result.done && ans.length < num) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n    }\n    return ans;\n};\nif (!ρσ_unpack_asarray.__argnames__) Object.defineProperties(ρσ_unpack_asarray, {\n    __argnames__ : {value: [\"num\", \"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_extends(child, parent) {\n    child.prototype = Object.create(parent.prototype);\n    child.prototype.constructor = child;\n};\nif (!ρσ_extends.__argnames__) Object.defineProperties(ρσ_extends, {\n    __argnames__ : {value: [\"child\", \"parent\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_in = (function() {\n    var ρσ_anonfunc = function () {\n        if (typeof Map === \"function\" && typeof Set === \"function\") {\n            return (function() {\n                var ρσ_anonfunc = function (val, arr) {\n                    if (typeof arr === \"string\") {\n                        return arr.indexOf(val) !== -1;\n                    }\n                    if (typeof arr.__contains__ === \"function\") {\n                        return arr.__contains__(val);\n                    }\n                    if (arr instanceof Map || arr instanceof Set) {\n                        return arr.has(val);\n                    }\n                    if (ρσ_arraylike(arr)) {\n                        return ρσ_list_contains.call(arr, val);\n                    }\n                    return Object.prototype.hasOwnProperty.call(arr, val);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"val\", \"arr\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        }\n        return (function() {\n            var ρσ_anonfunc = function (val, arr) {\n                if (typeof arr === \"string\") {\n                    return arr.indexOf(val) !== -1;\n                }\n                if (typeof arr.__contains__ === \"function\") {\n                    return arr.__contains__(val);\n                }\n                if (ρσ_arraylike(arr)) {\n                    return ρσ_list_contains.call(arr, val);\n                }\n                return Object.prototype.hasOwnProperty.call(arr, val);\n            };\n            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                __argnames__ : {value: [\"val\", \"arr\"]},\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_Iterable(iterable) {\n    var iterator, ans, result;\n    if (ρσ_arraylike(iterable)) {\n        return iterable;\n    }\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans = ρσ_list_decorate([]);\n        result = iterator.next();\n        while (!result.done) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n        return ans;\n    }\n    return Object.keys(iterable);\n};\nif (!ρσ_Iterable.__argnames__) Object.defineProperties(ρσ_Iterable, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_desugar_kwargs = (function() {\n    var ρσ_anonfunc = function () {\n        if (typeof Object.assign === \"function\") {\n            return (function() {\n                var ρσ_anonfunc = function () {\n                    var ans;\n                    ans = Object.create(null);\n                    ans[ρσ_kwargs_symbol] = true;\n                    for (var i = 0; i < arguments.length; i++) {\n                        Object.assign(ans, arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n                    }\n                    return ans;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        }\n        return (function() {\n            var ρσ_anonfunc = function () {\n                var ans, keys;\n                ans = Object.create(null);\n                ans[ρσ_kwargs_symbol] = true;\n                for (var i = 0; i < arguments.length; i++) {\n                    keys = Object.keys(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n                    for (var j = 0; j < keys.length; j++) {\n                        ans[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], ans)] = (ρσ_expr_temp = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i])[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], ρσ_expr_temp)];\n                    }\n                }\n                return ans;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_interpolate_kwargs(f, supplied_args) {\n    var has_prop, kwobj, args, prop;\n    if (!f.__argnames__) {\n        return f.apply(this, supplied_args);\n    }\n    has_prop = Object.prototype.hasOwnProperty;\n    kwobj = supplied_args.pop();\n    if (f.__handles_kwarg_interpolation__) {\n        args = new Array(Math.max(supplied_args.length, f.__argnames__.length) + 1);\n        args[args.length-1] = kwobj;\n        for (var i = 0; i < args.length - 1; i++) {\n            if (i < f.__argnames__.length) {\n                prop = (ρσ_expr_temp = f.__argnames__)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n                if (has_prop.call(kwobj, prop)) {\n                    args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = kwobj[(typeof prop === \"number\" && prop < 0) ? kwobj.length + prop : prop];\n                    delete kwobj[prop];\n                } else if (i < supplied_args.length) {\n                    args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i];\n                }\n            } else {\n                args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i];\n            }\n        }\n        return f.apply(this, args);\n    }\n    for (var i = 0; i < f.__argnames__.length; i++) {\n        prop = (ρσ_expr_temp = f.__argnames__)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n        if (has_prop.call(kwobj, prop)) {\n            supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i] = kwobj[(typeof prop === \"number\" && prop < 0) ? kwobj.length + prop : prop];\n        }\n    }\n    return f.apply(this, supplied_args);\n};\nif (!ρσ_interpolate_kwargs.__argnames__) Object.defineProperties(ρσ_interpolate_kwargs, {\n    __argnames__ : {value: [\"f\", \"supplied_args\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_interpolate_kwargs_constructor(apply, f, supplied_args) {\n    if (apply) {\n        f.apply(this, supplied_args);\n    } else {\n        ρσ_interpolate_kwargs.call(this, f, supplied_args);\n    }\n    return this;\n};\nif (!ρσ_interpolate_kwargs_constructor.__argnames__) Object.defineProperties(ρσ_interpolate_kwargs_constructor, {\n    __argnames__ : {value: [\"apply\", \"f\", \"supplied_args\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_getitem(obj, key) {\n    if (obj.__getitem__) {\n        return obj.__getitem__(key);\n    }\n    if (typeof key === \"number\" && key < 0) {\n        key += obj.length;\n    }\n    return obj[(typeof key === \"number\" && key < 0) ? obj.length + key : key];\n};\nif (!ρσ_getitem.__argnames__) Object.defineProperties(ρσ_getitem, {\n    __argnames__ : {value: [\"obj\", \"key\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_setitem(obj, key, val) {\n    if (obj.__setitem__) {\n        obj.__setitem__(key, val);\n    } else {\n        if (typeof key === \"number\" && key < 0) {\n            key += obj.length;\n        }\n        obj[(typeof key === \"number\" && key < 0) ? obj.length + key : key] = val;\n    }\n    return val;\n};\nif (!ρσ_setitem.__argnames__) Object.defineProperties(ρσ_setitem, {\n    __argnames__ : {value: [\"obj\", \"key\", \"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_delitem(obj, key) {\n    if (obj.__delitem__) {\n        obj.__delitem__(key);\n    } else if (typeof obj.splice === \"function\") {\n        obj.splice(key, 1);\n    } else {\n        if (typeof key === \"number\" && key < 0) {\n            key += obj.length;\n        }\n        delete obj[key];\n    }\n};\nif (!ρσ_delitem.__argnames__) Object.defineProperties(ρσ_delitem, {\n    __argnames__ : {value: [\"obj\", \"key\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_bound_index(idx, arr) {\n    if (typeof idx === \"number\" && idx < 0) {\n        idx += arr.length;\n    }\n    return idx;\n};\nif (!ρσ_bound_index.__argnames__) Object.defineProperties(ρσ_bound_index, {\n    __argnames__ : {value: [\"idx\", \"arr\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_splice(arr, val, start, end) {\n    start = start || 0;\n    if (start < 0) {\n        start += arr.length;\n    }\n    if (end === undefined) {\n        end = arr.length;\n    }\n    if (end < 0) {\n        end += arr.length;\n    }\n    Array.prototype.splice.apply(arr, [start, end - start].concat(val));\n};\nif (!ρσ_splice.__argnames__) Object.defineProperties(ρσ_splice, {\n    __argnames__ : {value: [\"arr\", \"val\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_exists = (function(){\n    var ρσ_d = {};\n    ρσ_d[\"n\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            return expr !== undefined && expr !== null;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"d\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (expr === undefined || expr === null) {\n                return Object.create(null);\n            }\n            return expr;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"c\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (typeof expr === \"function\") {\n                return expr;\n            }\n            return (function() {\n                var ρσ_anonfunc = function () {\n                    return undefined;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"g\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (expr === undefined || expr === null || typeof expr.__getitem__ !== \"function\") {\n                return (function(){\n                    var ρσ_d = {};\n                    ρσ_d[\"__getitem__\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            return undefined;\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"__main__\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    return ρσ_d;\n                }).call(this);\n            }\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"e\"] = (function() {\n        var ρσ_anonfunc = function (expr, alt) {\n            return (expr === undefined || expr === null) ? alt : expr;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\", \"alt\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ρσ_d;\n}).call(this);\nfunction ρσ_mixin() {\n    var seen, resolved_props, p, target, props, name;\n    seen = Object.create(null);\n    seen.__argnames__ = seen.__handles_kwarg_interpolation__ = seen.__init__ = seen.__annotations__ = seen.__doc__ = seen.__bind_methods__ = seen.__bases__ = seen.constructor = seen.__class__ = true;\n    resolved_props = {};\n    p = target = arguments[0].prototype;\n    while (p && p !== Object.prototype) {\n        props = Object.getOwnPropertyNames(p);\n        for (var i = 0; i < props.length; i++) {\n            seen[ρσ_bound_index(props[(typeof i === \"number\" && i < 0) ? props.length + i : i], seen)] = true;\n        }\n        p = Object.getPrototypeOf(p);\n    }\n    for (var c = 1; c < arguments.length; c++) {\n        p = arguments[(typeof c === \"number\" && c < 0) ? arguments.length + c : c].prototype;\n        while (p && p !== Object.prototype) {\n            props = Object.getOwnPropertyNames(p);\n            for (var i = 0; i < props.length; i++) {\n                name = props[(typeof i === \"number\" && i < 0) ? props.length + i : i];\n                if (seen[(typeof name === \"number\" && name < 0) ? seen.length + name : name]) {\n                    continue;\n                }\n                seen[(typeof name === \"number\" && name < 0) ? seen.length + name : name] = true;\n                resolved_props[(typeof name === \"number\" && name < 0) ? resolved_props.length + name : name] = Object.getOwnPropertyDescriptor(p, name);\n            }\n            p = Object.getPrototypeOf(p);\n        }\n    }\n    Object.defineProperties(target, resolved_props);\n};\nif (!ρσ_mixin.__module__) Object.defineProperties(ρσ_mixin, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_instanceof() {\n    var obj, bases, q, cls, p;\n    obj = arguments[0];\n    bases = \"\";\n    if (obj && obj.constructor && obj.constructor.prototype) {\n        bases = obj.constructor.prototype.__bases__ || \"\";\n    }\n    for (var i = 1; i < arguments.length; i++) {\n        q = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i];\n        if (obj instanceof q) {\n            return true;\n        }\n        if ((q === Array || q === ρσ_list_constructor) && Array.isArray(obj)) {\n            return true;\n        }\n        if (q === ρσ_str && (typeof obj === \"string\" || obj instanceof String)) {\n            return true;\n        }\n        if (q === ρσ_int && typeof obj === \"number\" && Number.isInteger(obj)) {\n            return true;\n        }\n        if (q === ρσ_float && typeof obj === \"number\" && !Number.isInteger(obj)) {\n            return true;\n        }\n        if (bases.length > 1) {\n            for (var c = 1; c < bases.length; c++) {\n                cls = bases[(typeof c === \"number\" && c < 0) ? bases.length + c : c];\n                while (cls) {\n                    if (q === cls) {\n                        return true;\n                    }\n                    p = Object.getPrototypeOf(cls.prototype);\n                    if (!p) {\n                        break;\n                    }\n                    cls = p.constructor;\n                }\n            }\n        }\n    }\n    return false;\n};\nif (!ρσ_instanceof.__module__) Object.defineProperties(ρσ_instanceof, {\n    __module__ : {value: \"__main__\"}\n});\nfunction sum(iterable, start) {\n    var ans, iterator, r;\n    if (Array.isArray(iterable)) {\n        return iterable.reduce((function() {\n            var ρσ_anonfunc = function (prev, cur) {\n                return prev + cur;\n            };\n            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                __argnames__ : {value: [\"prev\", \"cur\"]},\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })(), start || 0);\n    }\n    ans = start || 0;\n    iterator = iter(iterable);\n    r = iterator.next();\n    while (!r.done) {\n        ans += r.value;\n        r = iterator.next();\n    }\n    return ans;\n};\nif (!sum.__argnames__) Object.defineProperties(sum, {\n    __argnames__ : {value: [\"iterable\", \"start\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction map() {\n    var iterators, func, args, ans;\n    iterators = new Array(arguments.length - 1);\n    func = arguments[0];\n    args = new Array(arguments.length - 1);\n    for (var i = 1; i < arguments.length; i++) {\n        iterators[ρσ_bound_index(i - 1, iterators)] = iter(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n    }\n    ans = {'_func':func, '_iterators':iterators, '_args':args};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var r;\n            for (var i = 0; i < this._iterators.length; i++) {\n                r = (ρσ_expr_temp = this._iterators)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                (ρσ_expr_temp = this._args)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] = r.value;\n            }\n            return {'done':false, 'value':this._func.apply(undefined, this._args)};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!map.__module__) Object.defineProperties(map, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction filter(func_or_none, iterable) {\n    var func, ans;\n    func = (func_or_none === null) ? ρσ_bool : func_or_none;\n    ans = {'_func':func, '_iterator':ρσ_iter(iterable)};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var r;\n            r = this._iterator.next();\n            while (!r.done) {\n                if (this._func(r.value)) {\n                    return r;\n                }\n                r = this._iterator.next();\n            }\n            return {'done':true};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!filter.__argnames__) Object.defineProperties(filter, {\n    __argnames__ : {value: [\"func_or_none\", \"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction zip() {\n    var iterators, ans;\n    iterators = new Array(arguments.length);\n    for (var i = 0; i < arguments.length; i++) {\n        iterators[(typeof i === \"number\" && i < 0) ? iterators.length + i : i] = iter(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n    }\n    ans = {'_iterators':iterators};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var args, r;\n            args = new Array(this._iterators.length);\n            for (var i = 0; i < this._iterators.length; i++) {\n                r = (ρσ_expr_temp = this._iterators)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = r.value;\n            }\n            return {'done':false, 'value':args};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!zip.__module__) Object.defineProperties(zip, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction any(iterable) {\n    var i;\n    var ρσ_Iter0 = ρσ_Iterable(iterable);\n    for (var ρσ_Index0 = 0; ρσ_Index0 < ρσ_Iter0.length; ρσ_Index0++) {\n        i = ρσ_Iter0[ρσ_Index0];\n        if (i) {\n            return true;\n        }\n    }\n    return false;\n};\nif (!any.__argnames__) Object.defineProperties(any, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction all(iterable) {\n    var i;\n    var ρσ_Iter1 = ρσ_Iterable(iterable);\n    for (var ρσ_Index1 = 0; ρσ_Index1 < ρσ_Iter1.length; ρσ_Index1++) {\n        i = ρσ_Iter1[ρσ_Index1];\n        if (!i) {\n            return false;\n        }\n    }\n    return true;\n};\nif (!all.__argnames__) Object.defineProperties(all, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\nvar decimal_sep, define_str_func, ρσ_unpack, ρσ_orig_split, ρσ_orig_replace;\ndecimal_sep = 1.1.toLocaleString()[1];\nfunction ρσ_repr_js_builtin(x, as_array) {\n    var ans, b, keys, key;\n    ans = [];\n    b = \"{}\";\n    if (as_array) {\n        b = \"[]\";\n        for (var i = 0; i < x.length; i++) {\n            ans.push(ρσ_repr(x[(typeof i === \"number\" && i < 0) ? x.length + i : i]));\n        }\n    } else {\n        keys = Object.keys(x);\n        for (var k = 0; k < keys.length; k++) {\n            key = keys[(typeof k === \"number\" && k < 0) ? keys.length + k : k];\n            ans.push(JSON.stringify(key) + \":\" + ρσ_repr(x[(typeof key === \"number\" && key < 0) ? x.length + key : key]));\n        }\n    }\n    return b[0] + ans.join(\", \") + b[1];\n};\nif (!ρσ_repr_js_builtin.__argnames__) Object.defineProperties(ρσ_repr_js_builtin, {\n    __argnames__ : {value: [\"x\", \"as_array\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_html_element_to_string(elem) {\n    var attrs, val, attr, ans;\n    attrs = [];\n    var ρσ_Iter0 = ρσ_Iterable(elem.attributes);\n    for (var ρσ_Index0 = 0; ρσ_Index0 < ρσ_Iter0.length; ρσ_Index0++) {\n        attr = ρσ_Iter0[ρσ_Index0];\n        if (attr.specified) {\n            val = attr.value;\n            if (val.length > 10) {\n                val = val.slice(0, 15) + \"...\";\n            }\n            val = JSON.stringify(val);\n            attrs.push(\"\" + ρσ_str.format(\"{}\", attr.name) + \"=\" + ρσ_str.format(\"{}\", val) + \"\");\n        }\n    }\n    attrs = (attrs.length) ? \" \" + attrs.join(\" \") : \"\";\n    ans = \"<\" + ρσ_str.format(\"{}\", elem.tagName) + \"\" + ρσ_str.format(\"{}\", attrs) + \">\";\n    return ans;\n};\nif (!ρσ_html_element_to_string.__argnames__) Object.defineProperties(ρσ_html_element_to_string, {\n    __argnames__ : {value: [\"elem\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_repr(x) {\n    var ans, name;\n    if (x === null) {\n        return \"None\";\n    }\n    if (x === undefined) {\n        return \"undefined\";\n    }\n    ans = x;\n    if (typeof x.__repr__ === \"function\") {\n        ans = x.__repr__();\n    } else if (x === true || x === false) {\n        ans = (x) ? \"True\" : \"False\";\n    } else if (Array.isArray(x)) {\n        ans = ρσ_repr_js_builtin(x, true);\n    } else if (typeof x === \"function\") {\n        ans = x.toString();\n    } else if (typeof x === \"object\" && !x.toString) {\n        ans = ρσ_repr_js_builtin(x);\n    } else {\n        name = Object.prototype.toString.call(x).slice(8, -1);\n        if (ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name), -1)) {\n            return name + \"([\" + x.map((function() {\n                var ρσ_anonfunc = function (i) {\n                    return str.format(\"0x{:02x}\", i);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"i\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })()).join(\", \") + \"])\";\n        }\n        if (typeof HTMLElement !== \"undefined\" && x instanceof HTMLElement) {\n            ans = ρσ_html_element_to_string(x);\n        } else {\n            ans = (typeof x.toString === \"function\") ? x.toString() : x;\n        }\n        if (ans === \"[object Object]\") {\n            return ρσ_repr_js_builtin(x);\n        }\n        try {\n            ans = JSON.stringify(x);\n        } catch (ρσ_Exception) {\n            ρσ_last_exception = ρσ_Exception;\n            {\n            } \n        }\n    }\n    return ans + \"\";\n};\nif (!ρσ_repr.__argnames__) Object.defineProperties(ρσ_repr, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_str(x) {\n    var ans, name;\n    if (x === null) {\n        return \"None\";\n    }\n    if (x === undefined) {\n        return \"undefined\";\n    }\n    ans = x;\n    if (typeof x.__str__ === \"function\") {\n        ans = x.__str__();\n    } else if (typeof x.__repr__ === \"function\") {\n        ans = x.__repr__();\n    } else if (x === true || x === false) {\n        ans = (x) ? \"True\" : \"False\";\n    } else if (Array.isArray(x)) {\n        ans = ρσ_repr_js_builtin(x, true);\n    } else if (typeof x.toString === \"function\") {\n        name = Object.prototype.toString.call(x).slice(8, -1);\n        if (ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name), -1)) {\n            return name + \"([\" + x.map((function() {\n                var ρσ_anonfunc = function (i) {\n                    return str.format(\"0x{:02x}\", i);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"i\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })()).join(\", \") + \"])\";\n        }\n        if (typeof HTMLElement !== \"undefined\" && x instanceof HTMLElement) {\n            ans = ρσ_html_element_to_string(x);\n        } else {\n            ans = x.toString();\n        }\n        if (ans === \"[object Object]\") {\n            ans = ρσ_repr_js_builtin(x);\n        }\n    } else if (typeof x === \"object\" && !x.toString) {\n        ans = ρσ_repr_js_builtin(x);\n    }\n    return ans + \"\";\n};\nif (!ρσ_str.__argnames__) Object.defineProperties(ρσ_str, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\ndefine_str_func = (function() {\n    var ρσ_anonfunc = function (name, func) {\n        var f;\n        (ρσ_expr_temp = ρσ_str.prototype)[(typeof name === \"number\" && name < 0) ? ρσ_expr_temp.length + name : name] = func;\n        ρσ_str[(typeof name === \"number\" && name < 0) ? ρσ_str.length + name : name] = f = func.call.bind(func);\n        if (func.__argnames__) {\n            Object.defineProperty(f, \"__argnames__\", (function(){\n                var ρσ_d = {};\n                ρσ_d[\"value\"] = ['string'].concat(func.__argnames__);\n                return ρσ_d;\n            }).call(this));\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"name\", \"func\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_unpack = [String.prototype.split.call.bind(String.prototype.split), String.prototype.replace.call.bind(String.prototype.replace)];\nρσ_orig_split = ρσ_unpack[0];\nρσ_orig_replace = ρσ_unpack[1];\ndefine_str_func(\"format\", (function() {\n    var ρσ_anonfunc = function () {\n        var template, args, kwargs, explicit, implicit, idx, split, ans, pos, in_brace, markup, ch;\n        template = this;\n        if (template === undefined) {\n            throw new TypeError(\"Template is required\");\n        }\n        args = Array.prototype.slice.call(arguments);\n        kwargs = {};\n        if (args[args.length-1] && args[args.length-1][ρσ_kwargs_symbol] !== undefined) {\n            kwargs = args[args.length-1];\n            args = args.slice(0, -1);\n        }\n        explicit = implicit = false;\n        idx = 0;\n        split = ρσ_orig_split;\n        if (ρσ_str.format._template_resolve_pat === undefined) {\n            ρσ_str.format._template_resolve_pat = /[.\\[]/;\n        }\n        function resolve(arg, object) {\n            var ρσ_unpack, first, key, rest, ans;\n            if (!arg) {\n                return object;\n            }\n            ρσ_unpack = [arg[0], arg.slice(1)];\n            first = ρσ_unpack[0];\n            arg = ρσ_unpack[1];\n            key = split(arg, ρσ_str.format._template_resolve_pat, 1)[0];\n            rest = arg.slice(key.length);\n            ans = (first === \"[\") ? object[ρσ_bound_index(key.slice(0, -1), object)] : getattr(object, key);\n            if (ans === undefined) {\n                throw new KeyError((first === \"[\") ? key.slice(0, -1) : key);\n            }\n            return resolve(rest, ans);\n        };\n        if (!resolve.__argnames__) Object.defineProperties(resolve, {\n            __argnames__ : {value: [\"arg\", \"object\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function resolve_format_spec(format_spec) {\n            if (ρσ_str.format._template_resolve_fs_pat === undefined) {\n                ρσ_str.format._template_resolve_fs_pat = /[{]([a-zA-Z0-9_]+)[}]/g;\n            }\n            return format_spec.replace(ρσ_str.format._template_resolve_fs_pat, (function() {\n                var ρσ_anonfunc = function (match, key) {\n                    if (!Object.prototype.hasOwnProperty.call(kwargs, key)) {\n                        return \"\";\n                    }\n                    return \"\" + kwargs[(typeof key === \"number\" && key < 0) ? kwargs.length + key : key];\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"match\", \"key\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!resolve_format_spec.__argnames__) Object.defineProperties(resolve_format_spec, {\n            __argnames__ : {value: [\"format_spec\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function set_comma(ans, comma) {\n            var sep;\n            if (comma !== \",\") {\n                sep = 1234;\n                sep = sep.toLocaleString(undefined, {useGrouping: true})[1];\n                ans = str.replace(ans, sep, comma);\n            }\n            return ans;\n        };\n        if (!set_comma.__argnames__) Object.defineProperties(set_comma, {\n            __argnames__ : {value: [\"ans\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function safe_comma(value, comma) {\n            try {\n                return set_comma(value.toLocaleString(undefined, {useGrouping: true}), comma);\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                {\n                    return value.toString(10);\n                } \n            }\n        };\n        if (!safe_comma.__argnames__) Object.defineProperties(safe_comma, {\n            __argnames__ : {value: [\"value\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function safe_fixed(value, precision, comma) {\n            if (!comma) {\n                return value.toFixed(precision);\n            }\n            try {\n                return set_comma(value.toLocaleString(undefined, {useGrouping: true, minimumFractionDigits: precision, maximumFractionDigits: precision}), comma);\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                {\n                    return value.toFixed(precision);\n                } \n            }\n        };\n        if (!safe_fixed.__argnames__) Object.defineProperties(safe_fixed, {\n            __argnames__ : {value: [\"value\", \"precision\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function apply_formatting(value, format_spec) {\n            var ρσ_unpack, fill, align, sign, fhash, zeropad, width, comma, precision, ftype, is_numeric, is_int, lftype, code, prec, exp, nval, is_positive, left, right;\n            if (format_spec.indexOf(\"{\") !== -1) {\n                format_spec = resolve_format_spec(format_spec);\n            }\n            if (ρσ_str.format._template_format_pat === undefined) {\n                ρσ_str.format._template_format_pat = /([^{}](?=[<>=^]))?([<>=^])?([-+\\x20])?(\\#)?(0)?(\\d+)?([,_])?(?:\\.(\\d+))?([bcdeEfFgGnosxX%])?/;\n            }\n            try {\n                ρσ_unpack = format_spec.match(ρσ_str.format._template_format_pat).slice(1);\nρσ_unpack = ρσ_unpack_asarray(9, ρσ_unpack);\n                fill = ρσ_unpack[0];\n                align = ρσ_unpack[1];\n                sign = ρσ_unpack[2];\n                fhash = ρσ_unpack[3];\n                zeropad = ρσ_unpack[4];\n                width = ρσ_unpack[5];\n                comma = ρσ_unpack[6];\n                precision = ρσ_unpack[7];\n                ftype = ρσ_unpack[8];\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                if (ρσ_Exception instanceof TypeError) {\n                    return value;\n                } else {\n                    throw ρσ_Exception;\n                }\n            }\n            if (zeropad) {\n                fill = fill || \"0\";\n                align = align || \"=\";\n            } else {\n                fill = fill || \" \";\n                align = align || \">\";\n            }\n            is_numeric = Number(value) === value;\n            is_int = is_numeric && value % 1 === 0;\n            precision = parseInt(precision, 10);\n            lftype = (ftype || \"\").toLowerCase();\n            if (ftype === \"n\") {\n                is_numeric = true;\n                if (is_int) {\n                    if (comma) {\n                        throw new ValueError(\"Cannot specify ',' with 'n'\");\n                    }\n                    value = parseInt(value, 10).toLocaleString();\n                } else {\n                    value = parseFloat(value).toLocaleString();\n                }\n            } else if (['b', 'c', 'd', 'o', 'x'].indexOf(lftype) !== -1) {\n                value = parseInt(value, 10);\n                is_numeric = true;\n                if (!isNaN(value)) {\n                    if (ftype === \"b\") {\n                        value = (value >>> 0).toString(2);\n                        if (fhash) {\n                            value = \"0b\" + value;\n                        }\n                    } else if (ftype === \"c\") {\n                        if (value > 65535) {\n                            code = value - 65536;\n                            value = String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n                        } else {\n                            value = String.fromCharCode(value);\n                        }\n                    } else if (ftype === \"d\") {\n                        if (comma) {\n                            value = safe_comma(value, comma);\n                        } else {\n                            value = value.toString(10);\n                        }\n                    } else if (ftype === \"o\") {\n                        value = value.toString(8);\n                        if (fhash) {\n                            value = \"0o\" + value;\n                        }\n                    } else if (lftype === \"x\") {\n                        value = value.toString(16);\n                        value = (ftype === \"x\") ? value.toLowerCase() : value.toUpperCase();\n                        if (fhash) {\n                            value = \"0x\" + value;\n                        }\n                    }\n                }\n            } else if (['e','f','g','%'].indexOf(lftype) !== -1) {\n                is_numeric = true;\n                value = parseFloat(value);\n                prec = (isNaN(precision)) ? 6 : precision;\n                if (lftype === \"e\") {\n                    value = value.toExponential(prec);\n                    value = (ftype === \"E\") ? value.toUpperCase() : value.toLowerCase();\n                } else if (lftype === \"f\") {\n                    value = safe_fixed(value, prec, comma);\n                    value = (ftype === \"F\") ? value.toUpperCase() : value.toLowerCase();\n                } else if (lftype === \"%\") {\n                    value *= 100;\n                    value = safe_fixed(value, prec, comma) + \"%\";\n                } else if (lftype === \"g\") {\n                    prec = max(1, prec);\n                    exp = parseInt(split(value.toExponential(prec - 1).toLowerCase(), \"e\")[1], 10);\n                    if (-4 <= exp && exp < prec) {\n                        value = safe_fixed(value, prec - 1 - exp, comma);\n                    } else {\n                        value = value.toExponential(prec - 1);\n                    }\n                    value = value.replace(/0+$/g, \"\");\n                    if (value[value.length-1] === decimal_sep) {\n                        value = value.slice(0, -1);\n                    }\n                    if (ftype === \"G\") {\n                        value = value.toUpperCase();\n                    }\n                }\n            } else {\n                if (comma) {\n                    value = parseInt(value, 10);\n                    if (isNaN(value)) {\n                        throw new ValueError(\"Must use numbers with , or _\");\n                    }\n                    value = safe_comma(value, comma);\n                }\n                value += \"\";\n                if (!isNaN(precision)) {\n                    value = value.slice(0, precision);\n                }\n            }\n            value += \"\";\n            if (is_numeric && sign) {\n                nval = Number(value);\n                is_positive = !isNaN(nval) && nval >= 0;\n                if (is_positive && (sign === \" \" || sign === \"+\")) {\n                    value = sign + value;\n                }\n            }\n            function repeat(char, num) {\n                return (new Array(num+1)).join(char);\n            };\n            if (!repeat.__argnames__) Object.defineProperties(repeat, {\n                __argnames__ : {value: [\"char\", \"num\"]},\n                __module__ : {value: \"__main__\"}\n            });\n\n            if (is_numeric && width && width[0] === \"0\") {\n                width = width.slice(1);\n                ρσ_unpack = [\"0\", \"=\"];\n                fill = ρσ_unpack[0];\n                align = ρσ_unpack[1];\n            }\n            width = parseInt(width || \"-1\", 10);\n            if (isNaN(width)) {\n                throw new ValueError(\"Invalid width specification: \" + width);\n            }\n            if (fill && value.length < width) {\n                if (align === \"<\") {\n                    value = value + repeat(fill, width - value.length);\n                } else if (align === \">\") {\n                    value = repeat(fill, width - value.length) + value;\n                } else if (align === \"^\") {\n                    left = Math.floor((width - value.length) / 2);\n                    right = width - left - value.length;\n                    value = repeat(fill, left) + value + repeat(fill, right);\n                } else if (align === \"=\") {\n                    if (ρσ_in(value[0], \"+- \")) {\n                        value = value[0] + repeat(fill, width - value.length) + value.slice(1);\n                    } else {\n                        value = repeat(fill, width - value.length) + value;\n                    }\n                } else {\n                    throw new ValueError(\"Unrecognized alignment: \" + align);\n                }\n            }\n            return value;\n        };\n        if (!apply_formatting.__argnames__) Object.defineProperties(apply_formatting, {\n            __argnames__ : {value: [\"value\", \"format_spec\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function parse_markup(markup) {\n            var key, transformer, format_spec, pos, state, ch;\n            key = transformer = format_spec = \"\";\n            pos = 0;\n            state = 0;\n            while (pos < markup.length) {\n                ch = markup[(typeof pos === \"number\" && pos < 0) ? markup.length + pos : pos];\n                if (state === 0) {\n                    if (ch === \"!\") {\n                        state = 1;\n                    } else if (ch === \":\") {\n                        state = 2;\n                    } else {\n                        key += ch;\n                    }\n                } else if (state === 1) {\n                    if (ch === \":\") {\n                        state = 2;\n                    } else {\n                        transformer += ch;\n                    }\n                } else {\n                    format_spec += ch;\n                }\n                pos += 1;\n            }\n            return [key, transformer, format_spec];\n        };\n        if (!parse_markup.__argnames__) Object.defineProperties(parse_markup, {\n            __argnames__ : {value: [\"markup\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function render_markup(markup) {\n            var ρσ_unpack, key, transformer, format_spec, ends_with_equal, lkey, nvalue, object, ans;\n            ρσ_unpack = parse_markup(markup);\nρσ_unpack = ρσ_unpack_asarray(3, ρσ_unpack);\n            key = ρσ_unpack[0];\n            transformer = ρσ_unpack[1];\n            format_spec = ρσ_unpack[2];\n            if (transformer && ['a', 'r', 's'].indexOf(transformer) === -1) {\n                throw new ValueError(\"Unknown conversion specifier: \" + transformer);\n            }\n            ends_with_equal = key.endsWith(\"=\");\n            if (ends_with_equal) {\n                key = key.slice(0, -1);\n            }\n            lkey = key.length && split(key, /[.\\[]/, 1)[0];\n            if (lkey) {\n                explicit = true;\n                if (implicit) {\n                    throw new ValueError(\"cannot switch from automatic field numbering to manual field specification\");\n                }\n                nvalue = parseInt(lkey);\n                object = (isNaN(nvalue)) ? kwargs[(typeof lkey === \"number\" && lkey < 0) ? kwargs.length + lkey : lkey] : args[(typeof nvalue === \"number\" && nvalue < 0) ? args.length + nvalue : nvalue];\n                if (object === undefined) {\n                    if (isNaN(nvalue)) {\n                        throw new KeyError(lkey);\n                    }\n                    throw new IndexError(lkey);\n                }\n                object = resolve(key.slice(lkey.length), object);\n            } else {\n                implicit = true;\n                if (explicit) {\n                    throw new ValueError(\"cannot switch from manual field specification to automatic field numbering\");\n                }\n                if (idx >= args.length) {\n                    throw new IndexError(\"Not enough arguments to match template: \" + template);\n                }\n                object = args[(typeof idx === \"number\" && idx < 0) ? args.length + idx : idx];\n                idx += 1;\n            }\n            if (typeof object === \"function\") {\n                object = object();\n            }\n            ans = \"\" + object;\n            if (format_spec) {\n                ans = apply_formatting(ans, format_spec);\n            }\n            if (ends_with_equal) {\n                ans = \"\" + ρσ_str.format(\"{}\", key) + \"=\" + ρσ_str.format(\"{}\", ans) + \"\";\n            }\n            return ans;\n        };\n        if (!render_markup.__argnames__) Object.defineProperties(render_markup, {\n            __argnames__ : {value: [\"markup\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        ans = \"\";\n        pos = 0;\n        in_brace = 0;\n        markup = \"\";\n        while (pos < template.length) {\n            ch = template[(typeof pos === \"number\" && pos < 0) ? template.length + pos : pos];\n            if (in_brace) {\n                if (ch === \"{\") {\n                    in_brace += 1;\n                    markup += \"{\";\n                } else if (ch === \"}\") {\n                    in_brace -= 1;\n                    if (in_brace > 0) {\n                        markup += \"}\";\n                    } else {\n                        ans += render_markup(markup);\n                    }\n                } else {\n                    markup += ch;\n                }\n            } else {\n                if (ch === \"{\") {\n                    if (template[ρσ_bound_index(pos + 1, template)] === \"{\") {\n                        pos += 1;\n                        ans += \"{\";\n                    } else {\n                        in_brace = 1;\n                        markup = \"\";\n                    }\n                } else {\n                    ans += ch;\n                    if (ch === \"}\" && template[ρσ_bound_index(pos + 1, template)] === \"}\") {\n                        pos += 1;\n                    }\n                }\n            }\n            pos += 1;\n        }\n        if (in_brace) {\n            throw new ValueError(\"expected '}' before end of string\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"capitalize\", (function() {\n    var ρσ_anonfunc = function () {\n        var string;\n        string = this;\n        if (string) {\n            string = string[0].toUpperCase() + string.slice(1).toLowerCase();\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"center\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var left, right;\n        left = Math.floor((width - this.length) / 2);\n        right = width - left - this.length;\n        fill = fill || \" \";\n        return new Array(left+1).join(fill) + this + new Array(right+1).join(fill);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"count\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var string, ρσ_unpack, pos, step, ans;\n        string = this;\n        start = start || 0;\n        end = end || string.length;\n        if (start < 0 || end < 0) {\n            string = string.slice(start, end);\n            ρσ_unpack = [0, string.length];\n            start = ρσ_unpack[0];\n            end = ρσ_unpack[1];\n        }\n        pos = start;\n        step = needle.length;\n        if (!step) {\n            return 0;\n        }\n        ans = 0;\n        while (pos !== -1) {\n            pos = string.indexOf(needle, pos);\n            if (pos !== -1) {\n                ans += 1;\n                pos += step;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"endswith\", (function() {\n    var ρσ_anonfunc = function (suffixes, start, end) {\n        var string, q;\n        string = this;\n        start = start || 0;\n        if (typeof suffixes === \"string\") {\n            suffixes = [suffixes];\n        }\n        if (end !== undefined) {\n            string = string.slice(0, end);\n        }\n        for (var i = 0; i < suffixes.length; i++) {\n            q = suffixes[(typeof i === \"number\" && i < 0) ? suffixes.length + i : i];\n            if (string.indexOf(q, Math.max(start, string.length - q.length)) !== -1) {\n                return true;\n            }\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"suffixes\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"startswith\", (function() {\n    var ρσ_anonfunc = function (prefixes, start, end) {\n        var prefix;\n        start = start || 0;\n        if (typeof prefixes === \"string\") {\n            prefixes = [prefixes];\n        }\n        for (var i = 0; i < prefixes.length; i++) {\n            prefix = prefixes[(typeof i === \"number\" && i < 0) ? prefixes.length + i : i];\n            end = (end === undefined) ? this.length : end;\n            if (end - start >= prefix.length && prefix === this.slice(start, start + prefix.length)) {\n                return true;\n            }\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"prefixes\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"find\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        while (start < 0) {\n            start += this.length;\n        }\n        ans = this.indexOf(needle, start);\n        if (end !== undefined && ans !== -1) {\n            while (end < 0) {\n                end += this.length;\n            }\n            if (ans >= end - needle.length) {\n                return -1;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rfind\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        while (end < 0) {\n            end += this.length;\n        }\n        ans = this.lastIndexOf(needle, end - 1);\n        if (start !== undefined && ans !== -1) {\n            while (start < 0) {\n                start += this.length;\n            }\n            if (ans < start) {\n                return -1;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"index\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        ans = ρσ_str.prototype.find.apply(this, arguments);\n        if (ans === -1) {\n            throw new ValueError(\"substring not found\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rindex\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        ans = ρσ_str.prototype.rfind.apply(this, arguments);\n        if (ans === -1) {\n            throw new ValueError(\"substring not found\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"islower\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && this.toLowerCase() === this.toString();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"isupper\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && this.toUpperCase() === this.toString();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"isspace\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && /^\\s+$/.test(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"join\", (function() {\n    var ρσ_anonfunc = function (iterable) {\n        var ans, r;\n        if (Array.isArray(iterable)) {\n            return iterable.join(this);\n        }\n        ans = \"\";\n        r = iterable.next();\n        while (!r.done) {\n            if (ans) {\n                ans += this;\n            }\n            ans += r.value;\n            r = iterable.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"iterable\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"ljust\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            fill = fill || \" \";\n            string += new Array(width - string.length + 1).join(fill);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rjust\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            fill = fill || \" \";\n            string = new Array(width - string.length + 1).join(fill) + string;\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"lower\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.toLowerCase();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"upper\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.toUpperCase();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"lstrip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        var string, pos;\n        string = this;\n        pos = 0;\n        chars = chars || ρσ_str.whitespace;\n        while (chars.indexOf(string[(typeof pos === \"number\" && pos < 0) ? string.length + pos : pos]) !== -1) {\n            pos += 1;\n        }\n        if (pos) {\n            string = string.slice(pos);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rstrip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        var string, pos;\n        string = this;\n        pos = string.length - 1;\n        chars = chars || ρσ_str.whitespace;\n        while (chars.indexOf(string[(typeof pos === \"number\" && pos < 0) ? string.length + pos : pos]) !== -1) {\n            pos -= 1;\n        }\n        if (pos < string.length - 1) {\n            string = string.slice(0, pos + 1);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"strip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        return ρσ_str.prototype.lstrip.call(ρσ_str.prototype.rstrip.call(this, chars), chars);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"partition\", (function() {\n    var ρσ_anonfunc = function (sep) {\n        var idx;\n        idx = this.indexOf(sep);\n        if (idx === -1) {\n            return [this, \"\", \"\"];\n        }\n        return [this.slice(0, idx), sep, this.slice(idx + sep.length)];\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rpartition\", (function() {\n    var ρσ_anonfunc = function (sep) {\n        var idx;\n        idx = this.lastIndexOf(sep);\n        if (idx === -1) {\n            return [\"\", \"\", this];\n        }\n        return [this.slice(0, idx), sep, this.slice(idx + sep.length)];\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"replace\", (function() {\n    var ρσ_anonfunc = function (old, repl, count) {\n        var string, pos, idx;\n        string = this;\n        if (count === 1) {\n            return ρσ_orig_replace(string, old, repl);\n        }\n        if (count < 1) {\n            return string;\n        }\n        count = count || Number.MAX_VALUE;\n        pos = 0;\n        while (count > 0) {\n            count -= 1;\n            idx = string.indexOf(old, pos);\n            if (idx === -1) {\n                break;\n            }\n            pos = idx + repl.length;\n            string = string.slice(0, idx) + repl + string.slice(idx + old.length);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"old\", \"repl\", \"count\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"split\", (function() {\n    var ρσ_anonfunc = function (sep, maxsplit) {\n        var split, ans, extra, parts;\n        if (maxsplit === 0) {\n            return ρσ_list_decorate([ this ]);\n        }\n        split = ρσ_orig_split;\n        if (sep === undefined || sep === null) {\n            if (maxsplit > 0) {\n                ans = split(this, /(\\s+)/);\n                extra = \"\";\n                parts = [];\n                for (var i = 0; i < ans.length; i++) {\n                    if (parts.length >= maxsplit + 1) {\n                        extra += ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i];\n                    } else if (i % 2 === 0) {\n                        parts.push(ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i]);\n                    }\n                }\n                parts[parts.length-1] += extra;\n                ans = parts;\n            } else {\n                ans = split(this, /\\s+/);\n            }\n        } else {\n            if (sep === \"\") {\n                throw new ValueError(\"empty separator\");\n            }\n            ans = split(this, sep);\n            if (maxsplit > 0 && ans.length > maxsplit) {\n                extra = ans.slice(maxsplit).join(sep);\n                ans = ans.slice(0, maxsplit);\n                ans.push(extra);\n            }\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\", \"maxsplit\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rsplit\", (function() {\n    var ρσ_anonfunc = function (sep, maxsplit) {\n        var split, ans, is_space, pos, current, spc, ch, end, idx;\n        if (!maxsplit) {\n            return ρσ_str.prototype.split.call(this, sep);\n        }\n        split = ρσ_orig_split;\n        if (sep === undefined || sep === null) {\n            if (maxsplit > 0) {\n                ans = [];\n                is_space = /\\s/;\n                pos = this.length - 1;\n                current = \"\";\n                while (pos > -1 && maxsplit > 0) {\n                    spc = false;\n                    ch = (ρσ_expr_temp = this)[(typeof pos === \"number\" && pos < 0) ? ρσ_expr_temp.length + pos : pos];\n                    while (pos > -1 && is_space.test(ch)) {\n                        spc = true;\n                        ch = this[--pos];\n                    }\n                    if (spc) {\n                        if (current) {\n                            ans.push(current);\n                            maxsplit -= 1;\n                        }\n                        current = ch;\n                    } else {\n                        current += ch;\n                    }\n                    pos -= 1;\n                }\n                ans.push(this.slice(0, pos + 1) + current);\n                ans.reverse();\n            } else {\n                ans = split(this, /\\s+/);\n            }\n        } else {\n            if (sep === \"\") {\n                throw new ValueError(\"empty separator\");\n            }\n            ans = [];\n            pos = end = this.length;\n            while (pos > -1 && maxsplit > 0) {\n                maxsplit -= 1;\n                idx = this.lastIndexOf(sep, pos);\n                if (idx === -1) {\n                    break;\n                }\n                ans.push(this.slice(idx + sep.length, end));\n                pos = idx - 1;\n                end = idx;\n            }\n            ans.push(this.slice(0, end));\n            ans.reverse();\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\", \"maxsplit\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"splitlines\", (function() {\n    var ρσ_anonfunc = function (keepends) {\n        var split, parts, ans;\n        split = ρσ_orig_split;\n        if (keepends) {\n            parts = split(this, /((?:\\r?\\n)|\\r)/);\n            ans = [];\n            for (var i = 0; i < parts.length; i++) {\n                if (i % 2 === 0) {\n                    ans.push(parts[(typeof i === \"number\" && i < 0) ? parts.length + i : i]);\n                } else {\n                    ans[ans.length-1] += parts[(typeof i === \"number\" && i < 0) ? parts.length + i : i];\n                }\n            }\n        } else {\n            ans = split(this, /(?:\\r?\\n)|\\r/);\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"keepends\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"swapcase\", (function() {\n    var ρσ_anonfunc = function () {\n        var ans, a, b;\n        ans = new Array(this.length);\n        for (var i = 0; i < ans.length; i++) {\n            a = (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n            b = a.toLowerCase();\n            if (a === b) {\n                b = a.toUpperCase();\n            }\n            ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = b;\n        }\n        return ans.join(\"\");\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"zfill\", (function() {\n    var ρσ_anonfunc = function (width) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            string = new Array(width - string.length + 1).join(\"0\") + string;\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\nρσ_str.uchrs = (function() {\n    var ρσ_anonfunc = function (string, with_positions) {\n        return (function(){\n            var ρσ_d = {};\n            ρσ_d[\"_string\"] = string;\n            ρσ_d[\"_pos\"] = 0;\n            ρσ_d[ρσ_iterator_symbol] = (function() {\n                var ρσ_anonfunc = function () {\n                    return this;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            ρσ_d[\"next\"] = (function() {\n                var ρσ_anonfunc = function () {\n                    var length, pos, value, ans, extra;\n                    length = this._string.length;\n                    if (this._pos >= length) {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = true;\n                            return ρσ_d;\n                        }).call(this);\n                    }\n                    pos = this._pos;\n                    value = this._string.charCodeAt(this._pos++);\n                    ans = \"\\ufffd\";\n                    if (55296 <= value && value <= 56319) {\n                        if (this._pos < length) {\n                            extra = this._string.charCodeAt(this._pos++);\n                            if ((extra & 56320) === 56320) {\n                                ans = String.fromCharCode(value, extra);\n                            }\n                        }\n                    } else if ((value & 56320) !== 56320) {\n                        ans = String.fromCharCode(value);\n                    }\n                    if (with_positions) {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = false;\n                            ρσ_d[\"value\"] = ρσ_list_decorate([ pos, ans ]);\n                            return ρσ_d;\n                        }).call(this);\n                    } else {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = false;\n                            ρσ_d[\"value\"] = ans;\n                            return ρσ_d;\n                        }).call(this);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return ρσ_d;\n        }).call(this);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\", \"with_positions\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.uslice = (function() {\n    var ρσ_anonfunc = function (string, start, end) {\n        var items, iterator, r;\n        items = [];\n        iterator = ρσ_str.uchrs(string);\n        r = iterator.next();\n        while (!r.done) {\n            items.push(r.value);\n            r = iterator.next();\n        }\n        return items.slice(start || 0, (end === undefined) ? items.length : end).join(\"\");\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.ulen = (function() {\n    var ρσ_anonfunc = function (string) {\n        var iterator, r, ans;\n        iterator = ρσ_str.uchrs(string);\n        r = iterator.next();\n        ans = 0;\n        while (!r.done) {\n            r = iterator.next();\n            ans += 1;\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.ascii_lowercase = \"abcdefghijklmnopqrstuvwxyz\";\nρσ_str.ascii_uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nρσ_str.ascii_letters = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nρσ_str.digits = \"0123456789\";\nρσ_str.punctuation = \"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\";\nρσ_str.printable = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\u000b\\f\";\nρσ_str.whitespace = \" \\t\\n\\r\\u000b\\f\";\ndefine_str_func = undefined;\nvar str = ρσ_str, repr = ρσ_repr;"
  },
  {
    "path": "release/baselib-plain-ugly.js",
    "content": "var ρσ_len;function ρσ_bool(val){return!!val};if(!ρσ_bool.__argnames__)Object.defineProperties(ρσ_bool,{__argnames__:{value:[\"val\"]},__module__:{value:\"__main__\"}});function ρσ_print(){var parts;if(typeof console===\"object\"){parts=[];for(var i = 0; i < arguments.length; i++){parts.push(ρσ_str(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i]))}console.log(parts.join(\" \"))}};if(!ρσ_print.__module__)Object.defineProperties(ρσ_print,{__module__:{value:\"__main__\"}});function ρσ_int(val,base){var ans;if(typeof val===\"number\"){ans=val|0}else{ans=parseInt(val,base||10)}if(isNaN(ans)){throw new ValueError(\"Invalid literal for int with base \"+(base||10)+\": \"+val)}return ans};if(!ρσ_int.__argnames__)Object.defineProperties(ρσ_int,{__argnames__:{value:[\"val\",\"base\"]},__module__:{value:\"__main__\"}});function ρσ_float(val){var ans;if(typeof val===\"number\"){ans=val}else{ans=parseFloat(val)}if(isNaN(ans)){throw new ValueError(\"Could not convert string to float: \"+arguments[0])}return ans};if(!ρσ_float.__argnames__)Object.defineProperties(ρσ_float,{__argnames__:{value:[\"val\"]},__module__:{value:\"__main__\"}});function ρσ_arraylike_creator(){var names;names=\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".split(\" \");if(typeof HTMLCollection===\"function\"){names=names.concat(\"HTMLCollection NodeList NamedNodeMap TouchList\".split(\" \"))}return(function(){var ρσ_anonfunc=function(x){if(Array.isArray(x)||typeof x===\"string\"||names.indexOf(Object.prototype.toString.call(x).slice(8,-1))>-1){return true}return false};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})()};if(!ρσ_arraylike_creator.__module__)Object.defineProperties(ρσ_arraylike_creator,{__module__:{value:\"__main__\"}});function options_object(f){return(function(){var ρσ_anonfunc=function(){if(typeof arguments[arguments.length - 1] === \"object\"){arguments[ρσ_bound_index(arguments.length-1,arguments)][ρσ_kwargs_symbol]=true}return f.apply(this,arguments)};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()};if(!options_object.__argnames__)Object.defineProperties(options_object,{__argnames__:{value:[\"f\"]},__module__:{value:\"__main__\"}});function ρσ_id(x){return x.ρσ_object_id};if(!ρσ_id.__argnames__)Object.defineProperties(ρσ_id,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_dir(item){var arr;arr=ρσ_list_decorate([]);for(var i in item){arr.push(i)}return arr};if(!ρσ_dir.__argnames__)Object.defineProperties(ρσ_dir,{__argnames__:{value:[\"item\"]},__module__:{value:\"__main__\"}});function ρσ_ord(x){var ans,second;ans=x.charCodeAt(0);if(55296<=ans&&ans<=56319){second=x.charCodeAt(1);if(56320<=second&&second<=57343){return(ans-55296)*1024+second-56320+65536}throw new TypeError(\"string is missing the low surrogate char\")}return ans};if(!ρσ_ord.__argnames__)Object.defineProperties(ρσ_ord,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_chr(code){if(code<=65535){return String.fromCharCode(code)}code-=65536;return String.fromCharCode(55296+(code>>10),56320+(code&1023))};if(!ρσ_chr.__argnames__)Object.defineProperties(ρσ_chr,{__argnames__:{value:[\"code\"]},__module__:{value:\"__main__\"}});function ρσ_callable(x){return typeof x === \"function\"};if(!ρσ_callable.__argnames__)Object.defineProperties(ρσ_callable,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_bin(x){var ans;if(typeof x!==\"number\"||x%1!==0){throw new TypeError(\"integer required\")}ans=x.toString(2);if(ans[0]===\"-\"){ans=\"-\"+\"0b\"+ans.slice(1)}else{ans=\"0b\"+ans}return ans};if(!ρσ_bin.__argnames__)Object.defineProperties(ρσ_bin,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_hex(x){var ans;if(typeof x!==\"number\"||x%1!==0){throw new TypeError(\"integer required\")}ans=x.toString(16);if(ans[0]===\"-\"){ans=\"-\"+\"0x\"+ans.slice(1)}else{ans=\"0x\"+ans}return ans};if(!ρσ_hex.__argnames__)Object.defineProperties(ρσ_hex,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_enumerate(iterable){var ans,iterator;ans={\"_i\":-1};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();if(ρσ_arraylike(iterable)){ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i<iterable.length){return{'done':false, 'value':[this._i, iterable[this._i]]}}return{'done':true}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans}if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();ans[\"_iterator\"]=iterator;ans[\"next\"]=(function(){var ρσ_anonfunc=function(){var r;r=this._iterator.next();if(r.done){return{'done':true}}this._i+=1;return{'done':false, 'value':[this._i, r.value]}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans}return ρσ_enumerate(Object.keys(iterable))};if(!ρσ_enumerate.__argnames__)Object.defineProperties(ρσ_enumerate,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});function ρσ_reversed(iterable){var ans;if(ρσ_arraylike(iterable)){ans={\"_i\": iterable.length};ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i-=1;if(this._i>-1){return{'done':false, 'value':iterable[this._i]}}return{'done':true}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans}throw new TypeError(\"reversed() can only be called on arrays or strings\")};if(!ρσ_reversed.__argnames__)Object.defineProperties(ρσ_reversed,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});function ρσ_iter(iterable){var ans;if(typeof iterable[ρσ_iterator_symbol]===\"function\"){return(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]()}if(ρσ_arraylike(iterable)){ans={\"_i\":-1};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i<iterable.length){return{'done':false, 'value':iterable[this._i]}}return{'done':true}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans}return ρσ_iter(Object.keys(iterable))};if(!ρσ_iter.__argnames__)Object.defineProperties(ρσ_iter,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});function ρσ_range_next(step,length){var ρσ_unpack;this._i+=step;this._idx+=1;if(this._idx>=length){ρσ_unpack=[this.__i,-1];this._i=ρσ_unpack[0];this._idx=ρσ_unpack[1];return{'done':true}}return{'done':false, 'value':this._i}};if(!ρσ_range_next.__argnames__)Object.defineProperties(ρσ_range_next,{__argnames__:{value:[\"step\",\"length\"]},__module__:{value:\"__main__\"}});function ρσ_range(start,stop,step){var length,ans;if(arguments.length<=1){stop=start||0;start=0}step=arguments[2]||1;length=Math.max(Math.ceil((stop-start)/step),0);ans={start:start, step:step, stop:stop};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){var it;it={\"_i\": start - step, \"_idx\": -1};it.next=ρσ_range_next.bind(it,step,length);it[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return it};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans.count=(function(){var ρσ_anonfunc=function(val){if(!this._cached){this._cached=list(this)}return this._cached.count(val)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"val\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans.index=(function(){var ρσ_anonfunc=function(val){if(!this._cached){this._cached=list(this)}return this._cached.index(val)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"val\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans.__len__=(function(){var ρσ_anonfunc=function(){return length};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans.__repr__=(function(){var ρσ_anonfunc=function(){return\"range(\"+ρσ_str.format(\"{}\",start)+\", \"+ρσ_str.format(\"{}\",stop)+\", \"+ρσ_str.format(\"{}\",step)+\")\"};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans.__str__=ans.toString=ans.__repr__;if(typeof Proxy===\"function\"){ans=new Proxy(ans,(function(){var ρσ_d={};ρσ_d[\"get\"]=(function(){var ρσ_anonfunc=function(obj,prop){var iprop;if(typeof prop===\"string\"){iprop=parseInt(prop);if(!isNaN(iprop)){prop=iprop}}if(typeof prop===\"number\"){if(!obj._cached){obj._cached=list(obj)}return(ρσ_expr_temp=obj._cached)[(typeof prop===\"number\"&&prop<0)?ρσ_expr_temp.length+prop:prop]}return obj[(typeof prop===\"number\"&&prop<0)?obj.length+prop:prop]};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"obj\",\"prop\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this))}return ans};if(!ρσ_range.__argnames__)Object.defineProperties(ρσ_range,{__argnames__:{value:[\"start\",\"stop\",\"step\"]},__module__:{value:\"__main__\"}});function ρσ_getattr(obj,name,defval){var ret;try{ret=obj[(typeof name===\"number\"&&name<0)?obj.length+name:name]}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;if(ρσ_Exception instanceof TypeError){if(defval===undefined){throw new AttributeError(\"The attribute \"+name+\" is not present\")}return defval}else{throw ρσ_Exception}}if(ret===undefined&&!(name in obj)){if(defval===undefined){throw new AttributeError(\"The attribute \"+name+\" is not present\")}ret=defval}return ret};if(!ρσ_getattr.__argnames__)Object.defineProperties(ρσ_getattr,{__argnames__:{value:[\"obj\",\"name\",\"defval\"]},__module__:{value:\"__main__\"}});function ρσ_setattr(obj,name,value){obj[(typeof name===\"number\"&&name<0)?obj.length+name:name]=value};if(!ρσ_setattr.__argnames__)Object.defineProperties(ρσ_setattr,{__argnames__:{value:[\"obj\",\"name\",\"value\"]},__module__:{value:\"__main__\"}});function ρσ_hasattr(obj,name){return name in obj};if(!ρσ_hasattr.__argnames__)Object.defineProperties(ρσ_hasattr,{__argnames__:{value:[\"obj\",\"name\"]},__module__:{value:\"__main__\"}});ρσ_len=(function(){var ρσ_anonfunc=function(){function len(obj){if(ρσ_arraylike(obj)){return obj.length}if(typeof obj.__len__===\"function\"){return obj.__len__()}if(obj instanceof Set||obj instanceof Map){return obj.size}return Object.keys(obj).length};if(!len.__argnames__)Object.defineProperties(len,{__argnames__:{value:[\"obj\"]},__module__:{value:\"__main__\"}});function len5(obj){if(ρσ_arraylike(obj)){return obj.length}if(typeof obj.__len__===\"function\"){return obj.__len__()}return Object.keys(obj).length};if(!len5.__argnames__)Object.defineProperties(len5,{__argnames__:{value:[\"obj\"]},__module__:{value:\"__main__\"}});return(typeof Set===\"function\"&&typeof Map===\"function\")?len:len5};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()();function ρσ_get_module(name){return ρσ_modules[(typeof name===\"number\"&&name<0)?ρσ_modules.length+name:name]};if(!ρσ_get_module.__argnames__)Object.defineProperties(ρσ_get_module,{__argnames__:{value:[\"name\"]},__module__:{value:\"__main__\"}});function ρσ_pow(x,y,z){var ans;ans=Math.pow(x,y);if(z!==undefined){ans%=z}return ans};if(!ρσ_pow.__argnames__)Object.defineProperties(ρσ_pow,{__argnames__:{value:[\"x\",\"y\",\"z\"]},__module__:{value:\"__main__\"}});function ρσ_type(x){return x.constructor};if(!ρσ_type.__argnames__)Object.defineProperties(ρσ_type,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_divmod(x,y){var d;if(y===0){throw new ZeroDivisionError(\"integer division or modulo by zero\")}d=Math.floor(x/y);return[d,x-d*y]};if(!ρσ_divmod.__argnames__)Object.defineProperties(ρσ_divmod,{__argnames__:{value:[\"x\",\"y\"]},__module__:{value:\"__main__\"}});function ρσ_max(){var kwargs=arguments[arguments.length-1];if(kwargs===null||typeof kwargs!==\"object\"||kwargs[ρσ_kwargs_symbol]!==true)kwargs={};var args=Array.prototype.slice.call(arguments,0);if(kwargs!==null&&typeof kwargs===\"object\"&&kwargs[ρσ_kwargs_symbol]===true)args.pop();var args,x;if(args.length===0){if(kwargs.defval!==undefined){return kwargs.defval}throw new TypeError(\"expected at least one argument\")}if(args.length===1){args=args[0]}if(kwargs.key){args=(function(){var ρσ_Iter=ρσ_Iterable(args),ρσ_Result=[],x;for(var ρσ_Index=0;ρσ_Index<ρσ_Iter.length;ρσ_Index++){x=ρσ_Iter[ρσ_Index];ρσ_Result.push(kwargs.key(x))}ρσ_Result=ρσ_list_constructor(ρσ_Result);return ρσ_Result})()}if(!Array.isArray(args)){args=list(args)}if(args.length){return this.apply(null,args)}if(kwargs.defval!==undefined){return kwargs.defval}throw new TypeError(\"expected at least one argument\")};if(!ρσ_max.__handles_kwarg_interpolation__)Object.defineProperties(ρσ_max,{__handles_kwarg_interpolation__:{value:true},__module__:{value:\"__main__\"}});var abs = Math.abs, max = ρσ_max.bind(Math.max), min = ρσ_max.bind(Math.min), bool = ρσ_bool, type = ρσ_type;var float = ρσ_float, int = ρσ_int, arraylike = ρσ_arraylike_creator(), ρσ_arraylike = arraylike;var print = ρσ_print, id = ρσ_id, get_module = ρσ_get_module, pow = ρσ_pow, divmod = ρσ_divmod;var dir = ρσ_dir, ord = ρσ_ord, chr = ρσ_chr, bin = ρσ_bin, hex = ρσ_hex, callable = ρσ_callable;var enumerate = ρσ_enumerate, iter = ρσ_iter, reversed = ρσ_reversed, len = ρσ_len;var range = ρσ_range, getattr = ρσ_getattr, setattr = ρσ_setattr, hasattr = ρσ_hasattrfunction ρσ_equals(a,b){var ρσ_unpack,akeys,bkeys,key;if(a===b){return true}if(a&&typeof a.__eq__===\"function\"){return a.__eq__(b)}if(b&&typeof b.__eq__===\"function\"){return b.__eq__(a)}if(ρσ_arraylike(a)&&ρσ_arraylike(b)){if((a.length!==b.length&&(typeof a.length!==\"object\"||ρσ_not_equals(a.length,b.length)))){return false}for(var i=0; i < a.length; i++){if(!(((a[(typeof i===\"number\"&&i<0)?a.length+i:i]===b[(typeof i===\"number\"&&i<0)?b.length+i:i]||typeof a[(typeof i===\"number\"&&i<0)?a.length+i:i]===\"object\"&&ρσ_equals(a[(typeof i===\"number\"&&i<0)?a.length+i:i],b[(typeof i===\"number\"&&i<0)?b.length+i:i]))))){return false}}return true}if(typeof a===\"object\"&&typeof b===\"object\"&&a!==null&&b!==null&&(a.constructor===Object&&b.constructor===Object||Object.getPrototypeOf(a)===null&&Object.getPrototypeOf(b)===null)){ρσ_unpack=[Object.keys(a),Object.keys(b)];akeys=ρσ_unpack[0];bkeys=ρσ_unpack[1];if(akeys.length!==bkeys.length){return false}for(var j=0; j < akeys.length; j++){key=akeys[(typeof j===\"number\"&&j<0)?akeys.length+j:j];if(!(((a[(typeof key===\"number\"&&key<0)?a.length+key:key]===b[(typeof key===\"number\"&&key<0)?b.length+key:key]||typeof a[(typeof key===\"number\"&&key<0)?a.length+key:key]===\"object\"&&ρσ_equals(a[(typeof key===\"number\"&&key<0)?a.length+key:key],b[(typeof key===\"number\"&&key<0)?b.length+key:key]))))){return false}}return true}return false};if(!ρσ_equals.__argnames__)Object.defineProperties(ρσ_equals,{__argnames__:{value:[\"a\",\"b\"]},__module__:{value:\"__main__\"}});function ρσ_not_equals(a,b){if(a===b){return false}if(a&&typeof a.__ne__===\"function\"){return a.__ne__(b)}if(b&&typeof b.__ne__===\"function\"){return b.__ne__(a)}return!ρσ_equals(a,b)};if(!ρσ_not_equals.__argnames__)Object.defineProperties(ρσ_not_equals,{__argnames__:{value:[\"a\",\"b\"]},__module__:{value:\"__main__\"}});var equals = ρσ_equals;function ρσ_list_extend(iterable){var start,iterator,result;if(Array.isArray(iterable)||typeof iterable===\"string\"){start=this.length;this.length+=iterable.length;for(var i = 0; i < iterable.length; i++){(ρσ_expr_temp=this)[ρσ_bound_index(start+i,ρσ_expr_temp)]=iterable[(typeof i===\"number\"&&i<0)?iterable.length+i:i]}}else{iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();result=iterator.next();while(!result.done){this.push(result.value);result=iterator.next()}}};if(!ρσ_list_extend.__argnames__)Object.defineProperties(ρσ_list_extend,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});function ρσ_list_index(val,start,stop){start=start||0;if(start<0){start=this.length+start}if(start<0){throw new ValueError(val+\" is not in list\")}if(stop===undefined){stop=this.length}if(stop<0){stop=this.length+stop}for(var i = start; i < stop; i++){if(((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===val||typeof(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===\"object\"&&ρσ_equals((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i],val))){return i}}throw new ValueError(val+\" is not in list\")};if(!ρσ_list_index.__argnames__)Object.defineProperties(ρσ_list_index,{__argnames__:{value:[\"val\",\"start\",\"stop\"]},__module__:{value:\"__main__\"}});function ρσ_list_pop(index){var ans;if(this.length===0){throw new IndexError(\"list is empty\")}if(index===undefined){index=-1}ans=this.splice(index,1);if(!ans.length){throw new IndexError(\"pop index out of range\")}return ans[0]};if(!ρσ_list_pop.__argnames__)Object.defineProperties(ρσ_list_pop,{__argnames__:{value:[\"index\"]},__module__:{value:\"__main__\"}});function ρσ_list_remove(value){for(var i = 0; i < this.length; i++){if(((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===value||typeof(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===\"object\"&&ρσ_equals((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i],value))){this.splice(i,1);return}}throw new ValueError(value+\" not in list\")};if(!ρσ_list_remove.__argnames__)Object.defineProperties(ρσ_list_remove,{__argnames__:{value:[\"value\"]},__module__:{value:\"__main__\"}});function ρσ_list_to_string(){return\"[\"+this.join(\", \")+\"]\"};if(!ρσ_list_to_string.__module__)Object.defineProperties(ρσ_list_to_string,{__module__:{value:\"__main__\"}});function ρσ_list_insert(index,val){if(index<0){index+=this.length}index=min(this.length,max(index,0));if(index===0){this.unshift(val);return}for(var i = this.length; i > index; i--){(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]=(ρσ_expr_temp=this)[ρσ_bound_index(i-1,ρσ_expr_temp)]}(ρσ_expr_temp=this)[(typeof index===\"number\"&&index<0)?ρσ_expr_temp.length+index:index]=val};if(!ρσ_list_insert.__argnames__)Object.defineProperties(ρσ_list_insert,{__argnames__:{value:[\"index\",\"val\"]},__module__:{value:\"__main__\"}});function ρσ_list_copy(){return ρσ_list_constructor(this)};if(!ρσ_list_copy.__module__)Object.defineProperties(ρσ_list_copy,{__module__:{value:\"__main__\"}});function ρσ_list_clear(){this.length=0};if(!ρσ_list_clear.__module__)Object.defineProperties(ρσ_list_clear,{__module__:{value:\"__main__\"}});function ρσ_list_as_array(){return Array.prototype.slice.call(this)};if(!ρσ_list_as_array.__module__)Object.defineProperties(ρσ_list_as_array,{__module__:{value:\"__main__\"}});function ρσ_list_count(value){return this.reduce((function(){var ρσ_anonfunc=function(n,val){return n+(val===value)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"n\",\"val\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})(),0)};if(!ρσ_list_count.__argnames__)Object.defineProperties(ρσ_list_count,{__argnames__:{value:[\"value\"]},__module__:{value:\"__main__\"}});function ρσ_list_sort_key(value){var t;t=typeof value;if(t===\"string\"||t===\"number\"){return value}return value.toString()};if(!ρσ_list_sort_key.__argnames__)Object.defineProperties(ρσ_list_sort_key,{__argnames__:{value:[\"value\"]},__module__:{value:\"__main__\"}});function ρσ_list_sort_cmp(a,b,ap,bp){if(a<b){return-1}if(a>b){return 1}return ap-bp};if(!ρσ_list_sort_cmp.__argnames__)Object.defineProperties(ρσ_list_sort_cmp,{__argnames__:{value:[\"a\",\"b\",\"ap\",\"bp\"]},__module__:{value:\"__main__\"}});function ρσ_list_sort(){var key=(arguments[0]===undefined||(0===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true))?ρσ_list_sort.__defaults__.key:arguments[0];var reverse=(arguments[1]===undefined||(1===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true))?ρσ_list_sort.__defaults__.reverse:arguments[1];var ρσ_kwargs_obj=arguments[arguments.length-1];if(ρσ_kwargs_obj===null||typeof ρσ_kwargs_obj!==\"object\"||ρσ_kwargs_obj[ρσ_kwargs_symbol]!==true)ρσ_kwargs_obj={};if(Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj,\"key\")){key=ρσ_kwargs_obj.key}if(Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj,\"reverse\")){reverse=ρσ_kwargs_obj.reverse}var mult,keymap,posmap,k;key=key||ρσ_list_sort_key;mult=(reverse)?-1:1;keymap=dict();posmap=dict();for(var i=0; i < this.length; i++){k=(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i];keymap.set(k,key(k));posmap.set(k,i)}this.sort((function(){var ρσ_anonfunc=function(a,b){return mult*ρσ_list_sort_cmp(keymap.get(a),keymap.get(b),posmap.get(a),posmap.get(b))};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"a\",\"b\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})())};if(!ρσ_list_sort.__defaults__)Object.defineProperties(ρσ_list_sort,{__defaults__:{value:{key:null,reverse:false}},__handles_kwarg_interpolation__:{value:true},__argnames__:{value:[\"key\",\"reverse\"]},__module__:{value:\"__main__\"}});function ρσ_list_concat(){var ans;ans=Array.prototype.concat.apply(this,arguments);ρσ_list_decorate(ans);return ans};if(!ρσ_list_concat.__module__)Object.defineProperties(ρσ_list_concat,{__module__:{value:\"__main__\"}});function ρσ_list_slice(){var ans;ans=Array.prototype.slice.apply(this,arguments);ρσ_list_decorate(ans);return ans};if(!ρσ_list_slice.__module__)Object.defineProperties(ρσ_list_slice,{__module__:{value:\"__main__\"}});function ρσ_list_iterator(value){var self;self=this;return(function(){var ρσ_d={};ρσ_d[\"_i\"]=-1;ρσ_d[\"_list\"]=self;ρσ_d[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i>=this._list.length){return(function(){var ρσ_d={};ρσ_d[\"done\"]=true;return ρσ_d}).call(this)}return(function(){var ρσ_d={};ρσ_d[\"done\"]=false;ρσ_d[\"value\"]=(ρσ_expr_temp=this._list)[ρσ_bound_index(this._i,ρσ_expr_temp)];return ρσ_d}).call(this)};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this)};if(!ρσ_list_iterator.__argnames__)Object.defineProperties(ρσ_list_iterator,{__argnames__:{value:[\"value\"]},__module__:{value:\"__main__\"}});function ρσ_list_len(){return this.length};if(!ρσ_list_len.__module__)Object.defineProperties(ρσ_list_len,{__module__:{value:\"__main__\"}});function ρσ_list_contains(val){for(var i = 0; i < this.length; i++){if(((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===val||typeof(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===\"object\"&&ρσ_equals((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i],val))){return true}}return false};if(!ρσ_list_contains.__argnames__)Object.defineProperties(ρσ_list_contains,{__argnames__:{value:[\"val\"]},__module__:{value:\"__main__\"}});function ρσ_list_eq(other){if(!ρσ_arraylike(other)){return false}if((this.length!==other.length&&(typeof this.length!==\"object\"||ρσ_not_equals(this.length,other.length)))){return false}for(var i = 0; i < this.length; i++){if(!((((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===other[(typeof i===\"number\"&&i<0)?other.length+i:i]||typeof(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]===\"object\"&&ρσ_equals((ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i],other[(typeof i===\"number\"&&i<0)?other.length+i:i]))))){return false}}return true};if(!ρσ_list_eq.__argnames__)Object.defineProperties(ρσ_list_eq,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});function ρσ_list_decorate(ans){ans.append=Array.prototype.push;ans.toString=ρσ_list_to_string;ans.inspect=ρσ_list_to_string;ans.extend=ρσ_list_extend;ans.index=ρσ_list_index;ans.pypop=ρσ_list_pop;ans.remove=ρσ_list_remove;ans.insert=ρσ_list_insert;ans.copy=ρσ_list_copy;ans.clear=ρσ_list_clear;ans.count=ρσ_list_count;ans.concat=ρσ_list_concat;ans.pysort=ρσ_list_sort;ans.slice=ρσ_list_slice;ans.as_array=ρσ_list_as_array;ans.__len__=ρσ_list_len;ans.__contains__=ρσ_list_contains;ans.__eq__=ρσ_list_eq;ans.constructor=ρσ_list_constructor;if(typeof ans[ρσ_iterator_symbol]!==\"function\"){ans[ρσ_iterator_symbol]=ρσ_list_iterator}return ans};if(!ρσ_list_decorate.__argnames__)Object.defineProperties(ρσ_list_decorate,{__argnames__:{value:[\"ans\"]},__module__:{value:\"__main__\"}});function ρσ_list_constructor(iterable){var ans,iterator,result;if(iterable===undefined){ans=[]}else if(ρσ_arraylike(iterable)){ans=new Array(iterable.length);for(var i = 0; i < iterable.length; i++){ans[(typeof i===\"number\"&&i<0)?ans.length+i:i]=iterable[(typeof i===\"number\"&&i<0)?iterable.length+i:i]}}else if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();ans=ρσ_list_decorate([]);result=iterator.next();while(!result.done){ans.push(result.value);result=iterator.next()}}else if(typeof iterable===\"number\"){ans=new Array(iterable)}else{ans=Object.keys(iterable)}return ρσ_list_decorate(ans)};if(!ρσ_list_constructor.__argnames__)Object.defineProperties(ρσ_list_constructor,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});ρσ_list_constructor.__name__=\"list\";var list = ρσ_list_constructor, list_wrap = ρσ_list_decorate;function sorted(){var iterable=(0===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true)?undefined:arguments[0];var key=(arguments[1]===undefined||(1===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true))?sorted.__defaults__.key:arguments[1];var reverse=(arguments[2]===undefined||(2===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true))?sorted.__defaults__.reverse:arguments[2];var ρσ_kwargs_obj=arguments[arguments.length-1];if(ρσ_kwargs_obj===null||typeof ρσ_kwargs_obj!==\"object\"||ρσ_kwargs_obj[ρσ_kwargs_symbol]!==true)ρσ_kwargs_obj={};if(Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj,\"key\")){key=ρσ_kwargs_obj.key}if(Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj,\"reverse\")){reverse=ρσ_kwargs_obj.reverse}var ans;ans=ρσ_list_constructor(iterable);ans.pysort(key,reverse);return ans};if(!sorted.__defaults__)Object.defineProperties(sorted,{__defaults__:{value:{key:null,reverse:false}},__handles_kwarg_interpolation__:{value:true},__argnames__:{value:[\"iterable\",\"key\",\"reverse\"]},__module__:{value:\"__main__\"}});var ρσ_global_object_id = 0, ρσ_set_implementation;function ρσ_set_keyfor(x){var t,ans;t=typeof x;if(t===\"string\"||t===\"number\"||t===\"boolean\"){return\"_\"+t[0]+x}if(x === null){return\"__!@#$0\"}ans=x.ρσ_hash_key_prop;if(ans===undefined){ans = \"_!@#$\" + (++ρσ_global_object_id);Object.defineProperty(x,\"ρσ_hash_key_prop\",(function(){var ρσ_d={};ρσ_d[\"value\"]=ans;return ρσ_d}).call(this))}return ans};if(!ρσ_set_keyfor.__argnames__)Object.defineProperties(ρσ_set_keyfor,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_set_polyfill(){this._store={};this.size=0};if(!ρσ_set_polyfill.__module__)Object.defineProperties(ρσ_set_polyfill,{__module__:{value:\"__main__\"}});ρσ_set_polyfill.prototype.add=(function(){var ρσ_anonfunc=function(x){var key;key=ρσ_set_keyfor(x);if(!Object.prototype.hasOwnProperty.call(this._store,key)){this.size+=1;(ρσ_expr_temp=this._store)[(typeof key===\"number\"&&key<0)?ρσ_expr_temp.length+key:key]=x}return this};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set_polyfill.prototype.clear=(function(){var ρσ_anonfunc=function(x){this._store={};this.size=0};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set_polyfill.prototype.delete=(function(){var ρσ_anonfunc=function(x){var key;key=ρσ_set_keyfor(x);if(Object.prototype.hasOwnProperty.call(this._store,key)){this.size-=1;delete this._store[key];return true}return false};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set_polyfill.prototype.has=(function(){var ρσ_anonfunc=function(x){return Object.prototype.hasOwnProperty.call(this._store,ρσ_set_keyfor(x))};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set_polyfill.prototype.values=(function(){var ρσ_anonfunc=function(x){var ans;ans={'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i>=this._keys.length){return{'done': true}}return{'done':false, 'value':this._s[this._keys[this._i]]}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();if(typeof Set!==\"function\"||typeof Set.prototype.delete!==\"function\"){ρσ_set_implementation = ρσ_set_polyfill}else{ρσ_set_implementation = Set}function ρσ_set(iterable){var ans,s,iterator,result,keys;if(this instanceof ρσ_set){this.jsset=new ρσ_set_implementation;ans=this;if(iterable===undefined){return ans}s=ans.jsset;if(ρσ_arraylike(iterable)){for(var i = 0; i < iterable.length; i++){s.add(iterable[(typeof i===\"number\"&&i<0)?iterable.length+i:i])}}else if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();result=iterator.next();while(!result.done){s.add(result.value);result=iterator.next()}}else{keys=Object.keys(iterable);for(var j=0; j < keys.length; j++){s.add(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j])}}return ans}else{return new ρσ_set(iterable)}};if(!ρσ_set.__argnames__)Object.defineProperties(ρσ_set,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});ρσ_set.prototype.__name__=\"set\";Object.defineProperties(ρσ_set.prototype,(function(){var ρσ_d={};ρσ_d[\"length\"]=(function(){var ρσ_d={};ρσ_d[\"get\"]=(function(){var ρσ_anonfunc=function(){return this.jsset.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this);ρσ_d[\"size\"]=(function(){var ρσ_d={};ρσ_d[\"get\"]=(function(){var ρσ_anonfunc=function(){return this.jsset.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this);return ρσ_d}).call(this));ρσ_set.prototype.__len__=(function(){var ρσ_anonfunc=function(){return this.jsset.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.has=ρσ_set.prototype.__contains__=(function(){var ρσ_anonfunc=function(x){return this.jsset.has(x)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.add=(function(){var ρσ_anonfunc=function(x){this.jsset.add(x)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.clear=(function(){var ρσ_anonfunc=function(){this.jsset.clear()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.copy=(function(){var ρσ_anonfunc=function(){return ρσ_set(this)};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.discard=(function(){var ρσ_anonfunc=function(x){this.jsset.delete(x)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this.jsset.values()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.difference=(function(){var ρσ_anonfunc=function(){var ans,s,iterator,r,x,has;ans=new ρσ_set;s=ans.jsset;iterator=this.jsset.values();r=iterator.next();while(!r.done){x=r.value;has=false;for(var i = 0; i < arguments.length; i++){if(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i].has(x)){has=true;break}}if(!has){s.add(x)}r=iterator.next()}return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.difference_update=(function(){var ρσ_anonfunc=function(){var s,remove,iterator,r,x;s=this.jsset;remove=[];iterator=s.values();r=iterator.next();while(!r.done){x=r.value;for(var i = 0; i < arguments.length; i++){if(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i].has(x)){remove.push(x);break}}r=iterator.next()}for(var j = 0; j < remove.length; j++){s.delete(remove[(typeof j===\"number\"&&j<0)?remove.length+j:j])}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.intersection=(function(){var ρσ_anonfunc=function(){var ans,s,iterator,r,x,has;ans=new ρσ_set;s=ans.jsset;iterator=this.jsset.values();r=iterator.next();while(!r.done){x=r.value;has=true;for(var i = 0; i < arguments.length; i++){if(!arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i].has(x)){has=false;break}}if(has){s.add(x)}r=iterator.next()}return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.intersection_update=(function(){var ρσ_anonfunc=function(){var s,remove,iterator,r,x;s=this.jsset;remove=[];iterator=s.values();r=iterator.next();while(!r.done){x=r.value;for(var i = 0; i < arguments.length; i++){if(!arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i].has(x)){remove.push(x);break}}r=iterator.next()}for(var j = 0; j < remove.length; j++){s.delete(remove[(typeof j===\"number\"&&j<0)?remove.length+j:j])}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.isdisjoint=(function(){var ρσ_anonfunc=function(other){var iterator,r,x;iterator=this.jsset.values();r=iterator.next();while(!r.done){x=r.value;if(other.has(x)){return false}r=iterator.next()}return true};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.issubset=(function(){var ρσ_anonfunc=function(other){var iterator,r,x;iterator=this.jsset.values();r=iterator.next();while(!r.done){x=r.value;if(!other.has(x)){return false}r=iterator.next()}return true};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.issuperset=(function(){var ρσ_anonfunc=function(other){var s,iterator,r,x;s=this.jsset;iterator=other.jsset.values();r=iterator.next();while(!r.done){x=r.value;if(!s.has(x)){return false}r=iterator.next()}return true};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.pop=(function(){var ρσ_anonfunc=function(){var iterator,r;iterator=this.jsset.values();r=iterator.next();if(r.done){throw new KeyError(\"pop from an empty set\")}this.jsset.delete(r.value);return r.value};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.remove=(function(){var ρσ_anonfunc=function(x){if(!this.jsset.delete(x)){throw new KeyError(x.toString())}};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.symmetric_difference=(function(){var ρσ_anonfunc=function(other){return this.union(other).difference(this.intersection(other))};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.symmetric_difference_update=(function(){var ρσ_anonfunc=function(other){var common;common=this.intersection(other);this.update(other);this.difference_update(common)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.union=(function(){var ρσ_anonfunc=function(){var ans;ans=ρσ_set(this);ans.update.apply(ans,arguments);return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.update=(function(){var ρσ_anonfunc=function(){var s,iterator,r;s=this.jsset;for(var i=0; i < arguments.length; i++){iterator=arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i][ρσ_iterator_symbol]();r=iterator.next();while(!r.done){s.add(r.value);r=iterator.next()}}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.toString=ρσ_set.prototype.__repr__=ρσ_set.prototype.__str__=ρσ_set.prototype.inspect=(function(){var ρσ_anonfunc=function(){return\"{\"+list(this).join(\", \")+\"}\"};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_set.prototype.__eq__=(function(){var ρσ_anonfunc=function(other){var iterator,r;if(!other instanceof this.constructor){return false}if(other.size!==this.size){return false}if(other.size===0){return true}iterator=other[ρσ_iterator_symbol]();r=iterator.next();while(!r.done){if(!this.has(r.value)){return false}r=iterator.next()}return true};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();function ρσ_set_wrap(x){var ans;ans=new ρσ_set;ans.jsset=x;return ans};if(!ρσ_set_wrap.__argnames__)Object.defineProperties(ρσ_set_wrap,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});var set = ρσ_set, set_wrap = ρσ_set_wrap;var ρσ_dict_implementation;function ρσ_dict_polyfill(){this._store={};this.size=0};if(!ρσ_dict_polyfill.__module__)Object.defineProperties(ρσ_dict_polyfill,{__module__:{value:\"__main__\"}});ρσ_dict_polyfill.prototype.set=(function(){var ρσ_anonfunc=function(x,value){var key;key=ρσ_set_keyfor(x);if(!Object.prototype.hasOwnProperty.call(this._store,key)){this.size+=1}(ρσ_expr_temp=this._store)[(typeof key===\"number\"&&key<0)?ρσ_expr_temp.length+key:key]=[x, value];return this};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\",\"value\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.clear=(function(){var ρσ_anonfunc=function(x){this._store={};this.size=0};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.delete=(function(){var ρσ_anonfunc=function(x){var key;key=ρσ_set_keyfor(x);if(Object.prototype.hasOwnProperty.call(this._store,key)){this.size-=1;delete this._store[key];return true}return false};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.has=(function(){var ρσ_anonfunc=function(x){return Object.prototype.hasOwnProperty.call(this._store,ρσ_set_keyfor(x))};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.get=(function(){var ρσ_anonfunc=function(x){try{return(ρσ_expr_temp=this._store)[ρσ_bound_index(ρσ_set_keyfor(x),ρσ_expr_temp)][1]}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;if(ρσ_Exception instanceof TypeError){return undefined}else{throw ρσ_Exception}}};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.values=(function(){var ρσ_anonfunc=function(x){var ans;ans={'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i>=this._keys.length){return{'done': true}}return{'done':false, 'value':this._s[this._keys[this._i]][1]}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.keys=(function(){var ρσ_anonfunc=function(x){var ans;ans={'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i>=this._keys.length){return{'done': true}}return{'done':false, 'value':this._s[this._keys[this._i]][0]}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict_polyfill.prototype.entries=(function(){var ρσ_anonfunc=function(x){var ans;ans={'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){this._i+=1;if(this._i>=this._keys.length){return{'done': true}}return{'done':false, 'value':this._s[this._keys[this._i]]}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();if(typeof Map!==\"function\"||typeof Map.prototype.delete!==\"function\"){ρσ_dict_implementation = ρσ_dict_polyfill}else{ρσ_dict_implementation = Map}function ρσ_dict(){var iterable=(0===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true)?undefined:arguments[0];var kw=arguments[arguments.length-1];if(kw===null||typeof kw!==\"object\"||kw[ρσ_kwargs_symbol]!==true)kw={};if(this instanceof ρσ_dict){this.jsmap=new ρσ_dict_implementation;if(iterable!==undefined){this.update(iterable)}this.update(kw);return this}else{return ρσ_interpolate_kwargs_constructor.call(Object.create(ρσ_dict.prototype),false,ρσ_dict,[iterable].concat([ρσ_desugar_kwargs(kw)]))}};if(!ρσ_dict.__handles_kwarg_interpolation__)Object.defineProperties(ρσ_dict,{__handles_kwarg_interpolation__:{value:true},__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});ρσ_dict.prototype.__name__=\"dict\";Object.defineProperties(ρσ_dict.prototype,(function(){var ρσ_d={};ρσ_d[\"length\"]=(function(){var ρσ_d={};ρσ_d[\"get\"]=(function(){var ρσ_anonfunc=function(){return this.jsmap.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this);ρσ_d[\"size\"]=(function(){var ρσ_d={};ρσ_d[\"get\"]=(function(){var ρσ_anonfunc=function(){return this.jsmap.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this);return ρσ_d}).call(this));ρσ_dict.prototype.__len__=(function(){var ρσ_anonfunc=function(){return this.jsmap.size};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.has=ρσ_dict.prototype.__contains__=(function(){var ρσ_anonfunc=function(x){return this.jsmap.has(x)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});\nreturn ρσ_anonfunc})();ρσ_dict.prototype.set=ρσ_dict.prototype.__setitem__=(function(){var ρσ_anonfunc=function(key,value){this.jsmap.set(key,value)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\",\"value\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.__delitem__=(function(){var ρσ_anonfunc=function(key){this.jsmap.delete(key)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.clear=(function(){var ρσ_anonfunc=function(){this.jsmap.clear()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.copy=(function(){var ρσ_anonfunc=function(){return ρσ_dict(this)};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.keys=(function(){var ρσ_anonfunc=function(){return this.jsmap.keys()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.values=(function(){var ρσ_anonfunc=function(){return this.jsmap.values()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.items=ρσ_dict.prototype.entries=(function(){var ρσ_anonfunc=function(){return this.jsmap.entries()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this.jsmap.keys()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.__getitem__=(function(){var ρσ_anonfunc=function(key){var ans;ans=this.jsmap.get(key);if(ans===undefined&&!this.jsmap.has(key)){throw new KeyError(key+\"\")}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.get=(function(){var ρσ_anonfunc=function(key,defval){var ans;ans=this.jsmap.get(key);if(ans===undefined&&!this.jsmap.has(key)){return(defval===undefined)?null:defval}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\",\"defval\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.set_default=ρσ_dict.prototype.setdefault=(function(){var ρσ_anonfunc=function(key,defval){var j;j=this.jsmap;if(!j.has(key)){j.set(key,defval);return defval}return j.get(key)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\",\"defval\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.fromkeys=ρσ_dict.prototype.fromkeys=(function(){var ρσ_anonfunc=function(){var iterable=(0===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true)?undefined:arguments[0];var value=(arguments[1]===undefined||(1===arguments.length-1&&arguments[arguments.length-1]!==null&&typeof arguments[arguments.length-1]===\"object\"&&arguments[arguments.length-1][ρσ_kwargs_symbol]===true))?ρσ_anonfunc.__defaults__.value:arguments[1];var ρσ_kwargs_obj=arguments[arguments.length-1];if(ρσ_kwargs_obj===null||typeof ρσ_kwargs_obj!==\"object\"||ρσ_kwargs_obj[ρσ_kwargs_symbol]!==true)ρσ_kwargs_obj={};if(Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj,\"value\")){value=ρσ_kwargs_obj.value}var ans,iterator,r;ans=ρσ_dict();iterator=iter(iterable);r=iterator.next();while(!r.done){ans.set(r.value,value);r=iterator.next()}return ans};if(!ρσ_anonfunc.__defaults__)Object.defineProperties(ρσ_anonfunc,{__defaults__:{value:{value:null}},__handles_kwarg_interpolation__:{value:true},__argnames__:{value:[\"iterable\",\"value\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.pop=(function(){var ρσ_anonfunc=function(key,defval){var ans;ans=this.jsmap.get(key);if(ans===undefined&&!this.jsmap.has(key)){if(defval===undefined){throw new KeyError(key)}return defval}this.jsmap.delete(key);return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"key\",\"defval\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.popitem=(function(){var ρσ_anonfunc=function(){var last,e,r;last=null;e=this.jsmap.entries();while(true){r=e.next();if(r.done){if(last===null){throw new KeyError(\"dict is empty\")}this.jsmap.delete(last.value[0]);return last.value}last=r}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.update=(function(){var ρσ_anonfunc=function(){var m,iterable,iterator,result,keys;if(arguments.length===0){return}m=this.jsmap;iterable=arguments[0];if(Array.isArray(iterable)){for(var i = 0; i < iterable.length; i++){m.set(iterable[(typeof i===\"number\"&&i<0)?iterable.length+i:i][0],iterable[(typeof i===\"number\"&&i<0)?iterable.length+i:i][1])}}else if(iterable instanceof ρσ_dict){iterator=iterable.items();result=iterator.next();while(!result.done){m.set(result.value[0],result.value[1]);result=iterator.next()}}else if(typeof Map===\"function\"&&iterable instanceof Map){iterator=iterable.entries();result=iterator.next();while(!result.done){m.set(result.value[0],result.value[1]);result=iterator.next()}}else if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=iterable[ρσ_iterator_symbol]();result=iterator.next();while(!result.done){m.set(result.value[0],result.value[1]);result=iterator.next()}}else{keys=Object.keys(iterable);for(var j=0; j < keys.length; j++){if(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j]!==ρσ_iterator_symbol){m.set(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j],iterable[ρσ_bound_index(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j],iterable)])}}}if(arguments.length>1){ρσ_dict.prototype.update.call(this,arguments[1])}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.toString=ρσ_dict.prototype.inspect=ρσ_dict.prototype.__str__=ρσ_dict.prototype.__repr__=(function(){var ρσ_anonfunc=function(){var entries,iterator,r;entries=[];iterator=this.jsmap.entries();r=iterator.next();while(!r.done){entries.push(ρσ_repr(r.value[0])+\": \"+ρσ_repr(r.value[1]));r=iterator.next()}return\"{\"+entries.join(\", \")+\"}\"};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.__eq__=(function(){var ρσ_anonfunc=function(other){var iterator,r,x;if(!(other instanceof this.constructor)){return false}if(other.size!==this.size){return false}if(other.size===0){return true}iterator=other.items();r=iterator.next();while(!r.done){x=this.jsmap.get(r.value[0]);if(x===undefined&&!this.jsmap.has(r.value[0])||x!==r.value[1]){return false}r=iterator.next()}return true};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_dict.prototype.as_object=(function(){var ρσ_anonfunc=function(other){var ans,iterator,r;ans={};iterator=this.jsmap.entries();r=iterator.next();while(!r.done){ans[ρσ_bound_index(r.value[0],ans)]=r.value[1];r=iterator.next()}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"other\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();function ρσ_dict_wrap(x){var ans;ans=new ρσ_dict;ans.jsmap=x;return ans};if(!ρσ_dict_wrap.__argnames__)Object.defineProperties(ρσ_dict_wrap,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});var dict = ρσ_dict, dict_wrap = ρσ_dict_wrap;// }}}\nvar NameError;NameError=ReferenceError;function Exception(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});Exception.prototype.__init__.apply(this,arguments)}ρσ_extends(Exception,Error);Exception.prototype.__init__=function __init__(message){var self=this;self.message=message;self.stack=(new Error).stack;self.name=self.constructor.name};if(!Exception.prototype.__init__.__argnames__)Object.defineProperties(Exception.prototype.__init__,{__argnames__:{value:[\"message\"]},__module__:{value:\"__main__\"}});Exception.__argnames__=Exception.prototype.__init__.__argnames__;Exception.__handles_kwarg_interpolation__=Exception.prototype.__init__.__handles_kwarg_interpolation__;Exception.prototype.__repr__=function __repr__(){var self=this;return self.name+\": \"+self.message};if(!Exception.prototype.__repr__.__module__)Object.defineProperties(Exception.prototype.__repr__,{__module__:{value:\"__main__\"}});Exception.prototype.__str__=function __str__(){if(Error.prototype.__str__)return Error.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(Exception.prototype,\"__bases__\",{value:[Error]});function AttributeError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});AttributeError.prototype.__init__.apply(this,arguments)}ρσ_extends(AttributeError,Exception);AttributeError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};AttributeError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};AttributeError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(AttributeError.prototype,\"__bases__\",{value:[Exception]});function IndexError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});IndexError.prototype.__init__.apply(this,arguments)}ρσ_extends(IndexError,Exception);IndexError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};IndexError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};IndexError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(IndexError.prototype,\"__bases__\",{value:[Exception]});function KeyError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});KeyError.prototype.__init__.apply(this,arguments)}ρσ_extends(KeyError,Exception);KeyError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};KeyError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};KeyError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(KeyError.prototype,\"__bases__\",{value:[Exception]});function ValueError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});ValueError.prototype.__init__.apply(this,arguments)}ρσ_extends(ValueError,Exception);ValueError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};ValueError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};ValueError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(ValueError.prototype,\"__bases__\",{value:[Exception]});function UnicodeDecodeError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});UnicodeDecodeError.prototype.__init__.apply(this,arguments)}ρσ_extends(UnicodeDecodeError,Exception);UnicodeDecodeError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};UnicodeDecodeError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};UnicodeDecodeError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(UnicodeDecodeError.prototype,\"__bases__\",{value:[Exception]});function AssertionError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});AssertionError.prototype.__init__.apply(this,arguments)}ρσ_extends(AssertionError,Exception);AssertionError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};AssertionError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};AssertionError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(AssertionError.prototype,\"__bases__\",{value:[Exception]});function ZeroDivisionError(){if(this.ρσ_object_id===undefined)Object.defineProperty(this,\"ρσ_object_id\",{\"value\":++ρσ_object_counter});ZeroDivisionError.prototype.__init__.apply(this,arguments)}ρσ_extends(ZeroDivisionError,Exception);ZeroDivisionError.prototype.__init__=function __init__(){Exception.prototype.__init__&&Exception.prototype.__init__.apply(this,arguments)};ZeroDivisionError.prototype.__repr__=function __repr__(){if(Exception.prototype.__repr__)return Exception.prototype.__repr__.call(this);return\"<\"+__name__+\".\"+this.constructor.name+\" #\"+this.ρσ_object_id+\">\"};ZeroDivisionError.prototype.__str__=function __str__(){if(Exception.prototype.__str__)return Exception.prototype.__str__.call(this);return this.__repr__()};Object.defineProperty(ZeroDivisionError.prototype,\"__bases__\",{value:[Exception]})var ρσ_in,ρσ_desugar_kwargs,ρσ_exists;function ρσ_eslice(arr,step,start,end){var is_string;if(typeof arr===\"string\"||arr instanceof String){is_string=true;arr=arr.split(\"\")}if(step<0){step=-step;arr=arr.slice().reverse();if(typeof start!==\"undefined\"){start=arr.length-start-1}if(typeof end!==\"undefined\"){end=arr.length-end-1}}if(typeof start===\"undefined\"){start=0}if(typeof end===\"undefined\"){end=arr.length}arr=arr.slice(start,end).filter((function(){var ρσ_anonfunc=function(e,i){return i%step===0};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"e\",\"i\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());if(is_string){arr=arr.join(\"\")}return arr};if(!ρσ_eslice.__argnames__)Object.defineProperties(ρσ_eslice,{__argnames__:{value:[\"arr\",\"step\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});function ρσ_delslice(arr,step,start,end){var is_string,ρσ_unpack,indices;if(typeof arr===\"string\"||arr instanceof String){is_string=true;arr=arr.split(\"\")}if(step<0){if(typeof start===\"undefined\"){start=arr.length}if(typeof end===\"undefined\"){end=0}ρσ_unpack=[end,start,-step];start=ρσ_unpack[0];end=ρσ_unpack[1];step=ρσ_unpack[2]}if(typeof start===\"undefined\"){start=0}if(typeof end===\"undefined\"){end=arr.length}if(step===1){arr.splice(start,end-start)}else{if(end>start){indices=[];for(var i = start; i < end; i += step){indices.push(i)}for(var i = indices.length - 1; i >= 0; i--){arr.splice(indices[(typeof i===\"number\"&&i<0)?indices.length+i:i],1)}}}if(is_string){arr=arr.join(\"\")}return arr};if(!ρσ_delslice.__argnames__)Object.defineProperties(ρσ_delslice,{__argnames__:{value:[\"arr\",\"step\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});function ρσ_flatten(arr){var ans,value;ans=ρσ_list_decorate([]);for(var i=0; i < arr.length; i++){value=arr[(typeof i===\"number\"&&i<0)?arr.length+i:i];if(Array.isArray(value)){ans=ans.concat(ρσ_flatten(value))}else{ans.push(value)}}return ans};if(!ρσ_flatten.__argnames__)Object.defineProperties(ρσ_flatten,{__argnames__:{value:[\"arr\"]},__module__:{value:\"__main__\"}});function ρσ_unpack_asarray(num,iterable){var ans,iterator,result;if(ρσ_arraylike(iterable)){return iterable}ans=[];if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();result=iterator.next();while(!result.done&&ans.length<num){ans.push(result.value);result=iterator.next()}}return ans};if(!ρσ_unpack_asarray.__argnames__)Object.defineProperties(ρσ_unpack_asarray,{__argnames__:{value:[\"num\",\"iterable\"]},__module__:{value:\"__main__\"}});function ρσ_extends(child,parent){child.prototype=Object.create(parent.prototype);child.prototype.constructor=child};if(!ρσ_extends.__argnames__)Object.defineProperties(ρσ_extends,{__argnames__:{value:[\"child\",\"parent\"]},__module__:{value:\"__main__\"}});ρσ_in=(function(){var ρσ_anonfunc=function(){if(typeof Map===\"function\"&&typeof Set===\"function\"){return(function(){var ρσ_anonfunc=function(val,arr){if(typeof arr===\"string\"){return arr.indexOf(val)!==-1}if(typeof arr.__contains__===\"function\"){return arr.__contains__(val)}if(arr instanceof Map || arr instanceof Set){return arr.has(val)}if(ρσ_arraylike(arr)){return ρσ_list_contains.call(arr,val)}return Object.prototype.hasOwnProperty.call(arr,val)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"val\",\"arr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})()}return(function(){var ρσ_anonfunc=function(val,arr){if(typeof arr===\"string\"){return arr.indexOf(val)!==-1}if(typeof arr.__contains__===\"function\"){return arr.__contains__(val)}if(ρσ_arraylike(arr)){return ρσ_list_contains.call(arr,val)}return Object.prototype.hasOwnProperty.call(arr,val)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"val\",\"arr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()();function ρσ_Iterable(iterable){var iterator,ans,result;if(ρσ_arraylike(iterable)){return iterable}if(typeof iterable[ρσ_iterator_symbol]===\"function\"){iterator=(typeof Map===\"function\"&&iterable instanceof Map)?iterable.keys():iterable[ρσ_iterator_symbol]();ans=ρσ_list_decorate([]);result=iterator.next();while(!result.done){ans.push(result.value);result=iterator.next()}return ans}return Object.keys(iterable)};if(!ρσ_Iterable.__argnames__)Object.defineProperties(ρσ_Iterable,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});ρσ_desugar_kwargs=(function(){var ρσ_anonfunc=function(){if(typeof Object.assign===\"function\"){return(function(){var ρσ_anonfunc=function(){var ans;ans=Object.create(null);ans[ρσ_kwargs_symbol]=true;for(var i = 0; i < arguments.length; i++){Object.assign(ans,arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i])}return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()}return(function(){var ρσ_anonfunc=function(){var ans,keys;ans=Object.create(null);ans[ρσ_kwargs_symbol]=true;for(var i = 0; i < arguments.length; i++){keys=Object.keys(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i]);for(var j = 0; j < keys.length; j++){ans[ρσ_bound_index(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j],ans)]=(ρσ_expr_temp=arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i])[ρσ_bound_index(keys[(typeof j===\"number\"&&j<0)?keys.length+j:j],ρσ_expr_temp)]}}return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()();function ρσ_interpolate_kwargs(f,supplied_args){var has_prop,kwobj,args,prop;if(!f.__argnames__){return f.apply(this,supplied_args)}has_prop=Object.prototype.hasOwnProperty;kwobj=supplied_args.pop();if(f.__handles_kwarg_interpolation__){args=new Array(Math.max(supplied_args.length,f.__argnames__.length)+1);args[args.length-1]=kwobj;for(var i = 0; i < args.length - 1; i++){if(i<f.__argnames__.length){prop=(ρσ_expr_temp=f.__argnames__)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i];if(has_prop.call(kwobj,prop)){args[(typeof i===\"number\"&&i<0)?args.length+i:i]=kwobj[(typeof prop===\"number\"&&prop<0)?kwobj.length+prop:prop];delete kwobj[prop]}else if(i<supplied_args.length){args[(typeof i===\"number\"&&i<0)?args.length+i:i]=supplied_args[(typeof i===\"number\"&&i<0)?supplied_args.length+i:i]}}else{args[(typeof i===\"number\"&&i<0)?args.length+i:i]=supplied_args[(typeof i===\"number\"&&i<0)?supplied_args.length+i:i]}}return f.apply(this,args)}for(var i = 0; i < f.__argnames__.length; i++){prop=(ρσ_expr_temp=f.__argnames__)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i];if(has_prop.call(kwobj,prop)){supplied_args[(typeof i===\"number\"&&i<0)?supplied_args.length+i:i]=kwobj[(typeof prop===\"number\"&&prop<0)?kwobj.length+prop:prop]}}return f.apply(this,supplied_args)};if(!ρσ_interpolate_kwargs.__argnames__)Object.defineProperties(ρσ_interpolate_kwargs,{__argnames__:{value:[\"f\",\"supplied_args\"]},__module__:{value:\"__main__\"}});function ρσ_interpolate_kwargs_constructor(apply,f,supplied_args){if(apply){f.apply(this,supplied_args)}else{ρσ_interpolate_kwargs.call(this,f,supplied_args)}return this};if(!ρσ_interpolate_kwargs_constructor.__argnames__)Object.defineProperties(ρσ_interpolate_kwargs_constructor,{__argnames__:{value:[\"apply\",\"f\",\"supplied_args\"]},__module__:{value:\"__main__\"}});function ρσ_getitem(obj,key){if(obj.__getitem__){return obj.__getitem__(key)}if(typeof key===\"number\"&&key<0){key+=obj.length}return obj[(typeof key===\"number\"&&key<0)?obj.length+key:key]};if(!ρσ_getitem.__argnames__)Object.defineProperties(ρσ_getitem,{__argnames__:{value:[\"obj\",\"key\"]},__module__:{value:\"__main__\"}});function ρσ_setitem(obj,key,val){if(obj.__setitem__){obj.__setitem__(key,val)}else{if(typeof key===\"number\"&&key<0){key+=obj.length}obj[(typeof key===\"number\"&&key<0)?obj.length+key:key]=val}return val};if(!ρσ_setitem.__argnames__)Object.defineProperties(ρσ_setitem,{__argnames__:{value:[\"obj\",\"key\",\"val\"]},__module__:{value:\"__main__\"}});function ρσ_delitem(obj,key){if(obj.__delitem__){obj.__delitem__(key)}else if(typeof obj.splice===\"function\"){obj.splice(key,1)}else{if(typeof key===\"number\"&&key<0){key+=obj.length}delete obj[key]}};if(!ρσ_delitem.__argnames__)Object.defineProperties(ρσ_delitem,{__argnames__:{value:[\"obj\",\"key\"]},__module__:{value:\"__main__\"}});function ρσ_bound_index(idx,arr){if(typeof idx===\"number\"&&idx<0){idx+=arr.length}return idx};if(!ρσ_bound_index.__argnames__)Object.defineProperties(ρσ_bound_index,{__argnames__:{value:[\"idx\",\"arr\"]},__module__:{value:\"__main__\"}});function ρσ_splice(arr,val,start,end){start=start||0;if(start<0){start+=arr.length}if(end===undefined){end=arr.length}if(end<0){end+=arr.length}Array.prototype.splice.apply(arr,[start, end - start].concat(val))};if(!ρσ_splice.__argnames__)Object.defineProperties(ρσ_splice,{__argnames__:{value:[\"arr\",\"val\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});ρσ_exists=(function(){var ρσ_d={};ρσ_d[\"n\"]=(function(){var ρσ_anonfunc=function(expr){return expr!==undefined&&expr!==null};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"expr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_d[\"d\"]=(function(){var ρσ_anonfunc=function(expr){if(expr===undefined||expr===null){return Object.create(null)}return expr};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"expr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_d[\"c\"]=(function(){var ρσ_anonfunc=function(expr){if(typeof expr===\"function\"){return expr}return(function(){var ρσ_anonfunc=function(){return undefined};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})()};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"expr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_d[\"g\"]=(function(){var ρσ_anonfunc=function(expr){if(expr===undefined||expr===null||typeof expr.__getitem__!==\"function\"){return(function(){var ρσ_d={};ρσ_d[\"__getitem__\"]=(function(){var ρσ_anonfunc=function(){return undefined};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this)}};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"expr\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_d[\"e\"]=(function(){var ρσ_anonfunc=function(expr,alt){return(expr===undefined||expr===null)?alt:expr};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"expr\",\"alt\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this);function ρσ_mixin(){var seen,resolved_props,p,target,props,name;seen=Object.create(null);seen.__argnames__=seen.__handles_kwarg_interpolation__=seen.__init__=seen.__annotations__=seen.__doc__=seen.__bind_methods__=seen.__bases__=seen.constructor=seen.__class__=true;resolved_props={};p=target=arguments[0].prototype;while(p&&p!==Object.prototype){props=Object.getOwnPropertyNames(p);for(var i = 0; i < props.length; i++){seen[ρσ_bound_index(props[(typeof i===\"number\"&&i<0)?props.length+i:i],seen)]=true}p=Object.getPrototypeOf(p)}for(var c = 1; c < arguments.length; c++){p=arguments[(typeof c===\"number\"&&c<0)?arguments.length+c:c].prototype;while(p&&p!==Object.prototype){props=Object.getOwnPropertyNames(p);for(var i = 0; i < props.length; i++){name=props[(typeof i===\"number\"&&i<0)?props.length+i:i];if(seen[(typeof name===\"number\"&&name<0)?seen.length+name:name]){continue}seen[(typeof name===\"number\"&&name<0)?seen.length+name:name]=true;resolved_props[(typeof name===\"number\"&&name<0)?resolved_props.length+name:name]=Object.getOwnPropertyDescriptor(p,name)}p=Object.getPrototypeOf(p)}}Object.defineProperties(target,resolved_props)};if(!ρσ_mixin.__module__)Object.defineProperties(ρσ_mixin,{__module__:{value:\"__main__\"}});function ρσ_instanceof(){var obj,bases,q,cls,p;obj=arguments[0];bases=\"\";if(obj&&obj.constructor&&obj.constructor.prototype){bases=obj.constructor.prototype.__bases__||\"\"}for(var i = 1; i < arguments.length; i++){q=arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i];if(obj instanceof q){return true}if((q===Array||q===ρσ_list_constructor)&&Array.isArray(obj)){return true}if(q===ρσ_str&&(typeof obj===\"string\"||obj instanceof String)){return true}if(q===ρσ_int&&typeof obj===\"number\"&&Number.isInteger(obj)){return true}if(q===ρσ_float&&typeof obj===\"number\"&&!Number.isInteger(obj)){return true}if(bases.length>1){for(var c = 1; c < bases.length; c++){cls=bases[(typeof c===\"number\"&&c<0)?bases.length+c:c];while(cls){if(q===cls){return true}p=Object.getPrototypeOf(cls.prototype);if(!p){break}cls=p.constructor}}}}return false};if(!ρσ_instanceof.__module__)Object.defineProperties(ρσ_instanceof,{__module__:{value:\"__main__\"}})function sum(iterable,start){var ans,iterator,r;if(Array.isArray(iterable)){return iterable.reduce((function(){var ρσ_anonfunc=function(prev,cur){return prev+cur};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"prev\",\"cur\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})(),start||0)}ans=start||0;iterator=iter(iterable);r=iterator.next();while(!r.done){ans+=r.value;r=iterator.next()}return ans};if(!sum.__argnames__)Object.defineProperties(sum,{__argnames__:{value:[\"iterable\",\"start\"]},__module__:{value:\"__main__\"}});function map(){var iterators,func,args,ans;iterators=new Array(arguments.length-1);func=arguments[0];args=new Array(arguments.length-1);for(var i = 1; i < arguments.length; i++){iterators[ρσ_bound_index(i-1,iterators)]=iter(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i])}ans={'_func':func, '_iterators':iterators, '_args':args};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){var r;for(var i = 0; i < this._iterators.length; i++){r=(ρσ_expr_temp=this._iterators)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i].next();if(r.done){return{'done':true}}(ρσ_expr_temp=this._args)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i]=r.value}return{'done':false, 'value':this._func.apply(undefined, this._args)}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!map.__module__)Object.defineProperties(map,{__module__:{value:\"__main__\"}});function filter(func_or_none,iterable){var func,ans;func=(func_or_none===null)?ρσ_bool:func_or_none;ans={'_func':func, '_iterator':ρσ_iter(iterable)};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){var r;r=this._iterator.next();while(!r.done){if(this._func(r.value)){return r}r=this._iterator.next()}return{'done':true}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!filter.__argnames__)Object.defineProperties(filter,{__argnames__:{value:[\"func_or_none\",\"iterable\"]},__module__:{value:\"__main__\"}});function zip(){var iterators,ans;iterators=new Array(arguments.length);for(var i = 0; i < arguments.length; i++){iterators[(typeof i===\"number\"&&i<0)?iterators.length+i:i]=iter(arguments[(typeof i===\"number\"&&i<0)?arguments.length+i:i])}ans={'_iterators':iterators};ans[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ans[\"next\"]=(function(){var ρσ_anonfunc=function(){var args,r;args=new Array(this._iterators.length);for(var i = 0; i < this._iterators.length; i++){r=(ρσ_expr_temp=this._iterators)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i].next();if(r.done){return{'done':true}}args[(typeof i===\"number\"&&i<0)?args.length+i:i]=r.value}return{'done':false, 'value':args}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ans};if(!zip.__module__)Object.defineProperties(zip,{__module__:{value:\"__main__\"}});function any(iterable){var i;var ρσ_Iter0=ρσ_Iterable(iterable);for(var ρσ_Index0=0;ρσ_Index0<ρσ_Iter0.length;ρσ_Index0++){i=ρσ_Iter0[ρσ_Index0];if(i){return true}}return false};if(!any.__argnames__)Object.defineProperties(any,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});function all(iterable){var i;var ρσ_Iter1=ρσ_Iterable(iterable);for(var ρσ_Index1=0;ρσ_Index1<ρσ_Iter1.length;ρσ_Index1++){i=ρσ_Iter1[ρσ_Index1];if(!i){return false}}return true};if(!all.__argnames__)Object.defineProperties(all,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}})var decimal_sep,define_str_func,ρσ_unpack,ρσ_orig_split,ρσ_orig_replace;decimal_sep=1.1.toLocaleString()[1];function ρσ_repr_js_builtin(x,as_array){var ans,b,keys,key;ans=[];b=\"{}\";if(as_array){b=\"[]\";for(var i = 0; i < x.length; i++){ans.push(ρσ_repr(x[(typeof i===\"number\"&&i<0)?x.length+i:i]))}}else{keys=Object.keys(x);for(var k = 0; k < keys.length; k++){key=keys[(typeof k===\"number\"&&k<0)?keys.length+k:k];ans.push(JSON.stringify(key)+\":\"+ρσ_repr(x[(typeof key===\"number\"&&key<0)?x.length+key:key]))}}return b[0]+ans.join(\", \")+b[1]};if(!ρσ_repr_js_builtin.__argnames__)Object.defineProperties(ρσ_repr_js_builtin,{__argnames__:{value:[\"x\",\"as_array\"]},__module__:{value:\"__main__\"}});function ρσ_html_element_to_string(elem){var attrs,val,attr,ans;attrs=[];var ρσ_Iter0=ρσ_Iterable(elem.attributes);for(var ρσ_Index0=0;ρσ_Index0<ρσ_Iter0.length;ρσ_Index0++){attr=ρσ_Iter0[ρσ_Index0];if(attr.specified){val=attr.value;if(val.length>10){val=val.slice(0,15)+\"...\"}val=JSON.stringify(val);attrs.push(\"\"+ρσ_str.format(\"{}\",attr.name)+\"=\"+ρσ_str.format(\"{}\",val)+\"\")}}attrs=(attrs.length)?\" \"+attrs.join(\" \"):\"\";ans=\"<\"+ρσ_str.format(\"{}\",elem.tagName)+\"\"+ρσ_str.format(\"{}\",attrs)+\">\";return ans};if(!ρσ_html_element_to_string.__argnames__)Object.defineProperties(ρσ_html_element_to_string,{__argnames__:{value:[\"elem\"]},__module__:{value:\"__main__\"}});function ρσ_repr(x){var ans,name;if(x===null){return\"None\"}if(x===undefined){return\"undefined\"}ans=x;if(typeof x.__repr__ === \"function\"){ans=x.__repr__()}else if(x===true||x===false){ans=(x)?\"True\":\"False\"}else if(Array.isArray(x)){ans=ρσ_repr_js_builtin(x,true)}else if(typeof x===\"function\"){ans=x.toString()}else if(typeof x===\"object\"&&!x.toString){ans=ρσ_repr_js_builtin(x)}else{name=Object.prototype.toString.call(x).slice(8,-1);if(ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name),-1)){return name+\"([\"+x.map((function(){var ρσ_anonfunc=function(i){return str.format(\"0x{:02x}\",i)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"i\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})()).join(\", \")+\"])\"}if(typeof HTMLElement!==\"undefined\"&&x instanceof HTMLElement){ans=ρσ_html_element_to_string(x)}else{ans=(typeof x.toString === \"function\")?x.toString():x}if(ans===\"[object Object]\"){return ρσ_repr_js_builtin(x)}try{ans=JSON.stringify(x)}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;{}}}return ans+\"\"};if(!ρσ_repr.__argnames__)Object.defineProperties(ρσ_repr,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});function ρσ_str(x){var ans,name;if(x===null){return\"None\"}if(x===undefined){return\"undefined\"}ans=x;if(typeof x.__str__ === \"function\"){ans=x.__str__()}else if(typeof x.__repr__ === \"function\"){ans=x.__repr__()}else if(x===true||x===false){ans=(x)?\"True\":\"False\"}else if(Array.isArray(x)){ans=ρσ_repr_js_builtin(x,true)}else if(typeof x.toString === \"function\"){name=Object.prototype.toString.call(x).slice(8,-1);if(ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name),-1)){return name+\"([\"+x.map((function(){var ρσ_anonfunc=function(i){return str.format(\"0x{:02x}\",i)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"i\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})()).join(\", \")+\"])\"}if(typeof HTMLElement!==\"undefined\"&&x instanceof HTMLElement){ans=ρσ_html_element_to_string(x)}else{ans=x.toString()}if(ans===\"[object Object]\"){ans=ρσ_repr_js_builtin(x)}}else if(typeof x===\"object\"&&!x.toString){ans=ρσ_repr_js_builtin(x)}return ans+\"\"};if(!ρσ_str.__argnames__)Object.defineProperties(ρσ_str,{__argnames__:{value:[\"x\"]},__module__:{value:\"__main__\"}});define_str_func=(function(){var ρσ_anonfunc=function(name,func){var f;(ρσ_expr_temp=ρσ_str.prototype)[(typeof name===\"number\"&&name<0)?ρσ_expr_temp.length+name:name]=func;ρσ_str[(typeof name===\"number\"&&name<0)?ρσ_str.length+name:name]=f=func.call.bind(func);if(func.__argnames__){Object.defineProperty(f,\"__argnames__\",(function(){var ρσ_d={};ρσ_d[\"value\"]=['string'].concat(func.__argnames__);return ρσ_d}).call(this))}};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"name\",\"func\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_unpack=[String.prototype.split.call.bind(String.prototype.split),String.prototype.replace.call.bind(String.prototype.replace)];ρσ_orig_split=ρσ_unpack[0];ρσ_orig_replace=ρσ_unpack[1];define_str_func(\"format\",(function(){var ρσ_anonfunc=function(){var template,args,kwargs,explicit,implicit,idx,split,ans,pos,in_brace,markup,ch;template=this;if(template===undefined){throw new TypeError(\"Template is required\")}args=Array.prototype.slice.call(arguments);kwargs={};if(args[args.length-1]&&args[args.length-1][ρσ_kwargs_symbol]!==undefined){kwargs=args[args.length-1];args=args.slice(0,-1)}explicit=implicit=false;idx=0;split=ρσ_orig_split;if(ρσ_str.format._template_resolve_pat===undefined){ρσ_str.format._template_resolve_pat=/[.\\[]/}function resolve(arg,object){var ρσ_unpack,first,key,rest,ans;if(!arg){return object}ρσ_unpack=[arg[0],arg.slice(1)];first=ρσ_unpack[0];arg=ρσ_unpack[1];key=split(arg,ρσ_str.format._template_resolve_pat,1)[0];rest=arg.slice(key.length);ans=(first===\"[\")?object[ρσ_bound_index(key.slice(0,-1),object)]:getattr(object,key);if(ans===undefined){throw new KeyError((first===\"[\")?key.slice(0,-1):key)}return resolve(rest,ans)};if(!resolve.__argnames__)Object.defineProperties(resolve,{__argnames__:{value:[\"arg\",\"object\"]},__module__:{value:\"__main__\"}});function resolve_format_spec(format_spec){if(ρσ_str.format._template_resolve_fs_pat===undefined){ρσ_str.format._template_resolve_fs_pat=/[{]([a-zA-Z0-9_]+)[}]/g}return format_spec.replace(ρσ_str.format._template_resolve_fs_pat,(function(){var ρσ_anonfunc=function(match,key){if(!Object.prototype.hasOwnProperty.call(kwargs,key)){return\"\"}return\"\"+kwargs[(typeof key===\"number\"&&key<0)?kwargs.length+key:key]};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"match\",\"key\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})())};if(!resolve_format_spec.__argnames__)Object.defineProperties(resolve_format_spec,{__argnames__:{value:[\"format_spec\"]},__module__:{value:\"__main__\"}});function set_comma(ans,comma){var sep;if(comma!==\",\"){sep=1234;sep=sep.toLocaleString(undefined,{useGrouping: true})[1];ans=str.replace(ans,sep,comma)}return ans};if(!set_comma.__argnames__)Object.defineProperties(set_comma,{__argnames__:{value:[\"ans\",\"comma\"]},__module__:{value:\"__main__\"}});function safe_comma(value,comma){try{return set_comma(value.toLocaleString(undefined,{useGrouping: true}),comma)}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;{return value.toString(10)}}};if(!safe_comma.__argnames__)Object.defineProperties(safe_comma,{__argnames__:{value:[\"value\",\"comma\"]},__module__:{value:\"__main__\"}});function safe_fixed(value,precision,comma){if(!comma){return value.toFixed(precision)}try{return set_comma(value.toLocaleString(undefined,{useGrouping: true, minimumFractionDigits: precision, maximumFractionDigits: precision}),comma)}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;{return value.toFixed(precision)}}};if(!safe_fixed.__argnames__)Object.defineProperties(safe_fixed,{__argnames__:{value:[\"value\",\"precision\",\"comma\"]},__module__:{value:\"__main__\"}});function apply_formatting(value,format_spec){var ρσ_unpack,fill,align,sign,fhash,zeropad,width,comma,precision,ftype,is_numeric,is_int,lftype,code,prec,exp,nval,is_positive,left,right;if(format_spec.indexOf(\"{\")!==-1){format_spec=resolve_format_spec(format_spec)}if(ρσ_str.format._template_format_pat===undefined){ρσ_str.format._template_format_pat=/([^{}](?=[<>=^]))?([<>=^])?([-+\\x20])?(\\#)?(0)?(\\d+)?([,_])?(?:\\.(\\d+))?([bcdeEfFgGnosxX%])?/}try{ρσ_unpack=format_spec.match(ρσ_str.format._template_format_pat).slice(1);ρσ_unpack=ρσ_unpack_asarray(9,ρσ_unpack);fill=ρσ_unpack[0];align=ρσ_unpack[1];sign=ρσ_unpack[2];fhash=ρσ_unpack[3];zeropad=ρσ_unpack[4];width=ρσ_unpack[5];comma=ρσ_unpack[6];precision=ρσ_unpack[7];ftype=ρσ_unpack[8]}catch(ρσ_Exception){ρσ_last_exception=ρσ_Exception;if(ρσ_Exception instanceof TypeError){return value}else{throw ρσ_Exception}}if(zeropad){fill=fill||\"0\";align=align||\"=\"}else{fill=fill||\" \";align=align||\">\"}is_numeric=Number(value) === value;is_int=is_numeric&&value % 1 === 0;precision=parseInt(precision,10);lftype=(ftype||\"\").toLowerCase();if(ftype===\"n\"){is_numeric=true;if(is_int){if(comma){throw new ValueError(\"Cannot specify ',' with 'n'\")}value=parseInt(value,10).toLocaleString()}else{value=parseFloat(value).toLocaleString()}}else if(['b', 'c', 'd', 'o', 'x'].indexOf(lftype)!==-1){value=parseInt(value,10);is_numeric=true;if(!isNaN(value)){if(ftype===\"b\"){value=(value >>> 0).toString(2);if(fhash){value=\"0b\"+value}}else if(ftype===\"c\"){if(value>65535){code=value-65536;value=String.fromCharCode(55296+(code>>10),56320+(code&1023))}else{value=String.fromCharCode(value)}}else if(ftype===\"d\"){if(comma){value=safe_comma(value,comma)}else{value=value.toString(10)}}else if(ftype===\"o\"){value=value.toString(8);if(fhash){value=\"0o\"+value}}else if(lftype===\"x\"){value=value.toString(16);value=(ftype===\"x\")?value.toLowerCase():value.toUpperCase();if(fhash){value=\"0x\"+value}}}}else if(['e','f','g','%'].indexOf(lftype)!==-1){is_numeric=true;value=parseFloat(value);prec=(isNaN(precision))?6:precision;if(lftype===\"e\"){value=value.toExponential(prec);value=(ftype===\"E\")?value.toUpperCase():value.toLowerCase()}else if(lftype===\"f\"){value=safe_fixed(value,prec,comma);value=(ftype===\"F\")?value.toUpperCase():value.toLowerCase()}else if(lftype===\"%\"){value*=100;value=safe_fixed(value,prec,comma)+\"%\"}else if(lftype===\"g\"){prec=max(1,prec);exp=parseInt(split(value.toExponential(prec-1).toLowerCase(),\"e\")[1],10);if(-4<=exp&&exp<prec){value=safe_fixed(value,prec-1-exp,comma)}else{value=value.toExponential(prec-1)}value=value.replace(/0+$/g,\"\");if(value[value.length-1]===decimal_sep){value=value.slice(0,-1)}if(ftype===\"G\"){value=value.toUpperCase()}}}else{if(comma){value=parseInt(value,10);if(isNaN(value)){throw new ValueError(\"Must use numbers with , or _\")}value=safe_comma(value,comma)}value+=\"\";if(!isNaN(precision)){value=value.slice(0,precision)}}value+=\"\";if(is_numeric&&sign){nval=Number(value);is_positive=!isNaN(nval)&&nval>=0;if(is_positive&&(sign===\" \"||sign===\"+\")){value=sign+value}}function repeat(char,num){return(new Array(num+1)).join(char)};if(!repeat.__argnames__)Object.defineProperties(repeat,{__argnames__:{value:[\"char\",\"num\"]},__module__:{value:\"__main__\"}});if(is_numeric&&width&&width[0]===\"0\"){width=width.slice(1);ρσ_unpack=[\"0\",\"=\"];fill=ρσ_unpack[0];align=ρσ_unpack[1]}width=parseInt(width||\"-1\",10);if(isNaN(width)){throw new ValueError(\"Invalid width specification: \"+width)}if(fill&&value.length<width){if(align===\"<\"){value=value+repeat(fill,width-value.length)}else if(align===\">\"){value=repeat(fill,width-value.length)+value}else if(align===\"^\"){left=Math.floor((width-value.length)/2);right=width-left-value.length;value=repeat(fill,left)+value+repeat(fill,right)}else if(align===\"=\"){if(ρσ_in(value[0],\"+- \")){value=value[0]+repeat(fill,width-value.length)+value.slice(1)}else{value=repeat(fill,width-value.length)+value}}else{throw new ValueError(\"Unrecognized alignment: \"+align)}}return value};if(!apply_formatting.__argnames__)Object.defineProperties(apply_formatting,{__argnames__:{value:[\"value\",\"format_spec\"]},__module__:{value:\"__main__\"}});function parse_markup(markup){var key,transformer,format_spec,pos,state,ch;key=transformer=format_spec=\"\";pos=0;state=0;while(pos<markup.length){ch=markup[(typeof pos===\"number\"&&pos<0)?markup.length+pos:pos];if(state===0){if(ch===\"!\"){state=1}else if(ch===\":\"){state=2}else{key+=ch}}else if(state===1){if(ch===\":\"){state=2}else{transformer+=ch}}else{format_spec+=ch}pos+=1}return[key,transformer,format_spec]};if(!parse_markup.__argnames__)Object.defineProperties(parse_markup,{__argnames__:{value:[\"markup\"]},__module__:{value:\"__main__\"}});function render_markup(markup){var ρσ_unpack,key,transformer,format_spec,ends_with_equal,lkey,nvalue,object,ans;ρσ_unpack=parse_markup(markup);ρσ_unpack=ρσ_unpack_asarray(3,ρσ_unpack);key=ρσ_unpack[0];transformer=ρσ_unpack[1];format_spec=ρσ_unpack[2];if(transformer&&['a', 'r', 's'].indexOf(transformer)===-1){throw new ValueError(\"Unknown conversion specifier: \"+transformer)}ends_with_equal=key.endsWith(\"=\");if(ends_with_equal){key=key.slice(0,-1)}lkey=key.length&&split(key,/[.\\[]/,1)[0];if(lkey){explicit=true;if(implicit){throw new ValueError(\"cannot switch from automatic field numbering to manual field specification\")}nvalue=parseInt(lkey);object=(isNaN(nvalue))?kwargs[(typeof lkey===\"number\"&&lkey<0)?kwargs.length+lkey:lkey]:args[(typeof nvalue===\"number\"&&nvalue<0)?args.length+nvalue:nvalue];if(object===undefined){if(isNaN(nvalue)){throw new KeyError(lkey)}throw new IndexError(lkey)}object=resolve(key.slice(lkey.length),object)}else{implicit=true;if(explicit){throw new ValueError(\"cannot switch from manual field specification to automatic field numbering\")}if(idx>=args.length){throw new IndexError(\"Not enough arguments to match template: \"+template)}object=args[(typeof idx===\"number\"&&idx<0)?args.length+idx:idx];idx+=1}if(typeof object===\"function\"){object=object()}ans=\"\"+object;if(format_spec){ans=apply_formatting(ans,format_spec)}if(ends_with_equal){ans=\"\"+ρσ_str.format(\"{}\",key)+\"=\"+ρσ_str.format(\"{}\",ans)+\"\"}return ans};if(!render_markup.__argnames__)Object.defineProperties(render_markup,{__argnames__:{value:[\"markup\"]},__module__:{value:\"__main__\"}});ans=\"\";pos=0;in_brace=0;markup=\"\";while(pos<template.length){ch=template[(typeof pos===\"number\"&&pos<0)?template.length+pos:pos];if(in_brace){if(ch===\"{\"){in_brace+=1;markup+=\"{\"}else if(ch===\"}\"){in_brace-=1;if(in_brace>0){markup+=\"}\"}else{ans+=render_markup(markup)}}else{markup+=ch}}else{if(ch===\"{\"){if(template[ρσ_bound_index(pos+1,template)]===\"{\"){pos+=1;ans+=\"{\"}else{in_brace=1;markup=\"\"}}else{ans+=ch;if(ch===\"}\"&&template[ρσ_bound_index(pos+1,template)]===\"}\"){pos+=1}}}pos+=1}if(in_brace){throw new ValueError(\"expected '}' before end of string\")}return ans};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"capitalize\",(function(){var ρσ_anonfunc=function(){var string;string=this;if(string){string=string[0].toUpperCase()+string.slice(1).toLowerCase()}return string};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"center\",(function(){var ρσ_anonfunc=function(width,fill){var left,right;left=Math.floor((width-this.length)/2);right=width-left-this.length;fill=fill||\" \";return new Array(left+1).join(fill)+this+new Array(right+1).join(fill)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"width\",\"fill\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"count\",(function(){var ρσ_anonfunc=function(needle,start,end){var string,ρσ_unpack,pos,step,ans;string=this;start=start||0;end=end||string.length;if(start<0||end<0){string=string.slice(start,end);ρσ_unpack=[0,string.length];start=ρσ_unpack[0];end=ρσ_unpack[1]}pos=start;step=needle.length;if(!step){return 0}ans=0;while(pos!==-1){pos=string.indexOf(needle,pos);if(pos!==-1){ans+=1;pos+=step}}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"needle\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"endswith\",(function(){var ρσ_anonfunc=function(suffixes,start,end){var string,q;string=this;start=start||0;if(typeof suffixes===\"string\"){suffixes=[suffixes]}if(end!==undefined){string=string.slice(0,end)}for(var i = 0; i < suffixes.length; i++){q=suffixes[(typeof i===\"number\"&&i<0)?suffixes.length+i:i];if(string.indexOf(q,Math.max(start,string.length-q.length))!==-1){return true}}return false};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"suffixes\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"startswith\",(function(){var ρσ_anonfunc=function(prefixes,start,end){var prefix;start=start||0;if(typeof prefixes===\"string\"){prefixes=[prefixes]}for(var i = 0; i < prefixes.length; i++){prefix=prefixes[(typeof i===\"number\"&&i<0)?prefixes.length+i:i];end=(end===undefined)?this.length:end;if(end-start>=prefix.length&&prefix===this.slice(start,start+prefix.length)){return true}}return false};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"prefixes\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"find\",(function(){var ρσ_anonfunc=function(needle,start,end){var ans;while(start<0){start+=this.length}ans=this.indexOf(needle,start);if(end!==undefined&&ans!==-1){while(end<0){end+=this.length}if(ans>=end-needle.length){return-1}}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"needle\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rfind\",(function(){var ρσ_anonfunc=function(needle,start,end){var ans;while(end<0){end+=this.length}ans=this.lastIndexOf(needle,end-1);if(start!==undefined&&ans!==-1){while(start<0){start+=this.length}if(ans<start){return-1}}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"needle\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"index\",(function(){var ρσ_anonfunc=function(needle,start,end){var ans;ans=ρσ_str.prototype.find.apply(this,arguments);if(ans===-1){throw new ValueError(\"substring not found\")}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"needle\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rindex\",(function(){var ρσ_anonfunc=function(needle,start,end){var ans;ans=ρσ_str.prototype.rfind.apply(this,arguments);if(ans===-1){throw new ValueError(\"substring not found\")}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"needle\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"islower\",(function(){var ρσ_anonfunc=function(){return this.length>0&&this.toLowerCase()===this.toString()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"isupper\",(function(){var ρσ_anonfunc=function(){return this.length>0&&this.toUpperCase()===this.toString()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"isspace\",(function(){var ρσ_anonfunc=function(){return this.length>0&&/^\\s+$/.test(this)};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"join\",(function(){var ρσ_anonfunc=function(iterable){var ans,r;if(Array.isArray(iterable)){return iterable.join(this)}ans=\"\";r=iterable.next();while(!r.done){if(ans){ans+=this}ans+=r.value;r=iterable.next()}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"iterable\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"ljust\",(function(){var ρσ_anonfunc=function(width,fill){var string;string=this;if(width>string.length){fill=fill||\" \";string+=new Array(width - string.length + 1).join(fill)}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"width\",\"fill\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rjust\",(function(){var ρσ_anonfunc=function(width,fill){var string;string=this;if(width>string.length){fill=fill||\" \";string=new Array(width - string.length + 1).join(fill)+string}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"width\",\"fill\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"lower\",(function(){var ρσ_anonfunc=function(){return this.toLowerCase()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"upper\",(function(){var ρσ_anonfunc=function(){return this.toUpperCase()};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"lstrip\",(function(){var ρσ_anonfunc=function(chars){var string,pos;string=this;pos=0;chars=chars||ρσ_str.whitespace;while(chars.indexOf(string[(typeof pos===\"number\"&&pos<0)?string.length+pos:pos])!==-1){pos+=1}if(pos){string=string.slice(pos)}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"chars\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rstrip\",(function(){var ρσ_anonfunc=function(chars){var string,pos;string=this;pos=string.length-1;chars=chars||ρσ_str.whitespace;while(chars.indexOf(string[(typeof pos===\"number\"&&pos<0)?string.length+pos:pos])!==-1){pos-=1}if(pos<string.length-1){string=string.slice(0,pos+1)}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"chars\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"strip\",(function(){var ρσ_anonfunc=function(chars){return ρσ_str.prototype.lstrip.call(ρσ_str.prototype.rstrip.call(this,chars),chars)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"chars\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"partition\",(function(){var ρσ_anonfunc=function(sep){var idx;idx=this.indexOf(sep);if(idx===-1){return[this,\"\",\"\"]}return[this.slice(0,idx),sep,this.slice(idx+sep.length)]};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"sep\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rpartition\",(function(){var ρσ_anonfunc=function(sep){var idx;idx=this.lastIndexOf(sep);if(idx===-1){return[\"\",\"\",this]}return[this.slice(0,idx),sep,this.slice(idx+sep.length)]};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"sep\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"replace\",(function(){var ρσ_anonfunc=function(old,repl,count){var string,pos,idx;string=this;if(count===1){return ρσ_orig_replace(string,old,repl)}if(count<1){return string}count=count||Number.MAX_VALUE;pos=0;while(count>0){count-=1;idx=string.indexOf(old,pos);if(idx===-1){break}pos=idx+repl.length;string=string.slice(0,idx)+repl+string.slice(idx+old.length)}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"old\",\"repl\",\"count\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"split\",(function(){var ρσ_anonfunc=function(sep,maxsplit){var split,ans,extra,parts;if(maxsplit===0){return ρσ_list_decorate([this])}split=ρσ_orig_split;if(sep===undefined||sep===null){if(maxsplit>0){ans=split(this,/(\\s+)/);extra=\"\";parts=[];for(var i = 0; i < ans.length; i++){if(parts.length>=maxsplit+1){extra+=ans[(typeof i===\"number\"&&i<0)?ans.length+i:i]}else if(i%2===0){parts.push(ans[(typeof i===\"number\"&&i<0)?ans.length+i:i])}}parts[parts.length-1]+=extra;ans=parts}else{ans=split(this,/\\s+/)}}else{if(sep===\"\"){throw new ValueError(\"empty separator\")}ans=split(this,sep);if(maxsplit>0&&ans.length>maxsplit){extra=ans.slice(maxsplit).join(sep);ans=ans.slice(0,maxsplit);ans.push(extra)}}return ρσ_list_decorate(ans)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"sep\",\"maxsplit\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"rsplit\",(function(){var ρσ_anonfunc=function(sep,maxsplit){var split,ans,is_space,pos,current,spc,ch,end,idx;if(!maxsplit){return ρσ_str.prototype.split.call(this,sep)}split=ρσ_orig_split;if(sep===undefined||sep===null){if(maxsplit>0){ans=[];is_space=/\\s/;pos=this.length-1;current=\"\";while(pos>-1&&maxsplit>0){spc=false;ch=(ρσ_expr_temp=this)[(typeof pos===\"number\"&&pos<0)?ρσ_expr_temp.length+pos:pos];while(pos>-1&&is_space.test(ch)){spc=true;ch=this[--pos]}if(spc){if(current){ans.push(current);maxsplit-=1}current=ch}else{current+=ch}pos-=1}ans.push(this.slice(0,pos+1)+current);ans.reverse()}else{ans=split(this,/\\s+/)}}else{if(sep===\"\"){throw new ValueError(\"empty separator\")}ans=[];pos=end=this.length;while(pos>-1&&maxsplit>0){maxsplit-=1;idx=this.lastIndexOf(sep,pos);if(idx===-1){break}ans.push(this.slice(idx+sep.length,end));pos=idx-1;end=idx}ans.push(this.slice(0,end));ans.reverse()}return ρσ_list_decorate(ans)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"sep\",\"maxsplit\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"splitlines\",(function(){var ρσ_anonfunc=function(keepends){var split,parts,ans;split=ρσ_orig_split;if(keepends){parts=split(this,/((?:\\r?\\n)|\\r)/);ans=[];for(var i = 0; i < parts.length; i++){if(i%2===0){ans.push(parts[(typeof i===\"number\"&&i<0)?parts.length+i:i])}else{ans[ans.length-1]+=parts[(typeof i===\"number\"&&i<0)?parts.length+i:i]}}}else{ans=split(this,/(?:\\r?\\n)|\\r/)}return ρσ_list_decorate(ans)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"keepends\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"swapcase\",(function(){var ρσ_anonfunc=function(){var ans,a,b;ans=new Array(this.length);for(var i = 0; i < ans.length; i++){a=(ρσ_expr_temp=this)[(typeof i===\"number\"&&i<0)?ρσ_expr_temp.length+i:i];b=a.toLowerCase();if(a===b){b=a.toUpperCase()}ans[(typeof i===\"number\"&&i<0)?ans.length+i:i]=b}return ans.join(\"\")};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})());define_str_func(\"zfill\",(function(){var ρσ_anonfunc=function(width){var string;string=this;if(width>string.length){string=new Array(width - string.length + 1).join(\"0\")+string}return string};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"width\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})());ρσ_str.uchrs=(function(){var ρσ_anonfunc=function(string,with_positions){return(function(){var ρσ_d={};ρσ_d[\"_string\"]=string;ρσ_d[\"_pos\"]=0;ρσ_d[ρσ_iterator_symbol]=(function(){var ρσ_anonfunc=function(){return this};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_d[\"next\"]=(function(){var ρσ_anonfunc=function(){var length,pos,value,ans,extra;length=this._string.length;if(this._pos>=length){return(function(){var ρσ_d={};ρσ_d[\"done\"]=true;return ρσ_d}).call(this)}pos=this._pos;value=this._string.charCodeAt(this._pos++);ans=\"\\ufffd\";if(55296<=value&&value<=56319){if(this._pos<length){extra=this._string.charCodeAt(this._pos++);if((extra&56320)===56320){ans=String.fromCharCode(value,extra)}}}else if((value&56320)!==56320){ans=String.fromCharCode(value)}if(with_positions){return(function(){var ρσ_d={};ρσ_d[\"done\"]=false;ρσ_d[\"value\"]=ρσ_list_decorate([pos,ans]);return ρσ_d}).call(this)}else{return(function(){var ρσ_d={};ρσ_d[\"done\"]=false;ρσ_d[\"value\"]=ans;return ρσ_d}).call(this)}};if(!ρσ_anonfunc.__module__)Object.defineProperties(ρσ_anonfunc,{__module__:{value:\"__main__\"}});return ρσ_anonfunc})();return ρσ_d}).call(this)};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"string\",\"with_positions\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_str.uslice=(function(){var ρσ_anonfunc=function(string,start,end){var items,iterator,r;items=[];iterator=ρσ_str.uchrs(string);r=iterator.next();while(!r.done){items.push(r.value);r=iterator.next()}return items.slice(start||0,(end===undefined)?items.length:end).join(\"\")};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"string\",\"start\",\"end\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_str.ulen=(function(){var ρσ_anonfunc=function(string){var iterator,r,ans;iterator=ρσ_str.uchrs(string);r=iterator.next();ans=0;while(!r.done){r=iterator.next();ans+=1}return ans};if(!ρσ_anonfunc.__argnames__)Object.defineProperties(ρσ_anonfunc,{__argnames__:{value:[\"string\"]},__module__:{value:\"__main__\"}});return ρσ_anonfunc})();ρσ_str.ascii_lowercase=\"abcdefghijklmnopqrstuvwxyz\";ρσ_str.ascii_uppercase=\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";ρσ_str.ascii_letters=\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";ρσ_str.digits=\"0123456789\";ρσ_str.punctuation=\"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\";ρσ_str.printable=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\u000b\\f\";ρσ_str.whitespace=\" \\t\\n\\r\\u000b\\f\";define_str_func = undefined;var str = ρσ_str, repr = ρσ_repr"
  },
  {
    "path": "release/compiler.js",
    "content": "(function(){\n    \"use strict\";\n    var ρσ_iterator_symbol = (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") ? Symbol.iterator : \"iterator-Symbol-5d0927e5554349048cf0e3762a228256\";\n    var ρσ_kwargs_symbol = (typeof Symbol === \"function\") ? Symbol(\"kwargs-object\") : \"kwargs-object-Symbol-5d0927e5554349048cf0e3762a228256\";\n    var ρσ_cond_temp, ρσ_expr_temp, ρσ_last_exception;\n    var ρσ_object_counter = 0;\nvar ρσ_len;\nfunction ρσ_bool(val) {\n    return !!val;\n};\nif (!ρσ_bool.__argnames__) Object.defineProperties(ρσ_bool, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_print() {\n    var parts;\n    if (typeof console === \"object\") {\n        parts = [];\n        for (var i = 0; i < arguments.length; i++) {\n            parts.push(ρσ_str(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]));\n        }\n        console.log(parts.join(\" \"));\n    }\n};\nif (!ρσ_print.__module__) Object.defineProperties(ρσ_print, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_int(val, base) {\n    var ans;\n    if (typeof val === \"number\") {\n        ans = val | 0;\n    } else {\n        ans = parseInt(val, base || 10);\n    }\n    if (isNaN(ans)) {\n        throw new ValueError(\"Invalid literal for int with base \" + (base || 10) + \": \" + val);\n    }\n    return ans;\n};\nif (!ρσ_int.__argnames__) Object.defineProperties(ρσ_int, {\n    __argnames__ : {value: [\"val\", \"base\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_float(val) {\n    var ans;\n    if (typeof val === \"number\") {\n        ans = val;\n    } else {\n        ans = parseFloat(val);\n    }\n    if (isNaN(ans)) {\n        throw new ValueError(\"Could not convert string to float: \" + arguments[0]);\n    }\n    return ans;\n};\nif (!ρσ_float.__argnames__) Object.defineProperties(ρσ_float, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_arraylike_creator() {\n    var names;\n    names = \"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".split(\" \");\n    if (typeof HTMLCollection === \"function\") {\n        names = names.concat(\"HTMLCollection NodeList NamedNodeMap TouchList\".split(\" \"));\n    }\n    return (function() {\n        var ρσ_anonfunc = function (x) {\n            if (Array.isArray(x) || typeof x === \"string\" || names.indexOf(Object.prototype.toString.call(x).slice(8, -1)) > -1) {\n                return true;\n            }\n            return false;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"x\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n};\nif (!ρσ_arraylike_creator.__module__) Object.defineProperties(ρσ_arraylike_creator, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction options_object(f) {\n    return (function() {\n        var ρσ_anonfunc = function () {\n            if (typeof arguments[arguments.length - 1] === \"object\") {\n                arguments[ρσ_bound_index(arguments.length - 1, arguments)][ρσ_kwargs_symbol] = true;\n            }\n            return f.apply(this, arguments);\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n};\nif (!options_object.__argnames__) Object.defineProperties(options_object, {\n    __argnames__ : {value: [\"f\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_id(x) {\n    return x.ρσ_object_id;\n};\nif (!ρσ_id.__argnames__) Object.defineProperties(ρσ_id, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_dir(item) {\n    var arr;\n    arr = ρσ_list_decorate([]);\n    for (var i in item) {\n        arr.push(i);\n    }\n    return arr;\n};\nif (!ρσ_dir.__argnames__) Object.defineProperties(ρσ_dir, {\n    __argnames__ : {value: [\"item\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_ord(x) {\n    var ans, second;\n    ans = x.charCodeAt(0);\n    if (55296 <= ans && ans <= 56319) {\n        second = x.charCodeAt(1);\n        if (56320 <= second && second <= 57343) {\n            return (ans - 55296) * 1024 + second - 56320 + 65536;\n        }\n        throw new TypeError(\"string is missing the low surrogate char\");\n    }\n    return ans;\n};\nif (!ρσ_ord.__argnames__) Object.defineProperties(ρσ_ord, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_chr(code) {\n    if (code <= 65535) {\n        return String.fromCharCode(code);\n    }\n    code -= 65536;\n    return String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n};\nif (!ρσ_chr.__argnames__) Object.defineProperties(ρσ_chr, {\n    __argnames__ : {value: [\"code\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_callable(x) {\n    return typeof x === \"function\";\n};\nif (!ρσ_callable.__argnames__) Object.defineProperties(ρσ_callable, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_bin(x) {\n    var ans;\n    if (typeof x !== \"number\" || x % 1 !== 0) {\n        throw new TypeError(\"integer required\");\n    }\n    ans = x.toString(2);\n    if (ans[0] === \"-\") {\n        ans = \"-\" + \"0b\" + ans.slice(1);\n    } else {\n        ans = \"0b\" + ans;\n    }\n    return ans;\n};\nif (!ρσ_bin.__argnames__) Object.defineProperties(ρσ_bin, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_hex(x) {\n    var ans;\n    if (typeof x !== \"number\" || x % 1 !== 0) {\n        throw new TypeError(\"integer required\");\n    }\n    ans = x.toString(16);\n    if (ans[0] === \"-\") {\n        ans = \"-\" + \"0x\" + ans.slice(1);\n    } else {\n        ans = \"0x\" + ans;\n    }\n    return ans;\n};\nif (!ρσ_hex.__argnames__) Object.defineProperties(ρσ_hex, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_enumerate(iterable) {\n    var ans, iterator;\n    ans = {\"_i\":-1};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    if (ρσ_arraylike(iterable)) {\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i < iterable.length) {\n                    return {'done':false, 'value':[this._i, iterable[this._i]]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans[\"_iterator\"] = iterator;\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                var r;\n                r = this._iterator.next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                this._i += 1;\n                return {'done':false, 'value':[this._i, r.value]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    return ρσ_enumerate(Object.keys(iterable));\n};\nif (!ρσ_enumerate.__argnames__) Object.defineProperties(ρσ_enumerate, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_reversed(iterable) {\n    var ans;\n    if (ρσ_arraylike(iterable)) {\n        ans = {\"_i\": iterable.length};\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i -= 1;\n                if (this._i > -1) {\n                    return {'done':false, 'value':iterable[this._i]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    throw new TypeError(\"reversed() can only be called on arrays or strings\");\n};\nif (!ρσ_reversed.__argnames__) Object.defineProperties(ρσ_reversed, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_iter(iterable) {\n    var ans;\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        return (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n    }\n    if (ρσ_arraylike(iterable)) {\n        ans = {\"_i\":-1};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i < iterable.length) {\n                    return {'done':false, 'value':iterable[this._i]};\n                }\n                return {'done':true};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    }\n    return ρσ_iter(Object.keys(iterable));\n};\nif (!ρσ_iter.__argnames__) Object.defineProperties(ρσ_iter, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_range_next(step, length) {\n    var ρσ_unpack;\n    this._i += step;\n    this._idx += 1;\n    if (this._idx >= length) {\n        ρσ_unpack = [this.__i, -1];\n        this._i = ρσ_unpack[0];\n        this._idx = ρσ_unpack[1];\n        return {'done':true};\n    }\n    return {'done':false, 'value':this._i};\n};\nif (!ρσ_range_next.__argnames__) Object.defineProperties(ρσ_range_next, {\n    __argnames__ : {value: [\"step\", \"length\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_range(start, stop, step) {\n    var length, ans;\n    if (arguments.length <= 1) {\n        stop = start || 0;\n        start = 0;\n    }\n    step = arguments[2] || 1;\n    length = Math.max(Math.ceil((stop - start) / step), 0);\n    ans = {start:start, step:step, stop:stop};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            var it;\n            it = {\"_i\": start - step, \"_idx\": -1};\n            it.next = ρσ_range_next.bind(it, step, length);\n            it[ρσ_iterator_symbol] = (function() {\n                var ρσ_anonfunc = function () {\n                    return this;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return it;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.count = (function() {\n        var ρσ_anonfunc = function (val) {\n            if (!this._cached) {\n                this._cached = list(this);\n            }\n            return this._cached.count(val);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.index = (function() {\n        var ρσ_anonfunc = function (val) {\n            if (!this._cached) {\n                this._cached = list(this);\n            }\n            return this._cached.index(val);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__len__ = (function() {\n        var ρσ_anonfunc = function () {\n            return length;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__repr__ = (function() {\n        var ρσ_anonfunc = function () {\n            return \"range(\" + ρσ_str.format(\"{}\", start) + \", \" + ρσ_str.format(\"{}\", stop) + \", \" + ρσ_str.format(\"{}\", step) + \")\";\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans.__str__ = ans.toString = ans.__repr__;\n    if (typeof Proxy === \"function\") {\n        ans = new Proxy(ans, (function(){\n            var ρσ_d = {};\n            ρσ_d[\"get\"] = (function() {\n                var ρσ_anonfunc = function (obj, prop) {\n                    var iprop;\n                    if (typeof prop === \"string\") {\n                        iprop = parseInt(prop);\n                        if (!isNaN(iprop)) {\n                            prop = iprop;\n                        }\n                    }\n                    if (typeof prop === \"number\") {\n                        if (!obj._cached) {\n                            obj._cached = list(obj);\n                        }\n                        return (ρσ_expr_temp = obj._cached)[(typeof prop === \"number\" && prop < 0) ? ρσ_expr_temp.length + prop : prop];\n                    }\n                    return obj[(typeof prop === \"number\" && prop < 0) ? obj.length + prop : prop];\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"obj\", \"prop\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return ρσ_d;\n        }).call(this));\n    }\n    return ans;\n};\nif (!ρσ_range.__argnames__) Object.defineProperties(ρσ_range, {\n    __argnames__ : {value: [\"start\", \"stop\", \"step\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_getattr(obj, name, defval) {\n    var ret;\n    try {\n        ret = obj[(typeof name === \"number\" && name < 0) ? obj.length + name : name];\n    } catch (ρσ_Exception) {\n        ρσ_last_exception = ρσ_Exception;\n        if (ρσ_Exception instanceof TypeError) {\n            if (defval === undefined) {\n                throw new AttributeError(\"The attribute \" + name + \" is not present\");\n            }\n            return defval;\n        } else {\n            throw ρσ_Exception;\n        }\n    }\n    if (ret === undefined && !(name in obj)) {\n        if (defval === undefined) {\n            throw new AttributeError(\"The attribute \" + name + \" is not present\");\n        }\n        ret = defval;\n    }\n    return ret;\n};\nif (!ρσ_getattr.__argnames__) Object.defineProperties(ρσ_getattr, {\n    __argnames__ : {value: [\"obj\", \"name\", \"defval\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_setattr(obj, name, value) {\n    obj[(typeof name === \"number\" && name < 0) ? obj.length + name : name] = value;\n};\nif (!ρσ_setattr.__argnames__) Object.defineProperties(ρσ_setattr, {\n    __argnames__ : {value: [\"obj\", \"name\", \"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_hasattr(obj, name) {\n    return name in obj;\n};\nif (!ρσ_hasattr.__argnames__) Object.defineProperties(ρσ_hasattr, {\n    __argnames__ : {value: [\"obj\", \"name\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_len = (function() {\n    var ρσ_anonfunc = function () {\n        function len(obj) {\n            if (ρσ_arraylike(obj)) {\n                return obj.length;\n            }\n            if (typeof obj.__len__ === \"function\") {\n                return obj.__len__();\n            }\n            if (obj instanceof Set || obj instanceof Map) {\n                return obj.size;\n            }\n            return Object.keys(obj).length;\n        };\n        if (!len.__argnames__) Object.defineProperties(len, {\n            __argnames__ : {value: [\"obj\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function len5(obj) {\n            if (ρσ_arraylike(obj)) {\n                return obj.length;\n            }\n            if (typeof obj.__len__ === \"function\") {\n                return obj.__len__();\n            }\n            return Object.keys(obj).length;\n        };\n        if (!len5.__argnames__) Object.defineProperties(len5, {\n            __argnames__ : {value: [\"obj\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        return (typeof Set === \"function\" && typeof Map === \"function\") ? len : len5;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_get_module(name) {\n    return ρσ_modules[(typeof name === \"number\" && name < 0) ? ρσ_modules.length + name : name];\n};\nif (!ρσ_get_module.__argnames__) Object.defineProperties(ρσ_get_module, {\n    __argnames__ : {value: [\"name\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_pow(x, y, z) {\n    var ans;\n    ans = Math.pow(x, y);\n    if (z !== undefined) {\n        ans %= z;\n    }\n    return ans;\n};\nif (!ρσ_pow.__argnames__) Object.defineProperties(ρσ_pow, {\n    __argnames__ : {value: [\"x\", \"y\", \"z\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_type(x) {\n    return x.constructor;\n};\nif (!ρσ_type.__argnames__) Object.defineProperties(ρσ_type, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_divmod(x, y) {\n    var d;\n    if (y === 0) {\n        throw new ZeroDivisionError(\"integer division or modulo by zero\");\n    }\n    d = Math.floor(x / y);\n    return [d, x - d * y];\n};\nif (!ρσ_divmod.__argnames__) Object.defineProperties(ρσ_divmod, {\n    __argnames__ : {value: [\"x\", \"y\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_max() {\n    var kwargs = arguments[arguments.length-1];\n    if (kwargs === null || typeof kwargs !== \"object\" || kwargs [ρσ_kwargs_symbol] !== true) kwargs = {};\n    var args = Array.prototype.slice.call(arguments, 0);\n    if (kwargs !== null && typeof kwargs === \"object\" && kwargs [ρσ_kwargs_symbol] === true) args.pop();\n    var args, x;\n    if (args.length === 0) {\n        if (kwargs.defval !== undefined) {\n            return kwargs.defval;\n        }\n        throw new TypeError(\"expected at least one argument\");\n    }\n    if (args.length === 1) {\n        args = args[0];\n    }\n    if (kwargs.key) {\n        args = (function() {\n            var ρσ_Iter = ρσ_Iterable(args), ρσ_Result = [], x;\n            for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                x = ρσ_Iter[ρσ_Index];\n                ρσ_Result.push(kwargs.key(x));\n            }\n            ρσ_Result = ρσ_list_constructor(ρσ_Result);\n            return ρσ_Result;\n        })();\n    }\n    if (!Array.isArray(args)) {\n        args = list(args);\n    }\n    if (args.length) {\n        return this.apply(null, args);\n    }\n    if (kwargs.defval !== undefined) {\n        return kwargs.defval;\n    }\n    throw new TypeError(\"expected at least one argument\");\n};\nif (!ρσ_max.__handles_kwarg_interpolation__) Object.defineProperties(ρσ_max, {\n    __handles_kwarg_interpolation__ : {value: true},\n    __module__ : {value: \"__main__\"}\n});\n\nvar abs = Math.abs, max = ρσ_max.bind(Math.max), min = ρσ_max.bind(Math.min), bool = ρσ_bool, type = ρσ_type;\nvar float = ρσ_float, int = ρσ_int, arraylike = ρσ_arraylike_creator(), ρσ_arraylike = arraylike;\nvar print = ρσ_print, id = ρσ_id, get_module = ρσ_get_module, pow = ρσ_pow, divmod = ρσ_divmod;\nvar dir = ρσ_dir, ord = ρσ_ord, chr = ρσ_chr, bin = ρσ_bin, hex = ρσ_hex, callable = ρσ_callable;\nvar enumerate = ρσ_enumerate, iter = ρσ_iter, reversed = ρσ_reversed, len = ρσ_len;\nvar range = ρσ_range, getattr = ρσ_getattr, setattr = ρσ_setattr, hasattr = ρσ_hasattr;function ρσ_equals(a, b) {\n    var ρσ_unpack, akeys, bkeys, key;\n    if (a === b) {\n        return true;\n    }\n    if (a && typeof a.__eq__ === \"function\") {\n        return a.__eq__(b);\n    }\n    if (b && typeof b.__eq__ === \"function\") {\n        return b.__eq__(a);\n    }\n    if (ρσ_arraylike(a) && ρσ_arraylike(b)) {\n        if ((a.length !== b.length && (typeof a.length !== \"object\" || ρσ_not_equals(a.length, b.length)))) {\n            return false;\n        }\n        for (var i=0; i < a.length; i++) {\n            if (!(((a[(typeof i === \"number\" && i < 0) ? a.length + i : i] === b[(typeof i === \"number\" && i < 0) ? b.length + i : i] || typeof a[(typeof i === \"number\" && i < 0) ? a.length + i : i] === \"object\" && ρσ_equals(a[(typeof i === \"number\" && i < 0) ? a.length + i : i], b[(typeof i === \"number\" && i < 0) ? b.length + i : i]))))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    if (typeof a === \"object\" && typeof b === \"object\" && a !== null && b !== null && (a.constructor === Object && b.constructor === Object || Object.getPrototypeOf(a) === null && Object.getPrototypeOf(b) === null)) {\n        ρσ_unpack = [Object.keys(a), Object.keys(b)];\n        akeys = ρσ_unpack[0];\n        bkeys = ρσ_unpack[1];\n        if (akeys.length !== bkeys.length) {\n            return false;\n        }\n        for (var j=0; j < akeys.length; j++) {\n            key = akeys[(typeof j === \"number\" && j < 0) ? akeys.length + j : j];\n            if (!(((a[(typeof key === \"number\" && key < 0) ? a.length + key : key] === b[(typeof key === \"number\" && key < 0) ? b.length + key : key] || typeof a[(typeof key === \"number\" && key < 0) ? a.length + key : key] === \"object\" && ρσ_equals(a[(typeof key === \"number\" && key < 0) ? a.length + key : key], b[(typeof key === \"number\" && key < 0) ? b.length + key : key]))))) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n};\nif (!ρσ_equals.__argnames__) Object.defineProperties(ρσ_equals, {\n    __argnames__ : {value: [\"a\", \"b\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_not_equals(a, b) {\n    if (a === b) {\n        return false;\n    }\n    if (a && typeof a.__ne__ === \"function\") {\n        return a.__ne__(b);\n    }\n    if (b && typeof b.__ne__ === \"function\") {\n        return b.__ne__(a);\n    }\n    return !ρσ_equals(a, b);\n};\nif (!ρσ_not_equals.__argnames__) Object.defineProperties(ρσ_not_equals, {\n    __argnames__ : {value: [\"a\", \"b\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar equals = ρσ_equals;\nfunction ρσ_list_extend(iterable) {\n    var start, iterator, result;\n    if (Array.isArray(iterable) || typeof iterable === \"string\") {\n        start = this.length;\n        this.length += iterable.length;\n        for (var i = 0; i < iterable.length; i++) {\n            (ρσ_expr_temp = this)[ρσ_bound_index(start + i, ρσ_expr_temp)] = iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i];\n        }\n    } else {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        result = iterator.next();\n        while (!result.done) {\n            this.push(result.value);\n            result = iterator.next();\n        }\n    }\n};\nif (!ρσ_list_extend.__argnames__) Object.defineProperties(ρσ_list_extend, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_index(val, start, stop) {\n    start = start || 0;\n    if (start < 0) {\n        start = this.length + start;\n    }\n    if (start < 0) {\n        throw new ValueError(val + \" is not in list\");\n    }\n    if (stop === undefined) {\n        stop = this.length;\n    }\n    if (stop < 0) {\n        stop = this.length + stop;\n    }\n    for (var i = start; i < stop; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === val || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], val))) {\n            return i;\n        }\n    }\n    throw new ValueError(val + \" is not in list\");\n};\nif (!ρσ_list_index.__argnames__) Object.defineProperties(ρσ_list_index, {\n    __argnames__ : {value: [\"val\", \"start\", \"stop\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_pop(index) {\n    var ans;\n    if (this.length === 0) {\n        throw new IndexError(\"list is empty\");\n    }\n    if (index === undefined) {\n        index = -1;\n    }\n    ans = this.splice(index, 1);\n    if (!ans.length) {\n        throw new IndexError(\"pop index out of range\");\n    }\n    return ans[0];\n};\nif (!ρσ_list_pop.__argnames__) Object.defineProperties(ρσ_list_pop, {\n    __argnames__ : {value: [\"index\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_remove(value) {\n    for (var i = 0; i < this.length; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === value || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], value))) {\n            this.splice(i, 1);\n            return;\n        }\n    }\n    throw new ValueError(value + \" not in list\");\n};\nif (!ρσ_list_remove.__argnames__) Object.defineProperties(ρσ_list_remove, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_to_string() {\n    return \"[\" + this.join(\", \") + \"]\";\n};\nif (!ρσ_list_to_string.__module__) Object.defineProperties(ρσ_list_to_string, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_insert(index, val) {\n    if (index < 0) {\n        index += this.length;\n    }\n    index = min(this.length, max(index, 0));\n    if (index === 0) {\n        this.unshift(val);\n        return;\n    }\n    for (var i = this.length; i > index; i--) {\n        (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] = (ρσ_expr_temp = this)[ρσ_bound_index(i - 1, ρσ_expr_temp)];\n    }\n    (ρσ_expr_temp = this)[(typeof index === \"number\" && index < 0) ? ρσ_expr_temp.length + index : index] = val;\n};\nif (!ρσ_list_insert.__argnames__) Object.defineProperties(ρσ_list_insert, {\n    __argnames__ : {value: [\"index\", \"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_copy() {\n    return ρσ_list_constructor(this);\n};\nif (!ρσ_list_copy.__module__) Object.defineProperties(ρσ_list_copy, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_clear() {\n    this.length = 0;\n};\nif (!ρσ_list_clear.__module__) Object.defineProperties(ρσ_list_clear, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_as_array() {\n    return Array.prototype.slice.call(this);\n};\nif (!ρσ_list_as_array.__module__) Object.defineProperties(ρσ_list_as_array, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_count(value) {\n    return this.reduce((function() {\n        var ρσ_anonfunc = function (n, val) {\n            return n + (val === value);\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"n\", \"val\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })(), 0);\n};\nif (!ρσ_list_count.__argnames__) Object.defineProperties(ρσ_list_count, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort_key(value) {\n    var t;\n    t = typeof value;\n    if (t === \"string\" || t === \"number\") {\n        return value;\n    }\n    return value.toString();\n};\nif (!ρσ_list_sort_key.__argnames__) Object.defineProperties(ρσ_list_sort_key, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort_cmp(a, b, ap, bp) {\n    if (a < b) {\n        return -1;\n    }\n    if (a > b) {\n        return 1;\n    }\n    return ap - bp;\n};\nif (!ρσ_list_sort_cmp.__argnames__) Object.defineProperties(ρσ_list_sort_cmp, {\n    __argnames__ : {value: [\"a\", \"b\", \"ap\", \"bp\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_sort() {\n    var key = (arguments[0] === undefined || ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_list_sort.__defaults__.key : arguments[0];\n    var reverse = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_list_sort.__defaults__.reverse : arguments[1];\n    var ρσ_kwargs_obj = arguments[arguments.length-1];\n    if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"key\")){\n        key = ρσ_kwargs_obj.key;\n    }\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"reverse\")){\n        reverse = ρσ_kwargs_obj.reverse;\n    }\n    var mult, keymap, posmap, k;\n    key = key || ρσ_list_sort_key;\n    mult = (reverse) ? -1 : 1;\n    keymap = dict();\n    posmap = dict();\n    for (var i=0; i < this.length; i++) {\n        k = (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n        keymap.set(k, key(k));\n        posmap.set(k, i);\n    }\n    this.sort((function() {\n        var ρσ_anonfunc = function (a, b) {\n            return mult * ρσ_list_sort_cmp(keymap.get(a), keymap.get(b), posmap.get(a), posmap.get(b));\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"a\", \"b\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })());\n};\nif (!ρσ_list_sort.__defaults__) Object.defineProperties(ρσ_list_sort, {\n    __defaults__ : {value: {key:null, reverse:false}},\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"key\", \"reverse\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_concat() {\n    var ans;\n    ans = Array.prototype.concat.apply(this, arguments);\n    ρσ_list_decorate(ans);\n    return ans;\n};\nif (!ρσ_list_concat.__module__) Object.defineProperties(ρσ_list_concat, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_slice() {\n    var ans;\n    ans = Array.prototype.slice.apply(this, arguments);\n    ρσ_list_decorate(ans);\n    return ans;\n};\nif (!ρσ_list_slice.__module__) Object.defineProperties(ρσ_list_slice, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_iterator(value) {\n    var self;\n    self = this;\n    return (function(){\n        var ρσ_d = {};\n        ρσ_d[\"_i\"] = -1;\n        ρσ_d[\"_list\"] = self;\n        ρσ_d[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._list.length) {\n                    return (function(){\n                        var ρσ_d = {};\n                        ρσ_d[\"done\"] = true;\n                        return ρσ_d;\n                    }).call(this);\n                }\n                return (function(){\n                    var ρσ_d = {};\n                    ρσ_d[\"done\"] = false;\n                    ρσ_d[\"value\"] = (ρσ_expr_temp = this._list)[ρσ_bound_index(this._i, ρσ_expr_temp)];\n                    return ρσ_d;\n                }).call(this);\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n};\nif (!ρσ_list_iterator.__argnames__) Object.defineProperties(ρσ_list_iterator, {\n    __argnames__ : {value: [\"value\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_len() {\n    return this.length;\n};\nif (!ρσ_list_len.__module__) Object.defineProperties(ρσ_list_len, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_contains(val) {\n    for (var i = 0; i < this.length; i++) {\n        if (((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === val || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], val))) {\n            return true;\n        }\n    }\n    return false;\n};\nif (!ρσ_list_contains.__argnames__) Object.defineProperties(ρσ_list_contains, {\n    __argnames__ : {value: [\"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_eq(other) {\n    if (!ρσ_arraylike(other)) {\n        return false;\n    }\n    if ((this.length !== other.length && (typeof this.length !== \"object\" || ρσ_not_equals(this.length, other.length)))) {\n        return false;\n    }\n    for (var i = 0; i < this.length; i++) {\n        if (!((((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === other[(typeof i === \"number\" && i < 0) ? other.length + i : i] || typeof (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] === \"object\" && ρσ_equals((ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i], other[(typeof i === \"number\" && i < 0) ? other.length + i : i]))))) {\n            return false;\n        }\n    }\n    return true;\n};\nif (!ρσ_list_eq.__argnames__) Object.defineProperties(ρσ_list_eq, {\n    __argnames__ : {value: [\"other\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_decorate(ans) {\n    ans.append = Array.prototype.push;\n    ans.toString = ρσ_list_to_string;\n    ans.inspect = ρσ_list_to_string;\n    ans.extend = ρσ_list_extend;\n    ans.index = ρσ_list_index;\n    ans.pypop = ρσ_list_pop;\n    ans.remove = ρσ_list_remove;\n    ans.insert = ρσ_list_insert;\n    ans.copy = ρσ_list_copy;\n    ans.clear = ρσ_list_clear;\n    ans.count = ρσ_list_count;\n    ans.concat = ρσ_list_concat;\n    ans.pysort = ρσ_list_sort;\n    ans.slice = ρσ_list_slice;\n    ans.as_array = ρσ_list_as_array;\n    ans.__len__ = ρσ_list_len;\n    ans.__contains__ = ρσ_list_contains;\n    ans.__eq__ = ρσ_list_eq;\n    ans.constructor = ρσ_list_constructor;\n    if (typeof ans[ρσ_iterator_symbol] !== \"function\") {\n        ans[ρσ_iterator_symbol] = ρσ_list_iterator;\n    }\n    return ans;\n};\nif (!ρσ_list_decorate.__argnames__) Object.defineProperties(ρσ_list_decorate, {\n    __argnames__ : {value: [\"ans\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_list_constructor(iterable) {\n    var ans, iterator, result;\n    if (iterable === undefined) {\n        ans = [];\n    } else if (ρσ_arraylike(iterable)) {\n        ans = new Array(iterable.length);\n        for (var i = 0; i < iterable.length; i++) {\n            ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i];\n        }\n    } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans = ρσ_list_decorate([]);\n        result = iterator.next();\n        while (!result.done) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n    } else if (typeof iterable === \"number\") {\n        ans = new Array(iterable);\n    } else {\n        ans = Object.keys(iterable);\n    }\n    return ρσ_list_decorate(ans);\n};\nif (!ρσ_list_constructor.__argnames__) Object.defineProperties(ρσ_list_constructor, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_list_constructor.__name__ = \"list\";\nvar list = ρσ_list_constructor, list_wrap = ρσ_list_decorate;\nfunction sorted() {\n    var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n    var key = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? sorted.__defaults__.key : arguments[1];\n    var reverse = (arguments[2] === undefined || ( 2 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? sorted.__defaults__.reverse : arguments[2];\n    var ρσ_kwargs_obj = arguments[arguments.length-1];\n    if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"key\")){\n        key = ρσ_kwargs_obj.key;\n    }\n    if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"reverse\")){\n        reverse = ρσ_kwargs_obj.reverse;\n    }\n    var ans;\n    ans = ρσ_list_constructor(iterable);\n    ans.pysort(key, reverse);\n    return ans;\n};\nif (!sorted.__defaults__) Object.defineProperties(sorted, {\n    __defaults__ : {value: {key:null, reverse:false}},\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"iterable\", \"key\", \"reverse\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar ρσ_global_object_id = 0, ρσ_set_implementation;\nfunction ρσ_set_keyfor(x) {\n    var t, ans;\n    t = typeof x;\n    if (t === \"string\" || t === \"number\" || t === \"boolean\") {\n        return \"_\" + t[0] + x;\n    }\n    if (x === null) {\n        return \"__!@#$0\";\n    }\n    ans = x.ρσ_hash_key_prop;\n    if (ans === undefined) {\n        ans = \"_!@#$\" + (++ρσ_global_object_id);\n        Object.defineProperty(x, \"ρσ_hash_key_prop\", (function(){\n            var ρσ_d = {};\n            ρσ_d[\"value\"] = ans;\n            return ρσ_d;\n        }).call(this));\n    }\n    return ans;\n};\nif (!ρσ_set_keyfor.__argnames__) Object.defineProperties(ρσ_set_keyfor, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_set_polyfill() {\n    this._store = {};\n    this.size = 0;\n};\nif (!ρσ_set_polyfill.__module__) Object.defineProperties(ρσ_set_polyfill, {\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_set_polyfill.prototype.add = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (!Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size += 1;\n            (ρσ_expr_temp = this._store)[(typeof key === \"number\" && key < 0) ? ρσ_expr_temp.length + key : key] = x;\n        }\n        return this;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.clear = (function() {\n    var ρσ_anonfunc = function (x) {\n        this._store = {};\n        this.size = 0;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.delete = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size -= 1;\n            delete this._store[key];\n            return true;\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.has = (function() {\n    var ρσ_anonfunc = function (x) {\n        return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set_polyfill.prototype.values = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nif (typeof Set !== \"function\" || typeof Set.prototype.delete !== \"function\") {\n    ρσ_set_implementation = ρσ_set_polyfill;\n} else {\n    ρσ_set_implementation = Set;\n}\nfunction ρσ_set(iterable) {\n    var ans, s, iterator, result, keys;\n    if (this instanceof ρσ_set) {\n        this.jsset = new ρσ_set_implementation;\n        ans = this;\n        if (iterable === undefined) {\n            return ans;\n        }\n        s = ans.jsset;\n        if (ρσ_arraylike(iterable)) {\n            for (var i = 0; i < iterable.length; i++) {\n                s.add(iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i]);\n            }\n        } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n            iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n            result = iterator.next();\n            while (!result.done) {\n                s.add(result.value);\n                result = iterator.next();\n            }\n        } else {\n            keys = Object.keys(iterable);\n            for (var j=0; j < keys.length; j++) {\n                s.add(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j]);\n            }\n        }\n        return ans;\n    } else {\n        return new ρσ_set(iterable);\n    }\n};\nif (!ρσ_set.__argnames__) Object.defineProperties(ρσ_set, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_set.prototype.__name__ = \"set\";\nObject.defineProperties(ρσ_set.prototype, (function(){\n    var ρσ_d = {};\n    ρσ_d[\"length\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsset.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    ρσ_d[\"size\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsset.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    return ρσ_d;\n}).call(this));\nρσ_set.prototype.__len__ = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsset.size;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.has = ρσ_set.prototype.__contains__ = (function() {\n    var ρσ_anonfunc = function (x) {\n        return this.jsset.has(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.add = (function() {\n    var ρσ_anonfunc = function (x) {\n        this.jsset.add(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.clear = (function() {\n    var ρσ_anonfunc = function () {\n        this.jsset.clear();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.copy = (function() {\n    var ρσ_anonfunc = function () {\n        return ρσ_set(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.discard = (function() {\n    var ρσ_anonfunc = function (x) {\n        this.jsset.delete(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype[ρσ_iterator_symbol] = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsset.values();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.difference = (function() {\n    var ρσ_anonfunc = function () {\n        var ans, s, iterator, r, x, has;\n        ans = new ρσ_set;\n        s = ans.jsset;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            has = false;\n            for (var i = 0; i < arguments.length; i++) {\n                if (arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    has = true;\n                    break;\n                }\n            }\n            if (!has) {\n                s.add(x);\n            }\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.difference_update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, remove, iterator, r, x;\n        s = this.jsset;\n        remove = [];\n        iterator = s.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            for (var i = 0; i < arguments.length; i++) {\n                if (arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    remove.push(x);\n                    break;\n                }\n            }\n            r = iterator.next();\n        }\n        for (var j = 0; j < remove.length; j++) {\n            s.delete(remove[(typeof j === \"number\" && j < 0) ? remove.length + j : j]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.intersection = (function() {\n    var ρσ_anonfunc = function () {\n        var ans, s, iterator, r, x, has;\n        ans = new ρσ_set;\n        s = ans.jsset;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            has = true;\n            for (var i = 0; i < arguments.length; i++) {\n                if (!arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    has = false;\n                    break;\n                }\n            }\n            if (has) {\n                s.add(x);\n            }\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.intersection_update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, remove, iterator, r, x;\n        s = this.jsset;\n        remove = [];\n        iterator = s.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            for (var i = 0; i < arguments.length; i++) {\n                if (!arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].has(x)) {\n                    remove.push(x);\n                    break;\n                }\n            }\n            r = iterator.next();\n        }\n        for (var j = 0; j < remove.length; j++) {\n            s.delete(remove[(typeof j === \"number\" && j < 0) ? remove.length + j : j]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.isdisjoint = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (other.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.issubset = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (!other.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.issuperset = (function() {\n    var ρσ_anonfunc = function (other) {\n        var s, iterator, r, x;\n        s = this.jsset;\n        iterator = other.jsset.values();\n        r = iterator.next();\n        while (!r.done) {\n            x = r.value;\n            if (!s.has(x)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.pop = (function() {\n    var ρσ_anonfunc = function () {\n        var iterator, r;\n        iterator = this.jsset.values();\n        r = iterator.next();\n        if (r.done) {\n            throw new KeyError(\"pop from an empty set\");\n        }\n        this.jsset.delete(r.value);\n        return r.value;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.remove = (function() {\n    var ρσ_anonfunc = function (x) {\n        if (!this.jsset.delete(x)) {\n            throw new KeyError(x.toString());\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.symmetric_difference = (function() {\n    var ρσ_anonfunc = function (other) {\n        return this.union(other).difference(this.intersection(other));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.symmetric_difference_update = (function() {\n    var ρσ_anonfunc = function (other) {\n        var common;\n        common = this.intersection(other);\n        this.update(other);\n        this.difference_update(common);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.union = (function() {\n    var ρσ_anonfunc = function () {\n        var ans;\n        ans = ρσ_set(this);\n        ans.update.apply(ans, arguments);\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.update = (function() {\n    var ρσ_anonfunc = function () {\n        var s, iterator, r;\n        s = this.jsset;\n        for (var i=0; i < arguments.length; i++) {\n            iterator = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i][ρσ_iterator_symbol]();\n            r = iterator.next();\n            while (!r.done) {\n                s.add(r.value);\n                r = iterator.next();\n            }\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.toString = ρσ_set.prototype.__repr__ = ρσ_set.prototype.__str__ = ρσ_set.prototype.inspect = (function() {\n    var ρσ_anonfunc = function () {\n        return \"{\" + list(this).join(\", \") + \"}\";\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_set.prototype.__eq__ = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r;\n        if (!other instanceof this.constructor) {\n            return false;\n        }\n        if (other.size !== this.size) {\n            return false;\n        }\n        if (other.size === 0) {\n            return true;\n        }\n        iterator = other[ρσ_iterator_symbol]();\n        r = iterator.next();\n        while (!r.done) {\n            if (!this.has(r.value)) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nfunction ρσ_set_wrap(x) {\n    var ans;\n    ans = new ρσ_set;\n    ans.jsset = x;\n    return ans;\n};\nif (!ρσ_set_wrap.__argnames__) Object.defineProperties(ρσ_set_wrap, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar set = ρσ_set, set_wrap = ρσ_set_wrap;\nvar ρσ_dict_implementation;\nfunction ρσ_dict_polyfill() {\n    this._store = {};\n    this.size = 0;\n};\nif (!ρσ_dict_polyfill.__module__) Object.defineProperties(ρσ_dict_polyfill, {\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_dict_polyfill.prototype.set = (function() {\n    var ρσ_anonfunc = function (x, value) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (!Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size += 1;\n        }\n        (ρσ_expr_temp = this._store)[(typeof key === \"number\" && key < 0) ? ρσ_expr_temp.length + key : key] = [x, value];\n        return this;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.clear = (function() {\n    var ρσ_anonfunc = function (x) {\n        this._store = {};\n        this.size = 0;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.delete = (function() {\n    var ρσ_anonfunc = function (x) {\n        var key;\n        key = ρσ_set_keyfor(x);\n        if (Object.prototype.hasOwnProperty.call(this._store, key)) {\n            this.size -= 1;\n            delete this._store[key];\n            return true;\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.has = (function() {\n    var ρσ_anonfunc = function (x) {\n        return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x));\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.get = (function() {\n    var ρσ_anonfunc = function (x) {\n        try {\n            return (ρσ_expr_temp = this._store)[ρσ_bound_index(ρσ_set_keyfor(x), ρσ_expr_temp)][1];\n        } catch (ρσ_Exception) {\n            ρσ_last_exception = ρσ_Exception;\n            if (ρσ_Exception instanceof TypeError) {\n                return undefined;\n            } else {\n                throw ρσ_Exception;\n            }\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.values = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]][1]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.keys = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]][0]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict_polyfill.prototype.entries = (function() {\n    var ρσ_anonfunc = function (x) {\n        var ans;\n        ans = {'_keys': Object.keys(this._store), '_i':-1, '_s':this._store};\n        ans[ρσ_iterator_symbol] = (function() {\n            var ρσ_anonfunc = function () {\n                return this;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        ans[\"next\"] = (function() {\n            var ρσ_anonfunc = function () {\n                this._i += 1;\n                if (this._i >= this._keys.length) {\n                    return {'done': true};\n                }\n                return {'done':false, 'value':this._s[this._keys[this._i]]};\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nif (typeof Map !== \"function\" || typeof Map.prototype.delete !== \"function\") {\n    ρσ_dict_implementation = ρσ_dict_polyfill;\n} else {\n    ρσ_dict_implementation = Map;\n}\nfunction ρσ_dict() {\n    var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n    var kw = arguments[arguments.length-1];\n    if (kw === null || typeof kw !== \"object\" || kw [ρσ_kwargs_symbol] !== true) kw = {};\n    if (this instanceof ρσ_dict) {\n        this.jsmap = new ρσ_dict_implementation;\n        if (iterable !== undefined) {\n            this.update(iterable);\n        }\n        this.update(kw);\n        return this;\n    } else {\n        return ρσ_interpolate_kwargs_constructor.call(Object.create(ρσ_dict.prototype), false, ρσ_dict, [iterable].concat([ρσ_desugar_kwargs(kw)]));\n    }\n};\nif (!ρσ_dict.__handles_kwarg_interpolation__) Object.defineProperties(ρσ_dict, {\n    __handles_kwarg_interpolation__ : {value: true},\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_dict.prototype.__name__ = \"dict\";\nObject.defineProperties(ρσ_dict.prototype, (function(){\n    var ρσ_d = {};\n    ρσ_d[\"length\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsmap.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    ρσ_d[\"size\"] = (function(){\n        var ρσ_d = {};\n        ρσ_d[\"get\"] = (function() {\n            var ρσ_anonfunc = function () {\n                return this.jsmap.size;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n        return ρσ_d;\n    }).call(this);\n    return ρσ_d;\n}).call(this));\nρσ_dict.prototype.__len__ = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.size;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.has = ρσ_dict.prototype.__contains__ = (function() {\n    var ρσ_anonfunc = function (x) {\n        return this.jsmap.has(x);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"x\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.set = ρσ_dict.prototype.__setitem__ = (function() {\n    var ρσ_anonfunc = function (key, value) {\n        this.jsmap.set(key, value);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__delitem__ = (function() {\n    var ρσ_anonfunc = function (key) {\n        this.jsmap.delete(key);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.clear = (function() {\n    var ρσ_anonfunc = function () {\n        this.jsmap.clear();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.copy = (function() {\n    var ρσ_anonfunc = function () {\n        return ρσ_dict(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.keys = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.keys();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.values = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.values();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.items = ρσ_dict.prototype.entries = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.entries();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype[ρσ_iterator_symbol] = (function() {\n    var ρσ_anonfunc = function () {\n        return this.jsmap.keys();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__getitem__ = (function() {\n    var ρσ_anonfunc = function (key) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            throw new KeyError(key + \"\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.get = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            return (defval === undefined) ? null : defval;\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.set_default = ρσ_dict.prototype.setdefault = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var j;\n        j = this.jsmap;\n        if (!j.has(key)) {\n            j.set(key, defval);\n            return defval;\n        }\n        return j.get(key);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.fromkeys = ρσ_dict.prototype.fromkeys = (function() {\n    var ρσ_anonfunc = function () {\n        var iterable = ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true) ? undefined : arguments[0];\n        var value = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? ρσ_anonfunc.__defaults__.value : arguments[1];\n        var ρσ_kwargs_obj = arguments[arguments.length-1];\n        if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n        if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"value\")){\n            value = ρσ_kwargs_obj.value;\n        }\n        var ans, iterator, r;\n        ans = ρσ_dict();\n        iterator = iter(iterable);\n        r = iterator.next();\n        while (!r.done) {\n            ans.set(r.value, value);\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__defaults__) Object.defineProperties(ρσ_anonfunc, {\n        __defaults__ : {value: {value:null}},\n        __handles_kwarg_interpolation__ : {value: true},\n        __argnames__ : {value: [\"iterable\", \"value\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.pop = (function() {\n    var ρσ_anonfunc = function (key, defval) {\n        var ans;\n        ans = this.jsmap.get(key);\n        if (ans === undefined && !this.jsmap.has(key)) {\n            if (defval === undefined) {\n                throw new KeyError(key);\n            }\n            return defval;\n        }\n        this.jsmap.delete(key);\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"key\", \"defval\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.popitem = (function() {\n    var ρσ_anonfunc = function () {\n        var last, e, r;\n        last = null;\n        e = this.jsmap.entries();\n        while (true) {\n            r = e.next();\n            if (r.done) {\n                if (last === null) {\n                    throw new KeyError(\"dict is empty\");\n                }\n                this.jsmap.delete(last.value[0]);\n                return last.value;\n            }\n            last = r;\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.update = (function() {\n    var ρσ_anonfunc = function () {\n        var m, iterable, iterator, result, keys;\n        if (arguments.length === 0) {\n            return;\n        }\n        m = this.jsmap;\n        iterable = arguments[0];\n        if (Array.isArray(iterable)) {\n            for (var i = 0; i < iterable.length; i++) {\n                m.set(iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i][0], iterable[(typeof i === \"number\" && i < 0) ? iterable.length + i : i][1]);\n            }\n        } else if (iterable instanceof ρσ_dict) {\n            iterator = iterable.items();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else if (typeof Map === \"function\" && iterable instanceof Map) {\n            iterator = iterable.entries();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n            iterator = iterable[ρσ_iterator_symbol]();\n            result = iterator.next();\n            while (!result.done) {\n                m.set(result.value[0], result.value[1]);\n                result = iterator.next();\n            }\n        } else {\n            keys = Object.keys(iterable);\n            for (var j=0; j < keys.length; j++) {\n                if (keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j] !== ρσ_iterator_symbol) {\n                    m.set(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], iterable[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], iterable)]);\n                }\n            }\n        }\n        if (arguments.length > 1) {\n            ρσ_dict.prototype.update.call(this, arguments[1]);\n        }\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.toString = ρσ_dict.prototype.inspect = ρσ_dict.prototype.__str__ = ρσ_dict.prototype.__repr__ = (function() {\n    var ρσ_anonfunc = function () {\n        var entries, iterator, r;\n        entries = [];\n        iterator = this.jsmap.entries();\n        r = iterator.next();\n        while (!r.done) {\n            entries.push(ρσ_repr(r.value[0]) + \": \" + ρσ_repr(r.value[1]));\n            r = iterator.next();\n        }\n        return \"{\" + entries.join(\", \") + \"}\";\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.__eq__ = (function() {\n    var ρσ_anonfunc = function (other) {\n        var iterator, r, x;\n        if (!(other instanceof this.constructor)) {\n            return false;\n        }\n        if (other.size !== this.size) {\n            return false;\n        }\n        if (other.size === 0) {\n            return true;\n        }\n        iterator = other.items();\n        r = iterator.next();\n        while (!r.done) {\n            x = this.jsmap.get(r.value[0]);\n            if (x === undefined && !this.jsmap.has(r.value[0]) || x !== r.value[1]) {\n                return false;\n            }\n            r = iterator.next();\n        }\n        return true;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_dict.prototype.as_object = (function() {\n    var ρσ_anonfunc = function (other) {\n        var ans, iterator, r;\n        ans = {};\n        iterator = this.jsmap.entries();\n        r = iterator.next();\n        while (!r.done) {\n            ans[ρσ_bound_index(r.value[0], ans)] = r.value[1];\n            r = iterator.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"other\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nfunction ρσ_dict_wrap(x) {\n    var ans;\n    ans = new ρσ_dict;\n    ans.jsmap = x;\n    return ans;\n};\nif (!ρσ_dict_wrap.__argnames__) Object.defineProperties(ρσ_dict_wrap, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nvar dict = ρσ_dict, dict_wrap = ρσ_dict_wrap;// }}}\nvar NameError;\nNameError = ReferenceError;\nfunction Exception() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    Exception.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(Exception, Error);\nException.prototype.__init__ = function __init__(message) {\n    var self = this;\n    self.message = message;\n    self.stack = (new Error).stack;\n    self.name = self.constructor.name;\n};\nif (!Exception.prototype.__init__.__argnames__) Object.defineProperties(Exception.prototype.__init__, {\n    __argnames__ : {value: [\"message\"]},\n    __module__ : {value: \"__main__\"}\n});\nException.__argnames__ = Exception.prototype.__init__.__argnames__;\nException.__handles_kwarg_interpolation__ = Exception.prototype.__init__.__handles_kwarg_interpolation__;\nException.prototype.__repr__ = function __repr__() {\n    var self = this;\n    return self.name + \": \" + self.message;\n};\nif (!Exception.prototype.__repr__.__module__) Object.defineProperties(Exception.prototype.__repr__, {\n    __module__ : {value: \"__main__\"}\n});\nException.prototype.__str__ = function __str__ () {\n    if(Error.prototype.__str__) return Error.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(Exception.prototype, \"__bases__\", {value: [Error]});\n\nfunction AttributeError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    AttributeError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(AttributeError, Exception);\nAttributeError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nAttributeError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nAttributeError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(AttributeError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction IndexError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    IndexError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(IndexError, Exception);\nIndexError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nIndexError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nIndexError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(IndexError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction KeyError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    KeyError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(KeyError, Exception);\nKeyError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nKeyError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nKeyError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(KeyError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction ValueError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    ValueError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(ValueError, Exception);\nValueError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nValueError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nValueError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(ValueError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction UnicodeDecodeError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    UnicodeDecodeError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(UnicodeDecodeError, Exception);\nUnicodeDecodeError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nUnicodeDecodeError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nUnicodeDecodeError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(UnicodeDecodeError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction AssertionError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    AssertionError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(AssertionError, Exception);\nAssertionError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nAssertionError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nAssertionError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(AssertionError.prototype, \"__bases__\", {value: [Exception]});\n\n\nfunction ZeroDivisionError() {\n    if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n    ZeroDivisionError.prototype.__init__.apply(this, arguments);\n}\nρσ_extends(ZeroDivisionError, Exception);\nZeroDivisionError.prototype.__init__ = function __init__ () {\n    Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n};\nZeroDivisionError.prototype.__repr__ = function __repr__ () {\n    if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n    return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n};\nZeroDivisionError.prototype.__str__ = function __str__ () {\n    if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n};\nObject.defineProperty(ZeroDivisionError.prototype, \"__bases__\", {value: [Exception]});\n\nvar ρσ_in, ρσ_desugar_kwargs, ρσ_exists;\nfunction ρσ_eslice(arr, step, start, end) {\n    var is_string;\n    if (typeof arr === \"string\" || arr instanceof String) {\n        is_string = true;\n        arr = arr.split(\"\");\n    }\n    if (step < 0) {\n        step = -step;\n        arr = arr.slice().reverse();\n        if (typeof start !== \"undefined\") {\n            start = arr.length - start - 1;\n        }\n        if (typeof end !== \"undefined\") {\n            end = arr.length - end - 1;\n        }\n    }\n    if (typeof start === \"undefined\") {\n        start = 0;\n    }\n    if (typeof end === \"undefined\") {\n        end = arr.length;\n    }\n    arr = arr.slice(start, end).filter((function() {\n        var ρσ_anonfunc = function (e, i) {\n            return i % step === 0;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"e\", \"i\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })());\n    if (is_string) {\n        arr = arr.join(\"\");\n    }\n    return arr;\n};\nif (!ρσ_eslice.__argnames__) Object.defineProperties(ρσ_eslice, {\n    __argnames__ : {value: [\"arr\", \"step\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_delslice(arr, step, start, end) {\n    var is_string, ρσ_unpack, indices;\n    if (typeof arr === \"string\" || arr instanceof String) {\n        is_string = true;\n        arr = arr.split(\"\");\n    }\n    if (step < 0) {\n        if (typeof start === \"undefined\") {\n            start = arr.length;\n        }\n        if (typeof end === \"undefined\") {\n            end = 0;\n        }\n        ρσ_unpack = [end, start, -step];\n        start = ρσ_unpack[0];\n        end = ρσ_unpack[1];\n        step = ρσ_unpack[2];\n    }\n    if (typeof start === \"undefined\") {\n        start = 0;\n    }\n    if (typeof end === \"undefined\") {\n        end = arr.length;\n    }\n    if (step === 1) {\n        arr.splice(start, end - start);\n    } else {\n        if (end > start) {\n            indices = [];\n            for (var i = start; i < end; i += step) {\n                indices.push(i);\n            }\n            for (var i = indices.length - 1; i >= 0; i--) {\n                arr.splice(indices[(typeof i === \"number\" && i < 0) ? indices.length + i : i], 1);\n            }\n        }\n    }\n    if (is_string) {\n        arr = arr.join(\"\");\n    }\n    return arr;\n};\nif (!ρσ_delslice.__argnames__) Object.defineProperties(ρσ_delslice, {\n    __argnames__ : {value: [\"arr\", \"step\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_flatten(arr) {\n    var ans, value;\n    ans = ρσ_list_decorate([]);\n    for (var i=0; i < arr.length; i++) {\n        value = arr[(typeof i === \"number\" && i < 0) ? arr.length + i : i];\n        if (Array.isArray(value)) {\n            ans = ans.concat(ρσ_flatten(value));\n        } else {\n            ans.push(value);\n        }\n    }\n    return ans;\n};\nif (!ρσ_flatten.__argnames__) Object.defineProperties(ρσ_flatten, {\n    __argnames__ : {value: [\"arr\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_unpack_asarray(num, iterable) {\n    var ans, iterator, result;\n    if (ρσ_arraylike(iterable)) {\n        return iterable;\n    }\n    ans = [];\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        result = iterator.next();\n        while (!result.done && ans.length < num) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n    }\n    return ans;\n};\nif (!ρσ_unpack_asarray.__argnames__) Object.defineProperties(ρσ_unpack_asarray, {\n    __argnames__ : {value: [\"num\", \"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_extends(child, parent) {\n    child.prototype = Object.create(parent.prototype);\n    child.prototype.constructor = child;\n};\nif (!ρσ_extends.__argnames__) Object.defineProperties(ρσ_extends, {\n    __argnames__ : {value: [\"child\", \"parent\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_in = (function() {\n    var ρσ_anonfunc = function () {\n        if (typeof Map === \"function\" && typeof Set === \"function\") {\n            return (function() {\n                var ρσ_anonfunc = function (val, arr) {\n                    if (typeof arr === \"string\") {\n                        return arr.indexOf(val) !== -1;\n                    }\n                    if (typeof arr.__contains__ === \"function\") {\n                        return arr.__contains__(val);\n                    }\n                    if (arr instanceof Map || arr instanceof Set) {\n                        return arr.has(val);\n                    }\n                    if (ρσ_arraylike(arr)) {\n                        return ρσ_list_contains.call(arr, val);\n                    }\n                    return Object.prototype.hasOwnProperty.call(arr, val);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"val\", \"arr\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        }\n        return (function() {\n            var ρσ_anonfunc = function (val, arr) {\n                if (typeof arr === \"string\") {\n                    return arr.indexOf(val) !== -1;\n                }\n                if (typeof arr.__contains__ === \"function\") {\n                    return arr.__contains__(val);\n                }\n                if (ρσ_arraylike(arr)) {\n                    return ρσ_list_contains.call(arr, val);\n                }\n                return Object.prototype.hasOwnProperty.call(arr, val);\n            };\n            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                __argnames__ : {value: [\"val\", \"arr\"]},\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_Iterable(iterable) {\n    var iterator, ans, result;\n    if (ρσ_arraylike(iterable)) {\n        return iterable;\n    }\n    if (typeof iterable[ρσ_iterator_symbol] === \"function\") {\n        iterator = (typeof Map === \"function\" && iterable instanceof Map) ? iterable.keys() : iterable[ρσ_iterator_symbol]();\n        ans = ρσ_list_decorate([]);\n        result = iterator.next();\n        while (!result.done) {\n            ans.push(result.value);\n            result = iterator.next();\n        }\n        return ans;\n    }\n    return Object.keys(iterable);\n};\nif (!ρσ_Iterable.__argnames__) Object.defineProperties(ρσ_Iterable, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_desugar_kwargs = (function() {\n    var ρσ_anonfunc = function () {\n        if (typeof Object.assign === \"function\") {\n            return (function() {\n                var ρσ_anonfunc = function () {\n                    var ans;\n                    ans = Object.create(null);\n                    ans[ρσ_kwargs_symbol] = true;\n                    for (var i = 0; i < arguments.length; i++) {\n                        Object.assign(ans, arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n                    }\n                    return ans;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        }\n        return (function() {\n            var ρσ_anonfunc = function () {\n                var ans, keys;\n                ans = Object.create(null);\n                ans[ρσ_kwargs_symbol] = true;\n                for (var i = 0; i < arguments.length; i++) {\n                    keys = Object.keys(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n                    for (var j = 0; j < keys.length; j++) {\n                        ans[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], ans)] = (ρσ_expr_temp = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i])[ρσ_bound_index(keys[(typeof j === \"number\" && j < 0) ? keys.length + j : j], ρσ_expr_temp)];\n                    }\n                }\n                return ans;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})()();\nfunction ρσ_interpolate_kwargs(f, supplied_args) {\n    var has_prop, kwobj, args, prop;\n    if (!f.__argnames__) {\n        return f.apply(this, supplied_args);\n    }\n    has_prop = Object.prototype.hasOwnProperty;\n    kwobj = supplied_args.pop();\n    if (f.__handles_kwarg_interpolation__) {\n        args = new Array(Math.max(supplied_args.length, f.__argnames__.length) + 1);\n        args[args.length-1] = kwobj;\n        for (var i = 0; i < args.length - 1; i++) {\n            if (i < f.__argnames__.length) {\n                prop = (ρσ_expr_temp = f.__argnames__)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n                if (has_prop.call(kwobj, prop)) {\n                    args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = kwobj[(typeof prop === \"number\" && prop < 0) ? kwobj.length + prop : prop];\n                    delete kwobj[prop];\n                } else if (i < supplied_args.length) {\n                    args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i];\n                }\n            } else {\n                args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i];\n            }\n        }\n        return f.apply(this, args);\n    }\n    for (var i = 0; i < f.__argnames__.length; i++) {\n        prop = (ρσ_expr_temp = f.__argnames__)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n        if (has_prop.call(kwobj, prop)) {\n            supplied_args[(typeof i === \"number\" && i < 0) ? supplied_args.length + i : i] = kwobj[(typeof prop === \"number\" && prop < 0) ? kwobj.length + prop : prop];\n        }\n    }\n    return f.apply(this, supplied_args);\n};\nif (!ρσ_interpolate_kwargs.__argnames__) Object.defineProperties(ρσ_interpolate_kwargs, {\n    __argnames__ : {value: [\"f\", \"supplied_args\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_interpolate_kwargs_constructor(apply, f, supplied_args) {\n    if (apply) {\n        f.apply(this, supplied_args);\n    } else {\n        ρσ_interpolate_kwargs.call(this, f, supplied_args);\n    }\n    return this;\n};\nif (!ρσ_interpolate_kwargs_constructor.__argnames__) Object.defineProperties(ρσ_interpolate_kwargs_constructor, {\n    __argnames__ : {value: [\"apply\", \"f\", \"supplied_args\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_getitem(obj, key) {\n    if (obj.__getitem__) {\n        return obj.__getitem__(key);\n    }\n    if (typeof key === \"number\" && key < 0) {\n        key += obj.length;\n    }\n    return obj[(typeof key === \"number\" && key < 0) ? obj.length + key : key];\n};\nif (!ρσ_getitem.__argnames__) Object.defineProperties(ρσ_getitem, {\n    __argnames__ : {value: [\"obj\", \"key\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_setitem(obj, key, val) {\n    if (obj.__setitem__) {\n        obj.__setitem__(key, val);\n    } else {\n        if (typeof key === \"number\" && key < 0) {\n            key += obj.length;\n        }\n        obj[(typeof key === \"number\" && key < 0) ? obj.length + key : key] = val;\n    }\n    return val;\n};\nif (!ρσ_setitem.__argnames__) Object.defineProperties(ρσ_setitem, {\n    __argnames__ : {value: [\"obj\", \"key\", \"val\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_delitem(obj, key) {\n    if (obj.__delitem__) {\n        obj.__delitem__(key);\n    } else if (typeof obj.splice === \"function\") {\n        obj.splice(key, 1);\n    } else {\n        if (typeof key === \"number\" && key < 0) {\n            key += obj.length;\n        }\n        delete obj[key];\n    }\n};\nif (!ρσ_delitem.__argnames__) Object.defineProperties(ρσ_delitem, {\n    __argnames__ : {value: [\"obj\", \"key\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_bound_index(idx, arr) {\n    if (typeof idx === \"number\" && idx < 0) {\n        idx += arr.length;\n    }\n    return idx;\n};\nif (!ρσ_bound_index.__argnames__) Object.defineProperties(ρσ_bound_index, {\n    __argnames__ : {value: [\"idx\", \"arr\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_splice(arr, val, start, end) {\n    start = start || 0;\n    if (start < 0) {\n        start += arr.length;\n    }\n    if (end === undefined) {\n        end = arr.length;\n    }\n    if (end < 0) {\n        end += arr.length;\n    }\n    Array.prototype.splice.apply(arr, [start, end - start].concat(val));\n};\nif (!ρσ_splice.__argnames__) Object.defineProperties(ρσ_splice, {\n    __argnames__ : {value: [\"arr\", \"val\", \"start\", \"end\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nρσ_exists = (function(){\n    var ρσ_d = {};\n    ρσ_d[\"n\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            return expr !== undefined && expr !== null;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"d\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (expr === undefined || expr === null) {\n                return Object.create(null);\n            }\n            return expr;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"c\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (typeof expr === \"function\") {\n                return expr;\n            }\n            return (function() {\n                var ρσ_anonfunc = function () {\n                    return undefined;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"g\"] = (function() {\n        var ρσ_anonfunc = function (expr) {\n            if (expr === undefined || expr === null || typeof expr.__getitem__ !== \"function\") {\n                return (function(){\n                    var ρσ_d = {};\n                    ρσ_d[\"__getitem__\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            return undefined;\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"__main__\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    return ρσ_d;\n                }).call(this);\n            }\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ρσ_d[\"e\"] = (function() {\n        var ρσ_anonfunc = function (expr, alt) {\n            return (expr === undefined || expr === null) ? alt : expr;\n        };\n        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n            __argnames__ : {value: [\"expr\", \"alt\"]},\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ρσ_d;\n}).call(this);\nfunction ρσ_mixin() {\n    var seen, resolved_props, p, target, props, name;\n    seen = Object.create(null);\n    seen.__argnames__ = seen.__handles_kwarg_interpolation__ = seen.__init__ = seen.__annotations__ = seen.__doc__ = seen.__bind_methods__ = seen.__bases__ = seen.constructor = seen.__class__ = true;\n    resolved_props = {};\n    p = target = arguments[0].prototype;\n    while (p && p !== Object.prototype) {\n        props = Object.getOwnPropertyNames(p);\n        for (var i = 0; i < props.length; i++) {\n            seen[ρσ_bound_index(props[(typeof i === \"number\" && i < 0) ? props.length + i : i], seen)] = true;\n        }\n        p = Object.getPrototypeOf(p);\n    }\n    for (var c = 1; c < arguments.length; c++) {\n        p = arguments[(typeof c === \"number\" && c < 0) ? arguments.length + c : c].prototype;\n        while (p && p !== Object.prototype) {\n            props = Object.getOwnPropertyNames(p);\n            for (var i = 0; i < props.length; i++) {\n                name = props[(typeof i === \"number\" && i < 0) ? props.length + i : i];\n                if (seen[(typeof name === \"number\" && name < 0) ? seen.length + name : name]) {\n                    continue;\n                }\n                seen[(typeof name === \"number\" && name < 0) ? seen.length + name : name] = true;\n                resolved_props[(typeof name === \"number\" && name < 0) ? resolved_props.length + name : name] = Object.getOwnPropertyDescriptor(p, name);\n            }\n            p = Object.getPrototypeOf(p);\n        }\n    }\n    Object.defineProperties(target, resolved_props);\n};\nif (!ρσ_mixin.__module__) Object.defineProperties(ρσ_mixin, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_instanceof() {\n    var obj, bases, q, cls, p;\n    obj = arguments[0];\n    bases = \"\";\n    if (obj && obj.constructor && obj.constructor.prototype) {\n        bases = obj.constructor.prototype.__bases__ || \"\";\n    }\n    for (var i = 1; i < arguments.length; i++) {\n        q = arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i];\n        if (obj instanceof q) {\n            return true;\n        }\n        if ((q === Array || q === ρσ_list_constructor) && Array.isArray(obj)) {\n            return true;\n        }\n        if (q === ρσ_str && (typeof obj === \"string\" || obj instanceof String)) {\n            return true;\n        }\n        if (q === ρσ_int && typeof obj === \"number\" && Number.isInteger(obj)) {\n            return true;\n        }\n        if (q === ρσ_float && typeof obj === \"number\" && !Number.isInteger(obj)) {\n            return true;\n        }\n        if (bases.length > 1) {\n            for (var c = 1; c < bases.length; c++) {\n                cls = bases[(typeof c === \"number\" && c < 0) ? bases.length + c : c];\n                while (cls) {\n                    if (q === cls) {\n                        return true;\n                    }\n                    p = Object.getPrototypeOf(cls.prototype);\n                    if (!p) {\n                        break;\n                    }\n                    cls = p.constructor;\n                }\n            }\n        }\n    }\n    return false;\n};\nif (!ρσ_instanceof.__module__) Object.defineProperties(ρσ_instanceof, {\n    __module__ : {value: \"__main__\"}\n});\nfunction sum(iterable, start) {\n    var ans, iterator, r;\n    if (Array.isArray(iterable)) {\n        return iterable.reduce((function() {\n            var ρσ_anonfunc = function (prev, cur) {\n                return prev + cur;\n            };\n            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                __argnames__ : {value: [\"prev\", \"cur\"]},\n                __module__ : {value: \"__main__\"}\n            });\n            return ρσ_anonfunc;\n        })(), start || 0);\n    }\n    ans = start || 0;\n    iterator = iter(iterable);\n    r = iterator.next();\n    while (!r.done) {\n        ans += r.value;\n        r = iterator.next();\n    }\n    return ans;\n};\nif (!sum.__argnames__) Object.defineProperties(sum, {\n    __argnames__ : {value: [\"iterable\", \"start\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction map() {\n    var iterators, func, args, ans;\n    iterators = new Array(arguments.length - 1);\n    func = arguments[0];\n    args = new Array(arguments.length - 1);\n    for (var i = 1; i < arguments.length; i++) {\n        iterators[ρσ_bound_index(i - 1, iterators)] = iter(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n    }\n    ans = {'_func':func, '_iterators':iterators, '_args':args};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var r;\n            for (var i = 0; i < this._iterators.length; i++) {\n                r = (ρσ_expr_temp = this._iterators)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                (ρσ_expr_temp = this._args)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i] = r.value;\n            }\n            return {'done':false, 'value':this._func.apply(undefined, this._args)};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!map.__module__) Object.defineProperties(map, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction filter(func_or_none, iterable) {\n    var func, ans;\n    func = (func_or_none === null) ? ρσ_bool : func_or_none;\n    ans = {'_func':func, '_iterator':ρσ_iter(iterable)};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var r;\n            r = this._iterator.next();\n            while (!r.done) {\n                if (this._func(r.value)) {\n                    return r;\n                }\n                r = this._iterator.next();\n            }\n            return {'done':true};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!filter.__argnames__) Object.defineProperties(filter, {\n    __argnames__ : {value: [\"func_or_none\", \"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction zip() {\n    var iterators, ans;\n    iterators = new Array(arguments.length);\n    for (var i = 0; i < arguments.length; i++) {\n        iterators[(typeof i === \"number\" && i < 0) ? iterators.length + i : i] = iter(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n    }\n    ans = {'_iterators':iterators};\n    ans[ρσ_iterator_symbol] = (function() {\n        var ρσ_anonfunc = function () {\n            return this;\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    ans[\"next\"] = (function() {\n        var ρσ_anonfunc = function () {\n            var args, r;\n            args = new Array(this._iterators.length);\n            for (var i = 0; i < this._iterators.length; i++) {\n                r = (ρσ_expr_temp = this._iterators)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].next();\n                if (r.done) {\n                    return {'done':true};\n                }\n                args[(typeof i === \"number\" && i < 0) ? args.length + i : i] = r.value;\n            }\n            return {'done':false, 'value':args};\n        };\n        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n            __module__ : {value: \"__main__\"}\n        });\n        return ρσ_anonfunc;\n    })();\n    return ans;\n};\nif (!zip.__module__) Object.defineProperties(zip, {\n    __module__ : {value: \"__main__\"}\n});\n\nfunction any(iterable) {\n    var i;\n    var ρσ_Iter0 = ρσ_Iterable(iterable);\n    for (var ρσ_Index0 = 0; ρσ_Index0 < ρσ_Iter0.length; ρσ_Index0++) {\n        i = ρσ_Iter0[ρσ_Index0];\n        if (i) {\n            return true;\n        }\n    }\n    return false;\n};\nif (!any.__argnames__) Object.defineProperties(any, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction all(iterable) {\n    var i;\n    var ρσ_Iter1 = ρσ_Iterable(iterable);\n    for (var ρσ_Index1 = 0; ρσ_Index1 < ρσ_Iter1.length; ρσ_Index1++) {\n        i = ρσ_Iter1[ρσ_Index1];\n        if (!i) {\n            return false;\n        }\n    }\n    return true;\n};\nif (!all.__argnames__) Object.defineProperties(all, {\n    __argnames__ : {value: [\"iterable\"]},\n    __module__ : {value: \"__main__\"}\n});\nvar decimal_sep, define_str_func, ρσ_unpack, ρσ_orig_split, ρσ_orig_replace;\ndecimal_sep = 1.1.toLocaleString()[1];\nfunction ρσ_repr_js_builtin(x, as_array) {\n    var ans, b, keys, key;\n    ans = [];\n    b = \"{}\";\n    if (as_array) {\n        b = \"[]\";\n        for (var i = 0; i < x.length; i++) {\n            ans.push(ρσ_repr(x[(typeof i === \"number\" && i < 0) ? x.length + i : i]));\n        }\n    } else {\n        keys = Object.keys(x);\n        for (var k = 0; k < keys.length; k++) {\n            key = keys[(typeof k === \"number\" && k < 0) ? keys.length + k : k];\n            ans.push(JSON.stringify(key) + \":\" + ρσ_repr(x[(typeof key === \"number\" && key < 0) ? x.length + key : key]));\n        }\n    }\n    return b[0] + ans.join(\", \") + b[1];\n};\nif (!ρσ_repr_js_builtin.__argnames__) Object.defineProperties(ρσ_repr_js_builtin, {\n    __argnames__ : {value: [\"x\", \"as_array\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_html_element_to_string(elem) {\n    var attrs, val, attr, ans;\n    attrs = [];\n    var ρσ_Iter0 = ρσ_Iterable(elem.attributes);\n    for (var ρσ_Index0 = 0; ρσ_Index0 < ρσ_Iter0.length; ρσ_Index0++) {\n        attr = ρσ_Iter0[ρσ_Index0];\n        if (attr.specified) {\n            val = attr.value;\n            if (val.length > 10) {\n                val = val.slice(0, 15) + \"...\";\n            }\n            val = JSON.stringify(val);\n            attrs.push(\"\" + ρσ_str.format(\"{}\", attr.name) + \"=\" + ρσ_str.format(\"{}\", val) + \"\");\n        }\n    }\n    attrs = (attrs.length) ? \" \" + attrs.join(\" \") : \"\";\n    ans = \"<\" + ρσ_str.format(\"{}\", elem.tagName) + \"\" + ρσ_str.format(\"{}\", attrs) + \">\";\n    return ans;\n};\nif (!ρσ_html_element_to_string.__argnames__) Object.defineProperties(ρσ_html_element_to_string, {\n    __argnames__ : {value: [\"elem\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_repr(x) {\n    var ans, name;\n    if (x === null) {\n        return \"None\";\n    }\n    if (x === undefined) {\n        return \"undefined\";\n    }\n    ans = x;\n    if (typeof x.__repr__ === \"function\") {\n        ans = x.__repr__();\n    } else if (x === true || x === false) {\n        ans = (x) ? \"True\" : \"False\";\n    } else if (Array.isArray(x)) {\n        ans = ρσ_repr_js_builtin(x, true);\n    } else if (typeof x === \"function\") {\n        ans = x.toString();\n    } else if (typeof x === \"object\" && !x.toString) {\n        ans = ρσ_repr_js_builtin(x);\n    } else {\n        name = Object.prototype.toString.call(x).slice(8, -1);\n        if (ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name), -1)) {\n            return name + \"([\" + x.map((function() {\n                var ρσ_anonfunc = function (i) {\n                    return str.format(\"0x{:02x}\", i);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"i\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })()).join(\", \") + \"])\";\n        }\n        if (typeof HTMLElement !== \"undefined\" && x instanceof HTMLElement) {\n            ans = ρσ_html_element_to_string(x);\n        } else {\n            ans = (typeof x.toString === \"function\") ? x.toString() : x;\n        }\n        if (ans === \"[object Object]\") {\n            return ρσ_repr_js_builtin(x);\n        }\n        try {\n            ans = JSON.stringify(x);\n        } catch (ρσ_Exception) {\n            ρσ_last_exception = ρσ_Exception;\n            {\n            } \n        }\n    }\n    return ans + \"\";\n};\nif (!ρσ_repr.__argnames__) Object.defineProperties(ρσ_repr, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\nfunction ρσ_str(x) {\n    var ans, name;\n    if (x === null) {\n        return \"None\";\n    }\n    if (x === undefined) {\n        return \"undefined\";\n    }\n    ans = x;\n    if (typeof x.__str__ === \"function\") {\n        ans = x.__str__();\n    } else if (typeof x.__repr__ === \"function\") {\n        ans = x.__repr__();\n    } else if (x === true || x === false) {\n        ans = (x) ? \"True\" : \"False\";\n    } else if (Array.isArray(x)) {\n        ans = ρσ_repr_js_builtin(x, true);\n    } else if (typeof x.toString === \"function\") {\n        name = Object.prototype.toString.call(x).slice(8, -1);\n        if (ρσ_not_equals(\"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name), -1)) {\n            return name + \"([\" + x.map((function() {\n                var ρσ_anonfunc = function (i) {\n                    return str.format(\"0x{:02x}\", i);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"i\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })()).join(\", \") + \"])\";\n        }\n        if (typeof HTMLElement !== \"undefined\" && x instanceof HTMLElement) {\n            ans = ρσ_html_element_to_string(x);\n        } else {\n            ans = x.toString();\n        }\n        if (ans === \"[object Object]\") {\n            ans = ρσ_repr_js_builtin(x);\n        }\n    } else if (typeof x === \"object\" && !x.toString) {\n        ans = ρσ_repr_js_builtin(x);\n    }\n    return ans + \"\";\n};\nif (!ρσ_str.__argnames__) Object.defineProperties(ρσ_str, {\n    __argnames__ : {value: [\"x\"]},\n    __module__ : {value: \"__main__\"}\n});\n\ndefine_str_func = (function() {\n    var ρσ_anonfunc = function (name, func) {\n        var f;\n        (ρσ_expr_temp = ρσ_str.prototype)[(typeof name === \"number\" && name < 0) ? ρσ_expr_temp.length + name : name] = func;\n        ρσ_str[(typeof name === \"number\" && name < 0) ? ρσ_str.length + name : name] = f = func.call.bind(func);\n        if (func.__argnames__) {\n            Object.defineProperty(f, \"__argnames__\", (function(){\n                var ρσ_d = {};\n                ρσ_d[\"value\"] = ['string'].concat(func.__argnames__);\n                return ρσ_d;\n            }).call(this));\n        }\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"name\", \"func\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_unpack = [String.prototype.split.call.bind(String.prototype.split), String.prototype.replace.call.bind(String.prototype.replace)];\nρσ_orig_split = ρσ_unpack[0];\nρσ_orig_replace = ρσ_unpack[1];\ndefine_str_func(\"format\", (function() {\n    var ρσ_anonfunc = function () {\n        var template, args, kwargs, explicit, implicit, idx, split, ans, pos, in_brace, markup, ch;\n        template = this;\n        if (template === undefined) {\n            throw new TypeError(\"Template is required\");\n        }\n        args = Array.prototype.slice.call(arguments);\n        kwargs = {};\n        if (args[args.length-1] && args[args.length-1][ρσ_kwargs_symbol] !== undefined) {\n            kwargs = args[args.length-1];\n            args = args.slice(0, -1);\n        }\n        explicit = implicit = false;\n        idx = 0;\n        split = ρσ_orig_split;\n        if (ρσ_str.format._template_resolve_pat === undefined) {\n            ρσ_str.format._template_resolve_pat = /[.\\[]/;\n        }\n        function resolve(arg, object) {\n            var ρσ_unpack, first, key, rest, ans;\n            if (!arg) {\n                return object;\n            }\n            ρσ_unpack = [arg[0], arg.slice(1)];\n            first = ρσ_unpack[0];\n            arg = ρσ_unpack[1];\n            key = split(arg, ρσ_str.format._template_resolve_pat, 1)[0];\n            rest = arg.slice(key.length);\n            ans = (first === \"[\") ? object[ρσ_bound_index(key.slice(0, -1), object)] : getattr(object, key);\n            if (ans === undefined) {\n                throw new KeyError((first === \"[\") ? key.slice(0, -1) : key);\n            }\n            return resolve(rest, ans);\n        };\n        if (!resolve.__argnames__) Object.defineProperties(resolve, {\n            __argnames__ : {value: [\"arg\", \"object\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function resolve_format_spec(format_spec) {\n            if (ρσ_str.format._template_resolve_fs_pat === undefined) {\n                ρσ_str.format._template_resolve_fs_pat = /[{]([a-zA-Z0-9_]+)[}]/g;\n            }\n            return format_spec.replace(ρσ_str.format._template_resolve_fs_pat, (function() {\n                var ρσ_anonfunc = function (match, key) {\n                    if (!Object.prototype.hasOwnProperty.call(kwargs, key)) {\n                        return \"\";\n                    }\n                    return \"\" + kwargs[(typeof key === \"number\" && key < 0) ? kwargs.length + key : key];\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"match\", \"key\"]},\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!resolve_format_spec.__argnames__) Object.defineProperties(resolve_format_spec, {\n            __argnames__ : {value: [\"format_spec\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function set_comma(ans, comma) {\n            var sep;\n            if (comma !== \",\") {\n                sep = 1234;\n                sep = sep.toLocaleString(undefined, {useGrouping: true})[1];\n                ans = str.replace(ans, sep, comma);\n            }\n            return ans;\n        };\n        if (!set_comma.__argnames__) Object.defineProperties(set_comma, {\n            __argnames__ : {value: [\"ans\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function safe_comma(value, comma) {\n            try {\n                return set_comma(value.toLocaleString(undefined, {useGrouping: true}), comma);\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                {\n                    return value.toString(10);\n                } \n            }\n        };\n        if (!safe_comma.__argnames__) Object.defineProperties(safe_comma, {\n            __argnames__ : {value: [\"value\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function safe_fixed(value, precision, comma) {\n            if (!comma) {\n                return value.toFixed(precision);\n            }\n            try {\n                return set_comma(value.toLocaleString(undefined, {useGrouping: true, minimumFractionDigits: precision, maximumFractionDigits: precision}), comma);\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                {\n                    return value.toFixed(precision);\n                } \n            }\n        };\n        if (!safe_fixed.__argnames__) Object.defineProperties(safe_fixed, {\n            __argnames__ : {value: [\"value\", \"precision\", \"comma\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function apply_formatting(value, format_spec) {\n            var ρσ_unpack, fill, align, sign, fhash, zeropad, width, comma, precision, ftype, is_numeric, is_int, lftype, code, prec, exp, nval, is_positive, left, right;\n            if (format_spec.indexOf(\"{\") !== -1) {\n                format_spec = resolve_format_spec(format_spec);\n            }\n            if (ρσ_str.format._template_format_pat === undefined) {\n                ρσ_str.format._template_format_pat = /([^{}](?=[<>=^]))?([<>=^])?([-+\\x20])?(\\#)?(0)?(\\d+)?([,_])?(?:\\.(\\d+))?([bcdeEfFgGnosxX%])?/;\n            }\n            try {\n                ρσ_unpack = format_spec.match(ρσ_str.format._template_format_pat).slice(1);\nρσ_unpack = ρσ_unpack_asarray(9, ρσ_unpack);\n                fill = ρσ_unpack[0];\n                align = ρσ_unpack[1];\n                sign = ρσ_unpack[2];\n                fhash = ρσ_unpack[3];\n                zeropad = ρσ_unpack[4];\n                width = ρσ_unpack[5];\n                comma = ρσ_unpack[6];\n                precision = ρσ_unpack[7];\n                ftype = ρσ_unpack[8];\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                if (ρσ_Exception instanceof TypeError) {\n                    return value;\n                } else {\n                    throw ρσ_Exception;\n                }\n            }\n            if (zeropad) {\n                fill = fill || \"0\";\n                align = align || \"=\";\n            } else {\n                fill = fill || \" \";\n                align = align || \">\";\n            }\n            is_numeric = Number(value) === value;\n            is_int = is_numeric && value % 1 === 0;\n            precision = parseInt(precision, 10);\n            lftype = (ftype || \"\").toLowerCase();\n            if (ftype === \"n\") {\n                is_numeric = true;\n                if (is_int) {\n                    if (comma) {\n                        throw new ValueError(\"Cannot specify ',' with 'n'\");\n                    }\n                    value = parseInt(value, 10).toLocaleString();\n                } else {\n                    value = parseFloat(value).toLocaleString();\n                }\n            } else if (['b', 'c', 'd', 'o', 'x'].indexOf(lftype) !== -1) {\n                value = parseInt(value, 10);\n                is_numeric = true;\n                if (!isNaN(value)) {\n                    if (ftype === \"b\") {\n                        value = (value >>> 0).toString(2);\n                        if (fhash) {\n                            value = \"0b\" + value;\n                        }\n                    } else if (ftype === \"c\") {\n                        if (value > 65535) {\n                            code = value - 65536;\n                            value = String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n                        } else {\n                            value = String.fromCharCode(value);\n                        }\n                    } else if (ftype === \"d\") {\n                        if (comma) {\n                            value = safe_comma(value, comma);\n                        } else {\n                            value = value.toString(10);\n                        }\n                    } else if (ftype === \"o\") {\n                        value = value.toString(8);\n                        if (fhash) {\n                            value = \"0o\" + value;\n                        }\n                    } else if (lftype === \"x\") {\n                        value = value.toString(16);\n                        value = (ftype === \"x\") ? value.toLowerCase() : value.toUpperCase();\n                        if (fhash) {\n                            value = \"0x\" + value;\n                        }\n                    }\n                }\n            } else if (['e','f','g','%'].indexOf(lftype) !== -1) {\n                is_numeric = true;\n                value = parseFloat(value);\n                prec = (isNaN(precision)) ? 6 : precision;\n                if (lftype === \"e\") {\n                    value = value.toExponential(prec);\n                    value = (ftype === \"E\") ? value.toUpperCase() : value.toLowerCase();\n                } else if (lftype === \"f\") {\n                    value = safe_fixed(value, prec, comma);\n                    value = (ftype === \"F\") ? value.toUpperCase() : value.toLowerCase();\n                } else if (lftype === \"%\") {\n                    value *= 100;\n                    value = safe_fixed(value, prec, comma) + \"%\";\n                } else if (lftype === \"g\") {\n                    prec = max(1, prec);\n                    exp = parseInt(split(value.toExponential(prec - 1).toLowerCase(), \"e\")[1], 10);\n                    if (-4 <= exp && exp < prec) {\n                        value = safe_fixed(value, prec - 1 - exp, comma);\n                    } else {\n                        value = value.toExponential(prec - 1);\n                    }\n                    value = value.replace(/0+$/g, \"\");\n                    if (value[value.length-1] === decimal_sep) {\n                        value = value.slice(0, -1);\n                    }\n                    if (ftype === \"G\") {\n                        value = value.toUpperCase();\n                    }\n                }\n            } else {\n                if (comma) {\n                    value = parseInt(value, 10);\n                    if (isNaN(value)) {\n                        throw new ValueError(\"Must use numbers with , or _\");\n                    }\n                    value = safe_comma(value, comma);\n                }\n                value += \"\";\n                if (!isNaN(precision)) {\n                    value = value.slice(0, precision);\n                }\n            }\n            value += \"\";\n            if (is_numeric && sign) {\n                nval = Number(value);\n                is_positive = !isNaN(nval) && nval >= 0;\n                if (is_positive && (sign === \" \" || sign === \"+\")) {\n                    value = sign + value;\n                }\n            }\n            function repeat(char, num) {\n                return (new Array(num+1)).join(char);\n            };\n            if (!repeat.__argnames__) Object.defineProperties(repeat, {\n                __argnames__ : {value: [\"char\", \"num\"]},\n                __module__ : {value: \"__main__\"}\n            });\n\n            if (is_numeric && width && width[0] === \"0\") {\n                width = width.slice(1);\n                ρσ_unpack = [\"0\", \"=\"];\n                fill = ρσ_unpack[0];\n                align = ρσ_unpack[1];\n            }\n            width = parseInt(width || \"-1\", 10);\n            if (isNaN(width)) {\n                throw new ValueError(\"Invalid width specification: \" + width);\n            }\n            if (fill && value.length < width) {\n                if (align === \"<\") {\n                    value = value + repeat(fill, width - value.length);\n                } else if (align === \">\") {\n                    value = repeat(fill, width - value.length) + value;\n                } else if (align === \"^\") {\n                    left = Math.floor((width - value.length) / 2);\n                    right = width - left - value.length;\n                    value = repeat(fill, left) + value + repeat(fill, right);\n                } else if (align === \"=\") {\n                    if (ρσ_in(value[0], \"+- \")) {\n                        value = value[0] + repeat(fill, width - value.length) + value.slice(1);\n                    } else {\n                        value = repeat(fill, width - value.length) + value;\n                    }\n                } else {\n                    throw new ValueError(\"Unrecognized alignment: \" + align);\n                }\n            }\n            return value;\n        };\n        if (!apply_formatting.__argnames__) Object.defineProperties(apply_formatting, {\n            __argnames__ : {value: [\"value\", \"format_spec\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function parse_markup(markup) {\n            var key, transformer, format_spec, pos, state, ch;\n            key = transformer = format_spec = \"\";\n            pos = 0;\n            state = 0;\n            while (pos < markup.length) {\n                ch = markup[(typeof pos === \"number\" && pos < 0) ? markup.length + pos : pos];\n                if (state === 0) {\n                    if (ch === \"!\") {\n                        state = 1;\n                    } else if (ch === \":\") {\n                        state = 2;\n                    } else {\n                        key += ch;\n                    }\n                } else if (state === 1) {\n                    if (ch === \":\") {\n                        state = 2;\n                    } else {\n                        transformer += ch;\n                    }\n                } else {\n                    format_spec += ch;\n                }\n                pos += 1;\n            }\n            return [key, transformer, format_spec];\n        };\n        if (!parse_markup.__argnames__) Object.defineProperties(parse_markup, {\n            __argnames__ : {value: [\"markup\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        function render_markup(markup) {\n            var ρσ_unpack, key, transformer, format_spec, ends_with_equal, lkey, nvalue, object, ans;\n            ρσ_unpack = parse_markup(markup);\nρσ_unpack = ρσ_unpack_asarray(3, ρσ_unpack);\n            key = ρσ_unpack[0];\n            transformer = ρσ_unpack[1];\n            format_spec = ρσ_unpack[2];\n            if (transformer && ['a', 'r', 's'].indexOf(transformer) === -1) {\n                throw new ValueError(\"Unknown conversion specifier: \" + transformer);\n            }\n            ends_with_equal = key.endsWith(\"=\");\n            if (ends_with_equal) {\n                key = key.slice(0, -1);\n            }\n            lkey = key.length && split(key, /[.\\[]/, 1)[0];\n            if (lkey) {\n                explicit = true;\n                if (implicit) {\n                    throw new ValueError(\"cannot switch from automatic field numbering to manual field specification\");\n                }\n                nvalue = parseInt(lkey);\n                object = (isNaN(nvalue)) ? kwargs[(typeof lkey === \"number\" && lkey < 0) ? kwargs.length + lkey : lkey] : args[(typeof nvalue === \"number\" && nvalue < 0) ? args.length + nvalue : nvalue];\n                if (object === undefined) {\n                    if (isNaN(nvalue)) {\n                        throw new KeyError(lkey);\n                    }\n                    throw new IndexError(lkey);\n                }\n                object = resolve(key.slice(lkey.length), object);\n            } else {\n                implicit = true;\n                if (explicit) {\n                    throw new ValueError(\"cannot switch from manual field specification to automatic field numbering\");\n                }\n                if (idx >= args.length) {\n                    throw new IndexError(\"Not enough arguments to match template: \" + template);\n                }\n                object = args[(typeof idx === \"number\" && idx < 0) ? args.length + idx : idx];\n                idx += 1;\n            }\n            if (typeof object === \"function\") {\n                object = object();\n            }\n            ans = \"\" + object;\n            if (format_spec) {\n                ans = apply_formatting(ans, format_spec);\n            }\n            if (ends_with_equal) {\n                ans = \"\" + ρσ_str.format(\"{}\", key) + \"=\" + ρσ_str.format(\"{}\", ans) + \"\";\n            }\n            return ans;\n        };\n        if (!render_markup.__argnames__) Object.defineProperties(render_markup, {\n            __argnames__ : {value: [\"markup\"]},\n            __module__ : {value: \"__main__\"}\n        });\n\n        ans = \"\";\n        pos = 0;\n        in_brace = 0;\n        markup = \"\";\n        while (pos < template.length) {\n            ch = template[(typeof pos === \"number\" && pos < 0) ? template.length + pos : pos];\n            if (in_brace) {\n                if (ch === \"{\") {\n                    in_brace += 1;\n                    markup += \"{\";\n                } else if (ch === \"}\") {\n                    in_brace -= 1;\n                    if (in_brace > 0) {\n                        markup += \"}\";\n                    } else {\n                        ans += render_markup(markup);\n                    }\n                } else {\n                    markup += ch;\n                }\n            } else {\n                if (ch === \"{\") {\n                    if (template[ρσ_bound_index(pos + 1, template)] === \"{\") {\n                        pos += 1;\n                        ans += \"{\";\n                    } else {\n                        in_brace = 1;\n                        markup = \"\";\n                    }\n                } else {\n                    ans += ch;\n                    if (ch === \"}\" && template[ρσ_bound_index(pos + 1, template)] === \"}\") {\n                        pos += 1;\n                    }\n                }\n            }\n            pos += 1;\n        }\n        if (in_brace) {\n            throw new ValueError(\"expected '}' before end of string\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"capitalize\", (function() {\n    var ρσ_anonfunc = function () {\n        var string;\n        string = this;\n        if (string) {\n            string = string[0].toUpperCase() + string.slice(1).toLowerCase();\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"center\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var left, right;\n        left = Math.floor((width - this.length) / 2);\n        right = width - left - this.length;\n        fill = fill || \" \";\n        return new Array(left+1).join(fill) + this + new Array(right+1).join(fill);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"count\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var string, ρσ_unpack, pos, step, ans;\n        string = this;\n        start = start || 0;\n        end = end || string.length;\n        if (start < 0 || end < 0) {\n            string = string.slice(start, end);\n            ρσ_unpack = [0, string.length];\n            start = ρσ_unpack[0];\n            end = ρσ_unpack[1];\n        }\n        pos = start;\n        step = needle.length;\n        if (!step) {\n            return 0;\n        }\n        ans = 0;\n        while (pos !== -1) {\n            pos = string.indexOf(needle, pos);\n            if (pos !== -1) {\n                ans += 1;\n                pos += step;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"endswith\", (function() {\n    var ρσ_anonfunc = function (suffixes, start, end) {\n        var string, q;\n        string = this;\n        start = start || 0;\n        if (typeof suffixes === \"string\") {\n            suffixes = [suffixes];\n        }\n        if (end !== undefined) {\n            string = string.slice(0, end);\n        }\n        for (var i = 0; i < suffixes.length; i++) {\n            q = suffixes[(typeof i === \"number\" && i < 0) ? suffixes.length + i : i];\n            if (string.indexOf(q, Math.max(start, string.length - q.length)) !== -1) {\n                return true;\n            }\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"suffixes\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"startswith\", (function() {\n    var ρσ_anonfunc = function (prefixes, start, end) {\n        var prefix;\n        start = start || 0;\n        if (typeof prefixes === \"string\") {\n            prefixes = [prefixes];\n        }\n        for (var i = 0; i < prefixes.length; i++) {\n            prefix = prefixes[(typeof i === \"number\" && i < 0) ? prefixes.length + i : i];\n            end = (end === undefined) ? this.length : end;\n            if (end - start >= prefix.length && prefix === this.slice(start, start + prefix.length)) {\n                return true;\n            }\n        }\n        return false;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"prefixes\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"find\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        while (start < 0) {\n            start += this.length;\n        }\n        ans = this.indexOf(needle, start);\n        if (end !== undefined && ans !== -1) {\n            while (end < 0) {\n                end += this.length;\n            }\n            if (ans >= end - needle.length) {\n                return -1;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rfind\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        while (end < 0) {\n            end += this.length;\n        }\n        ans = this.lastIndexOf(needle, end - 1);\n        if (start !== undefined && ans !== -1) {\n            while (start < 0) {\n                start += this.length;\n            }\n            if (ans < start) {\n                return -1;\n            }\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"index\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        ans = ρσ_str.prototype.find.apply(this, arguments);\n        if (ans === -1) {\n            throw new ValueError(\"substring not found\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rindex\", (function() {\n    var ρσ_anonfunc = function (needle, start, end) {\n        var ans;\n        ans = ρσ_str.prototype.rfind.apply(this, arguments);\n        if (ans === -1) {\n            throw new ValueError(\"substring not found\");\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"needle\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"islower\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && this.toLowerCase() === this.toString();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"isupper\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && this.toUpperCase() === this.toString();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"isspace\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.length > 0 && /^\\s+$/.test(this);\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"join\", (function() {\n    var ρσ_anonfunc = function (iterable) {\n        var ans, r;\n        if (Array.isArray(iterable)) {\n            return iterable.join(this);\n        }\n        ans = \"\";\n        r = iterable.next();\n        while (!r.done) {\n            if (ans) {\n                ans += this;\n            }\n            ans += r.value;\n            r = iterable.next();\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"iterable\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"ljust\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            fill = fill || \" \";\n            string += new Array(width - string.length + 1).join(fill);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rjust\", (function() {\n    var ρσ_anonfunc = function (width, fill) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            fill = fill || \" \";\n            string = new Array(width - string.length + 1).join(fill) + string;\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\", \"fill\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"lower\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.toLowerCase();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"upper\", (function() {\n    var ρσ_anonfunc = function () {\n        return this.toUpperCase();\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"lstrip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        var string, pos;\n        string = this;\n        pos = 0;\n        chars = chars || ρσ_str.whitespace;\n        while (chars.indexOf(string[(typeof pos === \"number\" && pos < 0) ? string.length + pos : pos]) !== -1) {\n            pos += 1;\n        }\n        if (pos) {\n            string = string.slice(pos);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rstrip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        var string, pos;\n        string = this;\n        pos = string.length - 1;\n        chars = chars || ρσ_str.whitespace;\n        while (chars.indexOf(string[(typeof pos === \"number\" && pos < 0) ? string.length + pos : pos]) !== -1) {\n            pos -= 1;\n        }\n        if (pos < string.length - 1) {\n            string = string.slice(0, pos + 1);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"strip\", (function() {\n    var ρσ_anonfunc = function (chars) {\n        return ρσ_str.prototype.lstrip.call(ρσ_str.prototype.rstrip.call(this, chars), chars);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"chars\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"partition\", (function() {\n    var ρσ_anonfunc = function (sep) {\n        var idx;\n        idx = this.indexOf(sep);\n        if (idx === -1) {\n            return [this, \"\", \"\"];\n        }\n        return [this.slice(0, idx), sep, this.slice(idx + sep.length)];\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rpartition\", (function() {\n    var ρσ_anonfunc = function (sep) {\n        var idx;\n        idx = this.lastIndexOf(sep);\n        if (idx === -1) {\n            return [\"\", \"\", this];\n        }\n        return [this.slice(0, idx), sep, this.slice(idx + sep.length)];\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"replace\", (function() {\n    var ρσ_anonfunc = function (old, repl, count) {\n        var string, pos, idx;\n        string = this;\n        if (count === 1) {\n            return ρσ_orig_replace(string, old, repl);\n        }\n        if (count < 1) {\n            return string;\n        }\n        count = count || Number.MAX_VALUE;\n        pos = 0;\n        while (count > 0) {\n            count -= 1;\n            idx = string.indexOf(old, pos);\n            if (idx === -1) {\n                break;\n            }\n            pos = idx + repl.length;\n            string = string.slice(0, idx) + repl + string.slice(idx + old.length);\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"old\", \"repl\", \"count\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"split\", (function() {\n    var ρσ_anonfunc = function (sep, maxsplit) {\n        var split, ans, extra, parts;\n        if (maxsplit === 0) {\n            return ρσ_list_decorate([ this ]);\n        }\n        split = ρσ_orig_split;\n        if (sep === undefined || sep === null) {\n            if (maxsplit > 0) {\n                ans = split(this, /(\\s+)/);\n                extra = \"\";\n                parts = [];\n                for (var i = 0; i < ans.length; i++) {\n                    if (parts.length >= maxsplit + 1) {\n                        extra += ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i];\n                    } else if (i % 2 === 0) {\n                        parts.push(ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i]);\n                    }\n                }\n                parts[parts.length-1] += extra;\n                ans = parts;\n            } else {\n                ans = split(this, /\\s+/);\n            }\n        } else {\n            if (sep === \"\") {\n                throw new ValueError(\"empty separator\");\n            }\n            ans = split(this, sep);\n            if (maxsplit > 0 && ans.length > maxsplit) {\n                extra = ans.slice(maxsplit).join(sep);\n                ans = ans.slice(0, maxsplit);\n                ans.push(extra);\n            }\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\", \"maxsplit\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"rsplit\", (function() {\n    var ρσ_anonfunc = function (sep, maxsplit) {\n        var split, ans, is_space, pos, current, spc, ch, end, idx;\n        if (!maxsplit) {\n            return ρσ_str.prototype.split.call(this, sep);\n        }\n        split = ρσ_orig_split;\n        if (sep === undefined || sep === null) {\n            if (maxsplit > 0) {\n                ans = [];\n                is_space = /\\s/;\n                pos = this.length - 1;\n                current = \"\";\n                while (pos > -1 && maxsplit > 0) {\n                    spc = false;\n                    ch = (ρσ_expr_temp = this)[(typeof pos === \"number\" && pos < 0) ? ρσ_expr_temp.length + pos : pos];\n                    while (pos > -1 && is_space.test(ch)) {\n                        spc = true;\n                        ch = this[--pos];\n                    }\n                    if (spc) {\n                        if (current) {\n                            ans.push(current);\n                            maxsplit -= 1;\n                        }\n                        current = ch;\n                    } else {\n                        current += ch;\n                    }\n                    pos -= 1;\n                }\n                ans.push(this.slice(0, pos + 1) + current);\n                ans.reverse();\n            } else {\n                ans = split(this, /\\s+/);\n            }\n        } else {\n            if (sep === \"\") {\n                throw new ValueError(\"empty separator\");\n            }\n            ans = [];\n            pos = end = this.length;\n            while (pos > -1 && maxsplit > 0) {\n                maxsplit -= 1;\n                idx = this.lastIndexOf(sep, pos);\n                if (idx === -1) {\n                    break;\n                }\n                ans.push(this.slice(idx + sep.length, end));\n                pos = idx - 1;\n                end = idx;\n            }\n            ans.push(this.slice(0, end));\n            ans.reverse();\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"sep\", \"maxsplit\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"splitlines\", (function() {\n    var ρσ_anonfunc = function (keepends) {\n        var split, parts, ans;\n        split = ρσ_orig_split;\n        if (keepends) {\n            parts = split(this, /((?:\\r?\\n)|\\r)/);\n            ans = [];\n            for (var i = 0; i < parts.length; i++) {\n                if (i % 2 === 0) {\n                    ans.push(parts[(typeof i === \"number\" && i < 0) ? parts.length + i : i]);\n                } else {\n                    ans[ans.length-1] += parts[(typeof i === \"number\" && i < 0) ? parts.length + i : i];\n                }\n            }\n        } else {\n            ans = split(this, /(?:\\r?\\n)|\\r/);\n        }\n        return ρσ_list_decorate(ans);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"keepends\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"swapcase\", (function() {\n    var ρσ_anonfunc = function () {\n        var ans, a, b;\n        ans = new Array(this.length);\n        for (var i = 0; i < ans.length; i++) {\n            a = (ρσ_expr_temp = this)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n            b = a.toLowerCase();\n            if (a === b) {\n                b = a.toUpperCase();\n            }\n            ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = b;\n        }\n        return ans.join(\"\");\n    };\n    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\ndefine_str_func(\"zfill\", (function() {\n    var ρσ_anonfunc = function (width) {\n        var string;\n        string = this;\n        if (width > string.length) {\n            string = new Array(width - string.length + 1).join(\"0\") + string;\n        }\n        return string;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"width\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})());\nρσ_str.uchrs = (function() {\n    var ρσ_anonfunc = function (string, with_positions) {\n        return (function(){\n            var ρσ_d = {};\n            ρσ_d[\"_string\"] = string;\n            ρσ_d[\"_pos\"] = 0;\n            ρσ_d[ρσ_iterator_symbol] = (function() {\n                var ρσ_anonfunc = function () {\n                    return this;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            ρσ_d[\"next\"] = (function() {\n                var ρσ_anonfunc = function () {\n                    var length, pos, value, ans, extra;\n                    length = this._string.length;\n                    if (this._pos >= length) {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = true;\n                            return ρσ_d;\n                        }).call(this);\n                    }\n                    pos = this._pos;\n                    value = this._string.charCodeAt(this._pos++);\n                    ans = \"\\ufffd\";\n                    if (55296 <= value && value <= 56319) {\n                        if (this._pos < length) {\n                            extra = this._string.charCodeAt(this._pos++);\n                            if ((extra & 56320) === 56320) {\n                                ans = String.fromCharCode(value, extra);\n                            }\n                        }\n                    } else if ((value & 56320) !== 56320) {\n                        ans = String.fromCharCode(value);\n                    }\n                    if (with_positions) {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = false;\n                            ρσ_d[\"value\"] = ρσ_list_decorate([ pos, ans ]);\n                            return ρσ_d;\n                        }).call(this);\n                    } else {\n                        return (function(){\n                            var ρσ_d = {};\n                            ρσ_d[\"done\"] = false;\n                            ρσ_d[\"value\"] = ans;\n                            return ρσ_d;\n                        }).call(this);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"__main__\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return ρσ_d;\n        }).call(this);\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\", \"with_positions\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.uslice = (function() {\n    var ρσ_anonfunc = function (string, start, end) {\n        var items, iterator, r;\n        items = [];\n        iterator = ρσ_str.uchrs(string);\n        r = iterator.next();\n        while (!r.done) {\n            items.push(r.value);\n            r = iterator.next();\n        }\n        return items.slice(start || 0, (end === undefined) ? items.length : end).join(\"\");\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\", \"start\", \"end\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.ulen = (function() {\n    var ρσ_anonfunc = function (string) {\n        var iterator, r, ans;\n        iterator = ρσ_str.uchrs(string);\n        r = iterator.next();\n        ans = 0;\n        while (!r.done) {\n            r = iterator.next();\n            ans += 1;\n        }\n        return ans;\n    };\n    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n        __argnames__ : {value: [\"string\"]},\n        __module__ : {value: \"__main__\"}\n    });\n    return ρσ_anonfunc;\n})();\nρσ_str.ascii_lowercase = \"abcdefghijklmnopqrstuvwxyz\";\nρσ_str.ascii_uppercase = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nρσ_str.ascii_letters = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\nρσ_str.digits = \"0123456789\";\nρσ_str.punctuation = \"!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~\";\nρσ_str.printable = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\u000b\\f\";\nρσ_str.whitespace = \" \\t\\n\\r\\u000b\\f\";\ndefine_str_func = undefined;\nvar str = ρσ_str, repr = ρσ_repr;;\n    var ρσ_modules = {};\n    ρσ_modules.utils = {};\n    ρσ_modules.errors = {};\n    ρσ_modules.unicode_aliases = {};\n    ρσ_modules.ast = {};\n    ρσ_modules.string_interpolation = {};\n    ρσ_modules.tokenizer = {};\n    ρσ_modules.parse = {};\n    ρσ_modules.output = {};\n    ρσ_modules[\"output.stream\"] = {};\n    ρσ_modules[\"output.statements\"] = {};\n    ρσ_modules[\"output.exceptions\"] = {};\n    ρσ_modules[\"output.utils\"] = {};\n    ρσ_modules[\"output.loops\"] = {};\n    ρσ_modules[\"output.operators\"] = {};\n    ρσ_modules[\"output.functions\"] = {};\n    ρσ_modules[\"output.classes\"] = {};\n    ρσ_modules[\"output.literals\"] = {};\n    ρσ_modules[\"output.comments\"] = {};\n    ρσ_modules[\"output.modules\"] = {};\n    ρσ_modules[\"output.codegen\"] = {};\n\n    (function(){\n        var __name__ = \"utils\";\n        var has_prop, MAP;\n        has_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);\n        function array_to_hash(a) {\n            var ret, i;\n            ret = Object.create(null);\n            var ρσ_Iter0 = ρσ_Iterable(range(len(a)));\n            for (var ρσ_Index0 = 0; ρσ_Index0 < ρσ_Iter0.length; ρσ_Index0++) {\n                i = ρσ_Iter0[ρσ_Index0];\n                ret[ρσ_bound_index(a[(typeof i === \"number\" && i < 0) ? a.length + i : i], ret)] = true;\n            }\n            return ret;\n        };\n        if (!array_to_hash.__argnames__) Object.defineProperties(array_to_hash, {\n            __argnames__ : {value: [\"a\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function slice(a, start) {\n            return Array.prototype.slice.call(a, start || 0);\n        };\n        if (!slice.__argnames__) Object.defineProperties(slice, {\n            __argnames__ : {value: [\"a\", \"start\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function characters(str_) {\n            return str_.split(\"\");\n        };\n        if (!characters.__argnames__) Object.defineProperties(characters, {\n            __argnames__ : {value: [\"str_\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function member(name, array) {\n            var i;\n            for (var ρσ_Index1 = array.length - 1; ρσ_Index1 > -1; ρσ_Index1-=1) {\n                i = ρσ_Index1;\n                if (array[(typeof i === \"number\" && i < 0) ? array.length + i : i] === name) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        if (!member.__argnames__) Object.defineProperties(member, {\n            __argnames__ : {value: [\"name\", \"array\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function repeat_string(str_, i) {\n            var d;\n            if (i <= 0) {\n                return \"\";\n            }\n            if (i === 1) {\n                return str_;\n            }\n            d = repeat_string(str_, i >> 1);\n            d += d;\n            if (i & 1) {\n                d += str_;\n            }\n            return d;\n        };\n        if (!repeat_string.__argnames__) Object.defineProperties(repeat_string, {\n            __argnames__ : {value: [\"str_\", \"i\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function DefaultsError() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            DefaultsError.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(DefaultsError, ValueError);\n        DefaultsError.prototype.__init__ = function __init__(name, defs) {\n            var self = this;\n            ValueError.prototype.__init__.call(self, name + \" is not a supported option. Supported options are: \" + str(Object.keys(defs)));\n        };\n        if (!DefaultsError.prototype.__init__.__argnames__) Object.defineProperties(DefaultsError.prototype.__init__, {\n            __argnames__ : {value: [\"name\", \"defs\"]},\n            __module__ : {value: \"utils\"}\n        });\n        DefaultsError.__argnames__ = DefaultsError.prototype.__init__.__argnames__;\n        DefaultsError.__handles_kwarg_interpolation__ = DefaultsError.prototype.__init__.__handles_kwarg_interpolation__;\n        DefaultsError.prototype.__repr__ = function __repr__ () {\n            if(ValueError.prototype.__repr__) return ValueError.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        DefaultsError.prototype.__str__ = function __str__ () {\n            if(ValueError.prototype.__str__) return ValueError.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(DefaultsError.prototype, \"__bases__\", {value: [ValueError]});\n\n        function defaults(args, defs, croak) {\n            var ret, i;\n            if (args === true) {\n                args = Object.create(null);\n            }\n            ret = args || Object.create(null);\n            if (croak) {\n                var ρσ_Iter2 = ρσ_Iterable(ret);\n                for (var ρσ_Index2 = 0; ρσ_Index2 < ρσ_Iter2.length; ρσ_Index2++) {\n                    i = ρσ_Iter2[ρσ_Index2];\n                    if (!has_prop(defs, i)) {\n                        throw new DefaultsError(i, defs);\n                    }\n                }\n            }\n            var ρσ_Iter3 = ρσ_Iterable(defs);\n            for (var ρσ_Index3 = 0; ρσ_Index3 < ρσ_Iter3.length; ρσ_Index3++) {\n                i = ρσ_Iter3[ρσ_Index3];\n                ret[(typeof i === \"number\" && i < 0) ? ret.length + i : i] = (args && has_prop(args, i)) ? args[(typeof i === \"number\" && i < 0) ? args.length + i : i] : defs[(typeof i === \"number\" && i < 0) ? defs.length + i : i];\n            }\n            return ret;\n        };\n        if (!defaults.__argnames__) Object.defineProperties(defaults, {\n            __argnames__ : {value: [\"args\", \"defs\", \"croak\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function merge(obj, ext) {\n            var i;\n            var ρσ_Iter4 = ρσ_Iterable(ext);\n            for (var ρσ_Index4 = 0; ρσ_Index4 < ρσ_Iter4.length; ρσ_Index4++) {\n                i = ρσ_Iter4[ρσ_Index4];\n                obj[(typeof i === \"number\" && i < 0) ? obj.length + i : i] = ext[(typeof i === \"number\" && i < 0) ? ext.length + i : i];\n            }\n            return obj;\n        };\n        if (!merge.__argnames__) Object.defineProperties(merge, {\n            __argnames__ : {value: [\"obj\", \"ext\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function noop() {\n        };\n        if (!noop.__module__) Object.defineProperties(noop, {\n            __module__ : {value: \"utils\"}\n        });\n\n        MAP = (function() {\n            var ρσ_anonfunc = function () {\n                var skip;\n                function MAP(a, f, backwards) {\n                    var ret, top, i;\n                    ret = ρσ_list_decorate([]);\n                    top = ρσ_list_decorate([]);\n                    function doit() {\n                        var val, is_last;\n                        val = f(a[(typeof i === \"number\" && i < 0) ? a.length + i : i], i);\n                        is_last = ρσ_instanceof(val, Last);\n                        if (is_last) {\n                            val = val.v;\n                        }\n                        if (ρσ_instanceof(val, AtTop)) {\n                            val = val.v;\n                            if (ρσ_instanceof(val, Splice)) {\n                                top.push.apply(top, (backwards) ? val.v.slice().reverse() : val.v);\n                            } else {\n                                top.push(val);\n                            }\n                        } else if (val !== skip) {\n                            if (ρσ_instanceof(val, Splice)) {\n                                ret.push.apply(ret, (backwards) ? val.v.slice().reverse() : val.v);\n                            } else {\n                                ret.push(val);\n                            }\n                        }\n                        return is_last;\n                    };\n                    if (!doit.__module__) Object.defineProperties(doit, {\n                        __module__ : {value: \"utils\"}\n                    });\n\n                    if (Array.isArray(a)) {\n                        if (backwards) {\n                            for (var ρσ_Index5 = a.length - 1; ρσ_Index5 > -1; ρσ_Index5-=1) {\n                                i = ρσ_Index5;\n                                if (doit()) {\n                                    break;\n                                }\n                            }\n                            ret.reverse();\n                            top.reverse();\n                        } else {\n                            var ρσ_Iter6 = ρσ_Iterable(range(len(a)));\n                            for (var ρσ_Index6 = 0; ρσ_Index6 < ρσ_Iter6.length; ρσ_Index6++) {\n                                i = ρσ_Iter6[ρσ_Index6];\n                                if (doit()) {\n                                    break;\n                                }\n                            }\n                        }\n                    } else {\n                        var ρσ_Iter7 = ρσ_Iterable(a);\n                        for (var ρσ_Index7 = 0; ρσ_Index7 < ρσ_Iter7.length; ρσ_Index7++) {\n                            i = ρσ_Iter7[ρσ_Index7];\n                            if (doit()) {\n                                break;\n                            }\n                        }\n                    }\n                    return top.concat(ret);\n                };\n                if (!MAP.__argnames__) Object.defineProperties(MAP, {\n                    __argnames__ : {value: [\"a\", \"f\", \"backwards\"]},\n                    __module__ : {value: \"utils\"}\n                });\n\n                MAP.at_top = (function() {\n                    var ρσ_anonfunc = function (val) {\n                        return new AtTop(val);\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"val\"]},\n                        __module__ : {value: \"utils\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n                MAP.splice = (function() {\n                    var ρσ_anonfunc = function (val) {\n                        return new Splice(val);\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"val\"]},\n                        __module__ : {value: \"utils\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n                MAP.last = (function() {\n                    var ρσ_anonfunc = function (val) {\n                        return new Last(val);\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"val\"]},\n                        __module__ : {value: \"utils\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n                skip = MAP.skip = Object.create(null);\n                function AtTop(val) {\n                    this.v = val;\n                };\n                if (!AtTop.__argnames__) Object.defineProperties(AtTop, {\n                    __argnames__ : {value: [\"val\"]},\n                    __module__ : {value: \"utils\"}\n                });\n\n                function Splice(val) {\n                    this.v = val;\n                };\n                if (!Splice.__argnames__) Object.defineProperties(Splice, {\n                    __argnames__ : {value: [\"val\"]},\n                    __module__ : {value: \"utils\"}\n                });\n\n                function Last(val) {\n                    this.v = val;\n                };\n                if (!Last.__argnames__) Object.defineProperties(Last, {\n                    __argnames__ : {value: [\"val\"]},\n                    __module__ : {value: \"utils\"}\n                });\n\n                return MAP;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"utils\"}\n            });\n            return ρσ_anonfunc;\n        })().call(this);\n        function push_uniq(array, el) {\n            if (array.indexOf(el) < 0) {\n                array.push(el);\n            }\n        };\n        if (!push_uniq.__argnames__) Object.defineProperties(push_uniq, {\n            __argnames__ : {value: [\"array\", \"el\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function string_template(text, props) {\n            return text.replace(/\\{(.+?)\\}/g, (function() {\n                var ρσ_anonfunc = function (str_, p) {\n                    return props[(typeof p === \"number\" && p < 0) ? props.length + p : p];\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"str_\", \"p\"]},\n                    __module__ : {value: \"utils\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!string_template.__argnames__) Object.defineProperties(string_template, {\n            __argnames__ : {value: [\"text\", \"props\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function remove(array, el) {\n            var i;\n            for (var ρσ_Index8 = array.length - 1; ρσ_Index8 > -1; ρσ_Index8-=1) {\n                i = ρσ_Index8;\n                if (array[(typeof i === \"number\" && i < 0) ? array.length + i : i] === el) {\n                    array.splice(i, 1);\n                }\n            }\n        };\n        if (!remove.__argnames__) Object.defineProperties(remove, {\n            __argnames__ : {value: [\"array\", \"el\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function mergeSort(array, cmp) {\n            if (array.length < 2) {\n                return array.slice();\n            }\n            function merge(a, b) {\n                var r, ai, bi, i;\n                r = ρσ_list_decorate([]);\n                ai = 0;\n                bi = 0;\n                i = 0;\n                while (ai < a.length && bi < b.length) {\n                    if (cmp(a[(typeof ai === \"number\" && ai < 0) ? a.length + ai : ai], b[(typeof bi === \"number\" && bi < 0) ? b.length + bi : bi]) <= 0) {\n                        r[(typeof i === \"number\" && i < 0) ? r.length + i : i] = a[(typeof ai === \"number\" && ai < 0) ? a.length + ai : ai];\n                        ai += 1;\n                    } else {\n                        r[(typeof i === \"number\" && i < 0) ? r.length + i : i] = b[(typeof bi === \"number\" && bi < 0) ? b.length + bi : bi];\n                        bi += 1;\n                    }\n                    i += 1;\n                }\n                if (ai < a.length) {\n                    r.push.apply(r, a.slice(ai));\n                }\n                if (bi < b.length) {\n                    r.push.apply(r, b.slice(bi));\n                }\n                return r;\n            };\n            if (!merge.__argnames__) Object.defineProperties(merge, {\n                __argnames__ : {value: [\"a\", \"b\"]},\n                __module__ : {value: \"utils\"}\n            });\n\n            function _ms(a) {\n                var m, left, right;\n                if (a.length <= 1) {\n                    return a;\n                }\n                m = Math.floor(a.length / 2);\n                left = a.slice(0, m);\n                right = a.slice(m);\n                left = _ms(left);\n                right = _ms(right);\n                return merge(left, right);\n            };\n            if (!_ms.__argnames__) Object.defineProperties(_ms, {\n                __argnames__ : {value: [\"a\"]},\n                __module__ : {value: \"utils\"}\n            });\n\n            return _ms(array);\n        };\n        if (!mergeSort.__argnames__) Object.defineProperties(mergeSort, {\n            __argnames__ : {value: [\"array\", \"cmp\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function set_difference(a, b) {\n            return a.filter((function() {\n                var ρσ_anonfunc = function (el) {\n                    return b.indexOf(el) < 0;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"el\"]},\n                    __module__ : {value: \"utils\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!set_difference.__argnames__) Object.defineProperties(set_difference, {\n            __argnames__ : {value: [\"a\", \"b\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function set_intersection(a, b) {\n            return a.filter((function() {\n                var ρσ_anonfunc = function (el) {\n                    return b.indexOf(el) >= 0;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"el\"]},\n                    __module__ : {value: \"utils\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!set_intersection.__argnames__) Object.defineProperties(set_intersection, {\n            __argnames__ : {value: [\"a\", \"b\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function make_predicate(words) {\n            var a, k;\n            if (typeof words === \"string\") {\n                words = words.split(\" \");\n            }\n            a = Object.create(null);\n            var ρσ_Iter9 = ρσ_Iterable(words);\n            for (var ρσ_Index9 = 0; ρσ_Index9 < ρσ_Iter9.length; ρσ_Index9++) {\n                k = ρσ_Iter9[ρσ_Index9];\n                a[(typeof k === \"number\" && k < 0) ? a.length + k : k] = true;\n            }\n            return a;\n        };\n        if (!make_predicate.__argnames__) Object.defineProperties(make_predicate, {\n            __argnames__ : {value: [\"words\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        function cache_file_name(src, cache_dir) {\n            if (cache_dir) {\n                src = str.replace(src, \"\\\\\", \"/\");\n                return cache_dir + \"/\" + str.lstrip(str.replace(src, \"/\", \"-\") + \".json\", \"-\");\n            }\n            return src + \"-cached\";\n        };\n        if (!cache_file_name.__argnames__) Object.defineProperties(cache_file_name, {\n            __argnames__ : {value: [\"src\", \"cache_dir\"]},\n            __module__ : {value: \"utils\"}\n        });\n\n        ρσ_modules.utils.has_prop = has_prop;\n        ρσ_modules.utils.MAP = MAP;\n        ρσ_modules.utils.array_to_hash = array_to_hash;\n        ρσ_modules.utils.slice = slice;\n        ρσ_modules.utils.characters = characters;\n        ρσ_modules.utils.member = member;\n        ρσ_modules.utils.repeat_string = repeat_string;\n        ρσ_modules.utils.DefaultsError = DefaultsError;\n        ρσ_modules.utils.defaults = defaults;\n        ρσ_modules.utils.merge = merge;\n        ρσ_modules.utils.noop = noop;\n        ρσ_modules.utils.push_uniq = push_uniq;\n        ρσ_modules.utils.string_template = string_template;\n        ρσ_modules.utils.remove = remove;\n        ρσ_modules.utils.mergeSort = mergeSort;\n        ρσ_modules.utils.set_difference = set_difference;\n        ρσ_modules.utils.set_intersection = set_intersection;\n        ρσ_modules.utils.make_predicate = make_predicate;\n        ρσ_modules.utils.cache_file_name = cache_file_name;\n    })();\n\n    (function(){\n        var __name__ = \"errors\";\n        function SyntaxError() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            SyntaxError.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(SyntaxError, Error);\n        SyntaxError.prototype.__init__ = function __init__(message, filename, line, col, pos, is_eof) {\n            var self = this;\n            self.stack = (new Error).stack;\n            self.message = message;\n            self.line = line;\n            self.col = col;\n            self.pos = pos;\n            self.is_eof = is_eof;\n            self.filename = filename;\n            self.lineNumber = line;\n            self.fileName = filename;\n        };\n        if (!SyntaxError.prototype.__init__.__argnames__) Object.defineProperties(SyntaxError.prototype.__init__, {\n            __argnames__ : {value: [\"message\", \"filename\", \"line\", \"col\", \"pos\", \"is_eof\"]},\n            __module__ : {value: \"errors\"}\n        });\n        SyntaxError.__argnames__ = SyntaxError.prototype.__init__.__argnames__;\n        SyntaxError.__handles_kwarg_interpolation__ = SyntaxError.prototype.__init__.__handles_kwarg_interpolation__;\n        SyntaxError.prototype.toString = function toString() {\n            var self = this;\n            var ans;\n            ans = self.message + \" (line: \" + self.line + \", col: \" + self.col + \", pos: \" + self.pos + \")\";\n            if (self.filename) {\n                ans = self.filename + \":\" + ans;\n            }\n            if (self.stack) {\n                ans += \"\\n\\n\" + self.stack;\n            }\n            return ans;\n        };\n        if (!SyntaxError.prototype.toString.__module__) Object.defineProperties(SyntaxError.prototype.toString, {\n            __module__ : {value: \"errors\"}\n        });\n        SyntaxError.prototype.__repr__ = function __repr__ () {\n            if(Error.prototype.__repr__) return Error.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        SyntaxError.prototype.__str__ = function __str__ () {\n            if(Error.prototype.__str__) return Error.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(SyntaxError.prototype, \"__bases__\", {value: [Error]});\n\n        function ImportError() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            ImportError.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(ImportError, SyntaxError);\n        ImportError.prototype.__init__ = function __init__ () {\n            SyntaxError.prototype.__init__ && SyntaxError.prototype.__init__.apply(this, arguments);\n        };\n        ImportError.prototype.__repr__ = function __repr__ () {\n            if(SyntaxError.prototype.__repr__) return SyntaxError.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        ImportError.prototype.__str__ = function __str__ () {\n            if(SyntaxError.prototype.__str__) return SyntaxError.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(ImportError.prototype, \"__bases__\", {value: [SyntaxError]});\n        \n\n        ρσ_modules.errors.SyntaxError = SyntaxError;\n        ρσ_modules.errors.ImportError = ImportError;\n    })();\n\n    (function(){\n        var __name__ = \"unicode_aliases\";\n        var DB, ALIAS_MAP;\n        DB = \"\\n# NameAliases-8.0.0.txt\\n# Date: 2014-11-19, 01:30:00 GMT [KW, LI]\\n#\\n# This file is a normative contributory data file in the\\n# Unicode Character Database.\\n#\\n# Copyright (c) 2005-2014 Unicode, Inc.\\n# For terms of use, see http://www.unicode.org/terms_of_use.html\\n#\\n# This file defines the formal name aliases for Unicode characters.\\n#\\n# For informative aliases, see NamesList.txt\\n#\\n# The formal name aliases are divided into five types, each with a distinct label.\\n#\\n# Type Labels:\\n#\\n# 1. correction\\n#      Corrections for serious problems in the character names\\n# 2. control\\n#      ISO 6429 names for C0 and C1 control functions, and other\\n#      commonly occurring names for control codes\\n# 3. alternate\\n#      A few widely used alternate names for format characters\\n# 4. figment\\n#      Several documented labels for C1 control code points which\\n#      were never actually approved in any standard\\n# 5. abbreviation\\n#      Commonly occurring abbreviations (or acronyms) for control codes,\\n#      format characters, spaces, and variation selectors\\n#\\n# The formal name aliases are part of the Unicode character namespace, which\\n# includes the character names and the names of named character sequences.\\n# The inclusion of ISO 6429 names and other commonly occurring names and\\n# abbreviations for control codes and format characters as formal name aliases\\n# is to help avoid name collisions between Unicode character names and the\\n# labels which commonly appear in text and/or in implementations such as regex, for\\n# control codes (which for historical reasons have no Unicode character name)\\n# or for format characters.\\n#\\n# For documentation, see NamesList.html and http://www.unicode.org/reports/tr44/\\n#\\n# FORMAT\\n#\\n# Each line has three fields, as described here:\\n#\\n# First field:  Code point\\n# Second field: Alias\\n# Third field:  Type\\n#\\n# The type labels used are defined above. As for property values, comparisons\\n# of type labels should ignore case.\\n#\\n# The type labels can be mapped to other strings for display, if desired.\\n#\\n# In case multiple aliases are assigned, additional aliases\\n# are provided on separate lines. Parsers of this data file should\\n# take note that the same code point can (and does) occur more than once.\\n#\\n# Note that currently the only instances of multiple aliases of the same\\n# type for a single code point are either of type \\\"control\\\" or \\\"abbreviation\\\".\\n# An alias of type \\\"abbreviation\\\" can, in principle, be added for any code\\n# point, although currently aliases of type \\\"correction\\\" do not have\\n# any additional aliases of type \\\"abbreviation\\\". Such relationships\\n# are not enforced by stability policies.\\n#\\n#-----------------------------------------------------------------\\n\\n0000;NULL;control\\n0000;NUL;abbreviation\\n0001;START OF HEADING;control\\n0001;SOH;abbreviation\\n0002;START OF TEXT;control\\n0002;STX;abbreviation\\n0003;END OF TEXT;control\\n0003;ETX;abbreviation\\n0004;END OF TRANSMISSION;control\\n0004;EOT;abbreviation\\n0005;ENQUIRY;control\\n0005;ENQ;abbreviation\\n0006;ACKNOWLEDGE;control\\n0006;ACK;abbreviation\\n\\n# Note that no formal name alias for the ISO 6429 \\\"BELL\\\" is\\n# provided for U+0007, because of the existing name collision\\n# with U+1F514 BELL.\\n\\n0007;ALERT;control\\n0007;BEL;abbreviation\\n\\n0008;BACKSPACE;control\\n0008;BS;abbreviation\\n0009;CHARACTER TABULATION;control\\n0009;HORIZONTAL TABULATION;control\\n0009;HT;abbreviation\\n0009;TAB;abbreviation\\n000A;LINE FEED;control\\n000A;NEW LINE;control\\n000A;END OF LINE;control\\n000A;LF;abbreviation\\n000A;NL;abbreviation\\n000A;EOL;abbreviation\\n000B;LINE TABULATION;control\\n000B;VERTICAL TABULATION;control\\n000B;VT;abbreviation\\n000C;FORM FEED;control\\n000C;FF;abbreviation\\n000D;CARRIAGE RETURN;control\\n000D;CR;abbreviation\\n000E;SHIFT OUT;control\\n000E;LOCKING-SHIFT ONE;control\\n000E;SO;abbreviation\\n000F;SHIFT IN;control\\n000F;LOCKING-SHIFT ZERO;control\\n000F;SI;abbreviation\\n0010;DATA LINK ESCAPE;control\\n0010;DLE;abbreviation\\n0011;DEVICE CONTROL ONE;control\\n0011;DC1;abbreviation\\n0012;DEVICE CONTROL TWO;control\\n0012;DC2;abbreviation\\n0013;DEVICE CONTROL THREE;control\\n0013;DC3;abbreviation\\n0014;DEVICE CONTROL FOUR;control\\n0014;DC4;abbreviation\\n0015;NEGATIVE ACKNOWLEDGE;control\\n0015;NAK;abbreviation\\n0016;SYNCHRONOUS IDLE;control\\n0016;SYN;abbreviation\\n0017;END OF TRANSMISSION BLOCK;control\\n0017;ETB;abbreviation\\n0018;CANCEL;control\\n0018;CAN;abbreviation\\n0019;END OF MEDIUM;control\\n0019;EOM;abbreviation\\n001A;SUBSTITUTE;control\\n001A;SUB;abbreviation\\n001B;ESCAPE;control\\n001B;ESC;abbreviation\\n001C;INFORMATION SEPARATOR FOUR;control\\n001C;FILE SEPARATOR;control\\n001C;FS;abbreviation\\n001D;INFORMATION SEPARATOR THREE;control\\n001D;GROUP SEPARATOR;control\\n001D;GS;abbreviation\\n001E;INFORMATION SEPARATOR TWO;control\\n001E;RECORD SEPARATOR;control\\n001E;RS;abbreviation\\n001F;INFORMATION SEPARATOR ONE;control\\n001F;UNIT SEPARATOR;control\\n001F;US;abbreviation\\n0020;SP;abbreviation\\n007F;DELETE;control\\n007F;DEL;abbreviation\\n\\n# PADDING CHARACTER and HIGH OCTET PRESET represent\\n# architectural concepts initially proposed for early\\n# drafts of ISO/IEC 10646-1. They were never actually\\n# approved or standardized: hence their designation\\n# here as the \\\"figment\\\" type. Formal name aliases\\n# (and corresponding abbreviations) for these code\\n# points are included here because these names leaked\\n# out from the draft documents and were published in\\n# at least one RFC whose names for code points was\\n# implemented in Perl regex expressions.\\n\\n0080;PADDING CHARACTER;figment\\n0080;PAD;abbreviation\\n0081;HIGH OCTET PRESET;figment\\n0081;HOP;abbreviation\\n\\n0082;BREAK PERMITTED HERE;control\\n0082;BPH;abbreviation\\n0083;NO BREAK HERE;control\\n0083;NBH;abbreviation\\n0084;INDEX;control\\n0084;IND;abbreviation\\n0085;NEXT LINE;control\\n0085;NEL;abbreviation\\n0086;START OF SELECTED AREA;control\\n0086;SSA;abbreviation\\n0087;END OF SELECTED AREA;control\\n0087;ESA;abbreviation\\n0088;CHARACTER TABULATION SET;control\\n0088;HORIZONTAL TABULATION SET;control\\n0088;HTS;abbreviation\\n0089;CHARACTER TABULATION WITH JUSTIFICATION;control\\n0089;HORIZONTAL TABULATION WITH JUSTIFICATION;control\\n0089;HTJ;abbreviation\\n008A;LINE TABULATION SET;control\\n008A;VERTICAL TABULATION SET;control\\n008A;VTS;abbreviation\\n008B;PARTIAL LINE FORWARD;control\\n008B;PARTIAL LINE DOWN;control\\n008B;PLD;abbreviation\\n008C;PARTIAL LINE BACKWARD;control\\n008C;PARTIAL LINE UP;control\\n008C;PLU;abbreviation\\n008D;REVERSE LINE FEED;control\\n008D;REVERSE INDEX;control\\n008D;RI;abbreviation\\n008E;SINGLE SHIFT TWO;control\\n008E;SINGLE-SHIFT-2;control\\n008E;SS2;abbreviation\\n008F;SINGLE SHIFT THREE;control\\n008F;SINGLE-SHIFT-3;control\\n008F;SS3;abbreviation\\n0090;DEVICE CONTROL STRING;control\\n0090;DCS;abbreviation\\n0091;PRIVATE USE ONE;control\\n0091;PRIVATE USE-1;control\\n0091;PU1;abbreviation\\n0092;PRIVATE USE TWO;control\\n0092;PRIVATE USE-2;control\\n0092;PU2;abbreviation\\n0093;SET TRANSMIT STATE;control\\n0093;STS;abbreviation\\n0094;CANCEL CHARACTER;control\\n0094;CCH;abbreviation\\n0095;MESSAGE WAITING;control\\n0095;MW;abbreviation\\n0096;START OF GUARDED AREA;control\\n0096;START OF PROTECTED AREA;control\\n0096;SPA;abbreviation\\n0097;END OF GUARDED AREA;control\\n0097;END OF PROTECTED AREA;control\\n0097;EPA;abbreviation\\n0098;START OF STRING;control\\n0098;SOS;abbreviation\\n\\n# SINGLE GRAPHIC CHARACTER INTRODUCER is another\\n# architectural concept from early drafts of ISO/IEC 10646-1\\n# which was never approved and standardized.\\n\\n0099;SINGLE GRAPHIC CHARACTER INTRODUCER;figment\\n0099;SGC;abbreviation\\n\\n009A;SINGLE CHARACTER INTRODUCER;control\\n009A;SCI;abbreviation\\n009B;CONTROL SEQUENCE INTRODUCER;control\\n009B;CSI;abbreviation\\n009C;STRING TERMINATOR;control\\n009C;ST;abbreviation\\n009D;OPERATING SYSTEM COMMAND;control\\n009D;OSC;abbreviation\\n009E;PRIVACY MESSAGE;control\\n009E;PM;abbreviation\\n009F;APPLICATION PROGRAM COMMAND;control\\n009F;APC;abbreviation\\n00A0;NBSP;abbreviation\\n00AD;SHY;abbreviation\\n01A2;LATIN CAPITAL LETTER GHA;correction\\n01A3;LATIN SMALL LETTER GHA;correction\\n034F;CGJ;abbreviation\\n061C;ALM;abbreviation\\n0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction\\n0CDE;KANNADA LETTER LLLA;correction\\n0E9D;LAO LETTER FO FON;correction\\n0E9F;LAO LETTER FO FAY;correction\\n0EA3;LAO LETTER RO;correction\\n0EA5;LAO LETTER LO;correction\\n0FD0;TIBETAN MARK BKA- SHOG GI MGO RGYAN;correction\\n180B;FVS1;abbreviation\\n180C;FVS2;abbreviation\\n180D;FVS3;abbreviation\\n180E;MVS;abbreviation\\n200B;ZWSP;abbreviation\\n200C;ZWNJ;abbreviation\\n200D;ZWJ;abbreviation\\n200E;LRM;abbreviation\\n200F;RLM;abbreviation\\n202A;LRE;abbreviation\\n202B;RLE;abbreviation\\n202C;PDF;abbreviation\\n202D;LRO;abbreviation\\n202E;RLO;abbreviation\\n202F;NNBSP;abbreviation\\n205F;MMSP;abbreviation\\n2060;WJ;abbreviation\\n2066;LRI;abbreviation\\n2067;RLI;abbreviation\\n2068;FSI;abbreviation\\n2069;PDI;abbreviation\\n2118;WEIERSTRASS ELLIPTIC FUNCTION;correction\\n2448;MICR ON US SYMBOL;correction\\n2449;MICR DASH SYMBOL;correction\\n2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction\\n2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction\\nA015;YI SYLLABLE ITERATION MARK;correction\\nFE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET;correction\\nFE00;VS1;abbreviation\\nFE01;VS2;abbreviation\\nFE02;VS3;abbreviation\\nFE03;VS4;abbreviation\\nFE04;VS5;abbreviation\\nFE05;VS6;abbreviation\\nFE06;VS7;abbreviation\\nFE07;VS8;abbreviation\\nFE08;VS9;abbreviation\\nFE09;VS10;abbreviation\\nFE0A;VS11;abbreviation\\nFE0B;VS12;abbreviation\\nFE0C;VS13;abbreviation\\nFE0D;VS14;abbreviation\\nFE0E;VS15;abbreviation\\nFE0F;VS16;abbreviation\\nFEFF;BYTE ORDER MARK;alternate\\nFEFF;BOM;abbreviation\\nFEFF;ZWNBSP;abbreviation\\n122D4;CUNEIFORM SIGN NU11 TENU;correction\\n122D5;CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR;correction\\n1D0C5;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS;correction\\nE0100;VS17;abbreviation\\nE0101;VS18;abbreviation\\nE0102;VS19;abbreviation\\nE0103;VS20;abbreviation\\nE0104;VS21;abbreviation\\nE0105;VS22;abbreviation\\nE0106;VS23;abbreviation\\nE0107;VS24;abbreviation\\nE0108;VS25;abbreviation\\nE0109;VS26;abbreviation\\nE010A;VS27;abbreviation\\nE010B;VS28;abbreviation\\nE010C;VS29;abbreviation\\nE010D;VS30;abbreviation\\nE010E;VS31;abbreviation\\nE010F;VS32;abbreviation\\nE0110;VS33;abbreviation\\nE0111;VS34;abbreviation\\nE0112;VS35;abbreviation\\nE0113;VS36;abbreviation\\nE0114;VS37;abbreviation\\nE0115;VS38;abbreviation\\nE0116;VS39;abbreviation\\nE0117;VS40;abbreviation\\nE0118;VS41;abbreviation\\nE0119;VS42;abbreviation\\nE011A;VS43;abbreviation\\nE011B;VS44;abbreviation\\nE011C;VS45;abbreviation\\nE011D;VS46;abbreviation\\nE011E;VS47;abbreviation\\nE011F;VS48;abbreviation\\nE0120;VS49;abbreviation\\nE0121;VS50;abbreviation\\nE0122;VS51;abbreviation\\nE0123;VS52;abbreviation\\nE0124;VS53;abbreviation\\nE0125;VS54;abbreviation\\nE0126;VS55;abbreviation\\nE0127;VS56;abbreviation\\nE0128;VS57;abbreviation\\nE0129;VS58;abbreviation\\nE012A;VS59;abbreviation\\nE012B;VS60;abbreviation\\nE012C;VS61;abbreviation\\nE012D;VS62;abbreviation\\nE012E;VS63;abbreviation\\nE012F;VS64;abbreviation\\nE0130;VS65;abbreviation\\nE0131;VS66;abbreviation\\nE0132;VS67;abbreviation\\nE0133;VS68;abbreviation\\nE0134;VS69;abbreviation\\nE0135;VS70;abbreviation\\nE0136;VS71;abbreviation\\nE0137;VS72;abbreviation\\nE0138;VS73;abbreviation\\nE0139;VS74;abbreviation\\nE013A;VS75;abbreviation\\nE013B;VS76;abbreviation\\nE013C;VS77;abbreviation\\nE013D;VS78;abbreviation\\nE013E;VS79;abbreviation\\nE013F;VS80;abbreviation\\nE0140;VS81;abbreviation\\nE0141;VS82;abbreviation\\nE0142;VS83;abbreviation\\nE0143;VS84;abbreviation\\nE0144;VS85;abbreviation\\nE0145;VS86;abbreviation\\nE0146;VS87;abbreviation\\nE0147;VS88;abbreviation\\nE0148;VS89;abbreviation\\nE0149;VS90;abbreviation\\nE014A;VS91;abbreviation\\nE014B;VS92;abbreviation\\nE014C;VS93;abbreviation\\nE014D;VS94;abbreviation\\nE014E;VS95;abbreviation\\nE014F;VS96;abbreviation\\nE0150;VS97;abbreviation\\nE0151;VS98;abbreviation\\nE0152;VS99;abbreviation\\nE0153;VS100;abbreviation\\nE0154;VS101;abbreviation\\nE0155;VS102;abbreviation\\nE0156;VS103;abbreviation\\nE0157;VS104;abbreviation\\nE0158;VS105;abbreviation\\nE0159;VS106;abbreviation\\nE015A;VS107;abbreviation\\nE015B;VS108;abbreviation\\nE015C;VS109;abbreviation\\nE015D;VS110;abbreviation\\nE015E;VS111;abbreviation\\nE015F;VS112;abbreviation\\nE0160;VS113;abbreviation\\nE0161;VS114;abbreviation\\nE0162;VS115;abbreviation\\nE0163;VS116;abbreviation\\nE0164;VS117;abbreviation\\nE0165;VS118;abbreviation\\nE0166;VS119;abbreviation\\nE0167;VS120;abbreviation\\nE0168;VS121;abbreviation\\nE0169;VS122;abbreviation\\nE016A;VS123;abbreviation\\nE016B;VS124;abbreviation\\nE016C;VS125;abbreviation\\nE016D;VS126;abbreviation\\nE016E;VS127;abbreviation\\nE016F;VS128;abbreviation\\nE0170;VS129;abbreviation\\nE0171;VS130;abbreviation\\nE0172;VS131;abbreviation\\nE0173;VS132;abbreviation\\nE0174;VS133;abbreviation\\nE0175;VS134;abbreviation\\nE0176;VS135;abbreviation\\nE0177;VS136;abbreviation\\nE0178;VS137;abbreviation\\nE0179;VS138;abbreviation\\nE017A;VS139;abbreviation\\nE017B;VS140;abbreviation\\nE017C;VS141;abbreviation\\nE017D;VS142;abbreviation\\nE017E;VS143;abbreviation\\nE017F;VS144;abbreviation\\nE0180;VS145;abbreviation\\nE0181;VS146;abbreviation\\nE0182;VS147;abbreviation\\nE0183;VS148;abbreviation\\nE0184;VS149;abbreviation\\nE0185;VS150;abbreviation\\nE0186;VS151;abbreviation\\nE0187;VS152;abbreviation\\nE0188;VS153;abbreviation\\nE0189;VS154;abbreviation\\nE018A;VS155;abbreviation\\nE018B;VS156;abbreviation\\nE018C;VS157;abbreviation\\nE018D;VS158;abbreviation\\nE018E;VS159;abbreviation\\nE018F;VS160;abbreviation\\nE0190;VS161;abbreviation\\nE0191;VS162;abbreviation\\nE0192;VS163;abbreviation\\nE0193;VS164;abbreviation\\nE0194;VS165;abbreviation\\nE0195;VS166;abbreviation\\nE0196;VS167;abbreviation\\nE0197;VS168;abbreviation\\nE0198;VS169;abbreviation\\nE0199;VS170;abbreviation\\nE019A;VS171;abbreviation\\nE019B;VS172;abbreviation\\nE019C;VS173;abbreviation\\nE019D;VS174;abbreviation\\nE019E;VS175;abbreviation\\nE019F;VS176;abbreviation\\nE01A0;VS177;abbreviation\\nE01A1;VS178;abbreviation\\nE01A2;VS179;abbreviation\\nE01A3;VS180;abbreviation\\nE01A4;VS181;abbreviation\\nE01A5;VS182;abbreviation\\nE01A6;VS183;abbreviation\\nE01A7;VS184;abbreviation\\nE01A8;VS185;abbreviation\\nE01A9;VS186;abbreviation\\nE01AA;VS187;abbreviation\\nE01AB;VS188;abbreviation\\nE01AC;VS189;abbreviation\\nE01AD;VS190;abbreviation\\nE01AE;VS191;abbreviation\\nE01AF;VS192;abbreviation\\nE01B0;VS193;abbreviation\\nE01B1;VS194;abbreviation\\nE01B2;VS195;abbreviation\\nE01B3;VS196;abbreviation\\nE01B4;VS197;abbreviation\\nE01B5;VS198;abbreviation\\nE01B6;VS199;abbreviation\\nE01B7;VS200;abbreviation\\nE01B8;VS201;abbreviation\\nE01B9;VS202;abbreviation\\nE01BA;VS203;abbreviation\\nE01BB;VS204;abbreviation\\nE01BC;VS205;abbreviation\\nE01BD;VS206;abbreviation\\nE01BE;VS207;abbreviation\\nE01BF;VS208;abbreviation\\nE01C0;VS209;abbreviation\\nE01C1;VS210;abbreviation\\nE01C2;VS211;abbreviation\\nE01C3;VS212;abbreviation\\nE01C4;VS213;abbreviation\\nE01C5;VS214;abbreviation\\nE01C6;VS215;abbreviation\\nE01C7;VS216;abbreviation\\nE01C8;VS217;abbreviation\\nE01C9;VS218;abbreviation\\nE01CA;VS219;abbreviation\\nE01CB;VS220;abbreviation\\nE01CC;VS221;abbreviation\\nE01CD;VS222;abbreviation\\nE01CE;VS223;abbreviation\\nE01CF;VS224;abbreviation\\nE01D0;VS225;abbreviation\\nE01D1;VS226;abbreviation\\nE01D2;VS227;abbreviation\\nE01D3;VS228;abbreviation\\nE01D4;VS229;abbreviation\\nE01D5;VS230;abbreviation\\nE01D6;VS231;abbreviation\\nE01D7;VS232;abbreviation\\nE01D8;VS233;abbreviation\\nE01D9;VS234;abbreviation\\nE01DA;VS235;abbreviation\\nE01DB;VS236;abbreviation\\nE01DC;VS237;abbreviation\\nE01DD;VS238;abbreviation\\nE01DE;VS239;abbreviation\\nE01DF;VS240;abbreviation\\nE01E0;VS241;abbreviation\\nE01E1;VS242;abbreviation\\nE01E2;VS243;abbreviation\\nE01E3;VS244;abbreviation\\nE01E4;VS245;abbreviation\\nE01E5;VS246;abbreviation\\nE01E6;VS247;abbreviation\\nE01E7;VS248;abbreviation\\nE01E8;VS249;abbreviation\\nE01E9;VS250;abbreviation\\nE01EA;VS251;abbreviation\\nE01EB;VS252;abbreviation\\nE01EC;VS253;abbreviation\\nE01ED;VS254;abbreviation\\nE01EE;VS255;abbreviation\\nE01EF;VS256;abbreviation\\n\\n# EOF\\n\";\n        ALIAS_MAP = (function() {\n            var ρσ_anonfunc = function () {\n                var ans, line, parts, code_point;\n                ans = {};\n                var ρσ_Iter10 = ρσ_Iterable(DB.split(\"\\n\"));\n                for (var ρσ_Index10 = 0; ρσ_Index10 < ρσ_Iter10.length; ρσ_Index10++) {\n                    line = ρσ_Iter10[ρσ_Index10];\n                    line = line.trim();\n                    if (!line || line[0] === \"#\") {\n                        continue;\n                    }\n                    parts = line.split(\";\");\n                    if (parts.length >= 2) {\n                        code_point = parseInt(parts[0], 16);\n                        if (code_point !== undefined && parts[1]) {\n                            ans[ρσ_bound_index(parts[1].toLowerCase(), ans)] = code_point;\n                        }\n                    }\n                }\n                return ans;\n            };\n            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                __module__ : {value: \"unicode_aliases\"}\n            });\n            return ρσ_anonfunc;\n        })()();\n        ρσ_modules.unicode_aliases.DB = DB;\n        ρσ_modules.unicode_aliases.ALIAS_MAP = ALIAS_MAP;\n    })();\n\n    (function(){\n        var __name__ = \"ast\";\n        var noop = ρσ_modules.utils.noop;\n\n        function is_node_type(node, typ) {\n            return node instanceof typ;\n        };\n        if (!is_node_type.__argnames__) Object.defineProperties(is_node_type, {\n            __argnames__ : {value: [\"node\", \"typ\"]},\n            __module__ : {value: \"ast\"}\n        });\n\n        function AST() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST.prototype.__init__.apply(this, arguments);\n        }\n        AST.prototype.__init__ = function __init__(initializer) {\n            var self = this;\n            var obj;\n            if (initializer) {\n                obj = self;\n                while (true) {\n                    obj = Object.getPrototypeOf(obj);\n                    if (obj === null) {\n                        break;\n                    }\n                    for (var i in obj.properties) {\n                        self[i] = initializer[i];\n                    }\n                }\n            }\n        };\n        if (!AST.prototype.__init__.__argnames__) Object.defineProperties(AST.prototype.__init__, {\n            __argnames__ : {value: [\"initializer\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST.__argnames__ = AST.prototype.__init__.__argnames__;\n        AST.__handles_kwarg_interpolation__ = AST.prototype.__init__.__handles_kwarg_interpolation__;\n        AST.prototype.clone = function clone() {\n            var self = this;\n            return new self.constructor(self);\n        };\n        if (!AST.prototype.clone.__module__) Object.defineProperties(AST.prototype.clone, {\n            __module__ : {value: \"ast\"}\n        });\n        AST.prototype.__repr__ = function __repr__ () {\n                        return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST.prototype.__str__ = function __str__ () {\n            return this.__repr__();\n        };\n        Object.defineProperty(AST.prototype, \"__bases__\", {value: []});\n        AST.prototype.properties = Object.create(null);\n\n        function AST_Token() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Token.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Token, AST);\n        AST_Token.prototype.__init__ = function __init__ () {\n            AST.prototype.__init__ && AST.prototype.__init__.apply(this, arguments);\n        };\n        AST_Token.prototype.__repr__ = function __repr__ () {\n            if(AST.prototype.__repr__) return AST.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Token.prototype.__str__ = function __str__ () {\n            if(AST.prototype.__str__) return AST.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Token.prototype, \"__bases__\", {value: [AST]});\n        AST_Token.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"type\"] = \"The type of the token\";\n            ρσ_d[\"value\"] = \"The value of the token\";\n            ρσ_d[\"line\"] = \"The line number at which the token occurs\";\n            ρσ_d[\"col\"] = \"The column number at which the token occurs\";\n            ρσ_d[\"pos\"] = \"\";\n            ρσ_d[\"endpos\"] = \"\";\n            ρσ_d[\"nlb\"] = \"True iff there was a newline before this token\";\n            ρσ_d[\"comments_before\"] = \"True iff there were comments before this token\";\n            ρσ_d[\"file\"] = \"The filename in which this token occurs\";\n            ρσ_d[\"leading_whitespace\"] = \"The leading whitespace for the line on which this token occurs\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Node() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Node.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Node, AST);\n        AST_Node.prototype.__init__ = function __init__ () {\n            AST.prototype.__init__ && AST.prototype.__init__.apply(this, arguments);\n        };\n        AST_Node.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self);\n        };\n        if (!AST_Node.prototype._walk.__argnames__) Object.defineProperties(AST_Node.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Node.prototype.walk = function walk(visitor) {\n            var self = this;\n            return self._walk(visitor);\n        };\n        if (!AST_Node.prototype.walk.__argnames__) Object.defineProperties(AST_Node.prototype.walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Node.prototype._dump = function _dump() {\n            var self = this;\n            var depth = (arguments[0] === undefined || ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? _dump.__defaults__.depth : arguments[0];\n            var omit = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? _dump.__defaults__.omit : arguments[1];\n            var offset = (arguments[2] === undefined || ( 2 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? _dump.__defaults__.offset : arguments[2];\n            var include_name = (arguments[3] === undefined || ( 3 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? _dump.__defaults__.include_name : arguments[3];\n            var ρσ_kwargs_obj = arguments[arguments.length-1];\n            if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"depth\")){\n                depth = ρσ_kwargs_obj.depth;\n            }\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"omit\")){\n                omit = ρσ_kwargs_obj.omit;\n            }\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"offset\")){\n                offset = ρσ_kwargs_obj.offset;\n            }\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"include_name\")){\n                include_name = ρσ_kwargs_obj.include_name;\n            }\n            var p, reset, yellow, blue, green, red, magenta, pad, element, tname, property, key;\n            p = console.log;\n            reset = \"\\u001b[0m\";\n            yellow = \"\\u001b[33m\";\n            blue = \"\\u001b[34m\";\n            green = \"\\u001b[32m\";\n            red = \"\\u001b[31m\";\n            magenta = \"\\u001b[35m\";\n            pad = new Array(offset + 1).join(\"  \");\n            if (include_name) {\n                p(pad + yellow + self.constructor.name.slice(4) + reset);\n            }\n            var ρσ_Iter11 = ρσ_Iterable(self);\n            for (var ρσ_Index11 = 0; ρσ_Index11 < ρσ_Iter11.length; ρσ_Index11++) {\n                key = ρσ_Iter11[ρσ_Index11];\n                if (ρσ_in(key, omit)) {\n                    continue;\n                }\n                if (Array.isArray(self[(typeof key === \"number\" && key < 0) ? self.length + key : key])) {\n                    if (self[(typeof key === \"number\" && key < 0) ? self.length + key : key].length) {\n                        p(pad + \" \" + blue + key + \": \" + reset + \"[\");\n                        if (depth > 1) {\n                            var ρσ_Iter12 = ρσ_Iterable(self[(typeof key === \"number\" && key < 0) ? self.length + key : key]);\n                            for (var ρσ_Index12 = 0; ρσ_Index12 < ρσ_Iter12.length; ρσ_Index12++) {\n                                element = ρσ_Iter12[ρσ_Index12];\n                                element._dump(depth - 1, omit, offset + 1, true);\n                            }\n                        } else {\n                            var ρσ_Iter13 = ρσ_Iterable(self[(typeof key === \"number\" && key < 0) ? self.length + key : key]);\n                            for (var ρσ_Index13 = 0; ρσ_Index13 < ρσ_Iter13.length; ρσ_Index13++) {\n                                element = ρσ_Iter13[ρσ_Index13];\n                                p(pad + \"   \" + yellow + element.constructor.name.slice(4) + reset);\n                            }\n                        }\n                        p(pad + \" ]\");\n                    } else {\n                        p(pad + \" \" + blue + key + \": \" + reset + \"[]\");\n                    }\n                } else if (self[(typeof key === \"number\" && key < 0) ? self.length + key : key]) {\n                    if (is_node_type(self[(typeof key === \"number\" && key < 0) ? self.length + key : key], AST)) {\n                        tname = self[(typeof key === \"number\" && key < 0) ? self.length + key : key].constructor.name.slice(4);\n                        if (tname === \"Token\") {\n                            p(pad + \" \" + blue + key + \": \" + magenta + tname + reset);\n                            var ρσ_Iter14 = ρσ_Iterable(self[(typeof key === \"number\" && key < 0) ? self.length + key : key]);\n                            for (var ρσ_Index14 = 0; ρσ_Index14 < ρσ_Iter14.length; ρσ_Index14++) {\n                                property = ρσ_Iter14[ρσ_Index14];\n                                p(pad + \"   \" + blue + property + \": \" + reset + (ρσ_expr_temp = self[(typeof key === \"number\" && key < 0) ? self.length + key : key])[(typeof property === \"number\" && property < 0) ? ρσ_expr_temp.length + property : property]);\n                            }\n                        } else {\n                            p(pad + \" \" + blue + key + \": \" + yellow + tname + reset);\n                            if (depth > 1) {\n                                self[(typeof key === \"number\" && key < 0) ? self.length + key : key]._dump(depth - 1, omit, offset + 1, false);\n                            }\n                        }\n                    } else if (typeof self[(typeof key === \"number\" && key < 0) ? self.length + key : key] === \"string\") {\n                        p(pad + \" \" + blue + key + \": \" + green + \"\\\"\" + self[(typeof key === \"number\" && key < 0) ? self.length + key : key] + \"\\\"\" + reset);\n                    } else if (typeof self[(typeof key === \"number\" && key < 0) ? self.length + key : key] === \"number\") {\n                        p(pad + \" \" + blue + key + \": \" + green + self[(typeof key === \"number\" && key < 0) ? self.length + key : key] + reset);\n                    } else {\n                        p(pad + \" \" + blue + key + \": \" + red + self[(typeof key === \"number\" && key < 0) ? self.length + key : key] + reset);\n                    }\n                } else {\n                    p(pad + \" \" + blue + key + \": \" + reset + self[(typeof key === \"number\" && key < 0) ? self.length + key : key]);\n                }\n            }\n        };\n        if (!AST_Node.prototype._dump.__defaults__) Object.defineProperties(AST_Node.prototype._dump, {\n            __defaults__ : {value: {depth:100, omit:(function(){\n                var s = ρσ_set();\n                s.jsset.add(\"start\");\n                s.jsset.add(\"end\");\n                return s;\n            })(), offset:0, include_name:true}},\n            __handles_kwarg_interpolation__ : {value: true},\n            __argnames__ : {value: [\"depth\", \"omit\", \"offset\", \"include_name\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Node.prototype.dump = function dump() {\n            var self = this;\n            var depth = (arguments[0] === undefined || ( 0 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? dump.__defaults__.depth : arguments[0];\n            var omit = (arguments[1] === undefined || ( 1 === arguments.length-1 && arguments[arguments.length-1] !== null && typeof arguments[arguments.length-1] === \"object\" && arguments[arguments.length-1] [ρσ_kwargs_symbol] === true)) ? dump.__defaults__.omit : arguments[1];\n            var ρσ_kwargs_obj = arguments[arguments.length-1];\n            if (ρσ_kwargs_obj === null || typeof ρσ_kwargs_obj !== \"object\" || ρσ_kwargs_obj [ρσ_kwargs_symbol] !== true) ρσ_kwargs_obj = {};\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"depth\")){\n                depth = ρσ_kwargs_obj.depth;\n            }\n            if (Object.prototype.hasOwnProperty.call(ρσ_kwargs_obj, \"omit\")){\n                omit = ρσ_kwargs_obj.omit;\n            }\n            return self._dump(depth, omit, 0, true);\n        };\n        if (!AST_Node.prototype.dump.__defaults__) Object.defineProperties(AST_Node.prototype.dump, {\n            __defaults__ : {value: {depth:2, omit:Object.create(null)}},\n            __handles_kwarg_interpolation__ : {value: true},\n            __argnames__ : {value: [\"depth\", \"omit\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Node.prototype.__repr__ = function __repr__ () {\n            if(AST.prototype.__repr__) return AST.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Node.prototype.__str__ = function __str__ () {\n            if(AST.prototype.__str__) return AST.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Node.prototype, \"__bases__\", {value: [AST]});\n        AST_Node.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"start\"] = \"[AST_Token] The first token of this node\";\n            ρσ_d[\"end\"] = \"[AST_Token] The last token of this node\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Statement() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Statement.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Statement, AST_Node);\n        AST_Statement.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Statement.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Statement.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Statement.prototype, \"__bases__\", {value: [AST_Node]});\n\n        function AST_Debugger() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Debugger.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Debugger, AST_Statement);\n        AST_Debugger.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Debugger.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Debugger.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Debugger.prototype, \"__bases__\", {value: [AST_Statement]});\n\n        function AST_Directive() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Directive.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Directive, AST_Statement);\n        AST_Directive.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Directive.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Directive.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Directive.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Directive.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[string] The value of this directive as a plain string (it's not an AST_String!)\";\n            ρσ_d[\"scope\"] = \"[AST_Scope/S] The scope that this directive affects\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SimpleStatement() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SimpleStatement.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SimpleStatement, AST_Statement);\n        AST_SimpleStatement.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_SimpleStatement.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.body._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_SimpleStatement.prototype._walk.__argnames__) Object.defineProperties(AST_SimpleStatement.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_SimpleStatement.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SimpleStatement.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SimpleStatement.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_SimpleStatement.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"body\"] = \"[AST_Node] an expression node (should not be instanceof AST_Statement)\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Assert() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Assert.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Assert, AST_Statement);\n        AST_Assert.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Assert.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.condition._walk(visitor);\n                    if (self.message) {\n                        self.message._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Assert.prototype._walk.__argnames__) Object.defineProperties(AST_Assert.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Assert.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Assert.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Assert.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Assert.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Node] the expression that should be tested\";\n            ρσ_d[\"message\"] = \"[AST_Node*] the expression that is the error message or None\";\n            return ρσ_d;\n        }).call(this);\n\n        function walk_body(node, visitor) {\n            var stat;\n            if (is_node_type(node.body, AST_Statement)) {\n                node.body._walk(visitor);\n            } else if (node.body) {\n                var ρσ_Iter15 = ρσ_Iterable(node.body);\n                for (var ρσ_Index15 = 0; ρσ_Index15 < ρσ_Iter15.length; ρσ_Index15++) {\n                    stat = ρσ_Iter15[ρσ_Index15];\n                    stat._walk(visitor);\n                }\n            }\n        };\n        if (!walk_body.__argnames__) Object.defineProperties(walk_body, {\n            __argnames__ : {value: [\"node\", \"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n\n        function AST_Block() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Block.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Block, AST_Statement);\n        AST_Block.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Block.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    walk_body(self, visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Block.prototype._walk.__argnames__) Object.defineProperties(AST_Block.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Block.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Block.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Block.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Block.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"body\"] = \"[AST_Statement*] an array of statements\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_BlockStatement() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_BlockStatement.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_BlockStatement, AST_Block);\n        AST_BlockStatement.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_BlockStatement.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_BlockStatement.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_BlockStatement.prototype, \"__bases__\", {value: [AST_Block]});\n\n        function AST_EmptyStatement() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_EmptyStatement.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_EmptyStatement, AST_Statement);\n        AST_EmptyStatement.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_EmptyStatement.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self);\n        };\n        if (!AST_EmptyStatement.prototype._walk.__argnames__) Object.defineProperties(AST_EmptyStatement.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_EmptyStatement.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_EmptyStatement.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_EmptyStatement.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_EmptyStatement.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"stype\"] = \"[string] the type of empty statement. Is ; for semicolons\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_StatementWithBody() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_StatementWithBody, AST_Statement);\n        AST_StatementWithBody.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_StatementWithBody.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.body._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_StatementWithBody.prototype._walk.__argnames__) Object.defineProperties(AST_StatementWithBody.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_StatementWithBody.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_StatementWithBody.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_StatementWithBody.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_StatementWithBody.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"body\"] = \"[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_DWLoop() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_DWLoop.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_DWLoop, AST_StatementWithBody);\n        AST_DWLoop.prototype.__init__ = function __init__ () {\n            AST_StatementWithBody.prototype.__init__ && AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        };\n        AST_DWLoop.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.condition._walk(visitor);\n                    self.body._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_DWLoop.prototype._walk.__argnames__) Object.defineProperties(AST_DWLoop.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_DWLoop.prototype.__repr__ = function __repr__ () {\n            if(AST_StatementWithBody.prototype.__repr__) return AST_StatementWithBody.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_DWLoop.prototype.__str__ = function __str__ () {\n            if(AST_StatementWithBody.prototype.__str__) return AST_StatementWithBody.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_DWLoop.prototype, \"__bases__\", {value: [AST_StatementWithBody]});\n        AST_DWLoop.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Node] the loop condition.  Should not be instanceof AST_Statement\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Do() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Do.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Do, AST_DWLoop);\n        AST_Do.prototype.__init__ = function __init__ () {\n            AST_DWLoop.prototype.__init__ && AST_DWLoop.prototype.__init__.apply(this, arguments);\n        };\n        AST_Do.prototype.__repr__ = function __repr__ () {\n            if(AST_DWLoop.prototype.__repr__) return AST_DWLoop.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Do.prototype.__str__ = function __str__ () {\n            if(AST_DWLoop.prototype.__str__) return AST_DWLoop.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Do.prototype, \"__bases__\", {value: [AST_DWLoop]});\n\n        function AST_While() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_While.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_While, AST_DWLoop);\n        AST_While.prototype.__init__ = function __init__ () {\n            AST_DWLoop.prototype.__init__ && AST_DWLoop.prototype.__init__.apply(this, arguments);\n        };\n        AST_While.prototype.__repr__ = function __repr__ () {\n            if(AST_DWLoop.prototype.__repr__) return AST_DWLoop.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_While.prototype.__str__ = function __str__ () {\n            if(AST_DWLoop.prototype.__str__) return AST_DWLoop.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_While.prototype, \"__bases__\", {value: [AST_DWLoop]});\n\n        function AST_ForIn() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ForIn.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ForIn, AST_StatementWithBody);\n        AST_ForIn.prototype.__init__ = function __init__ () {\n            AST_StatementWithBody.prototype.__init__ && AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        };\n        AST_ForIn.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.init._walk(visitor);\n                    if (self.name) self.name._walk(visitor);\n                    self.object._walk(visitor);\n                    if (self.body) {\n                        self.body._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_ForIn.prototype._walk.__argnames__) Object.defineProperties(AST_ForIn.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_ForIn.prototype.__repr__ = function __repr__ () {\n            if(AST_StatementWithBody.prototype.__repr__) return AST_StatementWithBody.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ForIn.prototype.__str__ = function __str__ () {\n            if(AST_StatementWithBody.prototype.__str__) return AST_StatementWithBody.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ForIn.prototype, \"__bases__\", {value: [AST_StatementWithBody]});\n        AST_ForIn.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"init\"] = \"[AST_Node] the `for/in` initialization code\";\n            ρσ_d[\"name\"] = \"[AST_SymbolRef?] the loop variable, only if `init` is AST_Var\";\n            ρσ_d[\"object\"] = \"[AST_Node] the object that we're looping through\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_ForJS() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ForJS.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ForJS, AST_StatementWithBody);\n        AST_ForJS.prototype.__init__ = function __init__ () {\n            AST_StatementWithBody.prototype.__init__ && AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        };\n        AST_ForJS.prototype.__repr__ = function __repr__ () {\n            if(AST_StatementWithBody.prototype.__repr__) return AST_StatementWithBody.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ForJS.prototype.__str__ = function __str__ () {\n            if(AST_StatementWithBody.prototype.__str__) return AST_StatementWithBody.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ForJS.prototype, \"__bases__\", {value: [AST_StatementWithBody]});\n        AST_ForJS.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Verbatim] raw JavaScript conditional\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_ListComprehension() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ListComprehension.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ListComprehension, AST_ForIn);\n        AST_ListComprehension.prototype.__init__ = function __init__ () {\n            AST_ForIn.prototype.__init__ && AST_ForIn.prototype.__init__.apply(this, arguments);\n        };\n        AST_ListComprehension.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.init._walk(visitor);\n                    self.object._walk(visitor);\n                    self.statement._walk(visitor);\n                    if (self.condition) self.condition._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_ListComprehension.prototype._walk.__argnames__) Object.defineProperties(AST_ListComprehension.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_ListComprehension.prototype.__repr__ = function __repr__ () {\n            if(AST_ForIn.prototype.__repr__) return AST_ForIn.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ListComprehension.prototype.__str__ = function __str__ () {\n            if(AST_ForIn.prototype.__str__) return AST_ForIn.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ListComprehension.prototype, \"__bases__\", {value: [AST_ForIn]});\n        AST_ListComprehension.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Node] the `if` condition\";\n            ρσ_d[\"statement\"] = \"[AST_Node] statement to perform on each element before returning it\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SetComprehension() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SetComprehension.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SetComprehension, AST_ListComprehension);\n        AST_SetComprehension.prototype.__init__ = function __init__ () {\n            AST_ListComprehension.prototype.__init__ && AST_ListComprehension.prototype.__init__.apply(this, arguments);\n        };\n        AST_SetComprehension.prototype.__repr__ = function __repr__ () {\n            if(AST_ListComprehension.prototype.__repr__) return AST_ListComprehension.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SetComprehension.prototype.__str__ = function __str__ () {\n            if(AST_ListComprehension.prototype.__str__) return AST_ListComprehension.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SetComprehension.prototype, \"__bases__\", {value: [AST_ListComprehension]});\n\n        function AST_DictComprehension() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_DictComprehension.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_DictComprehension, AST_ListComprehension);\n        AST_DictComprehension.prototype.__init__ = function __init__ () {\n            AST_ListComprehension.prototype.__init__ && AST_ListComprehension.prototype.__init__.apply(this, arguments);\n        };\n        AST_DictComprehension.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.init._walk(visitor);\n                    self.object._walk(visitor);\n                    self.statement._walk(visitor);\n                    self.value_statement._walk(visitor);\n                    if (self.condition) self.condition._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_DictComprehension.prototype._walk.__argnames__) Object.defineProperties(AST_DictComprehension.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_DictComprehension.prototype.__repr__ = function __repr__ () {\n            if(AST_ListComprehension.prototype.__repr__) return AST_ListComprehension.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_DictComprehension.prototype.__str__ = function __str__ () {\n            if(AST_ListComprehension.prototype.__str__) return AST_ListComprehension.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_DictComprehension.prototype, \"__bases__\", {value: [AST_ListComprehension]});\n        AST_DictComprehension.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value_statement\"] = \"[AST_Node] statement to perform on each value before returning it\";\n            ρσ_d[\"is_pydict\"] = \"[bool] True if this comprehension is for a python dict\";\n            ρσ_d[\"is_jshash\"] = \"[bool] True if this comprehension is for a js hash\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_GeneratorComprehension() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_GeneratorComprehension.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_GeneratorComprehension, AST_ListComprehension);\n        AST_GeneratorComprehension.prototype.__init__ = function __init__ () {\n            AST_ListComprehension.prototype.__init__ && AST_ListComprehension.prototype.__init__.apply(this, arguments);\n        };\n        AST_GeneratorComprehension.prototype.__repr__ = function __repr__ () {\n            if(AST_ListComprehension.prototype.__repr__) return AST_ListComprehension.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_GeneratorComprehension.prototype.__str__ = function __str__ () {\n            if(AST_ListComprehension.prototype.__str__) return AST_ListComprehension.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_GeneratorComprehension.prototype, \"__bases__\", {value: [AST_ListComprehension]});\n\n        function AST_With() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_With.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_With, AST_StatementWithBody);\n        AST_With.prototype.__init__ = function __init__ () {\n            AST_StatementWithBody.prototype.__init__ && AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        };\n        AST_With.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var exp;\n                    var ρσ_Iter16 = ρσ_Iterable(self.clauses);\n                    for (var ρσ_Index16 = 0; ρσ_Index16 < ρσ_Iter16.length; ρσ_Index16++) {\n                        exp = ρσ_Iter16[ρσ_Index16];\n                        exp._walk(visitor);\n                    }\n                    self.body._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_With.prototype._walk.__argnames__) Object.defineProperties(AST_With.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_With.prototype.__repr__ = function __repr__ () {\n            if(AST_StatementWithBody.prototype.__repr__) return AST_StatementWithBody.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_With.prototype.__str__ = function __str__ () {\n            if(AST_StatementWithBody.prototype.__str__) return AST_StatementWithBody.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_With.prototype, \"__bases__\", {value: [AST_StatementWithBody]});\n        AST_With.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"clauses\"] = \"[AST_WithClause*] the `with` clauses (comma separated)\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_WithClause() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_WithClause.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_WithClause, AST_Node);\n        AST_WithClause.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_WithClause.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                    if (self.alias) {\n                        self.alias._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_WithClause.prototype._walk.__argnames__) Object.defineProperties(AST_WithClause.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_WithClause.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_WithClause.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_WithClause.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_WithClause.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"expression\"] = \"[AST_Node] the expression\";\n            ρσ_d[\"alias\"] = \"[AST_SymbolAlias?] optional alias for this expression\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Scope() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Scope.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Scope, AST_Block);\n        AST_Scope.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Scope.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Scope.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Scope.prototype, \"__bases__\", {value: [AST_Block]});\n        AST_Scope.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"localvars\"] = \"[SymbolDef*] list of variables local to this scope\";\n            ρσ_d[\"docstrings\"] = \"[AST_String*] list of docstrings for this scope\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Toplevel() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Toplevel.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Toplevel, AST_Scope);\n        AST_Toplevel.prototype.__init__ = function __init__ () {\n            AST_Scope.prototype.__init__ && AST_Scope.prototype.__init__.apply(this, arguments);\n        };\n        AST_Toplevel.prototype.__repr__ = function __repr__ () {\n            if(AST_Scope.prototype.__repr__) return AST_Scope.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Toplevel.prototype.__str__ = function __str__ () {\n            if(AST_Scope.prototype.__str__) return AST_Scope.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Toplevel.prototype, \"__bases__\", {value: [AST_Scope]});\n        AST_Toplevel.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"globals\"] = \"[Object/S] a map of name -> SymbolDef for all undeclared names\";\n            ρσ_d[\"baselib\"] = \"[Object/s] a collection of used parts of baselib\";\n            ρσ_d[\"imports\"] = \"[Object/S] a map of module_id->AST_Toplevel for all imported modules (this represents all imported modules across all source files)\";\n            ρσ_d[\"imported_module_ids\"] = \"[string*] a list of module ids that were imported by this module, specifically\";\n            ρσ_d[\"nonlocalvars\"] = \"[String*] a list of all non-local variable names (names that come from the global scope)\";\n            ρσ_d[\"shebang\"] = \"[string] If #! line is present, it will be stored here\";\n            ρσ_d[\"import_order\"] = \"[number] The global order in which this scope was imported\";\n            ρσ_d[\"module_id\"] = \"[string] The id of this module\";\n            ρσ_d[\"exports\"] = \"[SymbolDef*] list of names exported from this module\";\n            ρσ_d[\"classes\"] = \"[Object/S] a map of class names to AST_Class for classes defined in this module\";\n            ρσ_d[\"filename\"] = \"[string] The absolute path to the file from which this module was read\";\n            ρσ_d[\"srchash\"] = \"[string] SHA1 hash of source code, used for caching\";\n            ρσ_d[\"comments_after\"] = \"[array] True iff there were comments before this token\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Import() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Import.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Import, AST_Statement);\n        AST_Import.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Import.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var arg;\n                    if (self.alias) {\n                        self.alias._walk(visitor);\n                    }\n                    if (self.argnames) {\n                        var ρσ_Iter17 = ρσ_Iterable(self.argnames);\n                        for (var ρσ_Index17 = 0; ρσ_Index17 < ρσ_Iter17.length; ρσ_Index17++) {\n                            arg = ρσ_Iter17[ρσ_Index17];\n                            arg._walk(visitor);\n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Import.prototype._walk.__argnames__) Object.defineProperties(AST_Import.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Import.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Import.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Import.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Import.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"module\"] = \"[AST_SymbolVar] name of the module we're importing\";\n            ρσ_d[\"key\"] = \"[string] The key by which this module is stored in the global modules mapping\";\n            ρσ_d[\"alias\"] = \"[AST_SymbolAlias] The name this module is imported as, can be None. For import x as y statements.\";\n            ρσ_d[\"argnames\"] = \"[AST_ImportedVar*] names of objects to be imported\";\n            ρσ_d[\"body\"] = \"[AST_TopLevel] parsed contents of the imported file\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Imports() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Imports.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Imports, AST_Statement);\n        AST_Imports.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Imports.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var imp;\n                    var ρσ_Iter18 = ρσ_Iterable(self.imports);\n                    for (var ρσ_Index18 = 0; ρσ_Index18 < ρσ_Iter18.length; ρσ_Index18++) {\n                        imp = ρσ_Iter18[ρσ_Index18];\n                        imp._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Imports.prototype._walk.__argnames__) Object.defineProperties(AST_Imports.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Imports.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Imports.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Imports.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Imports.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"imports\"] = \"[AST_Import+] array of imports\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Decorator() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Decorator.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Decorator, AST_Node);\n        AST_Decorator.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Decorator.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    if (self.expression) {\n                        self.expression.walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Decorator.prototype._walk.__argnames__) Object.defineProperties(AST_Decorator.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Decorator.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Decorator.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Decorator.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Decorator.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"expression\"] = \"[AST_Node] the decorator expression\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Lambda() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Lambda.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Lambda, AST_Scope);\n        AST_Lambda.prototype.__init__ = function __init__ () {\n            AST_Scope.prototype.__init__ && AST_Scope.prototype.__init__.apply(this, arguments);\n        };\n        AST_Lambda.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var d, arg;\n                    if (self.decorators) {\n                        var ρσ_Iter19 = ρσ_Iterable(self.decorators);\n                        for (var ρσ_Index19 = 0; ρσ_Index19 < ρσ_Iter19.length; ρσ_Index19++) {\n                            d = ρσ_Iter19[ρσ_Index19];\n                            d.walk(visitor);\n                        }\n                    }\n                    if (self.name) {\n                        self.name._walk(visitor);\n                    }\n                    var ρσ_Iter20 = ρσ_Iterable(self.argnames);\n                    for (var ρσ_Index20 = 0; ρσ_Index20 < ρσ_Iter20.length; ρσ_Index20++) {\n                        arg = ρσ_Iter20[ρσ_Index20];\n                        arg._walk(visitor);\n                    }\n                    if (self.argnames.starargs) {\n                        self.argnames.starargs._walk(visitor);\n                    }\n                    if (self.argnames.kwargs) {\n                        self.argnames.kwargs._walk(visitor);\n                    }\n                    walk_body(self, visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Lambda.prototype._walk.__argnames__) Object.defineProperties(AST_Lambda.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Lambda.prototype.__repr__ = function __repr__ () {\n            if(AST_Scope.prototype.__repr__) return AST_Scope.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Lambda.prototype.__str__ = function __str__ () {\n            if(AST_Scope.prototype.__str__) return AST_Scope.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Lambda.prototype, \"__bases__\", {value: [AST_Scope]});\n        AST_Lambda.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"name\"] = \"[AST_SymbolDeclaration?] the name of this function\";\n            ρσ_d[\"argnames\"] = \"[AST_SymbolFunarg*] array of function arguments\";\n            ρσ_d[\"decorators\"] = \"[AST_Decorator*] function decorators, if any\";\n            ρσ_d[\"is_generator\"] = \"[bool*] True iff this function is a generator\";\n            ρσ_d[\"is_expression\"] = \"[bool*] True iff this function is a function expression\";\n            ρσ_d[\"is_anonymous\"] = \"[bool*] True iff this function is an anonymous function\";\n            ρσ_d[\"return_annotation\"] = \"[AST_Node?] The return type annotation provided (if any)\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Function() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Function.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Function, AST_Lambda);\n        AST_Function.prototype.__init__ = function __init__ () {\n            AST_Lambda.prototype.__init__ && AST_Lambda.prototype.__init__.apply(this, arguments);\n        };\n        AST_Function.prototype.__repr__ = function __repr__ () {\n            if(AST_Lambda.prototype.__repr__) return AST_Lambda.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Function.prototype.__str__ = function __str__ () {\n            if(AST_Lambda.prototype.__str__) return AST_Lambda.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Function.prototype, \"__bases__\", {value: [AST_Lambda]});\n\n        function AST_Class() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Class.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Class, AST_Scope);\n        AST_Class.prototype.__init__ = function __init__ () {\n            AST_Scope.prototype.__init__ && AST_Scope.prototype.__init__.apply(this, arguments);\n        };\n        AST_Class.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var d;\n                    if (self.decorators) {\n                        var ρσ_Iter21 = ρσ_Iterable(self.decorators);\n                        for (var ρσ_Index21 = 0; ρσ_Index21 < ρσ_Iter21.length; ρσ_Index21++) {\n                            d = ρσ_Iter21[ρσ_Index21];\n                            d.walk(visitor);\n                        }\n                    }\n                    self.name._walk(visitor);\n                    walk_body(self, visitor);\n                    if (self.parent) self.parent._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Class.prototype._walk.__argnames__) Object.defineProperties(AST_Class.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Class.prototype.__repr__ = function __repr__ () {\n            if(AST_Scope.prototype.__repr__) return AST_Scope.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Class.prototype.__str__ = function __str__ () {\n            if(AST_Scope.prototype.__str__) return AST_Scope.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Class.prototype, \"__bases__\", {value: [AST_Scope]});\n        AST_Class.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"name\"] = \"[AST_SymbolDeclaration?] the name of this class\";\n            ρσ_d[\"init\"] = \"[AST_Function] constructor for the class\";\n            ρσ_d[\"parent\"] = \"[AST_Symbol?] parent class this class inherits from\";\n            ρσ_d[\"bases\"] = \"[AST_Symbol*] list of base classes this class inherits from\";\n            ρσ_d[\"static\"] = \"[dict] A hash whose keys are names of static methods for this class\";\n            ρσ_d[\"external\"] = \"[boolean] true if class is declared elsewhere, but will be within current scope at runtime\";\n            ρσ_d[\"bound\"] = \"[string*] list of methods that need to be bound to self\";\n            ρσ_d[\"decorators\"] = \"[AST_Decorator*] function decorators, if any\";\n            ρσ_d[\"module_id\"] = \"[string] The id of the module this class is defined in\";\n            ρσ_d[\"statements\"] = \"[AST_Node*] list of statements in the class scope (excluding method definitions)\";\n            ρσ_d[\"dynamic_properties\"] = \"[dict] map of dynamic property names to property descriptors of the form {getter:AST_Method, setter:AST_Method\";\n            ρσ_d[\"classvars\"] = \"[dict] map containing all class variables as keys, to be used to easily test for existence of a class variable\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Method() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Method.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Method, AST_Lambda);\n        AST_Method.prototype.__init__ = function __init__ () {\n            AST_Lambda.prototype.__init__ && AST_Lambda.prototype.__init__.apply(this, arguments);\n        };\n        AST_Method.prototype.__repr__ = function __repr__ () {\n            if(AST_Lambda.prototype.__repr__) return AST_Lambda.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Method.prototype.__str__ = function __str__ () {\n            if(AST_Lambda.prototype.__str__) return AST_Lambda.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Method.prototype, \"__bases__\", {value: [AST_Lambda]});\n        AST_Method.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"static\"] = \"[boolean] true if method is static\";\n            ρσ_d[\"is_getter\"] = \"[boolean] true if method is a property getter\";\n            ρσ_d[\"is_setter\"] = \"[boolean] true if method is a property setter\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Jump() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Jump.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Jump, AST_Statement);\n        AST_Jump.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Jump.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Jump.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Jump.prototype, \"__bases__\", {value: [AST_Statement]});\n\n        function AST_Exit() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Exit.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Exit, AST_Jump);\n        AST_Exit.prototype.__init__ = function __init__ () {\n            AST_Jump.prototype.__init__ && AST_Jump.prototype.__init__.apply(this, arguments);\n        };\n        AST_Exit.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    if (self.value) {\n                        self.value._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Exit.prototype._walk.__argnames__) Object.defineProperties(AST_Exit.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Exit.prototype.__repr__ = function __repr__ () {\n            if(AST_Jump.prototype.__repr__) return AST_Jump.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Exit.prototype.__str__ = function __str__ () {\n            if(AST_Jump.prototype.__str__) return AST_Jump.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Exit.prototype, \"__bases__\", {value: [AST_Jump]});\n        AST_Exit.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Return() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Return.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Return, AST_Exit);\n        AST_Return.prototype.__init__ = function __init__ () {\n            AST_Exit.prototype.__init__ && AST_Exit.prototype.__init__.apply(this, arguments);\n        };\n        AST_Return.prototype.__repr__ = function __repr__ () {\n            if(AST_Exit.prototype.__repr__) return AST_Exit.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Return.prototype.__str__ = function __str__ () {\n            if(AST_Exit.prototype.__str__) return AST_Exit.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Return.prototype, \"__bases__\", {value: [AST_Exit]});\n\n        function AST_Yield() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Yield.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Yield, AST_Return);\n        AST_Yield.prototype.__init__ = function __init__ () {\n            AST_Return.prototype.__init__ && AST_Return.prototype.__init__.apply(this, arguments);\n        };\n        AST_Yield.prototype.__repr__ = function __repr__ () {\n            if(AST_Return.prototype.__repr__) return AST_Return.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Yield.prototype.__str__ = function __str__ () {\n            if(AST_Return.prototype.__str__) return AST_Return.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Yield.prototype, \"__bases__\", {value: [AST_Return]});\n        AST_Yield.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"is_yield_from\"] = \"[bool] True iff this is a yield from, False otherwise\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Throw() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Throw.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Throw, AST_Exit);\n        AST_Throw.prototype.__init__ = function __init__ () {\n            AST_Exit.prototype.__init__ && AST_Exit.prototype.__init__.apply(this, arguments);\n        };\n        AST_Throw.prototype.__repr__ = function __repr__ () {\n            if(AST_Exit.prototype.__repr__) return AST_Exit.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Throw.prototype.__str__ = function __str__ () {\n            if(AST_Exit.prototype.__str__) return AST_Exit.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Throw.prototype, \"__bases__\", {value: [AST_Exit]});\n\n        function AST_LoopControl() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_LoopControl.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_LoopControl, AST_Jump);\n        AST_LoopControl.prototype.__init__ = function __init__ () {\n            AST_Jump.prototype.__init__ && AST_Jump.prototype.__init__.apply(this, arguments);\n        };\n        AST_LoopControl.prototype.__repr__ = function __repr__ () {\n            if(AST_Jump.prototype.__repr__) return AST_Jump.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_LoopControl.prototype.__str__ = function __str__ () {\n            if(AST_Jump.prototype.__str__) return AST_Jump.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_LoopControl.prototype, \"__bases__\", {value: [AST_Jump]});\n\n        function AST_Break() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Break.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Break, AST_LoopControl);\n        AST_Break.prototype.__init__ = function __init__ () {\n            AST_LoopControl.prototype.__init__ && AST_LoopControl.prototype.__init__.apply(this, arguments);\n        };\n        AST_Break.prototype.__repr__ = function __repr__ () {\n            if(AST_LoopControl.prototype.__repr__) return AST_LoopControl.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Break.prototype.__str__ = function __str__ () {\n            if(AST_LoopControl.prototype.__str__) return AST_LoopControl.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Break.prototype, \"__bases__\", {value: [AST_LoopControl]});\n\n        function AST_Continue() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Continue.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Continue, AST_LoopControl);\n        AST_Continue.prototype.__init__ = function __init__ () {\n            AST_LoopControl.prototype.__init__ && AST_LoopControl.prototype.__init__.apply(this, arguments);\n        };\n        AST_Continue.prototype.__repr__ = function __repr__ () {\n            if(AST_LoopControl.prototype.__repr__) return AST_LoopControl.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Continue.prototype.__str__ = function __str__ () {\n            if(AST_LoopControl.prototype.__str__) return AST_LoopControl.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Continue.prototype, \"__bases__\", {value: [AST_LoopControl]});\n\n        function AST_If() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_If.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_If, AST_StatementWithBody);\n        AST_If.prototype.__init__ = function __init__ () {\n            AST_StatementWithBody.prototype.__init__ && AST_StatementWithBody.prototype.__init__.apply(this, arguments);\n        };\n        AST_If.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.condition._walk(visitor);\n                    self.body._walk(visitor);\n                    if (self.alternative) {\n                        self.alternative._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_If.prototype._walk.__argnames__) Object.defineProperties(AST_If.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_If.prototype.__repr__ = function __repr__ () {\n            if(AST_StatementWithBody.prototype.__repr__) return AST_StatementWithBody.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_If.prototype.__str__ = function __str__ () {\n            if(AST_StatementWithBody.prototype.__str__) return AST_StatementWithBody.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_If.prototype, \"__bases__\", {value: [AST_StatementWithBody]});\n        AST_If.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Node] the `if` condition\";\n            ρσ_d[\"alternative\"] = \"[AST_Statement?] the `else` part, or null if not present\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Try() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Try.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Try, AST_Block);\n        AST_Try.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Try.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    walk_body(self, visitor);\n                    if (self.bcatch) {\n                        self.bcatch._walk(visitor);\n                    }\n                    if (self.belse) {\n                        self.belse._walk(visitor);\n                    }\n                    if (self.bfinally) {\n                        self.bfinally._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Try.prototype._walk.__argnames__) Object.defineProperties(AST_Try.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Try.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Try.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Try.prototype, \"__bases__\", {value: [AST_Block]});\n        AST_Try.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"bcatch\"] = \"[AST_Catch?] the catch block, or null if not present\";\n            ρσ_d[\"bfinally\"] = \"[AST_Finally?] the finally block, or null if not present\";\n            ρσ_d[\"belse\"] = \"[AST_Else?] the else block for null if not present\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Catch() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Catch.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Catch, AST_Block);\n        AST_Catch.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Catch.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Catch.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Catch.prototype, \"__bases__\", {value: [AST_Block]});\n\n        function AST_Except() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Except.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Except, AST_Block);\n        AST_Except.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Except.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(this, (function() {\n                var ρσ_anonfunc = function () {\n                    var e;\n                    if (self.argname) {\n                        self.argname.walk(visitor);\n                    }\n                    if (self.errors) {\n                        var ρσ_Iter22 = ρσ_Iterable(self.errors);\n                        for (var ρσ_Index22 = 0; ρσ_Index22 < ρσ_Iter22.length; ρσ_Index22++) {\n                            e = ρσ_Iter22[ρσ_Index22];\n                            e.walk(visitor);\n                        }\n                    }\n                    walk_body(self, visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Except.prototype._walk.__argnames__) Object.defineProperties(AST_Except.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Except.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Except.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Except.prototype, \"__bases__\", {value: [AST_Block]});\n        AST_Except.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"argname\"] = \"[AST_SymbolCatch] symbol for the exception\";\n            ρσ_d[\"errors\"] = \"[AST_SymbolVar*] error classes to catch in this block\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Finally() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Finally.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Finally, AST_Block);\n        AST_Finally.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Finally.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Finally.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Finally.prototype, \"__bases__\", {value: [AST_Block]});\n\n        function AST_Else() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Else.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Else, AST_Block);\n        AST_Else.prototype.__init__ = function __init__ () {\n            AST_Block.prototype.__init__ && AST_Block.prototype.__init__.apply(this, arguments);\n        };\n        AST_Else.prototype.__repr__ = function __repr__ () {\n            if(AST_Block.prototype.__repr__) return AST_Block.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Else.prototype.__str__ = function __str__ () {\n            if(AST_Block.prototype.__str__) return AST_Block.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Else.prototype, \"__bases__\", {value: [AST_Block]});\n\n        function AST_Definitions() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Definitions.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Definitions, AST_Statement);\n        AST_Definitions.prototype.__init__ = function __init__ () {\n            AST_Statement.prototype.__init__ && AST_Statement.prototype.__init__.apply(this, arguments);\n        };\n        AST_Definitions.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var def_;\n                    var ρσ_Iter23 = ρσ_Iterable(self.definitions);\n                    for (var ρσ_Index23 = 0; ρσ_Index23 < ρσ_Iter23.length; ρσ_Index23++) {\n                        def_ = ρσ_Iter23[ρσ_Index23];\n                        def_._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Definitions.prototype._walk.__argnames__) Object.defineProperties(AST_Definitions.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Definitions.prototype.__repr__ = function __repr__ () {\n            if(AST_Statement.prototype.__repr__) return AST_Statement.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Definitions.prototype.__str__ = function __str__ () {\n            if(AST_Statement.prototype.__str__) return AST_Statement.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Definitions.prototype, \"__bases__\", {value: [AST_Statement]});\n        AST_Definitions.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"definitions\"] = \"[AST_VarDef*] array of variable definitions\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Var() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Var.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Var, AST_Definitions);\n        AST_Var.prototype.__init__ = function __init__ () {\n            AST_Definitions.prototype.__init__ && AST_Definitions.prototype.__init__.apply(this, arguments);\n        };\n        AST_Var.prototype.__repr__ = function __repr__ () {\n            if(AST_Definitions.prototype.__repr__) return AST_Definitions.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Var.prototype.__str__ = function __str__ () {\n            if(AST_Definitions.prototype.__str__) return AST_Definitions.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Var.prototype, \"__bases__\", {value: [AST_Definitions]});\n\n        function AST_VarDef() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_VarDef.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_VarDef, AST_Node);\n        AST_VarDef.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_VarDef.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.name._walk(visitor);\n                    if (self.value) {\n                        self.value._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_VarDef.prototype._walk.__argnames__) Object.defineProperties(AST_VarDef.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_VarDef.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_VarDef.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_VarDef.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_VarDef.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"name\"] = \"[AST_SymbolVar|AST_SymbolNonlocal] name of the variable\";\n            ρσ_d[\"value\"] = \"[AST_Node?] initializer, or null if there's no initializer\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_BaseCall() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_BaseCall.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_BaseCall, AST_Node);\n        AST_BaseCall.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_BaseCall.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_BaseCall.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_BaseCall.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_BaseCall.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"args\"] = \"[AST_Node*] array of arguments\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Call() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Call.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Call, AST_BaseCall);\n        AST_Call.prototype.__init__ = function __init__ () {\n            AST_BaseCall.prototype.__init__ && AST_BaseCall.prototype.__init__.apply(this, arguments);\n        };\n        AST_Call.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var arg;\n                    self.expression._walk(visitor);\n                    var ρσ_Iter24 = ρσ_Iterable(self.args);\n                    for (var ρσ_Index24 = 0; ρσ_Index24 < ρσ_Iter24.length; ρσ_Index24++) {\n                        arg = ρσ_Iter24[ρσ_Index24];\n                        arg._walk(visitor);\n                    }\n                    if (self.args.kwargs) {\n                        var ρσ_Iter25 = ρσ_Iterable(self.args.kwargs);\n                        for (var ρσ_Index25 = 0; ρσ_Index25 < ρσ_Iter25.length; ρσ_Index25++) {\n                            arg = ρσ_Iter25[ρσ_Index25];\n                            arg[0]._walk(visitor);\n                            arg[1]._walk(visitor);\n                        }\n                    }\n                    if (self.args.kwarg_items) {\n                        var ρσ_Iter26 = ρσ_Iterable(self.args.kwarg_items);\n                        for (var ρσ_Index26 = 0; ρσ_Index26 < ρσ_Iter26.length; ρσ_Index26++) {\n                            arg = ρσ_Iter26[ρσ_Index26];\n                            arg._walk(visitor);\n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Call.prototype._walk.__argnames__) Object.defineProperties(AST_Call.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Call.prototype.__repr__ = function __repr__ () {\n            if(AST_BaseCall.prototype.__repr__) return AST_BaseCall.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Call.prototype.__str__ = function __str__ () {\n            if(AST_BaseCall.prototype.__str__) return AST_BaseCall.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Call.prototype, \"__bases__\", {value: [AST_BaseCall]});\n        AST_Call.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"expression\"] = \"[AST_Node] expression to invoke as function\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_ClassCall() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ClassCall.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ClassCall, AST_BaseCall);\n        AST_ClassCall.prototype.__init__ = function __init__ () {\n            AST_BaseCall.prototype.__init__ && AST_BaseCall.prototype.__init__.apply(this, arguments);\n        };\n        AST_ClassCall.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var arg;\n                    if (self.expression) self.expression._walk(visitor);\n                    var ρσ_Iter27 = ρσ_Iterable(self.args);\n                    for (var ρσ_Index27 = 0; ρσ_Index27 < ρσ_Iter27.length; ρσ_Index27++) {\n                        arg = ρσ_Iter27[ρσ_Index27];\n                        arg._walk(visitor);\n                    }\n                    var ρσ_Iter28 = ρσ_Iterable(self.args.kwargs);\n                    for (var ρσ_Index28 = 0; ρσ_Index28 < ρσ_Iter28.length; ρσ_Index28++) {\n                        arg = ρσ_Iter28[ρσ_Index28];\n                        arg[0]._walk(visitor);\n                        arg[1]._walk(visitor);\n                    }\n                    var ρσ_Iter29 = ρσ_Iterable(self.args.kwarg_items);\n                    for (var ρσ_Index29 = 0; ρσ_Index29 < ρσ_Iter29.length; ρσ_Index29++) {\n                        arg = ρσ_Iter29[ρσ_Index29];\n                        arg._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_ClassCall.prototype._walk.__argnames__) Object.defineProperties(AST_ClassCall.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_ClassCall.prototype.__repr__ = function __repr__ () {\n            if(AST_BaseCall.prototype.__repr__) return AST_BaseCall.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ClassCall.prototype.__str__ = function __str__ () {\n            if(AST_BaseCall.prototype.__str__) return AST_BaseCall.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ClassCall.prototype, \"__bases__\", {value: [AST_BaseCall]});\n        AST_ClassCall.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"class\"] = \"[string] name of the class method belongs to\";\n            ρσ_d[\"method\"] = \"[string] class method being called\";\n            ρσ_d[\"static\"] = \"[boolean] defines whether the method is static\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_New() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_New.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_New, AST_Call);\n        AST_New.prototype.__init__ = function __init__ () {\n            AST_Call.prototype.__init__ && AST_Call.prototype.__init__.apply(this, arguments);\n        };\n        AST_New.prototype.__repr__ = function __repr__ () {\n            if(AST_Call.prototype.__repr__) return AST_Call.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_New.prototype.__str__ = function __str__ () {\n            if(AST_Call.prototype.__str__) return AST_Call.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_New.prototype, \"__bases__\", {value: [AST_Call]});\n\n        function AST_Seq() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Seq.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Seq, AST_Node);\n        AST_Seq.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Seq.prototype.to_array = function to_array() {\n            var self = this;\n            var p, a;\n            p = self;\n            a = ρσ_list_decorate([]);\n            while (p) {\n                a.push(p.car);\n                if (p.cdr && !(is_node_type(p.cdr, AST_Seq))) {\n                    a.push(p.cdr);\n                    break;\n                }\n                p = p.cdr;\n            }\n            return a;\n        };\n        if (!AST_Seq.prototype.to_array.__module__) Object.defineProperties(AST_Seq.prototype.to_array, {\n            __module__ : {value: \"ast\"}\n        });\n        AST_Seq.prototype.add = function add(node) {\n            var self = this;\n            var p, cell;\n            p = self;\n            while (p) {\n                if (!(is_node_type(p.cdr, AST_Seq))) {\n                    cell = AST_Seq.prototype.cons.call(p.cdr, node);\n                    return p.cdr = cell;\n                }\n                p = p.cdr;\n            }\n        };\n        if (!AST_Seq.prototype.add.__argnames__) Object.defineProperties(AST_Seq.prototype.add, {\n            __argnames__ : {value: [\"node\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Seq.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.car._walk(visitor);\n                    if (self.cdr) {\n                        self.cdr._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Seq.prototype._walk.__argnames__) Object.defineProperties(AST_Seq.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Seq.prototype.cons = function cons(x, y) {\n            var self = this;\n            var seq;\n            seq = new AST_Seq(x);\n            seq.car = x;\n            seq.cdr = y;\n            return seq;\n        };\n        if (!AST_Seq.prototype.cons.__argnames__) Object.defineProperties(AST_Seq.prototype.cons, {\n            __argnames__ : {value: [\"x\", \"y\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Seq.prototype.from_array = function from_array(array) {\n            var self = this;\n            var ans, i, p;\n            if (array.length === 0) {\n                return null;\n            }\n            if (array.length === 1) {\n                return array[0].clone();\n            }\n            ans = null;\n            for (var ρσ_Index30 = array.length - 1; ρσ_Index30 > -1; ρσ_Index30-=1) {\n                i = ρσ_Index30;\n                ans = AST_Seq.prototype.cons.call(array[(typeof i === \"number\" && i < 0) ? array.length + i : i], ans);\n            }\n            p = ans;\n            while (p) {\n                if (p.cdr && !p.cdr.cdr) {\n                    p.cdr = p.cdr.car;\n                    break;\n                }\n                p = p.cdr;\n            }\n            return ans;\n        };\n        if (!AST_Seq.prototype.from_array.__argnames__) Object.defineProperties(AST_Seq.prototype.from_array, {\n            __argnames__ : {value: [\"array\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Seq.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Seq.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Seq.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Seq.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"car\"] = \"[AST_Node] first element in sequence\";\n            ρσ_d[\"cdr\"] = \"[AST_Node] second element in sequence\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_PropAccess() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_PropAccess.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_PropAccess, AST_Node);\n        AST_PropAccess.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_PropAccess.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_PropAccess.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_PropAccess.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_PropAccess.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"expression\"] = \"[AST_Node] the “container” expression\";\n            ρσ_d[\"property\"] = \"[AST_Node|string] the property to access.  For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Dot() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Dot.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Dot, AST_PropAccess);\n        AST_Dot.prototype.__init__ = function __init__ () {\n            AST_PropAccess.prototype.__init__ && AST_PropAccess.prototype.__init__.apply(this, arguments);\n        };\n        AST_Dot.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Dot.prototype._walk.__argnames__) Object.defineProperties(AST_Dot.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Dot.prototype.__repr__ = function __repr__ () {\n            if(AST_PropAccess.prototype.__repr__) return AST_PropAccess.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Dot.prototype.__str__ = function __str__ () {\n            if(AST_PropAccess.prototype.__str__) return AST_PropAccess.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Dot.prototype, \"__bases__\", {value: [AST_PropAccess]});\n\n        function AST_Sub() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Sub.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Sub, AST_PropAccess);\n        AST_Sub.prototype.__init__ = function __init__ () {\n            AST_PropAccess.prototype.__init__ && AST_PropAccess.prototype.__init__.apply(this, arguments);\n        };\n        AST_Sub.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                    self.property._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Sub.prototype._walk.__argnames__) Object.defineProperties(AST_Sub.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Sub.prototype.__repr__ = function __repr__ () {\n            if(AST_PropAccess.prototype.__repr__) return AST_PropAccess.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Sub.prototype.__str__ = function __str__ () {\n            if(AST_PropAccess.prototype.__str__) return AST_PropAccess.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Sub.prototype, \"__bases__\", {value: [AST_PropAccess]});\n\n        function AST_ItemAccess() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ItemAccess.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ItemAccess, AST_PropAccess);\n        AST_ItemAccess.prototype.__init__ = function __init__ () {\n            AST_PropAccess.prototype.__init__ && AST_PropAccess.prototype.__init__.apply(this, arguments);\n        };\n        AST_ItemAccess.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                    self.property._walk(visitor);\n                    if (self.assignment) {\n                        self.assignment._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_ItemAccess.prototype._walk.__argnames__) Object.defineProperties(AST_ItemAccess.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_ItemAccess.prototype.__repr__ = function __repr__ () {\n            if(AST_PropAccess.prototype.__repr__) return AST_PropAccess.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ItemAccess.prototype.__str__ = function __str__ () {\n            if(AST_PropAccess.prototype.__str__) return AST_PropAccess.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ItemAccess.prototype, \"__bases__\", {value: [AST_PropAccess]});\n        AST_ItemAccess.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"assignment\"] = \"[AST_Node or None] Not None if this is an assignment (a[x] = y) rather than a simple access\";\n            ρσ_d[\"assign_operator\"] = \"[String] The operator for a assignment like += or empty string if plain assignment\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Splice() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Splice.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Splice, AST_PropAccess);\n        AST_Splice.prototype.__init__ = function __init__ () {\n            AST_PropAccess.prototype.__init__ && AST_PropAccess.prototype.__init__.apply(this, arguments);\n        };\n        AST_Splice.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                    self.property._walk(visitor);\n                    self.property2._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Splice.prototype._walk.__argnames__) Object.defineProperties(AST_Splice.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Splice.prototype.__repr__ = function __repr__ () {\n            if(AST_PropAccess.prototype.__repr__) return AST_PropAccess.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Splice.prototype.__str__ = function __str__ () {\n            if(AST_PropAccess.prototype.__str__) return AST_PropAccess.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Splice.prototype, \"__bases__\", {value: [AST_PropAccess]});\n        AST_Splice.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"property2\"] = \"[AST_Node] the 2nd property to access - typically ending index for the array.\";\n            ρσ_d[\"assignment\"] = \"[AST_Node] The data being spliced in.\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Unary() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Unary.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Unary, AST_Node);\n        AST_Unary.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Unary.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Unary.prototype._walk.__argnames__) Object.defineProperties(AST_Unary.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Unary.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Unary.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Unary.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Unary.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"operator\"] = \"[string] the operator\";\n            ρσ_d[\"expression\"] = \"[AST_Node] expression that this unary operator applies to\";\n            ρσ_d[\"parenthesized\"] = \"[bool] Whether this unary expression was parenthesized\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_UnaryPrefix() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_UnaryPrefix.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_UnaryPrefix, AST_Unary);\n        AST_UnaryPrefix.prototype.__init__ = function __init__ () {\n            AST_Unary.prototype.__init__ && AST_Unary.prototype.__init__.apply(this, arguments);\n        };\n        AST_UnaryPrefix.prototype.__repr__ = function __repr__ () {\n            if(AST_Unary.prototype.__repr__) return AST_Unary.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_UnaryPrefix.prototype.__str__ = function __str__ () {\n            if(AST_Unary.prototype.__str__) return AST_Unary.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_UnaryPrefix.prototype, \"__bases__\", {value: [AST_Unary]});\n\n        function AST_Binary() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Binary.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Binary, AST_Node);\n        AST_Binary.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Binary.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.left._walk(visitor);\n                    self.right._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Binary.prototype._walk.__argnames__) Object.defineProperties(AST_Binary.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Binary.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Binary.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Binary.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Binary.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"left\"] = \"[AST_Node] left-hand side expression\";\n            ρσ_d[\"operator\"] = \"[string] the operator\";\n            ρσ_d[\"right\"] = \"[AST_Node] right-hand side expression\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Existential() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Existential.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Existential, AST_Node);\n        AST_Existential.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Existential.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.expression._walk(visitor);\n                    if (self.after !== null && typeof self.after === \"object\") {\n                        self.after._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Existential.prototype._walk.__argnames__) Object.defineProperties(AST_Existential.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Existential.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Existential.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Existential.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Existential.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"expression\"] = \"[AST_Node] The expression whose existence we need to check\";\n            ρσ_d[\"after\"] = \"[None|string|AST_Node] is None when there is nothing following this operator, is a string when there is as AST_PropAccess following this operator, is an AST_Node if it is used a a shorthand for the conditional ternary, i.e. a ? b == a if a? else b\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Conditional() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Conditional.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Conditional, AST_Node);\n        AST_Conditional.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Conditional.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.condition._walk(visitor);\n                    self.consequent._walk(visitor);\n                    self.alternative._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Conditional.prototype._walk.__argnames__) Object.defineProperties(AST_Conditional.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Conditional.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Conditional.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Conditional.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Conditional.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"condition\"] = \"[AST_Node]\";\n            ρσ_d[\"consequent\"] = \"[AST_Node]\";\n            ρσ_d[\"alternative\"] = \"[AST_Node]\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Assign() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Assign.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Assign, AST_Binary);\n        AST_Assign.prototype.__init__ = function __init__ () {\n            AST_Binary.prototype.__init__ && AST_Binary.prototype.__init__.apply(this, arguments);\n        };\n        AST_Assign.prototype.is_chained = function is_chained() {\n            var self = this;\n            return is_node_type(self.right, AST_Assign) || is_node_type(self.right, AST_Seq) && (is_node_type(self.right.car, AST_Assign) || is_node_type(self.right.cdr, AST_Assign));\n        };\n        if (!AST_Assign.prototype.is_chained.__module__) Object.defineProperties(AST_Assign.prototype.is_chained, {\n            __module__ : {value: \"ast\"}\n        });\n        AST_Assign.prototype.traverse_chain = function traverse_chain() {\n            var self = this;\n            var right, left_hand_sides, next, assign;\n            right = self.right;\n            while (true) {\n                if (is_node_type(right, AST_Assign)) {\n                    right = right.right;\n                    continue;\n                }\n                if (is_node_type(right, AST_Seq)) {\n                    if (is_node_type(right.car, AST_Assign)) {\n                        right = new AST_Seq((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"car\"] = right.car.right;\n                            ρσ_d[\"cdr\"] = right.cdr;\n                            return ρσ_d;\n                        }).call(this));\n                        continue;\n                    }\n                    if (is_node_type(right.cdr, AST_Assign)) {\n                        right = right.cdr.right;\n                        continue;\n                    }\n                }\n                break;\n            }\n            left_hand_sides = [self.left];\n            next = self.right;\n            while (true) {\n                if (is_node_type(next, AST_Assign)) {\n                    left_hand_sides.push(next.left);\n                    next = next.right;\n                    continue;\n                }\n                if (is_node_type(next, AST_Seq)) {\n                    if (is_node_type(next.cdr, AST_Assign)) {\n                        assign = next.cdr;\n                        left_hand_sides.push(new AST_Seq((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"car\"] = next.car;\n                            ρσ_d[\"cdr\"] = assign.left;\n                            return ρσ_d;\n                        }).call(this)));\n                        next = assign.right;\n                        continue;\n                    }\n                }\n                break;\n            }\n            return [left_hand_sides, right];\n        };\n        if (!AST_Assign.prototype.traverse_chain.__module__) Object.defineProperties(AST_Assign.prototype.traverse_chain, {\n            __module__ : {value: \"ast\"}\n        });\n        AST_Assign.prototype.__repr__ = function __repr__ () {\n            if(AST_Binary.prototype.__repr__) return AST_Binary.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Assign.prototype.__str__ = function __str__ () {\n            if(AST_Binary.prototype.__str__) return AST_Binary.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Assign.prototype, \"__bases__\", {value: [AST_Binary]});\n\n        function AST_Array() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Array.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Array, AST_Node);\n        AST_Array.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Array.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var el;\n                    var ρσ_Iter31 = ρσ_Iterable(self.elements);\n                    for (var ρσ_Index31 = 0; ρσ_Index31 < ρσ_Iter31.length; ρσ_Index31++) {\n                        el = ρσ_Iter31[ρσ_Index31];\n                        el._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Array.prototype._walk.__argnames__) Object.defineProperties(AST_Array.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Array.prototype.flatten = function flatten() {\n            var self = this;\n            function flatten(arr) {\n                var ans, value;\n                ans = ρσ_list_decorate([]);\n                var ρσ_Iter32 = ρσ_Iterable(arr);\n                for (var ρσ_Index32 = 0; ρσ_Index32 < ρσ_Iter32.length; ρσ_Index32++) {\n                    value = ρσ_Iter32[ρσ_Index32];\n                    if (is_node_type(value, AST_Seq)) {\n                        value = value.to_array();\n                    } else if (is_node_type(value, AST_Array)) {\n                        value = value.elements;\n                    }\n                    if (Array.isArray(value)) {\n                        ans = ans.concat(flatten(value));\n                    } else {\n                        ans.push(value);\n                    }\n                }\n                return ans;\n            };\n            if (!flatten.__argnames__) Object.defineProperties(flatten, {\n                __argnames__ : {value: [\"arr\"]},\n                __module__ : {value: \"ast\"}\n            });\n\n            return flatten(self.elements);\n        };\n        if (!AST_Array.prototype.flatten.__module__) Object.defineProperties(AST_Array.prototype.flatten, {\n            __module__ : {value: \"ast\"}\n        });\n        AST_Array.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Array.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Array.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Array.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"elements\"] = \"[AST_Node*] array of elements\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Object() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Object.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Object, AST_Node);\n        AST_Object.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Object.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var prop;\n                    var ρσ_Iter33 = ρσ_Iterable(self.properties);\n                    for (var ρσ_Index33 = 0; ρσ_Index33 < ρσ_Iter33.length; ρσ_Index33++) {\n                        prop = ρσ_Iter33[ρσ_Index33];\n                        prop._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Object.prototype._walk.__argnames__) Object.defineProperties(AST_Object.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Object.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Object.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Object.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Object.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"properties\"] = \"[AST_ObjectProperty*] array of properties\";\n            ρσ_d[\"is_pydict\"] = \"[bool] True if this object is a python dict literal\";\n            ρσ_d[\"is_jshash\"] = \"[bool] True if this object is a js hash literal\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_ExpressiveObject() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ExpressiveObject.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ExpressiveObject, AST_Object);\n        AST_ExpressiveObject.prototype.__init__ = function __init__ () {\n            AST_Object.prototype.__init__ && AST_Object.prototype.__init__.apply(this, arguments);\n        };\n        AST_ExpressiveObject.prototype.__repr__ = function __repr__ () {\n            if(AST_Object.prototype.__repr__) return AST_Object.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ExpressiveObject.prototype.__str__ = function __str__ () {\n            if(AST_Object.prototype.__str__) return AST_Object.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ExpressiveObject.prototype, \"__bases__\", {value: [AST_Object]});\n\n        function AST_ObjectProperty() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ObjectProperty.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ObjectProperty, AST_Node);\n        AST_ObjectProperty.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_ObjectProperty.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.key._walk(visitor);\n                    self.value._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_ObjectProperty.prototype._walk.__argnames__) Object.defineProperties(AST_ObjectProperty.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_ObjectProperty.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ObjectProperty.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ObjectProperty.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_ObjectProperty.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"key\"] = \"[AST_Node] the property expression\";\n            ρσ_d[\"value\"] = \"[AST_Node] property value.  For setters and getters this is an AST_Function.\";\n            ρσ_d[\"quoted\"] = \"\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_ObjectKeyVal() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ObjectKeyVal.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ObjectKeyVal, AST_ObjectProperty);\n        AST_ObjectKeyVal.prototype.__init__ = function __init__ () {\n            AST_ObjectProperty.prototype.__init__ && AST_ObjectProperty.prototype.__init__.apply(this, arguments);\n        };\n        AST_ObjectKeyVal.prototype.__repr__ = function __repr__ () {\n            if(AST_ObjectProperty.prototype.__repr__) return AST_ObjectProperty.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ObjectKeyVal.prototype.__str__ = function __str__ () {\n            if(AST_ObjectProperty.prototype.__str__) return AST_ObjectProperty.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ObjectKeyVal.prototype, \"__bases__\", {value: [AST_ObjectProperty]});\n\n        function AST_Set() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Set.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Set, AST_Node);\n        AST_Set.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Set.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    var prop;\n                    var ρσ_Iter34 = ρσ_Iterable(self.items);\n                    for (var ρσ_Index34 = 0; ρσ_Index34 < ρσ_Iter34.length; ρσ_Index34++) {\n                        prop = ρσ_Iter34[ρσ_Index34];\n                        prop._walk(visitor);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_Set.prototype._walk.__argnames__) Object.defineProperties(AST_Set.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Set.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Set.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Set.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Set.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"items\"] = \"[AST_SetItem*] array of items\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SetItem() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SetItem.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SetItem, AST_Node);\n        AST_SetItem.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_SetItem.prototype._walk = function _walk(visitor) {\n            var self = this;\n            return visitor._visit(self, (function() {\n                var ρσ_anonfunc = function () {\n                    self.value._walk(visitor);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!AST_SetItem.prototype._walk.__argnames__) Object.defineProperties(AST_SetItem.prototype._walk, {\n            __argnames__ : {value: [\"visitor\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_SetItem.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SetItem.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SetItem.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_SetItem.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[AST_Node] The value of this item\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Symbol() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Symbol.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Symbol, AST_Node);\n        AST_Symbol.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Symbol.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Symbol.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Symbol.prototype, \"__bases__\", {value: [AST_Node]});\n        AST_Symbol.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"name\"] = \"[string] name of this symbol\";\n            ρσ_d[\"scope\"] = \"[AST_Scope/S] the current scope (not necessarily the definition scope)\";\n            ρσ_d[\"thedef\"] = \"[SymbolDef/S] the definition of this symbol\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SymbolAlias() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolAlias.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolAlias, AST_Symbol);\n        AST_SymbolAlias.prototype.__init__ = function __init__ () {\n            AST_Symbol.prototype.__init__ && AST_Symbol.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolAlias.prototype.__repr__ = function __repr__ () {\n            if(AST_Symbol.prototype.__repr__) return AST_Symbol.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolAlias.prototype.__str__ = function __str__ () {\n            if(AST_Symbol.prototype.__str__) return AST_Symbol.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolAlias.prototype, \"__bases__\", {value: [AST_Symbol]});\n\n        function AST_SymbolDeclaration() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolDeclaration, AST_Symbol);\n        AST_SymbolDeclaration.prototype.__init__ = function __init__ () {\n            AST_Symbol.prototype.__init__ && AST_Symbol.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolDeclaration.prototype.__repr__ = function __repr__ () {\n            if(AST_Symbol.prototype.__repr__) return AST_Symbol.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolDeclaration.prototype.__str__ = function __str__ () {\n            if(AST_Symbol.prototype.__str__) return AST_Symbol.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolDeclaration.prototype, \"__bases__\", {value: [AST_Symbol]});\n        AST_SymbolDeclaration.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"init\"] = \"[AST_Node*/S] array of initializers for this declaration.\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SymbolVar() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolVar.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolVar, AST_SymbolDeclaration);\n        AST_SymbolVar.prototype.__init__ = function __init__ () {\n            AST_SymbolDeclaration.prototype.__init__ && AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolVar.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolDeclaration.prototype.__repr__) return AST_SymbolDeclaration.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolVar.prototype.__str__ = function __str__ () {\n            if(AST_SymbolDeclaration.prototype.__str__) return AST_SymbolDeclaration.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolVar.prototype, \"__bases__\", {value: [AST_SymbolDeclaration]});\n\n        function AST_ImportedVar() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_ImportedVar.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_ImportedVar, AST_SymbolVar);\n        AST_ImportedVar.prototype.__init__ = function __init__ () {\n            AST_SymbolVar.prototype.__init__ && AST_SymbolVar.prototype.__init__.apply(this, arguments);\n        };\n        AST_ImportedVar.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolVar.prototype.__repr__) return AST_SymbolVar.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_ImportedVar.prototype.__str__ = function __str__ () {\n            if(AST_SymbolVar.prototype.__str__) return AST_SymbolVar.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_ImportedVar.prototype, \"__bases__\", {value: [AST_SymbolVar]});\n        AST_ImportedVar.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"alias\"] = \"AST_SymbolAlias the alias for this imported symbol\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SymbolNonlocal() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolNonlocal.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolNonlocal, AST_SymbolDeclaration);\n        AST_SymbolNonlocal.prototype.__init__ = function __init__ () {\n            AST_SymbolDeclaration.prototype.__init__ && AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolNonlocal.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolDeclaration.prototype.__repr__) return AST_SymbolDeclaration.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolNonlocal.prototype.__str__ = function __str__ () {\n            if(AST_SymbolDeclaration.prototype.__str__) return AST_SymbolDeclaration.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolNonlocal.prototype, \"__bases__\", {value: [AST_SymbolDeclaration]});\n\n        function AST_SymbolFunarg() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolFunarg.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolFunarg, AST_SymbolVar);\n        AST_SymbolFunarg.prototype.__init__ = function __init__ () {\n            AST_SymbolVar.prototype.__init__ && AST_SymbolVar.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolFunarg.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolVar.prototype.__repr__) return AST_SymbolVar.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolFunarg.prototype.__str__ = function __str__ () {\n            if(AST_SymbolVar.prototype.__str__) return AST_SymbolVar.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolFunarg.prototype, \"__bases__\", {value: [AST_SymbolVar]});\n        AST_SymbolFunarg.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"annotation\"] = \"[AST_Node?] The annotation provided for this argument (if any)\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_SymbolDefun() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolDefun.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolDefun, AST_SymbolDeclaration);\n        AST_SymbolDefun.prototype.__init__ = function __init__ () {\n            AST_SymbolDeclaration.prototype.__init__ && AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolDefun.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolDeclaration.prototype.__repr__) return AST_SymbolDeclaration.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolDefun.prototype.__str__ = function __str__ () {\n            if(AST_SymbolDeclaration.prototype.__str__) return AST_SymbolDeclaration.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolDefun.prototype, \"__bases__\", {value: [AST_SymbolDeclaration]});\n\n        function AST_SymbolLambda() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolLambda.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolLambda, AST_SymbolDeclaration);\n        AST_SymbolLambda.prototype.__init__ = function __init__ () {\n            AST_SymbolDeclaration.prototype.__init__ && AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolLambda.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolDeclaration.prototype.__repr__) return AST_SymbolDeclaration.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolLambda.prototype.__str__ = function __str__ () {\n            if(AST_SymbolDeclaration.prototype.__str__) return AST_SymbolDeclaration.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolLambda.prototype, \"__bases__\", {value: [AST_SymbolDeclaration]});\n\n        function AST_SymbolCatch() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolCatch.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolCatch, AST_SymbolDeclaration);\n        AST_SymbolCatch.prototype.__init__ = function __init__ () {\n            AST_SymbolDeclaration.prototype.__init__ && AST_SymbolDeclaration.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolCatch.prototype.__repr__ = function __repr__ () {\n            if(AST_SymbolDeclaration.prototype.__repr__) return AST_SymbolDeclaration.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolCatch.prototype.__str__ = function __str__ () {\n            if(AST_SymbolDeclaration.prototype.__str__) return AST_SymbolDeclaration.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolCatch.prototype, \"__bases__\", {value: [AST_SymbolDeclaration]});\n\n        function AST_SymbolRef() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_SymbolRef.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_SymbolRef, AST_Symbol);\n        AST_SymbolRef.prototype.__init__ = function __init__ () {\n            AST_Symbol.prototype.__init__ && AST_Symbol.prototype.__init__.apply(this, arguments);\n        };\n        AST_SymbolRef.prototype.__repr__ = function __repr__ () {\n            if(AST_Symbol.prototype.__repr__) return AST_Symbol.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_SymbolRef.prototype.__str__ = function __str__ () {\n            if(AST_Symbol.prototype.__str__) return AST_Symbol.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_SymbolRef.prototype, \"__bases__\", {value: [AST_Symbol]});\n        AST_SymbolRef.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"parens\"] = \"[boolean/S] if true, this variable is wrapped in parentheses\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_This() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_This.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_This, AST_Symbol);\n        AST_This.prototype.__init__ = function __init__ () {\n            AST_Symbol.prototype.__init__ && AST_Symbol.prototype.__init__.apply(this, arguments);\n        };\n        AST_This.prototype.__repr__ = function __repr__ () {\n            if(AST_Symbol.prototype.__repr__) return AST_Symbol.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_This.prototype.__str__ = function __str__ () {\n            if(AST_Symbol.prototype.__str__) return AST_Symbol.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_This.prototype, \"__bases__\", {value: [AST_Symbol]});\n\n        function AST_Constant() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Constant.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Constant, AST_Node);\n        AST_Constant.prototype.__init__ = function __init__ () {\n            AST_Node.prototype.__init__ && AST_Node.prototype.__init__.apply(this, arguments);\n        };\n        AST_Constant.prototype.__repr__ = function __repr__ () {\n            if(AST_Node.prototype.__repr__) return AST_Node.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Constant.prototype.__str__ = function __str__ () {\n            if(AST_Node.prototype.__str__) return AST_Node.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Constant.prototype, \"__bases__\", {value: [AST_Node]});\n\n        function AST_String() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_String.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_String, AST_Constant);\n        AST_String.prototype.__init__ = function __init__ () {\n            AST_Constant.prototype.__init__ && AST_Constant.prototype.__init__.apply(this, arguments);\n        };\n        AST_String.prototype.__repr__ = function __repr__ () {\n            if(AST_Constant.prototype.__repr__) return AST_Constant.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_String.prototype.__str__ = function __str__ () {\n            if(AST_Constant.prototype.__str__) return AST_Constant.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_String.prototype, \"__bases__\", {value: [AST_Constant]});\n        AST_String.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[string] the contents of this string\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Verbatim() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Verbatim.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Verbatim, AST_Constant);\n        AST_Verbatim.prototype.__init__ = function __init__ () {\n            AST_Constant.prototype.__init__ && AST_Constant.prototype.__init__.apply(this, arguments);\n        };\n        AST_Verbatim.prototype.__repr__ = function __repr__ () {\n            if(AST_Constant.prototype.__repr__) return AST_Constant.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Verbatim.prototype.__str__ = function __str__ () {\n            if(AST_Constant.prototype.__str__) return AST_Constant.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Verbatim.prototype, \"__bases__\", {value: [AST_Constant]});\n        AST_Verbatim.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[string] A string of raw JS code\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Number() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Number.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Number, AST_Constant);\n        AST_Number.prototype.__init__ = function __init__ () {\n            AST_Constant.prototype.__init__ && AST_Constant.prototype.__init__.apply(this, arguments);\n        };\n        AST_Number.prototype.__repr__ = function __repr__ () {\n            if(AST_Constant.prototype.__repr__) return AST_Constant.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Number.prototype.__str__ = function __str__ () {\n            if(AST_Constant.prototype.__str__) return AST_Constant.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Number.prototype, \"__bases__\", {value: [AST_Constant]});\n        AST_Number.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[number] the numeric value\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_RegExp() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_RegExp.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_RegExp, AST_Constant);\n        AST_RegExp.prototype.__init__ = function __init__ () {\n            AST_Constant.prototype.__init__ && AST_Constant.prototype.__init__.apply(this, arguments);\n        };\n        AST_RegExp.prototype.__repr__ = function __repr__ () {\n            if(AST_Constant.prototype.__repr__) return AST_Constant.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_RegExp.prototype.__str__ = function __str__ () {\n            if(AST_Constant.prototype.__str__) return AST_Constant.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_RegExp.prototype, \"__bases__\", {value: [AST_Constant]});\n        AST_RegExp.prototype.properties = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"value\"] = \"[RegExp] the actual regexp\";\n            return ρσ_d;\n        }).call(this);\n\n        function AST_Atom() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Atom.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Atom, AST_Constant);\n        AST_Atom.prototype.__init__ = function __init__(initializer) {\n            var self = this;\n            if (initializer) {\n                self.start = initializer.start;\n                self.end = initializer.end;\n            }\n        };\n        if (!AST_Atom.prototype.__init__.__argnames__) Object.defineProperties(AST_Atom.prototype.__init__, {\n            __argnames__ : {value: [\"initializer\"]},\n            __module__ : {value: \"ast\"}\n        });\n        AST_Atom.__argnames__ = AST_Atom.prototype.__init__.__argnames__;\n        AST_Atom.__handles_kwarg_interpolation__ = AST_Atom.prototype.__init__.__handles_kwarg_interpolation__;\n        AST_Atom.prototype.__repr__ = function __repr__ () {\n            if(AST_Constant.prototype.__repr__) return AST_Constant.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Atom.prototype.__str__ = function __str__ () {\n            if(AST_Constant.prototype.__str__) return AST_Constant.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Atom.prototype, \"__bases__\", {value: [AST_Constant]});\n\n        function AST_Null() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Null.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Null, AST_Atom);\n        AST_Null.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_Null.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Null.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Null.prototype, \"__bases__\", {value: [AST_Atom]});\n        AST_Null.prototype.value = null;\n\n        function AST_NaN() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_NaN.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_NaN, AST_Atom);\n        AST_NaN.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_NaN.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_NaN.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_NaN.prototype, \"__bases__\", {value: [AST_Atom]});\n        AST_NaN.prototype.value = NaN;\n\n        function AST_Undefined() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Undefined.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Undefined, AST_Atom);\n        AST_Undefined.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_Undefined.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Undefined.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Undefined.prototype, \"__bases__\", {value: [AST_Atom]});\n        AST_Undefined.prototype.value = undefined;\n\n        function AST_Hole() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Hole.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Hole, AST_Atom);\n        AST_Hole.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_Hole.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Hole.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Hole.prototype, \"__bases__\", {value: [AST_Atom]});\n        AST_Hole.prototype.value = undefined;\n\n        function AST_Infinity() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Infinity.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Infinity, AST_Atom);\n        AST_Infinity.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_Infinity.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Infinity.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Infinity.prototype, \"__bases__\", {value: [AST_Atom]});\n        AST_Infinity.prototype.value = Infinity;\n\n        function AST_Boolean() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_Boolean.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_Boolean, AST_Atom);\n        AST_Boolean.prototype.__init__ = function __init__ () {\n            AST_Atom.prototype.__init__ && AST_Atom.prototype.__init__.apply(this, arguments);\n        };\n        AST_Boolean.prototype.__repr__ = function __repr__ () {\n            if(AST_Atom.prototype.__repr__) return AST_Atom.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_Boolean.prototype.__str__ = function __str__ () {\n            if(AST_Atom.prototype.__str__) return AST_Atom.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_Boolean.prototype, \"__bases__\", {value: [AST_Atom]});\n\n        function AST_False() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_False.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_False, AST_Boolean);\n        AST_False.prototype.__init__ = function __init__ () {\n            AST_Boolean.prototype.__init__ && AST_Boolean.prototype.__init__.apply(this, arguments);\n        };\n        AST_False.prototype.__repr__ = function __repr__ () {\n            if(AST_Boolean.prototype.__repr__) return AST_Boolean.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_False.prototype.__str__ = function __str__ () {\n            if(AST_Boolean.prototype.__str__) return AST_Boolean.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_False.prototype, \"__bases__\", {value: [AST_Boolean]});\n        AST_False.prototype.value = false;\n\n        function AST_True() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            AST_True.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(AST_True, AST_Boolean);\n        AST_True.prototype.__init__ = function __init__ () {\n            AST_Boolean.prototype.__init__ && AST_Boolean.prototype.__init__.apply(this, arguments);\n        };\n        AST_True.prototype.__repr__ = function __repr__ () {\n            if(AST_Boolean.prototype.__repr__) return AST_Boolean.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        AST_True.prototype.__str__ = function __str__ () {\n            if(AST_Boolean.prototype.__str__) return AST_Boolean.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(AST_True.prototype, \"__bases__\", {value: [AST_Boolean]});\n        AST_True.prototype.value = true;\n\n        function TreeWalker() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            TreeWalker.prototype.__init__.apply(this, arguments);\n        }\n        TreeWalker.prototype.__init__ = function __init__(callback) {\n            var self = this;\n            self.visit = callback;\n            self.stack = ρσ_list_decorate([]);\n        };\n        if (!TreeWalker.prototype.__init__.__argnames__) Object.defineProperties(TreeWalker.prototype.__init__, {\n            __argnames__ : {value: [\"callback\"]},\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.__argnames__ = TreeWalker.prototype.__init__.__argnames__;\n        TreeWalker.__handles_kwarg_interpolation__ = TreeWalker.prototype.__init__.__handles_kwarg_interpolation__;\n        TreeWalker.prototype._visit = function _visit(node, descend) {\n            var self = this;\n            var ret;\n            self.stack.push(node);\n            ret = self.visit(node, (descend) ? (function() {\n                var ρσ_anonfunc = function () {\n                    descend.call(node);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"ast\"}\n                });\n                return ρσ_anonfunc;\n            })() : noop);\n            if (!ret && descend) {\n                descend.call(node);\n            }\n            self.stack.pop();\n            return ret;\n        };\n        if (!TreeWalker.prototype._visit.__argnames__) Object.defineProperties(TreeWalker.prototype._visit, {\n            __argnames__ : {value: [\"node\", \"descend\"]},\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.parent = function parent(n) {\n            var self = this;\n            return (ρσ_expr_temp = self.stack)[ρσ_bound_index(self.stack.length - 2 - (n || 0), ρσ_expr_temp)];\n        };\n        if (!TreeWalker.prototype.parent.__argnames__) Object.defineProperties(TreeWalker.prototype.parent, {\n            __argnames__ : {value: [\"n\"]},\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.push = function push(node) {\n            var self = this;\n            self.stack.push(node);\n        };\n        if (!TreeWalker.prototype.push.__argnames__) Object.defineProperties(TreeWalker.prototype.push, {\n            __argnames__ : {value: [\"node\"]},\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.pop = function pop() {\n            var self = this;\n            return self.stack.pop();\n        };\n        if (!TreeWalker.prototype.pop.__module__) Object.defineProperties(TreeWalker.prototype.pop, {\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.self = function self() {\n            var s = this;\n            return (ρσ_expr_temp = s.stack)[ρσ_bound_index(s.stack.length - 1, ρσ_expr_temp)];\n        };\n        if (!TreeWalker.prototype.self.__module__) Object.defineProperties(TreeWalker.prototype.self, {\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.find_parent = function find_parent(type) {\n            var self = this;\n            var stack, x, i;\n            stack = self.stack;\n            for (var ρσ_Index35 = stack.length - 1; ρσ_Index35 > -1; ρσ_Index35-=1) {\n                i = ρσ_Index35;\n                x = stack[(typeof i === \"number\" && i < 0) ? stack.length + i : i];\n                if (is_node_type(x, type)) {\n                    return x;\n                }\n            }\n        };\n        if (!TreeWalker.prototype.find_parent.__argnames__) Object.defineProperties(TreeWalker.prototype.find_parent, {\n            __argnames__ : {value: [\"type\"]},\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.in_boolean_context = function in_boolean_context() {\n            var self = this;\n            var stack, i, p;\n            stack = self.stack;\n            i = stack.length;\n            self = stack[ρσ_bound_index(i -= 1, stack)];\n            while (i > 0) {\n                p = stack[ρσ_bound_index(i -= 1, stack)];\n                if (is_node_type(p, AST_If) && p.condition === self || is_node_type(p, AST_Conditional) && p.condition === self || is_node_type(p, AST_DWLoop) && p.condition === self || is_node_type(p, AST_UnaryPrefix) && p.operator === \"!\" && p.expression === self) {\n                    return true;\n                }\n                if (!((is_node_type(p, AST_Binary) && (p.operator === \"&&\" || p.operator === \"||\")))) {\n                    return false;\n                }\n                self = p;\n            }\n        };\n        if (!TreeWalker.prototype.in_boolean_context.__module__) Object.defineProperties(TreeWalker.prototype.in_boolean_context, {\n            __module__ : {value: \"ast\"}\n        });\n        TreeWalker.prototype.__repr__ = function __repr__ () {\n                        return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        TreeWalker.prototype.__str__ = function __str__ () {\n            return this.__repr__();\n        };\n        Object.defineProperty(TreeWalker.prototype, \"__bases__\", {value: []});\n\n        function Found() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            Found.prototype.__init__.apply(this, arguments);\n        }\n        ρσ_extends(Found, Exception);\n        Found.prototype.__init__ = function __init__ () {\n            Exception.prototype.__init__ && Exception.prototype.__init__.apply(this, arguments);\n        };\n        Found.prototype.__repr__ = function __repr__ () {\n            if(Exception.prototype.__repr__) return Exception.prototype.__repr__.call(this);\n            return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        Found.prototype.__str__ = function __str__ () {\n            if(Exception.prototype.__str__) return Exception.prototype.__str__.call(this);\nreturn this.__repr__();\n        };\n        Object.defineProperty(Found.prototype, \"__bases__\", {value: [Exception]});\n        \n\n        function has_calls(expression) {\n            if (!expression) {\n                return false;\n            }\n            try {\n                expression.walk(new TreeWalker((function() {\n                    var ρσ_anonfunc = function (node) {\n                        if (is_node_type(node, AST_BaseCall) || is_node_type(node, AST_ItemAccess)) {\n                            throw new Found;\n                        }\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"node\"]},\n                        __module__ : {value: \"ast\"}\n                    });\n                    return ρσ_anonfunc;\n                })()));\n            } catch (ρσ_Exception) {\n                ρσ_last_exception = ρσ_Exception;\n                if (ρσ_Exception instanceof Found) {\n                    return true;\n                } else {\n                    throw ρσ_Exception;\n                }\n            }\n            return false;\n        };\n        if (!has_calls.__argnames__) Object.defineProperties(has_calls, {\n            __argnames__ : {value: [\"expression\"]},\n            __module__ : {value: \"ast\"}\n        });\n\n        ρσ_modules.ast.is_node_type = is_node_type;\n        ρσ_modules.ast.AST = AST;\n        ρσ_modules.ast.AST_Token = AST_Token;\n        ρσ_modules.ast.AST_Node = AST_Node;\n        ρσ_modules.ast.AST_Statement = AST_Statement;\n        ρσ_modules.ast.AST_Debugger = AST_Debugger;\n        ρσ_modules.ast.AST_Directive = AST_Directive;\n        ρσ_modules.ast.AST_SimpleStatement = AST_SimpleStatement;\n        ρσ_modules.ast.AST_Assert = AST_Assert;\n        ρσ_modules.ast.walk_body = walk_body;\n        ρσ_modules.ast.AST_Block = AST_Block;\n        ρσ_modules.ast.AST_BlockStatement = AST_BlockStatement;\n        ρσ_modules.ast.AST_EmptyStatement = AST_EmptyStatement;\n        ρσ_modules.ast.AST_StatementWithBody = AST_StatementWithBody;\n        ρσ_modules.ast.AST_DWLoop = AST_DWLoop;\n        ρσ_modules.ast.AST_Do = AST_Do;\n        ρσ_modules.ast.AST_While = AST_While;\n        ρσ_modules.ast.AST_ForIn = AST_ForIn;\n        ρσ_modules.ast.AST_ForJS = AST_ForJS;\n        ρσ_modules.ast.AST_ListComprehension = AST_ListComprehension;\n        ρσ_modules.ast.AST_SetComprehension = AST_SetComprehension;\n        ρσ_modules.ast.AST_DictComprehension = AST_DictComprehension;\n        ρσ_modules.ast.AST_GeneratorComprehension = AST_GeneratorComprehension;\n        ρσ_modules.ast.AST_With = AST_With;\n        ρσ_modules.ast.AST_WithClause = AST_WithClause;\n        ρσ_modules.ast.AST_Scope = AST_Scope;\n        ρσ_modules.ast.AST_Toplevel = AST_Toplevel;\n        ρσ_modules.ast.AST_Import = AST_Import;\n        ρσ_modules.ast.AST_Imports = AST_Imports;\n        ρσ_modules.ast.AST_Decorator = AST_Decorator;\n        ρσ_modules.ast.AST_Lambda = AST_Lambda;\n        ρσ_modules.ast.AST_Function = AST_Function;\n        ρσ_modules.ast.AST_Class = AST_Class;\n        ρσ_modules.ast.AST_Method = AST_Method;\n        ρσ_modules.ast.AST_Jump = AST_Jump;\n        ρσ_modules.ast.AST_Exit = AST_Exit;\n        ρσ_modules.ast.AST_Return = AST_Return;\n        ρσ_modules.ast.AST_Yield = AST_Yield;\n        ρσ_modules.ast.AST_Throw = AST_Throw;\n        ρσ_modules.ast.AST_LoopControl = AST_LoopControl;\n        ρσ_modules.ast.AST_Break = AST_Break;\n        ρσ_modules.ast.AST_Continue = AST_Continue;\n        ρσ_modules.ast.AST_If = AST_If;\n        ρσ_modules.ast.AST_Try = AST_Try;\n        ρσ_modules.ast.AST_Catch = AST_Catch;\n        ρσ_modules.ast.AST_Except = AST_Except;\n        ρσ_modules.ast.AST_Finally = AST_Finally;\n        ρσ_modules.ast.AST_Else = AST_Else;\n        ρσ_modules.ast.AST_Definitions = AST_Definitions;\n        ρσ_modules.ast.AST_Var = AST_Var;\n        ρσ_modules.ast.AST_VarDef = AST_VarDef;\n        ρσ_modules.ast.AST_BaseCall = AST_BaseCall;\n        ρσ_modules.ast.AST_Call = AST_Call;\n        ρσ_modules.ast.AST_ClassCall = AST_ClassCall;\n        ρσ_modules.ast.AST_New = AST_New;\n        ρσ_modules.ast.AST_Seq = AST_Seq;\n        ρσ_modules.ast.AST_PropAccess = AST_PropAccess;\n        ρσ_modules.ast.AST_Dot = AST_Dot;\n        ρσ_modules.ast.AST_Sub = AST_Sub;\n        ρσ_modules.ast.AST_ItemAccess = AST_ItemAccess;\n        ρσ_modules.ast.AST_Splice = AST_Splice;\n        ρσ_modules.ast.AST_Unary = AST_Unary;\n        ρσ_modules.ast.AST_UnaryPrefix = AST_UnaryPrefix;\n        ρσ_modules.ast.AST_Binary = AST_Binary;\n        ρσ_modules.ast.AST_Existential = AST_Existential;\n        ρσ_modules.ast.AST_Conditional = AST_Conditional;\n        ρσ_modules.ast.AST_Assign = AST_Assign;\n        ρσ_modules.ast.AST_Array = AST_Array;\n        ρσ_modules.ast.AST_Object = AST_Object;\n        ρσ_modules.ast.AST_ExpressiveObject = AST_ExpressiveObject;\n        ρσ_modules.ast.AST_ObjectProperty = AST_ObjectProperty;\n        ρσ_modules.ast.AST_ObjectKeyVal = AST_ObjectKeyVal;\n        ρσ_modules.ast.AST_Set = AST_Set;\n        ρσ_modules.ast.AST_SetItem = AST_SetItem;\n        ρσ_modules.ast.AST_Symbol = AST_Symbol;\n        ρσ_modules.ast.AST_SymbolAlias = AST_SymbolAlias;\n        ρσ_modules.ast.AST_SymbolDeclaration = AST_SymbolDeclaration;\n        ρσ_modules.ast.AST_SymbolVar = AST_SymbolVar;\n        ρσ_modules.ast.AST_ImportedVar = AST_ImportedVar;\n        ρσ_modules.ast.AST_SymbolNonlocal = AST_SymbolNonlocal;\n        ρσ_modules.ast.AST_SymbolFunarg = AST_SymbolFunarg;\n        ρσ_modules.ast.AST_SymbolDefun = AST_SymbolDefun;\n        ρσ_modules.ast.AST_SymbolLambda = AST_SymbolLambda;\n        ρσ_modules.ast.AST_SymbolCatch = AST_SymbolCatch;\n        ρσ_modules.ast.AST_SymbolRef = AST_SymbolRef;\n        ρσ_modules.ast.AST_This = AST_This;\n        ρσ_modules.ast.AST_Constant = AST_Constant;\n        ρσ_modules.ast.AST_String = AST_String;\n        ρσ_modules.ast.AST_Verbatim = AST_Verbatim;\n        ρσ_modules.ast.AST_Number = AST_Number;\n        ρσ_modules.ast.AST_RegExp = AST_RegExp;\n        ρσ_modules.ast.AST_Atom = AST_Atom;\n        ρσ_modules.ast.AST_Null = AST_Null;\n        ρσ_modules.ast.AST_NaN = AST_NaN;\n        ρσ_modules.ast.AST_Undefined = AST_Undefined;\n        ρσ_modules.ast.AST_Hole = AST_Hole;\n        ρσ_modules.ast.AST_Infinity = AST_Infinity;\n        ρσ_modules.ast.AST_Boolean = AST_Boolean;\n        ρσ_modules.ast.AST_False = AST_False;\n        ρσ_modules.ast.AST_True = AST_True;\n        ρσ_modules.ast.TreeWalker = TreeWalker;\n        ρσ_modules.ast.Found = Found;\n        ρσ_modules.ast.has_calls = has_calls;\n    })();\n\n    (function(){\n        var __name__ = \"string_interpolation\";\n        function quoted_string(x) {\n            return \"\\\"\" + x.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\").replace(/\\n/g, \"\\\\n\") + \"\\\"\";\n        };\n        if (!quoted_string.__argnames__) Object.defineProperties(quoted_string, {\n            __argnames__ : {value: [\"x\"]},\n            __module__ : {value: \"string_interpolation\"}\n        });\n\n        function render_markup(markup) {\n            var ρσ_unpack, pos, key, ch, fmtspec, prefix;\n            ρσ_unpack = [0, \"\"];\n            pos = ρσ_unpack[0];\n            key = ρσ_unpack[1];\n            while (pos < markup.length) {\n                ch = markup[(typeof pos === \"number\" && pos < 0) ? markup.length + pos : pos];\n                if (ch === \"!\" || ch === \":\") {\n                    break;\n                }\n                key += ch;\n                pos += 1;\n            }\n            fmtspec = markup.slice(pos);\n            prefix = \"\";\n            if (key.endsWith(\"=\")) {\n                prefix = key;\n                key = key.slice(0, -1);\n            }\n            return \"ρσ_str.format(\\\"\" + prefix + \"{\" + fmtspec + \"}\\\", \" + key + \")\";\n        };\n        if (!render_markup.__argnames__) Object.defineProperties(render_markup, {\n            __argnames__ : {value: [\"markup\"]},\n            __module__ : {value: \"string_interpolation\"}\n        });\n\n        function interpolate(template, raise_error) {\n            var pos, in_brace, markup, ans, ch;\n            pos = in_brace = 0;\n            markup = \"\";\n            ans = [\"\"];\n            while (pos < template.length) {\n                ch = template[(typeof pos === \"number\" && pos < 0) ? template.length + pos : pos];\n                if (in_brace) {\n                    if (ch === \"{\") {\n                        in_brace += 1;\n                        markup += \"{\";\n                    } else if (ch === \"}\") {\n                        in_brace -= 1;\n                        if (in_brace > 0) {\n                            markup += \"}\";\n                        } else {\n                            ans.push([markup]);\n                            ans.push(\"\");\n                        }\n                    } else {\n                        markup += ch;\n                    }\n                } else {\n                    if (ch === \"{\") {\n                        if (template[ρσ_bound_index(pos + 1, template)] === \"{\") {\n                            pos += 1;\n                            ans[ans.length-1] += \"{\";\n                        } else {\n                            in_brace = 1;\n                            markup = \"\";\n                        }\n                    } else if (ch === \"}\") {\n                        if (template[ρσ_bound_index(pos + 1, template)] === \"}\") {\n                            pos += 1;\n                            ans[ans.length-1] += \"}\";\n                        } else {\n                            raise_error(\"f-string: single '}' is not allowed\");\n                        }\n                    } else {\n                        ans[ans.length-1] += ch;\n                    }\n                }\n                pos += 1;\n            }\n            if (in_brace) {\n                raise_error(\"expected '}' before end of string\");\n            }\n            if (ans[ans.length-1] === \"+\") {\n                ans[ans.length-1] = \"\";\n            }\n            for (var i = 0; i < ans.length; i++) {\n                if (typeof ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] === \"string\") {\n                    ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = quoted_string(ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i]);\n                } else {\n                    ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i] = \"+\" + render_markup.apply(this, ans[(typeof i === \"number\" && i < 0) ? ans.length + i : i]) + \"+\";\n                }\n            }\n            return ans.join(\"\");\n        };\n        if (!interpolate.__argnames__) Object.defineProperties(interpolate, {\n            __argnames__ : {value: [\"template\", \"raise_error\"]},\n            __module__ : {value: \"string_interpolation\"}\n        });\n\n        ρσ_modules.string_interpolation.quoted_string = quoted_string;\n        ρσ_modules.string_interpolation.render_markup = render_markup;\n        ρσ_modules.string_interpolation.interpolate = interpolate;\n    })();\n\n    (function(){\n        var __name__ = \"tokenizer\";\n        var RE_HEX_NUMBER, RE_OCT_NUMBER, RE_DEC_NUMBER, OPERATOR_CHARS, ASCII_CONTROL_CHARS, HEX_PAT, NAME_PAT, OPERATORS, OP_MAP, WHITESPACE_CHARS, PUNC_BEFORE_EXPRESSION, PUNC_CHARS, KEYWORDS, KEYWORDS_ATOM, RESERVED_WORDS, KEYWORDS_BEFORE_EXPRESSION, ALL_KEYWORDS, IDENTIFIER_PAT, UNICODE, EX_EOF;\n        var ALIAS_MAP = ρσ_modules.unicode_aliases.ALIAS_MAP;\n\n        var make_predicate = ρσ_modules.utils.make_predicate;\n        var characters = ρσ_modules.utils.characters;\n\n        var AST_Token = ρσ_modules.ast.AST_Token;\n\n        var SyntaxError = ρσ_modules.errors.SyntaxError;\n\n        var interpolate = ρσ_modules.string_interpolation.interpolate;\n        var quoted_string = ρσ_modules.string_interpolation.quoted_string;\n\n        RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;\n        RE_OCT_NUMBER = /^0[0-7]+$/;\n        RE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i;\n        OPERATOR_CHARS = make_predicate(characters(\"+-*&%=<>!?|~^@\"));\n        ASCII_CONTROL_CHARS = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"a\"] = 7;\n            ρσ_d[\"b\"] = 8;\n            ρσ_d[\"f\"] = 12;\n            ρσ_d[\"n\"] = 10;\n            ρσ_d[\"r\"] = 13;\n            ρσ_d[\"t\"] = 9;\n            ρσ_d[\"v\"] = 11;\n            return ρσ_d;\n        }).call(this);\n        HEX_PAT = /[a-fA-F0-9]/;\n        NAME_PAT = /[a-zA-Z ]/;\n        OPERATORS = make_predicate(ρσ_list_decorate([ \"in\", \"instanceof\", \"typeof\", \"new\", \"void\", \"del\", \"+\", \"-\", \"not\", \"~\", \"&\", \"|\", \"^\", \"**\", \"*\", \"//\", \"/\", \"%\", \">>\", \"<<\", \">>>\", \"<\", \">\", \"<=\", \">=\", \"==\", \"is\", \"!=\", \"=\", \"+=\", \"-=\", \"//=\", \"/=\", \"*=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\", \"and\", \"or\", \"@\", \"->\" ]));\n        OP_MAP = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"or\"] = \"||\";\n            ρσ_d[\"and\"] = \"&&\";\n            ρσ_d[\"not\"] = \"!\";\n            ρσ_d[\"del\"] = \"delete\";\n            ρσ_d[\"None\"] = \"null\";\n            ρσ_d[\"is\"] = \"===\";\n            return ρσ_d;\n        }).call(this);\n        WHITESPACE_CHARS = make_predicate(characters(\"  \\n\\r\\t\\f\\u000b​᠎           \\u202f 　\"));\n        PUNC_BEFORE_EXPRESSION = make_predicate(characters(\"[{(,.;:\"));\n        PUNC_CHARS = make_predicate(characters(\"[]{}(),;:?\"));\n        KEYWORDS = \"as assert break class continue def del do elif else except finally for from global if import in is new nonlocal pass raise return yield try while with or and not\";\n        KEYWORDS_ATOM = \"False None True\";\n        RESERVED_WORDS = \"break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof new return super switch this throw try typeof var void while with yield enum implements static private package let public protected interface await null true false\";\n        KEYWORDS_BEFORE_EXPRESSION = \"return yield new del raise elif else if\";\n        ALL_KEYWORDS = KEYWORDS + \" \" + KEYWORDS_ATOM;\n        KEYWORDS = make_predicate(KEYWORDS);\n        RESERVED_WORDS = make_predicate(RESERVED_WORDS);\n        KEYWORDS_BEFORE_EXPRESSION = make_predicate(KEYWORDS_BEFORE_EXPRESSION);\n        KEYWORDS_ATOM = make_predicate(KEYWORDS_ATOM);\n        IDENTIFIER_PAT = /^[a-z_$][_a-z0-9$]*$/i;\n        function is_string_modifier(val) {\n            var ch;\n            var ρσ_Iter36 = ρσ_Iterable(val);\n            for (var ρσ_Index36 = 0; ρσ_Index36 < ρσ_Iter36.length; ρσ_Index36++) {\n                ch = ρσ_Iter36[ρσ_Index36];\n                if (\"vrufVRUF\".indexOf(ch) === -1) {\n                    return false;\n                }\n            }\n            return true;\n        };\n        if (!is_string_modifier.__argnames__) Object.defineProperties(is_string_modifier, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_letter(code) {\n            return code >= 97 && code <= 122 || code >= 65 && code <= 90 || code >= 170 && UNICODE.letter.test(String.fromCharCode(code));\n        };\n        if (!is_letter.__argnames__) Object.defineProperties(is_letter, {\n            __argnames__ : {value: [\"code\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_digit(code) {\n            return code >= 48 && code <= 57;\n        };\n        if (!is_digit.__argnames__) Object.defineProperties(is_digit, {\n            __argnames__ : {value: [\"code\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_alphanumeric_char(code) {\n            return is_digit(code) || is_letter(code);\n        };\n        if (!is_alphanumeric_char.__argnames__) Object.defineProperties(is_alphanumeric_char, {\n            __argnames__ : {value: [\"code\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_unicode_combining_mark(ch) {\n            return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);\n        };\n        if (!is_unicode_combining_mark.__argnames__) Object.defineProperties(is_unicode_combining_mark, {\n            __argnames__ : {value: [\"ch\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_unicode_connector_punctuation(ch) {\n            return UNICODE.connector_punctuation.test(ch);\n        };\n        if (!is_unicode_connector_punctuation.__argnames__) Object.defineProperties(is_unicode_connector_punctuation, {\n            __argnames__ : {value: [\"ch\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_identifier(name) {\n            return !RESERVED_WORDS[(typeof name === \"number\" && name < 0) ? RESERVED_WORDS.length + name : name] && !KEYWORDS[(typeof name === \"number\" && name < 0) ? KEYWORDS.length + name : name] && !KEYWORDS_ATOM[(typeof name === \"number\" && name < 0) ? KEYWORDS_ATOM.length + name : name] && IDENTIFIER_PAT.test(name);\n        };\n        if (!is_identifier.__argnames__) Object.defineProperties(is_identifier, {\n            __argnames__ : {value: [\"name\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_identifier_start(code) {\n            return code === 36 || code === 95 || is_letter(code);\n        };\n        if (!is_identifier_start.__argnames__) Object.defineProperties(is_identifier_start, {\n            __argnames__ : {value: [\"code\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function is_identifier_char(ch) {\n            var code;\n            code = ch.charCodeAt(0);\n            return is_identifier_start(code) || is_digit(code) || code === 8204 || code === 8205 || is_unicode_combining_mark(ch) || is_unicode_connector_punctuation(ch);\n        };\n        if (!is_identifier_char.__argnames__) Object.defineProperties(is_identifier_char, {\n            __argnames__ : {value: [\"ch\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        function parse_js_number(num) {\n            if (RE_HEX_NUMBER.test(num)) {\n                return parseInt(num.substr(2), 16);\n            } else if (RE_OCT_NUMBER.test(num)) {\n                return parseInt(num.substr(1), 8);\n            } else if (RE_DEC_NUMBER.test(num)) {\n                return parseFloat(num);\n            }\n        };\n        if (!parse_js_number.__argnames__) Object.defineProperties(parse_js_number, {\n            __argnames__ : {value: [\"num\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        UNICODE = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"letter\"] = new RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\u097F\\\\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\\\\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-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\u0D60\\\\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\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\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-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\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-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\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]\");\n            ρσ_d[\"non_spacing_mark\"] = new RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\");\n            ρσ_d[\"space_combining_mark\"] = new RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\");\n            ρσ_d[\"connector_punctuation\"] = new RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\");\n            return ρσ_d;\n        }).call(this);\n        function is_token(token, type, val) {\n            return token.type === type && (val === null || val === undefined || token.value === val);\n        };\n        if (!is_token.__argnames__) Object.defineProperties(is_token, {\n            __argnames__ : {value: [\"token\", \"type\", \"val\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        EX_EOF = Object.create(null);\n        function tokenizer(raw_text, filename) {\n            var S, read_string, read_regexp;\n            S = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"text\"] = raw_text.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, \"\\n\").replace(/\\uFEFF/g, \"\");\n                ρσ_d[\"filename\"] = filename;\n                ρσ_d[\"pos\"] = 0;\n                ρσ_d[\"tokpos\"] = 0;\n                ρσ_d[\"line\"] = 1;\n                ρσ_d[\"tokline\"] = 0;\n                ρσ_d[\"col\"] = 0;\n                ρσ_d[\"tokcol\"] = 0;\n                ρσ_d[\"newline_before\"] = false;\n                ρσ_d[\"regex_allowed\"] = false;\n                ρσ_d[\"comments_before\"] = [];\n                ρσ_d[\"whitespace_before\"] = [];\n                ρσ_d[\"newblock\"] = false;\n                ρσ_d[\"endblock\"] = false;\n                ρσ_d[\"indentation_matters\"] = [ true ];\n                ρσ_d[\"cached_whitespace\"] = \"\";\n                ρσ_d[\"prev\"] = undefined;\n                ρσ_d[\"index_or_slice\"] = [ false ];\n                ρσ_d[\"expecting_object_literal_key\"] = false;\n                return ρσ_d;\n            }).call(this);\n            function peek() {\n                return S.text.charAt(S.pos);\n            };\n            if (!peek.__module__) Object.defineProperties(peek, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function prevChar() {\n                return S.text.charAt(S.tokpos - 1);\n            };\n            if (!prevChar.__module__) Object.defineProperties(prevChar, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function next(signal_eof, in_string) {\n                var ch;\n                ch = S.text.charAt(S.pos);\n                S.pos += 1;\n                if (signal_eof && !ch) {\n                    throw EX_EOF;\n                }\n                if (ch === \"\\n\") {\n                    S.newline_before = S.newline_before || !in_string;\n                    S.line += 1;\n                    S.col = 0;\n                } else {\n                    S.col += 1;\n                }\n                return ch;\n            };\n            if (!next.__argnames__) Object.defineProperties(next, {\n                __argnames__ : {value: [\"signal_eof\", \"in_string\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function find(what, signal_eof) {\n                var pos;\n                pos = S.text.indexOf(what, S.pos);\n                if (signal_eof && pos === -1) {\n                    throw EX_EOF;\n                }\n                return pos;\n            };\n            if (!find.__argnames__) Object.defineProperties(find, {\n                __argnames__ : {value: [\"what\", \"signal_eof\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function start_token() {\n                S.tokline = S.line;\n                S.tokcol = S.col;\n                S.tokpos = S.pos;\n            };\n            if (!start_token.__module__) Object.defineProperties(start_token, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function token(type, value, is_comment, keep_newline) {\n                var ret, i;\n                S.regex_allowed = type === \"operator\" || type === \"keyword\" && KEYWORDS_BEFORE_EXPRESSION[(typeof value === \"number\" && value < 0) ? KEYWORDS_BEFORE_EXPRESSION.length + value : value] || type === \"punc\" && PUNC_BEFORE_EXPRESSION[(typeof value === \"number\" && value < 0) ? PUNC_BEFORE_EXPRESSION.length + value : value];\n                if (type === \"operator\" && value === \"is\" && S.text.substr(S.pos).trimLeft().substr(0, 4).trimRight() === \"not\") {\n                    next_token();\n                    value = \"!==\";\n                }\n                if (type === \"operator\" && OP_MAP[(typeof value === \"number\" && value < 0) ? OP_MAP.length + value : value]) {\n                    value = OP_MAP[(typeof value === \"number\" && value < 0) ? OP_MAP.length + value : value];\n                }\n                ret = (function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"type\"] = type;\n                    ρσ_d[\"value\"] = value;\n                    ρσ_d[\"line\"] = S.tokline;\n                    ρσ_d[\"col\"] = S.tokcol;\n                    ρσ_d[\"pos\"] = S.tokpos;\n                    ρσ_d[\"endpos\"] = S.pos;\n                    ρσ_d[\"nlb\"] = S.newline_before;\n                    ρσ_d[\"file\"] = filename;\n                    ρσ_d[\"leading_whitespace\"] = (ρσ_expr_temp = S.whitespace_before)[ρσ_expr_temp.length-1] || \"\";\n                    return ρσ_d;\n                }).call(this);\n                if (!is_comment) {\n                    ret.comments_before = S.comments_before;\n                    S.comments_before = [];\n                    for (var ρσ_Index37 = 0; ρσ_Index37 < ret.comments_before.length; ρσ_Index37++) {\n                        i = ρσ_Index37;\n                        ret.nlb = ret.nlb || (ρσ_expr_temp = ret.comments_before)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].nlb;\n                    }\n                }\n                if (!keep_newline) {\n                    S.newline_before = false;\n                }\n                if (type === \"punc\") {\n                    if (value === \":\" && !(ρσ_expr_temp = S.index_or_slice)[ρσ_expr_temp.length-1] && !S.expecting_object_literal_key && (!S.text.substring(S.pos + 1, find(\"\\n\")).trim() || !S.text.substring(S.pos + 1, find(\"#\")).trim())) {\n                        S.newblock = true;\n                        S.indentation_matters.push(true);\n                    }\n                    if (value === \"[\") {\n                        if (S.prev && (S.prev.type === \"name\" || S.prev.type === \"punc\" && \")]\".indexOf(S.prev.value) !== -1)) {\n                            S.index_or_slice.push(true);\n                        } else {\n                            S.index_or_slice.push(false);\n                        }\n                        S.indentation_matters.push(false);\n                    } else if (value === \"{\" || value === \"(\") {\n                        S.indentation_matters.push(false);\n                    } else if (value === \"]\") {\n                        S.index_or_slice.pop();\n                        S.indentation_matters.pop();\n                    } else if (value === \"}\" || value === \")\") {\n                        S.indentation_matters.pop();\n                    }\n                }\n                S.prev = new AST_Token(ret);\n                return S.prev;\n            };\n            if (!token.__argnames__) Object.defineProperties(token, {\n                __argnames__ : {value: [\"type\", \"value\", \"is_comment\", \"keep_newline\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function parse_whitespace() {\n                var leading_whitespace, whitespace_exists, ch;\n                leading_whitespace = \"\";\n                whitespace_exists = false;\n                while (WHITESPACE_CHARS[ρσ_bound_index(peek(), WHITESPACE_CHARS)]) {\n                    whitespace_exists = true;\n                    ch = next();\n                    if (ch === \"\\n\") {\n                        leading_whitespace = \"\";\n                    } else {\n                        leading_whitespace += ch;\n                    }\n                }\n                if (peek() !== \"#\") {\n                    if (!whitespace_exists) {\n                        leading_whitespace = S.cached_whitespace;\n                    } else {\n                        S.cached_whitespace = leading_whitespace;\n                    }\n                    if (S.newline_before || S.endblock) {\n                        return test_indent_token(leading_whitespace);\n                    }\n                }\n            };\n            if (!parse_whitespace.__module__) Object.defineProperties(parse_whitespace, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function test_indent_token(leading_whitespace) {\n                var most_recent;\n                most_recent = (ρσ_expr_temp = S.whitespace_before)[ρσ_expr_temp.length-1] || \"\";\n                S.endblock = false;\n                if ((ρσ_expr_temp = S.indentation_matters)[ρσ_expr_temp.length-1] && leading_whitespace !== most_recent) {\n                    if (S.newblock && leading_whitespace && leading_whitespace.indexOf(most_recent) === 0) {\n                        S.newblock = false;\n                        S.whitespace_before.push(leading_whitespace);\n                        return 1;\n                    } else if (most_recent && most_recent.indexOf(leading_whitespace) === 0) {\n                        S.endblock = true;\n                        S.whitespace_before.pop();\n                        return -1;\n                    } else {\n                        parse_error(\"Inconsistent indentation\");\n                    }\n                }\n                return 0;\n            };\n            if (!test_indent_token.__argnames__) Object.defineProperties(test_indent_token, {\n                __argnames__ : {value: [\"leading_whitespace\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_while(pred) {\n                var ret, i, ch;\n                ret = \"\";\n                i = 0;\n                ch = \"\";\n                while ((ch = peek()) && pred(ch, i)) {\n                    i += 1;\n                    ret += next();\n                }\n                return ret;\n            };\n            if (!read_while.__argnames__) Object.defineProperties(read_while, {\n                __argnames__ : {value: [\"pred\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function parse_error(err, is_eof) {\n                throw new SyntaxError(err, filename, S.tokline, S.tokcol, S.tokpos, is_eof);\n            };\n            if (!parse_error.__argnames__) Object.defineProperties(parse_error, {\n                __argnames__ : {value: [\"err\", \"is_eof\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_num(prefix) {\n                var has_e, has_x, has_dot, num, valid, seen;\n                has_e = false;\n                has_x = false;\n                has_dot = prefix === \".\";\n                if (!prefix && peek() === \"0\" && S.text.charAt(S.pos + 1) === \"b\") {\n                    [next(), next()];\n                    num = read_while((function() {\n                        var ρσ_anonfunc = function (ch) {\n                            return ch === \"0\" || ch === \"1\";\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"ch\"]},\n                            __module__ : {value: \"tokenizer\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                    valid = parseInt(num, 2);\n                    if (isNaN(valid)) {\n                        parse_error(\"Invalid syntax for a binary number\");\n                    }\n                    return token(\"num\", valid);\n                }\n                seen = [];\n                num = read_while((function() {\n                    var ρσ_anonfunc = function (ch, i) {\n                        seen.push(ch);\n                        if (ch === \"x\" || ch === \"X\") {\n                            if (has_x || seen.length !== 2 || seen[0] !== \"0\") {\n                                return false;\n                            }\n                            has_x = true;\n                            return true;\n                        } else if (ch === \"e\" || ch === \"E\") {\n                            if (has_x) {\n                                return true;\n                            }\n                            if (has_e || (i === 0 || typeof i === \"object\" && ρσ_equals(i, 0))) {\n                                return false;\n                            }\n                            has_e = true;\n                            return true;\n                        } else if (ch === \"-\") {\n                            if (i === 0 && !prefix) {\n                                return true;\n                            }\n                            if (has_e && seen[ρσ_bound_index(i - 1, seen)].toLowerCase() === \"e\") {\n                                return true;\n                            }\n                            return false;\n                        } else if (ch === \"+\") {\n                            if (has_e && seen[ρσ_bound_index(i - 1, seen)].toLowerCase() === \"e\") {\n                                return true;\n                            }\n                            return false;\n                        } else if (ch === \".\") {\n                            return (!has_dot && !has_x && !has_e) ? has_dot = true : false;\n                        }\n                        return is_alphanumeric_char(ch.charCodeAt(0));\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"ch\", \"i\"]},\n                        __module__ : {value: \"tokenizer\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                if (prefix) {\n                    num = prefix + num;\n                }\n                valid = parse_js_number(num);\n                if (!isNaN(valid)) {\n                    return token(\"num\", valid);\n                } else {\n                    parse_error(\"Invalid syntax: \" + num);\n                }\n            };\n            if (!read_num.__argnames__) Object.defineProperties(read_num, {\n                __argnames__ : {value: [\"prefix\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_hex_digits(count) {\n                var ans, nval;\n                ans = \"\";\n                while (count > 0) {\n                    count -= 1;\n                    if (!HEX_PAT.test(peek())) {\n                        return ans;\n                    }\n                    ans += next();\n                }\n                nval = parseInt(ans, 16);\n                if (nval > 1114111) {\n                    return ans;\n                }\n                return nval;\n            };\n            if (!read_hex_digits.__argnames__) Object.defineProperties(read_hex_digits, {\n                __argnames__ : {value: [\"count\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_escape_sequence() {\n                var q, octal, code, name, key;\n                q = next(true);\n                if (q === \"\\n\") {\n                    return \"\";\n                }\n                if (q === \"\\\\\") {\n                    return q;\n                }\n                if (\"\\\"'\".indexOf(q) !== -1) {\n                    return q;\n                }\n                if (ASCII_CONTROL_CHARS[(typeof q === \"number\" && q < 0) ? ASCII_CONTROL_CHARS.length + q : q]) {\n                    return String.fromCharCode(ASCII_CONTROL_CHARS[(typeof q === \"number\" && q < 0) ? ASCII_CONTROL_CHARS.length + q : q]);\n                }\n                if (\"0\" <= q && q <= \"7\") {\n                    octal = q;\n                    if (\"0\" <= (ρσ_cond_temp = peek()) && ρσ_cond_temp <= \"7\") {\n                        octal += next();\n                    }\n                    if (\"0\" <= (ρσ_cond_temp = peek()) && ρσ_cond_temp <= \"7\") {\n                        octal += next();\n                    }\n                    code = parseInt(octal, 8);\n                    if (isNaN(code)) {\n                        return \"\\\\\" + octal;\n                    }\n                    return String.fromCharCode(code);\n                }\n                if (q === \"x\") {\n                    code = read_hex_digits(2);\n                    if (typeof code === \"number\") {\n                        return String.fromCharCode(code);\n                    }\n                    return \"\\\\x\" + code;\n                }\n                if (q === \"u\") {\n                    code = read_hex_digits(4);\n                    if (typeof code === \"number\") {\n                        return String.fromCharCode(code);\n                    }\n                    return \"\\\\u\" + code;\n                }\n                if (q === \"U\") {\n                    code = read_hex_digits(8);\n                    if (typeof code === \"number\") {\n                        if (code <= 65535) {\n                            return String.fromCharCode(code);\n                        }\n                        code -= 65536;\n                        return String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n                    }\n                    return \"\\\\U\" + code;\n                }\n                if (q === \"N\" && peek() === \"{\") {\n                    next();\n                    name = read_while((function() {\n                        var ρσ_anonfunc = function (ch) {\n                            return NAME_PAT.test(ch);\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"ch\"]},\n                            __module__ : {value: \"tokenizer\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                    if (peek() !== \"}\") {\n                        return \"\\\\N{\" + name;\n                    }\n                    next();\n                    key = (name || \"\").toLowerCase();\n                    if (!name || !Object.prototype.hasOwnProperty.call(ALIAS_MAP, key)) {\n                        return \"\\\\N{\" + name + \"}\";\n                    }\n                    code = ALIAS_MAP[(typeof key === \"number\" && key < 0) ? ALIAS_MAP.length + key : key];\n                    if (code <= 65535) {\n                        return String.fromCharCode(code);\n                    }\n                    code -= 65536;\n                    return String.fromCharCode(55296 + (code >> 10), 56320 + (code & 1023));\n                }\n                return \"\\\\\" + q;\n            };\n            if (!read_escape_sequence.__module__) Object.defineProperties(read_escape_sequence, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function with_eof_error(eof_error, cont) {\n                return (function() {\n                    var ρσ_anonfunc = function () {\n                        try {\n                            return cont.apply(null, arguments);\n                        } catch (ρσ_Exception) {\n                            ρσ_last_exception = ρσ_Exception;\n                            {\n                                var ex = ρσ_Exception;\n                                if (ex === EX_EOF) {\n                                    parse_error(eof_error, true);\n                                } else {\n                                    throw ρσ_Exception;\n                                }\n                            } \n                        }\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"tokenizer\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            };\n            if (!with_eof_error.__argnames__) Object.defineProperties(with_eof_error, {\n                __argnames__ : {value: [\"eof_error\", \"cont\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            read_string = with_eof_error(\"Unterminated string constant\", (function() {\n                var ρσ_anonfunc = function (is_raw_literal, is_js_literal) {\n                    var quote, tok_type, ret, is_multiline, ch;\n                    quote = next();\n                    tok_type = (is_js_literal) ? \"js\" : \"string\";\n                    ret = \"\";\n                    is_multiline = false;\n                    if (peek() === quote) {\n                        next(true);\n                        if (peek() === quote) {\n                            next(true);\n                            is_multiline = true;\n                        } else {\n                            return token(tok_type, \"\");\n                        }\n                    }\n                    while (true) {\n                        ch = next(true, true);\n                        if (!ch) {\n                            break;\n                        }\n                        if (ch === \"\\n\" && !is_multiline) {\n                            parse_error(\"End of line while scanning string literal\");\n                        }\n                        if (ch === \"\\\\\") {\n                            ret += (is_raw_literal) ? \"\\\\\" + next(true) : read_escape_sequence();\n                            continue;\n                        }\n                        if (ch === quote) {\n                            if (!is_multiline) {\n                                break;\n                            }\n                            if (peek() === quote) {\n                                next();\n                                if (peek() === quote) {\n                                    next();\n                                    break;\n                                } else {\n                                    ch += quote;\n                                }\n                            }\n                        }\n                        ret += ch;\n                    }\n                    return token(tok_type, ret);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"is_raw_literal\", \"is_js_literal\"]},\n                    __module__ : {value: \"tokenizer\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            function handle_interpolated_string(string, start_tok) {\n                var parts, ch, stok, j, potential_mod, mods, is_raw, combined;\n                function raise_error(err) {\n                    throw new SyntaxError(err, filename, start_tok.line, start_tok.col, start_tok.pos, false);\n                };\n                if (!raise_error.__argnames__) Object.defineProperties(raise_error, {\n                    __argnames__ : {value: [\"err\"]},\n                    __module__ : {value: \"tokenizer\"}\n                });\n\n                parts = [interpolate(string, raise_error)];\n                while (true) {\n                    while (S.pos < S.text.length && (S.text.charAt(S.pos) === \" \" || S.text.charAt(S.pos) === \"\\t\")) {\n                        next();\n                    }\n                    ch = S.text.charAt(S.pos);\n                    if (!ch) {\n                        break;\n                    }\n                    if (ch === \"'\" || ch === \"\\\"\") {\n                        stok = read_string(false, false);\n                        parts.push(quoted_string(stok.value));\n                    } else if (is_identifier_start(ch.charCodeAt(0))) {\n                        j = S.pos;\n                        while (j < S.text.length && is_identifier_char(S.text.charAt(j))) {\n                            j += 1;\n                        }\n                        potential_mod = S.text.substring(S.pos, j);\n                        if (!is_string_modifier(potential_mod)) {\n                            break;\n                        }\n                        if (j >= S.text.length || \"'\\\"\".indexOf(S.text.charAt(j)) === -1) {\n                            break;\n                        }\n                        mods = potential_mod.toLowerCase();\n                        if (mods.indexOf(\"v\") !== -1) {\n                            break;\n                        }\n                        while (S.pos < j) {\n                            next();\n                        }\n                        is_raw = mods.indexOf(\"r\") !== -1;\n                        stok = read_string(is_raw, false);\n                        if (mods.indexOf(\"f\") !== -1) {\n                            parts.push(interpolate(stok.value, raise_error));\n                        } else {\n                            parts.push(quoted_string(stok.value));\n                        }\n                    } else {\n                        break;\n                    }\n                }\n                combined = parts.join(\"+\");\n                S.text = S.text.slice(0, S.pos) + \"(\" + combined + \")\" + S.text.slice(S.pos);\n                return token(\"punc\", next());\n            };\n            if (!handle_interpolated_string.__argnames__) Object.defineProperties(handle_interpolated_string, {\n                __argnames__ : {value: [\"string\", \"start_tok\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_line_comment(shebang) {\n                var i, ret;\n                if (!shebang) {\n                    next();\n                }\n                i = find(\"\\n\");\n                if (i === -1) {\n                    ret = S.text.substr(S.pos);\n                    S.pos = S.text.length;\n                } else {\n                    ret = S.text.substring(S.pos, i);\n                    S.pos = i;\n                }\n                return token((shebang) ? \"shebang\" : \"comment1\", ret, true);\n            };\n            if (!read_line_comment.__argnames__) Object.defineProperties(read_line_comment, {\n                __argnames__ : {value: [\"shebang\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_name() {\n                var name, ch;\n                name = ch = \"\";\n                while ((ch = peek()) !== null) {\n                    if (ch === \"\\\\\") {\n                        if (S.text.charAt(S.pos + 1) === \"\\n\") {\n                            S.pos += 2;\n                            continue;\n                        }\n                        break;\n                    } else if (is_identifier_char(ch)) {\n                        name += next();\n                    } else {\n                        break;\n                    }\n                }\n                return name;\n            };\n            if (!read_name.__module__) Object.defineProperties(read_name, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            read_regexp = with_eof_error(\"Unterminated regular expression\", (function() {\n                var ρσ_anonfunc = function () {\n                    var prev_backslash, regexp, ch, in_class, verbose_regexp, in_comment, mods;\n                    prev_backslash = false;\n                    regexp = ch = \"\";\n                    in_class = false;\n                    verbose_regexp = false;\n                    in_comment = false;\n                    if (peek() === \"/\") {\n                        next(true);\n                        if (peek() === \"/\") {\n                            verbose_regexp = true;\n                            next(true);\n                        } else {\n                            mods = read_name();\n                            return token(\"regexp\", new RegExp(regexp, mods));\n                        }\n                    }\n                    while (true) {\n                        ch = next(true);\n                        if (!ch) {\n                            break;\n                        }\n                        if (in_comment) {\n                            if (ch === \"\\n\") {\n                                in_comment = false;\n                            }\n                            continue;\n                        }\n                        if (prev_backslash) {\n                            regexp += \"\\\\\" + ch;\n                            prev_backslash = false;\n                        } else if (ch === \"[\") {\n                            in_class = true;\n                            regexp += ch;\n                        } else if (ch === \"]\" && in_class) {\n                            in_class = false;\n                            regexp += ch;\n                        } else if (ch === \"/\" && !in_class) {\n                            if (verbose_regexp) {\n                                if (peek() !== \"/\") {\n                                    regexp += \"\\\\/\";\n                                    continue;\n                                }\n                                next(true);\n                                if (peek() !== \"/\") {\n                                    regexp += \"\\\\/\\\\/\";\n                                    continue;\n                                }\n                                next(true);\n                            }\n                            break;\n                        } else if (ch === \"\\\\\") {\n                            prev_backslash = true;\n                        } else if (verbose_regexp && !in_class && \" \\n\\r\\t\".indexOf(ch) !== -1) {\n                        } else if (verbose_regexp && !in_class && ch === \"#\") {\n                            in_comment = true;\n                        } else {\n                            regexp += ch;\n                        }\n                    }\n                    mods = read_name();\n                    return token(\"regexp\", new RegExp(regexp, mods));\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"tokenizer\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            function read_operator(prefix) {\n                var op;\n                function grow(op) {\n                    var bigger;\n                    if (!peek()) {\n                        return op;\n                    }\n                    bigger = op + peek();\n                    if (OPERATORS[(typeof bigger === \"number\" && bigger < 0) ? OPERATORS.length + bigger : bigger]) {\n                        next();\n                        return grow(bigger);\n                    } else {\n                        return op;\n                    }\n                };\n                if (!grow.__argnames__) Object.defineProperties(grow, {\n                    __argnames__ : {value: [\"op\"]},\n                    __module__ : {value: \"tokenizer\"}\n                });\n\n                op = grow(prefix || next());\n                if (op === \"->\") {\n                    return token(\"punc\", op);\n                }\n                return token(\"operator\", op);\n            };\n            if (!read_operator.__argnames__) Object.defineProperties(read_operator, {\n                __argnames__ : {value: [\"prefix\"]},\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function handle_slash() {\n                next();\n                return (S.regex_allowed) ? read_regexp(\"\") : read_operator(\"/\");\n            };\n            if (!handle_slash.__module__) Object.defineProperties(handle_slash, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function handle_dot() {\n                next();\n                return (is_digit(peek().charCodeAt(0))) ? read_num(\".\") : token(\"punc\", \".\");\n            };\n            if (!handle_dot.__module__) Object.defineProperties(handle_dot, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function read_word() {\n                var word;\n                word = read_name();\n                return (KEYWORDS_ATOM[(typeof word === \"number\" && word < 0) ? KEYWORDS_ATOM.length + word : word]) ? token(\"atom\", word) : (!KEYWORDS[(typeof word === \"number\" && word < 0) ? KEYWORDS.length + word : word]) ? token(\"name\", word) : (OPERATORS[(typeof word === \"number\" && word < 0) ? OPERATORS.length + word : word] && prevChar() !== \".\") ? token(\"operator\", word) : token(\"keyword\", word);\n            };\n            if (!read_word.__module__) Object.defineProperties(read_word, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            function next_token() {\n                var indent, ch, code, tmp_, regex_allowed, tok, mods, start_pos_for_string, stok;\n                indent = parse_whitespace();\n                if (indent === -1) {\n                    return token(\"punc\", \"}\", false, true);\n                }\n                start_token();\n                ch = peek();\n                if (!ch) {\n                    return token(\"eof\");\n                }\n                code = ch.charCodeAt(0);\n                tmp_ = code;\n                if (tmp_ === 34 || tmp_ === 39) {\n                    return read_string(false);\n                } else if (tmp_ === 35) {\n                    if (S.pos === 0 && S.text.charAt(1) === \"!\") {\n                        return read_line_comment(true);\n                    }\n                    regex_allowed = S.regex_allowed;\n                    S.comments_before.push(read_line_comment());\n                    S.regex_allowed = regex_allowed;\n                    return next_token();\n                } else if (tmp_ === 46) {\n                    return handle_dot();\n                } else if (tmp_ === 47) {\n                    return handle_slash();\n                }\n                if (is_digit(code)) {\n                    return read_num();\n                }\n                if (PUNC_CHARS[(typeof ch === \"number\" && ch < 0) ? PUNC_CHARS.length + ch : ch]) {\n                    return token(\"punc\", next());\n                }\n                if (OPERATOR_CHARS[(typeof ch === \"number\" && ch < 0) ? OPERATOR_CHARS.length + ch : ch]) {\n                    return read_operator();\n                }\n                if (code === 92 && S.text.charAt(S.pos + 1) === \"\\n\") {\n                    next();\n                    next();\n                    S.newline_before = false;\n                    return next_token();\n                }\n                if (is_identifier_start(code)) {\n                    tok = read_word();\n                    if (\"'\\\"\".indexOf(peek()) !== -1 && is_string_modifier(tok.value)) {\n                        mods = tok.value.toLowerCase();\n                        start_pos_for_string = S.tokpos;\n                        stok = read_string(mods.indexOf(\"r\") !== -1, mods.indexOf(\"v\") !== -1);\n                        tok.endpos = stok.endpos;\n                        if (stok.type !== \"js\" && mods.indexOf(\"f\") !== -1) {\n                            tok.col += start_pos_for_string - tok.pos;\n                            return handle_interpolated_string(stok.value, tok);\n                        }\n                        tok.value = stok.value;\n                        tok.type = stok.type;\n                    }\n                    return tok;\n                }\n                parse_error(\"Unexpected character «\" + ch + \"»\");\n            };\n            if (!next_token.__module__) Object.defineProperties(next_token, {\n                __module__ : {value: \"tokenizer\"}\n            });\n\n            next_token.context = (function() {\n                var ρσ_anonfunc = function (nc) {\n                    if (nc) {\n                        S = nc;\n                    }\n                    return S;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"nc\"]},\n                    __module__ : {value: \"tokenizer\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            return next_token;\n        };\n        if (!tokenizer.__argnames__) Object.defineProperties(tokenizer, {\n            __argnames__ : {value: [\"raw_text\", \"filename\"]},\n            __module__ : {value: \"tokenizer\"}\n        });\n\n        ρσ_modules.tokenizer.RE_HEX_NUMBER = RE_HEX_NUMBER;\n        ρσ_modules.tokenizer.RE_OCT_NUMBER = RE_OCT_NUMBER;\n        ρσ_modules.tokenizer.RE_DEC_NUMBER = RE_DEC_NUMBER;\n        ρσ_modules.tokenizer.OPERATOR_CHARS = OPERATOR_CHARS;\n        ρσ_modules.tokenizer.ASCII_CONTROL_CHARS = ASCII_CONTROL_CHARS;\n        ρσ_modules.tokenizer.HEX_PAT = HEX_PAT;\n        ρσ_modules.tokenizer.NAME_PAT = NAME_PAT;\n        ρσ_modules.tokenizer.OPERATORS = OPERATORS;\n        ρσ_modules.tokenizer.OP_MAP = OP_MAP;\n        ρσ_modules.tokenizer.WHITESPACE_CHARS = WHITESPACE_CHARS;\n        ρσ_modules.tokenizer.PUNC_BEFORE_EXPRESSION = PUNC_BEFORE_EXPRESSION;\n        ρσ_modules.tokenizer.PUNC_CHARS = PUNC_CHARS;\n        ρσ_modules.tokenizer.KEYWORDS = KEYWORDS;\n        ρσ_modules.tokenizer.KEYWORDS_ATOM = KEYWORDS_ATOM;\n        ρσ_modules.tokenizer.RESERVED_WORDS = RESERVED_WORDS;\n        ρσ_modules.tokenizer.KEYWORDS_BEFORE_EXPRESSION = KEYWORDS_BEFORE_EXPRESSION;\n        ρσ_modules.tokenizer.ALL_KEYWORDS = ALL_KEYWORDS;\n        ρσ_modules.tokenizer.IDENTIFIER_PAT = IDENTIFIER_PAT;\n        ρσ_modules.tokenizer.UNICODE = UNICODE;\n        ρσ_modules.tokenizer.EX_EOF = EX_EOF;\n        ρσ_modules.tokenizer.is_string_modifier = is_string_modifier;\n        ρσ_modules.tokenizer.is_letter = is_letter;\n        ρσ_modules.tokenizer.is_digit = is_digit;\n        ρσ_modules.tokenizer.is_alphanumeric_char = is_alphanumeric_char;\n        ρσ_modules.tokenizer.is_unicode_combining_mark = is_unicode_combining_mark;\n        ρσ_modules.tokenizer.is_unicode_connector_punctuation = is_unicode_connector_punctuation;\n        ρσ_modules.tokenizer.is_identifier = is_identifier;\n        ρσ_modules.tokenizer.is_identifier_start = is_identifier_start;\n        ρσ_modules.tokenizer.is_identifier_char = is_identifier_char;\n        ρσ_modules.tokenizer.parse_js_number = parse_js_number;\n        ρσ_modules.tokenizer.is_token = is_token;\n        ρσ_modules.tokenizer.tokenizer = tokenizer;\n    })();\n\n    (function(){\n        var __name__ = \"parse\";\n        var COMPILER_VERSION, PYTHON_FLAGS, NATIVE_CLASSES, ERROR_CLASSES, COMMON_STATIC, FORBIDDEN_CLASS_VARS, UNARY_PREFIX, ASSIGNMENT, PRECEDENCE, STATEMENTS_WITH_LABELS, ATOMIC_START_TOKEN, compile_time_decorators;\n        var make_predicate = ρσ_modules.utils.make_predicate;\n        var array_to_hash = ρσ_modules.utils.array_to_hash;\n        var defaults = ρσ_modules.utils.defaults;\n        var has_prop = ρσ_modules.utils.has_prop;\n        var cache_file_name = ρσ_modules.utils.cache_file_name;\n\n        var SyntaxError = ρσ_modules.errors.SyntaxError;\n        var ImportError = ρσ_modules.errors.ImportError;\n\n        var AST_Array = ρσ_modules.ast.AST_Array;\n        var AST_Assign = ρσ_modules.ast.AST_Assign;\n        var AST_Binary = ρσ_modules.ast.AST_Binary;\n        var AST_BlockStatement = ρσ_modules.ast.AST_BlockStatement;\n        var AST_Break = ρσ_modules.ast.AST_Break;\n        var AST_Call = ρσ_modules.ast.AST_Call;\n        var AST_Catch = ρσ_modules.ast.AST_Catch;\n        var AST_Class = ρσ_modules.ast.AST_Class;\n        var AST_ClassCall = ρσ_modules.ast.AST_ClassCall;\n        var AST_Conditional = ρσ_modules.ast.AST_Conditional;\n        var AST_Constant = ρσ_modules.ast.AST_Constant;\n        var AST_Continue = ρσ_modules.ast.AST_Continue;\n        var AST_DWLoop = ρσ_modules.ast.AST_DWLoop;\n        var AST_Debugger = ρσ_modules.ast.AST_Debugger;\n        var AST_Decorator = ρσ_modules.ast.AST_Decorator;\n        var AST_Definitions = ρσ_modules.ast.AST_Definitions;\n        var AST_DictComprehension = ρσ_modules.ast.AST_DictComprehension;\n        var AST_Directive = ρσ_modules.ast.AST_Directive;\n        var AST_Do = ρσ_modules.ast.AST_Do;\n        var AST_Dot = ρσ_modules.ast.AST_Dot;\n        var AST_Else = ρσ_modules.ast.AST_Else;\n        var AST_EmptyStatement = ρσ_modules.ast.AST_EmptyStatement;\n        var AST_Except = ρσ_modules.ast.AST_Except;\n        var AST_ExpressiveObject = ρσ_modules.ast.AST_ExpressiveObject;\n        var AST_False = ρσ_modules.ast.AST_False;\n        var AST_Finally = ρσ_modules.ast.AST_Finally;\n        var AST_ForIn = ρσ_modules.ast.AST_ForIn;\n        var AST_ForJS = ρσ_modules.ast.AST_ForJS;\n        var AST_Function = ρσ_modules.ast.AST_Function;\n        var AST_GeneratorComprehension = ρσ_modules.ast.AST_GeneratorComprehension;\n        var AST_Hole = ρσ_modules.ast.AST_Hole;\n        var AST_If = ρσ_modules.ast.AST_If;\n        var AST_Import = ρσ_modules.ast.AST_Import;\n        var AST_ImportedVar = ρσ_modules.ast.AST_ImportedVar;\n        var AST_Imports = ρσ_modules.ast.AST_Imports;\n        var AST_ListComprehension = ρσ_modules.ast.AST_ListComprehension;\n        var AST_Method = ρσ_modules.ast.AST_Method;\n        var AST_New = ρσ_modules.ast.AST_New;\n        var AST_Null = ρσ_modules.ast.AST_Null;\n        var AST_Number = ρσ_modules.ast.AST_Number;\n        var AST_Object = ρσ_modules.ast.AST_Object;\n        var AST_ObjectKeyVal = ρσ_modules.ast.AST_ObjectKeyVal;\n        var AST_PropAccess = ρσ_modules.ast.AST_PropAccess;\n        var AST_RegExp = ρσ_modules.ast.AST_RegExp;\n        var AST_Return = ρσ_modules.ast.AST_Return;\n        var AST_Scope = ρσ_modules.ast.AST_Scope;\n        var AST_Set = ρσ_modules.ast.AST_Set;\n        var AST_SetComprehension = ρσ_modules.ast.AST_SetComprehension;\n        var AST_SetItem = ρσ_modules.ast.AST_SetItem;\n        var AST_Seq = ρσ_modules.ast.AST_Seq;\n        var AST_SimpleStatement = ρσ_modules.ast.AST_SimpleStatement;\n        var AST_Splice = ρσ_modules.ast.AST_Splice;\n        var AST_String = ρσ_modules.ast.AST_String;\n        var AST_Sub = ρσ_modules.ast.AST_Sub;\n        var AST_ItemAccess = ρσ_modules.ast.AST_ItemAccess;\n        var AST_SymbolAlias = ρσ_modules.ast.AST_SymbolAlias;\n        var AST_SymbolCatch = ρσ_modules.ast.AST_SymbolCatch;\n        var AST_SymbolDefun = ρσ_modules.ast.AST_SymbolDefun;\n        var AST_SymbolFunarg = ρσ_modules.ast.AST_SymbolFunarg;\n        var AST_SymbolLambda = ρσ_modules.ast.AST_SymbolLambda;\n        var AST_SymbolNonlocal = ρσ_modules.ast.AST_SymbolNonlocal;\n        var AST_SymbolRef = ρσ_modules.ast.AST_SymbolRef;\n        var AST_SymbolVar = ρσ_modules.ast.AST_SymbolVar;\n        var AST_This = ρσ_modules.ast.AST_This;\n        var AST_Throw = ρσ_modules.ast.AST_Throw;\n        var AST_Toplevel = ρσ_modules.ast.AST_Toplevel;\n        var AST_True = ρσ_modules.ast.AST_True;\n        var AST_Try = ρσ_modules.ast.AST_Try;\n        var AST_UnaryPrefix = ρσ_modules.ast.AST_UnaryPrefix;\n        var AST_Undefined = ρσ_modules.ast.AST_Undefined;\n        var AST_Var = ρσ_modules.ast.AST_Var;\n        var AST_VarDef = ρσ_modules.ast.AST_VarDef;\n        var AST_Verbatim = ρσ_modules.ast.AST_Verbatim;\n        var AST_While = ρσ_modules.ast.AST_While;\n        var AST_With = ρσ_modules.ast.AST_With;\n        var AST_WithClause = ρσ_modules.ast.AST_WithClause;\n        var AST_Yield = ρσ_modules.ast.AST_Yield;\n        var AST_Assert = ρσ_modules.ast.AST_Assert;\n        var AST_Existential = ρσ_modules.ast.AST_Existential;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        var tokenizer = ρσ_modules.tokenizer.tokenizer;\n        var is_token = ρσ_modules.tokenizer.is_token;\n        var RESERVED_WORDS = ρσ_modules.tokenizer.RESERVED_WORDS;\n\n        COMPILER_VERSION = \"33bc40d444e2a542a0577a3a3b0549d8381795ff\";\n        PYTHON_FLAGS = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"dict_literals\"] = true;\n            ρσ_d[\"overload_getitem\"] = true;\n            ρσ_d[\"bound_methods\"] = true;\n            ρσ_d[\"hash_literals\"] = true;\n            return ρσ_d;\n        }).call(this);\n        function get_compiler_version() {\n            return COMPILER_VERSION;\n        };\n        if (!get_compiler_version.__module__) Object.defineProperties(get_compiler_version, {\n            __module__ : {value: \"parse\"}\n        });\n\n        function static_predicate(names) {\n            return (function() {\n                var ρσ_Iter = ρσ_Iterable(names.split(\" \")), ρσ_Result = Object.create(null), k;\n                for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                    k = ρσ_Iter[ρσ_Index];\n                    ρσ_Result[k] = (true);\n                }\n                return ρσ_Result;\n            })();\n        };\n        if (!static_predicate.__argnames__) Object.defineProperties(static_predicate, {\n            __argnames__ : {value: [\"names\"]},\n            __module__ : {value: \"parse\"}\n        });\n\n        NATIVE_CLASSES = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"Image\"] = Object.create(null);\n            ρσ_d[\"FileReader\"] = Object.create(null);\n            ρσ_d[\"RegExp\"] = Object.create(null);\n            ρσ_d[\"Error\"] = Object.create(null);\n            ρσ_d[\"EvalError\"] = Object.create(null);\n            ρσ_d[\"InternalError\"] = Object.create(null);\n            ρσ_d[\"RangeError\"] = Object.create(null);\n            ρσ_d[\"ReferenceError\"] = Object.create(null);\n            ρσ_d[\"SyntaxError\"] = Object.create(null);\n            ρσ_d[\"TypeError\"] = Object.create(null);\n            ρσ_d[\"URIError\"] = Object.create(null);\n            ρσ_d[\"Object\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"getOwnPropertyNames getOwnPropertyDescriptor getOwnPropertyDescriptors getOwnPropertySymbols keys entries values create defineProperty defineProperties getPrototypeOf setPrototypeOf assign seal isSealed is preventExtensions isExtensible freeze isFrozen\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"String\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"fromCharCode\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"Array\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"isArray from of\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"Function\"] = Object.create(null);\n            ρσ_d[\"Date\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"UTC now parse\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"ArrayBuffer\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"isView transfer\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"DataView\"] = Object.create(null);\n            ρσ_d[\"Float32Array\"] = Object.create(null);\n            ρσ_d[\"Float64Array\"] = Object.create(null);\n            ρσ_d[\"Int16Array\"] = Object.create(null);\n            ρσ_d[\"Int32Array\"] = Object.create(null);\n            ρσ_d[\"Int8Array\"] = Object.create(null);\n            ρσ_d[\"Uint16Array\"] = Object.create(null);\n            ρσ_d[\"Uint32Array\"] = Object.create(null);\n            ρσ_d[\"Uint8Array\"] = Object.create(null);\n            ρσ_d[\"Uint8ClampedArray\"] = Object.create(null);\n            ρσ_d[\"Map\"] = Object.create(null);\n            ρσ_d[\"WeakMap\"] = Object.create(null);\n            ρσ_d[\"Proxy\"] = Object.create(null);\n            ρσ_d[\"Set\"] = Object.create(null);\n            ρσ_d[\"WeakSet\"] = Object.create(null);\n            ρσ_d[\"Promise\"] = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"static\"] = static_predicate(\"all race reject resolve\");\n                return ρσ_d;\n            }).call(this);\n            ρσ_d[\"WebSocket\"] = Object.create(null);\n            ρσ_d[\"XMLHttpRequest\"] = Object.create(null);\n            ρσ_d[\"TextEncoder\"] = Object.create(null);\n            ρσ_d[\"TextDecoder\"] = Object.create(null);\n            ρσ_d[\"MouseEvent\"] = Object.create(null);\n            ρσ_d[\"Event\"] = Object.create(null);\n            ρσ_d[\"CustomEvent\"] = Object.create(null);\n            ρσ_d[\"Blob\"] = Object.create(null);\n            return ρσ_d;\n        }).call(this);\n        ERROR_CLASSES = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"Exception\"] = Object.create(null);\n            ρσ_d[\"AttributeError\"] = Object.create(null);\n            ρσ_d[\"IndexError\"] = Object.create(null);\n            ρσ_d[\"KeyError\"] = Object.create(null);\n            ρσ_d[\"ValueError\"] = Object.create(null);\n            ρσ_d[\"UnicodeDecodeError\"] = Object.create(null);\n            ρσ_d[\"AssertionError\"] = Object.create(null);\n            ρσ_d[\"ZeroDivisionError\"] = Object.create(null);\n            return ρσ_d;\n        }).call(this);\n        COMMON_STATIC = static_predicate(\"call apply bind toString\");\n        FORBIDDEN_CLASS_VARS = \"prototype constructor\".split(\" \");\n        UNARY_PREFIX = make_predicate(\"typeof void delete ~ - + ! @\");\n        ASSIGNMENT = make_predicate(\"= += -= /= //= *= %= >>= <<= >>>= |= ^= &=\");\n        PRECEDENCE = (function() {\n            var ρσ_anonfunc = function (a, ret) {\n                var b, j, i;\n                for (var ρσ_Index38 = 0; ρσ_Index38 < a.length; ρσ_Index38++) {\n                    i = ρσ_Index38;\n                    b = a[(typeof i === \"number\" && i < 0) ? a.length + i : i];\n                    for (var ρσ_Index39 = 0; ρσ_Index39 < b.length; ρσ_Index39++) {\n                        j = ρσ_Index39;\n                        ret[ρσ_bound_index(b[(typeof j === \"number\" && j < 0) ? b.length + j : j], ret)] = i + 1;\n                    }\n                }\n                return ret;\n            };\n            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                __argnames__ : {value: [\"a\", \"ret\"]},\n                __module__ : {value: \"parse\"}\n            });\n            return ρσ_anonfunc;\n        })()(ρσ_list_decorate([ ρσ_list_decorate([ \"||\" ]), ρσ_list_decorate([ \"&&\" ]), ρσ_list_decorate([ \"|\" ]), ρσ_list_decorate([ \"^\" ]), ρσ_list_decorate([ \"&\" ]), ρσ_list_decorate([ \"==\", \"===\", \"!=\", \"!==\" ]), ρσ_list_decorate([ \"<\", \">\", \"<=\", \">=\", \"in\", \"nin\", \"instanceof\" ]), ρσ_list_decorate([ \">>\", \"<<\", \">>>\" ]), ρσ_list_decorate([ \"+\", \"-\" ]), ρσ_list_decorate([ \"*\", \"/\", \"//\", \"%\" ]), ρσ_list_decorate([ \"**\" ]) ]), Object.create(null));\n        STATEMENTS_WITH_LABELS = array_to_hash(ρσ_list_decorate([ \"for\", \"do\", \"while\", \"switch\" ]));\n        ATOMIC_START_TOKEN = array_to_hash(ρσ_list_decorate([ \"atom\", \"num\", \"string\", \"regexp\", \"name\", \"js\" ]));\n        compile_time_decorators = ρσ_list_decorate([ \"staticmethod\", \"external\", \"property\" ]);\n        function has_simple_decorator(decorators, name) {\n            var remove, s;\n            remove = [];\n            for (var i = 0; i < decorators.length; i++) {\n                s = decorators[(typeof i === \"number\" && i < 0) ? decorators.length + i : i];\n                if (is_node_type(s, AST_SymbolRef) && !s.parens && s.name === name) {\n                    remove.push(i);\n                }\n            }\n            if (remove.length) {\n                remove.reverse();\n                for (var i = 0; i < remove.length; i++) {\n                    decorators.splice(remove[(typeof i === \"number\" && i < 0) ? remove.length + i : i], 1);\n                }\n                return true;\n            }\n            return false;\n        };\n        if (!has_simple_decorator.__argnames__) Object.defineProperties(has_simple_decorator, {\n            __argnames__ : {value: [\"decorators\", \"name\"]},\n            __module__ : {value: \"parse\"}\n        });\n\n        function has_setter_decorator(decorators, name) {\n            var remove, s;\n            remove = [];\n            for (var i = 0; i < decorators.length; i++) {\n                s = decorators[(typeof i === \"number\" && i < 0) ? decorators.length + i : i];\n                if (is_node_type(s, AST_Dot) && is_node_type(s.expression, AST_SymbolRef) && s.expression.name === name && s.property === \"setter\") {\n                    remove.push(i);\n                }\n            }\n            if (remove.length) {\n                remove.reverse();\n                for (var i = 0; i < remove.length; i++) {\n                    decorators.splice(remove[(typeof i === \"number\" && i < 0) ? remove.length + i : i], 1);\n                }\n                return true;\n            }\n            return false;\n        };\n        if (!has_setter_decorator.__argnames__) Object.defineProperties(has_setter_decorator, {\n            __argnames__ : {value: [\"decorators\", \"name\"]},\n            __module__ : {value: \"parse\"}\n        });\n\n        function create_parser_ctx(S, import_dirs, module_id, baselib_items, imported_module_ids, imported_modules, importing_modules, options) {\n            function next() {\n                S.prev = S.token;\n                if (S.peeked.length) {\n                    S.token = S.peeked.shift();\n                } else {\n                    S.token = S.input();\n                }\n                return S.token;\n            };\n            if (!next.__module__) Object.defineProperties(next, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function is_(type, value) {\n                return is_token(S.token, type, value);\n            };\n            if (!is_.__argnames__) Object.defineProperties(is_, {\n                __argnames__ : {value: [\"type\", \"value\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function peek() {\n                if (!S.peeked.length) {\n                    S.peeked.push(S.input());\n                }\n                return S.peeked[0];\n            };\n            if (!peek.__module__) Object.defineProperties(peek, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function prev() {\n                return S.prev;\n            };\n            if (!prev.__module__) Object.defineProperties(prev, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function croak(msg, line, col, pos, is_eof) {\n                var ctx;\n                ctx = S.input.context();\n                throw new SyntaxError(msg, ctx.filename, (line !== undefined) ? line : ctx.tokline, (col !== undefined) ? col : ctx.tokcol, (pos !== undefined) ? pos : ctx.tokpos, is_eof);\n            };\n            if (!croak.__argnames__) Object.defineProperties(croak, {\n                __argnames__ : {value: [\"msg\", \"line\", \"col\", \"pos\", \"is_eof\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function token_error(token, msg) {\n                var is_eof;\n                is_eof = token.type === \"eof\";\n                croak(msg, token.line, token.col, undefined, is_eof);\n            };\n            if (!token_error.__argnames__) Object.defineProperties(token_error, {\n                __argnames__ : {value: [\"token\", \"msg\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function unexpected(token) {\n                if (token === undefined) {\n                    token = S.token;\n                }\n                token_error(token, \"Unexpected token: \" + token.type + \" «\" + token.value + \"»\");\n            };\n            if (!unexpected.__argnames__) Object.defineProperties(unexpected, {\n                __argnames__ : {value: [\"token\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expect_token(type, val) {\n                if (is_(type, val)) {\n                    return next();\n                }\n                token_error(S.token, \"Unexpected token \" + S.token.type + \" «\" + S.token.value + \"»\" + \", expected \" + type + \" «\" + val + \"»\");\n            };\n            if (!expect_token.__argnames__) Object.defineProperties(expect_token, {\n                __argnames__ : {value: [\"type\", \"val\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expect(punc) {\n                return expect_token(\"punc\", punc);\n            };\n            if (!expect.__argnames__) Object.defineProperties(expect, {\n                __argnames__ : {value: [\"punc\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function semicolon() {\n                if (is_(\"punc\", \";\")) {\n                    next();\n                    S.token.nlb = true;\n                }\n            };\n            if (!semicolon.__module__) Object.defineProperties(semicolon, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function embed_tokens(parser) {\n                function with_embedded_tokens() {\n                    var start, expr, end;\n                    start = S.token;\n                    expr = parser();\n                    if (expr === undefined) {\n                        unexpected();\n                    }\n                    end = prev();\n                    expr.start = start;\n                    expr.end = end;\n                    return expr;\n                };\n                if (!with_embedded_tokens.__module__) Object.defineProperties(with_embedded_tokens, {\n                    __module__ : {value: \"parse\"}\n                });\n\n                return with_embedded_tokens;\n            };\n            if (!embed_tokens.__argnames__) Object.defineProperties(embed_tokens, {\n                __argnames__ : {value: [\"parser\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function scan_for_top_level_callables(body) {\n                var ans, opt, x, obj;\n                ans = [];\n                if (Array.isArray(body)) {\n                    var ρσ_Iter40 = ρσ_Iterable(body);\n                    for (var ρσ_Index40 = 0; ρσ_Index40 < ρσ_Iter40.length; ρσ_Index40++) {\n                        obj = ρσ_Iter40[ρσ_Index40];\n                        if (is_node_type(obj, AST_Function) || is_node_type(obj, AST_Class)) {\n                            if (obj.name) {\n                                ans.push(obj.name.name);\n                            } else {\n                                token_error(obj.start, \"Top-level functions must have names\");\n                            }\n                        } else {\n                            if (is_node_type(obj, AST_Scope)) {\n                                continue;\n                            }\n                            var ρσ_Iter41 = ρσ_Iterable(ρσ_list_decorate([ \"body\", \"alternative\" ]));\n                            for (var ρσ_Index41 = 0; ρσ_Index41 < ρσ_Iter41.length; ρσ_Index41++) {\n                                x = ρσ_Iter41[ρσ_Index41];\n                                opt = obj[(typeof x === \"number\" && x < 0) ? obj.length + x : x];\n                                if (opt) {\n                                    ans = ans.concat(scan_for_top_level_callables(opt));\n                                }\n                                if (is_node_type(opt, AST_Assign) && !(is_node_type(opt.right, AST_Scope))) {\n                                    ans = ans.concat(scan_for_top_level_callables(opt.right));\n                                }\n                            }\n                        }\n                    }\n                } else if (body.body) {\n                    ans = ans.concat(scan_for_top_level_callables(body.body));\n                    if (body.alternative) {\n                        ans = ans.concat(scan_for_top_level_callables(body.alternative));\n                    }\n                }\n                return ans;\n            };\n            if (!scan_for_top_level_callables.__argnames__) Object.defineProperties(scan_for_top_level_callables, {\n                __argnames__ : {value: [\"body\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function scan_for_classes(body) {\n                var ans, obj;\n                ans = Object.create(null);\n                var ρσ_Iter42 = ρσ_Iterable(body);\n                for (var ρσ_Index42 = 0; ρσ_Index42 < ρσ_Iter42.length; ρσ_Index42++) {\n                    obj = ρσ_Iter42[ρσ_Index42];\n                    if (is_node_type(obj, AST_Class)) {\n                        ans[ρσ_bound_index(obj.name.name, ans)] = obj;\n                    }\n                }\n                return ans;\n            };\n            if (!scan_for_classes.__argnames__) Object.defineProperties(scan_for_classes, {\n                __argnames__ : {value: [\"body\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function scan_for_local_vars(body) {\n                var localvars, seen, opt, option, clause, stmt, is_compound_assign, lhs;\n                localvars = [];\n                seen = Object.create(null);\n                function push(x) {\n                    if (has_prop(seen, x)) {\n                        return;\n                    }\n                    seen[(typeof x === \"number\" && x < 0) ? seen.length + x : x] = true;\n                    localvars.push(x);\n                };\n                if (!push.__argnames__) Object.defineProperties(push, {\n                    __argnames__ : {value: [\"x\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                function extend(arr) {\n                    var x;\n                    var ρσ_Iter43 = ρσ_Iterable(arr);\n                    for (var ρσ_Index43 = 0; ρσ_Index43 < ρσ_Iter43.length; ρσ_Index43++) {\n                        x = ρσ_Iter43[ρσ_Index43];\n                        push(x);\n                    }\n                };\n                if (!extend.__argnames__) Object.defineProperties(extend, {\n                    __argnames__ : {value: [\"arr\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                function scan_in_array(arr) {\n                    var x;\n                    var ρσ_Iter44 = ρσ_Iterable(arr);\n                    for (var ρσ_Index44 = 0; ρσ_Index44 < ρσ_Iter44.length; ρσ_Index44++) {\n                        x = ρσ_Iter44[ρσ_Index44];\n                        if (is_node_type(x, AST_Seq)) {\n                            x = x.to_array();\n                        } else if (is_node_type(x, AST_Array)) {\n                            x = x.elements;\n                        }\n                        if (Array.isArray(x)) {\n                            scan_in_array(x);\n                        } else {\n                            if (!is_node_type(x, AST_PropAccess)) {\n                                push(x.name);\n                            }\n                        }\n                    }\n                };\n                if (!scan_in_array.__argnames__) Object.defineProperties(scan_in_array, {\n                    __argnames__ : {value: [\"arr\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                function add_assign_lhs(lhs) {\n                    if (is_node_type(lhs, AST_Seq)) {\n                        lhs = new AST_Array((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"elements\"] = lhs.to_array();\n                            return ρσ_d;\n                        }).call(this));\n                    }\n                    if (is_node_type(lhs, AST_Array)) {\n                        push(\"ρσ_unpack\");\n                        scan_in_array(lhs.elements);\n                    } else if (lhs.name) {\n                        push(lhs.name);\n                    }\n                };\n                if (!add_assign_lhs.__argnames__) Object.defineProperties(add_assign_lhs, {\n                    __argnames__ : {value: [\"lhs\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                function add_for_in(stmt) {\n                    if (is_node_type(stmt.init, AST_Array)) {\n                        push(\"ρσ_unpack\");\n                        scan_in_array(stmt.init.elements);\n                    } else {\n                        push(stmt.init.name);\n                    }\n                };\n                if (!add_for_in.__argnames__) Object.defineProperties(add_for_in, {\n                    __argnames__ : {value: [\"stmt\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                if (Array.isArray(body)) {\n                    var ρσ_Iter45 = ρσ_Iterable(body);\n                    for (var ρσ_Index45 = 0; ρσ_Index45 < ρσ_Iter45.length; ρσ_Index45++) {\n                        stmt = ρσ_Iter45[ρσ_Index45];\n                        if (is_node_type(stmt, AST_Scope)) {\n                            continue;\n                        }\n                        var ρσ_Iter46 = ρσ_Iterable(ρσ_list_decorate([ \"body\", \"alternative\", \"bcatch\", \"condition\" ]));\n                        for (var ρσ_Index46 = 0; ρσ_Index46 < ρσ_Iter46.length; ρσ_Index46++) {\n                            option = ρσ_Iter46[ρσ_Index46];\n                            opt = stmt[(typeof option === \"number\" && option < 0) ? stmt.length + option : option];\n                            if (opt) {\n                                extend(scan_for_local_vars(opt));\n                            }\n                            if (is_node_type(opt, AST_Assign) && !(is_node_type(opt.right, AST_Scope))) {\n                                extend(scan_for_local_vars(opt.right));\n                            }\n                        }\n                        if (is_node_type(stmt, AST_ForIn)) {\n                            add_for_in(stmt);\n                        } else if (is_node_type(stmt, AST_DWLoop)) {\n                            extend(scan_for_local_vars(stmt));\n                        } else if (is_node_type(stmt, AST_With)) {\n                            [push(\"ρσ_with_exception\"), push(\"ρσ_with_suppress\")];\n                            var ρσ_Iter47 = ρσ_Iterable(stmt.clauses);\n                            for (var ρσ_Index47 = 0; ρσ_Index47 < ρσ_Iter47.length; ρσ_Index47++) {\n                                clause = ρσ_Iter47[ρσ_Index47];\n                                if (clause.alias) {\n                                    push(clause.alias.name);\n                                }\n                            }\n                        }\n                    }\n                } else if (body.body) {\n                    extend(scan_for_local_vars(body.body));\n                    if (body.alternative) {\n                        extend(scan_for_local_vars(body.alternative));\n                    }\n                } else if (is_node_type(body, AST_Assign)) {\n                    if (body.is_chained()) {\n                        is_compound_assign = false;\n                        var ρσ_Iter48 = ρσ_Iterable(body.traverse_chain()[0]);\n                        for (var ρσ_Index48 = 0; ρσ_Index48 < ρσ_Iter48.length; ρσ_Index48++) {\n                            lhs = ρσ_Iter48[ρσ_Index48];\n                            add_assign_lhs(lhs);\n                            if (is_node_type(lhs, AST_Seq) || is_node_type(lhs, AST_Array)) {\n                                is_compound_assign = true;\n                                break;\n                            }\n                        }\n                        if (is_compound_assign) {\n                            push(\"ρσ_chain_assign_temp\");\n                        }\n                    } else {\n                        add_assign_lhs(body.left);\n                    }\n                    if (!is_node_type(body.right, AST_Scope)) {\n                        extend(scan_for_local_vars(body.right));\n                    }\n                } else if (is_node_type(body, AST_ForIn)) {\n                    add_for_in(body);\n                }\n                return localvars;\n            };\n            if (!scan_for_local_vars.__argnames__) Object.defineProperties(scan_for_local_vars, {\n                __argnames__ : {value: [\"body\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function scan_for_nonlocal_defs(body) {\n                var vardef, opt, option, stmt;\n                vars = [];\n                if (Array.isArray(body)) {\n                    var ρσ_Iter49 = ρσ_Iterable(body);\n                    for (var ρσ_Index49 = 0; ρσ_Index49 < ρσ_Iter49.length; ρσ_Index49++) {\n                        stmt = ρσ_Iter49[ρσ_Index49];\n                        if (is_node_type(stmt, AST_Scope)) {\n                            continue;\n                        }\n                        if (is_node_type(stmt, AST_Definitions)) {\n                            var ρσ_Iter50 = ρσ_Iterable(stmt.definitions);\n                            for (var ρσ_Index50 = 0; ρσ_Index50 < ρσ_Iter50.length; ρσ_Index50++) {\n                                vardef = ρσ_Iter50[ρσ_Index50];\n                                vars.push(vardef.name.name);\n                            }\n                        }\n                        var ρσ_Iter51 = ρσ_Iterable(ρσ_list_decorate([ \"body\", \"alternative\" ]));\n                        for (var ρσ_Index51 = 0; ρσ_Index51 < ρσ_Iter51.length; ρσ_Index51++) {\n                            option = ρσ_Iter51[ρσ_Index51];\n                            var vars;\n                            opt = stmt[(typeof option === \"number\" && option < 0) ? stmt.length + option : option];\n                            if (opt) {\n                                vars = vars.concat(scan_for_nonlocal_defs(opt));\n                            }\n                        }\n                    }\n                } else if (body.body) {\n                    vars = vars.concat(scan_for_nonlocal_defs(body.body));\n                    if (body.alternative) {\n                        vars = vars.concat(scan_for_nonlocal_defs(body.alternative));\n                    }\n                }\n                return vars;\n            };\n            if (!scan_for_nonlocal_defs.__argnames__) Object.defineProperties(scan_for_nonlocal_defs, {\n                __argnames__ : {value: [\"body\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function return_() {\n                var value, is_end_of_statement;\n                if (is_(\"punc\", \";\")) {\n                    semicolon();\n                    value = null;\n                } else {\n                    is_end_of_statement = S.token.nlb || is_(\"eof\") || is_(\"punc\", \"}\");\n                    if (is_end_of_statement) {\n                        value = null;\n                    } else {\n                        value = expression(true);\n                        semicolon();\n                    }\n                }\n                return value;\n            };\n            if (!return_.__module__) Object.defineProperties(return_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            \n            var statement = embed_tokens((function() {\n                var ρσ_anonfunc = function statement() {\n                    var tmp_, p, while_cond, start, func, chain, cond, msg, tmp;\n                    if (S.token.type === \"operator\" && S.token.value.substr(0, 1) === \"/\") {\n                        token_error(S.token, \"RapydScript does not support statements starting with regexp literals\");\n                    }\n                    S.statement_starting_token = S.token;\n                    tmp_ = S.token.type;\n                    p = prev();\n                    if (p && !S.token.nlb && ATOMIC_START_TOKEN[ρσ_bound_index(p.type, ATOMIC_START_TOKEN)] && !is_(\"punc\", \":\")) {\n                        unexpected();\n                    }\n                    if (tmp_ === \"string\") {\n                        return simple_statement();\n                    } else if (tmp_ === \"shebang\") {\n                        tmp_ = S.token.value;\n                        next();\n                        return new AST_Directive((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"value\"] = tmp_;\n                            return ρσ_d;\n                        }).call(this));\n                    } else if (tmp_ === \"num\" || tmp_ === \"regexp\" || tmp_ === \"operator\" || tmp_ === \"atom\" || tmp_ === \"js\") {\n                        return simple_statement();\n                    } else if (tmp_ === \"punc\") {\n                        tmp_ = S.token.value;\n                        if (tmp_ === \":\") {\n                            return new AST_BlockStatement((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = S.token;\n                                ρσ_d[\"body\"] = block_();\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"{\" || tmp_ === \"[\" || tmp_ === \"(\") {\n                            return simple_statement();\n                        } else if (tmp_ === \";\") {\n                            next();\n                            return new AST_EmptyStatement((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"stype\"] = \";\";\n                                ρσ_d[\"start\"] = prev();\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                        } else {\n                            unexpected();\n                        }\n                    } else if (tmp_ === \"name\") {\n                        if (is_token(peek(), \"punc\", \":\")) token_error(peek(), \"invalid syntax, colon not allowed here\");\n                        return simple_statement();\n                    } else if (tmp_ === \"keyword\") {\n                        tmp_ = S.token.value;\n                        next();\n                        if (tmp_ === \"break\") {\n                            return break_cont(AST_Break);\n                        } else if (tmp_ === \"continue\") {\n                            return break_cont(AST_Continue);\n                        } else if (tmp_ === \"debugger\") {\n                            semicolon();\n                            return new AST_Debugger;\n                        } else if (tmp_ === \"do\") {\n                            return new AST_Do((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"body\"] = in_loop(statement);\n                                ρσ_d[\"condition\"] = (function() {\n                                    var ρσ_anonfunc = function () {\n                                        var tmp;\n                                        expect(\".\");\n                                        expect_token(\"keyword\", \"while\");\n                                        tmp = expression(true);\n                                        if (is_node_type(tmp, AST_Assign)) {\n                                            croak(\"Assignments in do loop conditions are not allowed\");\n                                        }\n                                        semicolon();\n                                        return tmp;\n                                    };\n                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                        __module__ : {value: \"parse\"}\n                                    });\n                                    return ρσ_anonfunc;\n                                })()();\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"while\") {\n                            while_cond = expression(true);\n                            if (is_node_type(while_cond, AST_Assign)) {\n                                croak(\"Assignments in while loop conditions are not allowed\");\n                            }\n                            if (!is_(\"punc\", \":\")) {\n                                croak(\"Expected a colon after the while statement\");\n                            }\n                            return new AST_While((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"condition\"] = while_cond;\n                                ρσ_d[\"body\"] = in_loop(statement);\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"for\") {\n                            if (is_(\"js\")) {\n                                return for_js();\n                            }\n                            return for_();\n                        } else if (tmp_ === \"from\") {\n                            return import_(true);\n                        } else if (tmp_ === \"import\") {\n                            return import_(false);\n                        } else if (tmp_ === \"class\") {\n                            return class_();\n                        } else if (tmp_ === \"def\") {\n                            start = prev();\n                            func = function_((ρσ_expr_temp = S.in_class)[ρσ_expr_temp.length-1], false);\n                            func.start = start;\n                            func.end = prev();\n                            chain = subscripts(func, true);\n                            if (chain === func) {\n                                return func;\n                            } else {\n                                return new AST_SimpleStatement((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"start\"] = start;\n                                    ρσ_d[\"body\"] = chain;\n                                    ρσ_d[\"end\"] = prev();\n                                    return ρσ_d;\n                                }).call(this));\n                            }\n                        } else if (tmp_ === \"assert\") {\n                            start = prev();\n                            cond = expression(false);\n                            msg = null;\n                            if (is_(\"punc\", \",\")) {\n                                next();\n                                msg = expression(false);\n                            }\n                            return new AST_Assert((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"condition\"] = cond;\n                                ρσ_d[\"message\"] = msg;\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"if\") {\n                            return if_();\n                        } else if (tmp_ === \"pass\") {\n                            semicolon();\n                            return new AST_EmptyStatement((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"stype\"] = \"pass\";\n                                ρσ_d[\"start\"] = prev();\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"return\") {\n                            if (S.in_function === 0) {\n                                croak(\"'return' outside of function\");\n                            }\n                            if ((ρσ_expr_temp = S.functions)[ρσ_expr_temp.length-1].is_generator) {\n                                croak(\"'return' not allowed in a function with yield\");\n                            }\n                            (ρσ_expr_temp = S.functions)[ρσ_expr_temp.length-1].is_generator = false;\n                            return new AST_Return((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"value\"] = return_();\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"yield\") {\n                            return yield_();\n                        } else if (tmp_ === \"raise\") {\n                            if (S.token.nlb) {\n                                return new AST_Throw((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"value\"] = new AST_SymbolCatch((function(){\n                                        var ρσ_d = Object.create(null);\n                                        ρσ_d[\"name\"] = \"ρσ_Exception\";\n                                        return ρσ_d;\n                                    }).call(this));\n                                    return ρσ_d;\n                                }).call(this));\n                            }\n                            tmp = expression(true);\n                            semicolon();\n                            return new AST_Throw((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"value\"] = tmp;\n                                return ρσ_d;\n                            }).call(this));\n                        } else if (tmp_ === \"try\") {\n                            return try_();\n                        } else if (tmp_ === \"nonlocal\") {\n                            tmp = nonlocal_();\n                            semicolon();\n                            return tmp;\n                        } else if (tmp_ === \"global\") {\n                            tmp = nonlocal_(true);\n                            semicolon();\n                            return tmp;\n                        } else if (tmp_ === \"with\") {\n                            return with_();\n                        } else {\n                            unexpected();\n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"parse\"}\n                });\n                return ρσ_anonfunc;\n            })());\n\n            function with_() {\n                var clauses, start, expr, alias, body;\n                clauses = [];\n                start = S.token;\n                while (true) {\n                    if (is_(\"eof\")) {\n                        unexpected();\n                    }\n                    expr = expression();\n                    alias = null;\n                    if (is_(\"keyword\", \"as\")) {\n                        next();\n                        alias = as_symbol(AST_SymbolAlias);\n                    }\n                    clauses.push(new AST_WithClause((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"expression\"] = expr;\n                        ρσ_d[\"alias\"] = alias;\n                        return ρσ_d;\n                    }).call(this)));\n                    if (is_(\"punc\", \",\")) {\n                        next();\n                        continue;\n                    }\n                    if (!is_(\"punc\", \":\")) {\n                        unexpected();\n                    }\n                    break;\n                }\n                if (!clauses.length) {\n                    token_error(start, \"with statement must have at least one clause\");\n                }\n                body = statement();\n                return new AST_With((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"clauses\"] = clauses;\n                    ρσ_d[\"body\"] = body;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!with_.__module__) Object.defineProperties(with_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function simple_statement(tmp) {\n                tmp = expression(true);\n                semicolon();\n                return new AST_SimpleStatement((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"body\"] = tmp;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!simple_statement.__argnames__) Object.defineProperties(simple_statement, {\n                __argnames__ : {value: [\"tmp\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function break_cont(t) {\n                if (S.in_loop === 0) {\n                    croak(t.name.slice(4) + \" not inside a loop or switch\");\n                }\n                semicolon();\n                return new t;\n            };\n            if (!break_cont.__argnames__) Object.defineProperties(break_cont, {\n                __argnames__ : {value: [\"t\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function yield_() {\n                var is_yield_from;\n                if (S.in_function === 0) {\n                    croak(\"'yield' outside of function\");\n                }\n                if ((ρσ_expr_temp = S.functions)[ρσ_expr_temp.length-1].is_generator === false) {\n                    croak(\"'yield' not allowed in a function with return\");\n                }\n                (ρσ_expr_temp = S.functions)[ρσ_expr_temp.length-1].is_generator = true;\n                is_yield_from = is_(\"keyword\", \"from\");\n                if (is_yield_from) {\n                    next();\n                }\n                return new AST_Yield((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"is_yield_from\"] = is_yield_from;\n                    ρσ_d[\"value\"] = return_();\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!yield_.__module__) Object.defineProperties(yield_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function for_(list_comp) {\n                var init, tmp;\n                init = null;\n                if (!is_(\"punc\", \";\")) {\n                    init = expression(true, true);\n                    if (is_node_type(init, AST_Seq)) {\n                        if (is_node_type(init.car, AST_SymbolRef) && is_node_type(init.cdr, AST_SymbolRef)) {\n                            tmp = init.to_array();\n                        } else {\n                            tmp = ρσ_list_decorate([ init ]);\n                        }\n                        init = new AST_Array((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = init.start;\n                            ρσ_d[\"elements\"] = tmp;\n                            ρσ_d[\"end\"] = init.end;\n                            return ρσ_d;\n                        }).call(this));\n                    }\n                    if (is_(\"operator\", \"in\")) {\n                        if (is_node_type(init, AST_Var) && init.definitions.length > 1) {\n                            croak(\"Only one variable declaration allowed in for..in loop\");\n                        }\n                        next();\n                        return for_in(init, list_comp);\n                    }\n                }\n                unexpected();\n            };\n            if (!for_.__argnames__) Object.defineProperties(for_, {\n                __argnames__ : {value: [\"list_comp\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function for_in(init, list_comp) {\n                var lhs, obj;\n                lhs = (is_node_type(init, AST_Var)) ? init.definitions[0].name : null;\n                obj = expression(true);\n                if (list_comp) {\n                    return (function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"init\"] = init;\n                        ρσ_d[\"name\"] = lhs;\n                        ρσ_d[\"object\"] = obj;\n                        return ρσ_d;\n                    }).call(this);\n                }\n                return new AST_ForIn((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"init\"] = init;\n                    ρσ_d[\"name\"] = lhs;\n                    ρσ_d[\"object\"] = obj;\n                    ρσ_d[\"body\"] = in_loop(statement);\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!for_in.__argnames__) Object.defineProperties(for_in, {\n                __argnames__ : {value: [\"init\", \"list_comp\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function for_js() {\n                var condition;\n                condition = as_atom_node();\n                return new AST_ForJS((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"condition\"] = condition;\n                    ρσ_d[\"body\"] = in_loop(statement);\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!for_js.__module__) Object.defineProperties(for_js, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function get_class_in_scope(expr) {\n                var s, referenced_path, class_name;\n                if (is_node_type(expr, AST_SymbolRef)) {\n                    if (has_prop(NATIVE_CLASSES, expr.name)) {\n                        return NATIVE_CLASSES[ρσ_bound_index(expr.name, NATIVE_CLASSES)];\n                    }\n                    if (has_prop(ERROR_CLASSES, expr.name)) {\n                        return ERROR_CLASSES[ρσ_bound_index(expr.name, ERROR_CLASSES)];\n                    }\n                    for (var ρσ_Index52 = S.classes.length - 1; ρσ_Index52 > -1; ρσ_Index52-=1) {\n                        s = ρσ_Index52;\n                        if (has_prop((ρσ_expr_temp = S.classes)[(typeof s === \"number\" && s < 0) ? ρσ_expr_temp.length + s : s], expr.name)) {\n                            return (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[(typeof s === \"number\" && s < 0) ? ρσ_expr_temp.length + s : s])[ρσ_bound_index(expr.name, ρσ_expr_temp)];\n                        }\n                    }\n                } else if (is_node_type(expr, AST_Dot)) {\n                    referenced_path = ρσ_list_decorate([]);\n                    while (is_node_type(expr, AST_Dot)) {\n                        referenced_path.unshift(expr.property);\n                        expr = expr.expression;\n                    }\n                    if (is_node_type(expr, AST_SymbolRef)) {\n                        referenced_path.unshift(expr.name);\n                        if (len(referenced_path) > 1) {\n                            class_name = referenced_path.join(\".\");\n                            for (var ρσ_Index53 = S.classes.length - 1; ρσ_Index53 > -1; ρσ_Index53-=1) {\n                                s = ρσ_Index53;\n                                if (has_prop((ρσ_expr_temp = S.classes)[(typeof s === \"number\" && s < 0) ? ρσ_expr_temp.length + s : s], class_name)) {\n                                    return (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[(typeof s === \"number\" && s < 0) ? ρσ_expr_temp.length + s : s])[(typeof class_name === \"number\" && class_name < 0) ? ρσ_expr_temp.length + class_name : class_name];\n                                }\n                            }\n                        }\n                    }\n                }\n                return false;\n            };\n            if (!get_class_in_scope.__argnames__) Object.defineProperties(get_class_in_scope, {\n                __argnames__ : {value: [\"expr\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function import_error(message) {\n                var ctx;\n                ctx = S.input.context();\n                throw new ImportError(message, ctx.filename, ctx.tokline, ctx.tokcol, ctx.tokpos);\n            };\n            if (!import_error.__argnames__) Object.defineProperties(import_error, {\n                __argnames__ : {value: [\"message\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function do_import(key) {\n                var package_module_id, src_code, filename, modpath, ρσ_unpack, data, location, cached, srchash, ikey, bitem;\n                if (has_prop(imported_modules, key)) {\n                    return;\n                }\n                if (has_prop(importing_modules, key) && importing_modules[(typeof key === \"number\" && key < 0) ? importing_modules.length + key : key]) {\n                    import_error(\"Detected a recursive import of: \" + key + \" while importing: \" + module_id);\n                }\n                package_module_id = key.split(\".\").slice(0, -1).join(\".\");\n                if (len(package_module_id) > 0) {\n                    do_import(package_module_id);\n                }\n                if (options.for_linting) {\n                    imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key] = (function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"is_cached\"] = true;\n                        ρσ_d[\"classes\"] = Object.create(null);\n                        ρσ_d[\"module_id\"] = key;\n                        ρσ_d[\"exports\"] = ρσ_list_decorate([]);\n                        ρσ_d[\"nonlocalvars\"] = ρσ_list_decorate([]);\n                        ρσ_d[\"baselib\"] = Object.create(null);\n                        ρσ_d[\"outputs\"] = Object.create(null);\n                        ρσ_d[\"discard_asserts\"] = options.discard_asserts;\n                        return ρσ_d;\n                    }).call(this);\n                    return;\n                }\n                function safe_read(base_path) {\n                    var ρσ_unpack, i, path;\n                    var ρσ_Iter54 = ρσ_Iterable(enumerate(ρσ_list_decorate([ base_path + \".pyj\", base_path + \"/__init__.pyj\" ])));\n                    for (var ρσ_Index54 = 0; ρσ_Index54 < ρσ_Iter54.length; ρσ_Index54++) {\n                        ρσ_unpack = ρσ_Iter54[ρσ_Index54];\n                        i = ρσ_unpack[0];\n                        path = ρσ_unpack[1];\n                        try {\n                            return ρσ_list_decorate([ readfile(path, \"utf-8\"), path ]);\n                        } catch (ρσ_Exception) {\n                            ρσ_last_exception = ρσ_Exception;\n                            {\n                                var e = ρσ_Exception;\n                                if (e.code === \"ENOENT\" || e.code === \"EPERM\" || e.code === \"EACCESS\") {\n                                    if (i === 1) {\n                                        return [null, null];\n                                    }\n                                }\n                                if (i === 1) {\n                                    throw ρσ_Exception;\n                                }\n                            } \n                        }\n                    }\n                };\n                if (!safe_read.__argnames__) Object.defineProperties(safe_read, {\n                    __argnames__ : {value: [\"base_path\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                src_code = filename = null;\n                modpath = key.replace(/\\./g, \"/\");\n                var ρσ_Iter55 = ρσ_Iterable(import_dirs);\n                for (var ρσ_Index55 = 0; ρσ_Index55 < ρσ_Iter55.length; ρσ_Index55++) {\n                    location = ρσ_Iter55[ρσ_Index55];\n                    if (location) {\n                        ρσ_unpack = safe_read(location + \"/\" + modpath);\nρσ_unpack = ρσ_unpack_asarray(2, ρσ_unpack);\n                        data = ρσ_unpack[0];\n                        filename = ρσ_unpack[1];\n                        if (data !== null) {\n                            src_code = data;\n                            break;\n                        }\n                    }\n                }\n                if (src_code === null) {\n                    import_error(\"Failed Import: '\" + key + \"' module doesn't exist in any of the import directories: \" + import_dirs.join(\":\"));\n                }\n                try {\n                    cached = JSON.parse(readfile(cache_file_name(filename, options.module_cache_dir), \"utf-8\"));\n                } catch (ρσ_Exception) {\n                    ρσ_last_exception = ρσ_Exception;\n                    {\n                        cached = null;\n                    } \n                }\n                srchash = sha1sum(src_code);\n                if (cached && cached.version === COMPILER_VERSION && cached.signature === srchash && cached.discard_asserts === !!options.discard_asserts) {\n                    var ρσ_Iter56 = ρσ_Iterable(cached.imported_module_ids);\n                    for (var ρσ_Index56 = 0; ρσ_Index56 < ρσ_Iter56.length; ρσ_Index56++) {\n                        ikey = ρσ_Iter56[ρσ_Index56];\n                        do_import(ikey);\n                    }\n                    imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key] = (function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"is_cached\"] = true;\n                        ρσ_d[\"classes\"] = cached.classes;\n                        ρσ_d[\"outputs\"] = cached.outputs;\n                        ρσ_d[\"module_id\"] = key;\n                        ρσ_d[\"import_order\"] = Object.keys(imported_modules).length;\n                        ρσ_d[\"nonlocalvars\"] = cached.nonlocalvars;\n                        ρσ_d[\"baselib\"] = cached.baselib;\n                        ρσ_d[\"exports\"] = cached.exports;\n                        ρσ_d[\"discard_asserts\"] = options.discard_asserts;\n                        ρσ_d[\"imported_module_ids\"] = cached.imported_module_ids;\n                        return ρσ_d;\n                    }).call(this);\n                } else {\n                    parse(src_code, (function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"filename\"] = filename;\n                        ρσ_d[\"toplevel\"] = null;\n                        ρσ_d[\"basedir\"] = options.basedir;\n                        ρσ_d[\"libdir\"] = options.libdir;\n                        ρσ_d[\"import_dirs\"] = options.import_dirs;\n                        ρσ_d[\"module_id\"] = key;\n                        ρσ_d[\"imported_modules\"] = imported_modules;\n                        ρσ_d[\"importing_modules\"] = importing_modules;\n                        ρσ_d[\"discard_asserts\"] = options.discard_asserts;\n                        ρσ_d[\"module_cache_dir\"] = options.module_cache_dir;\n                        return ρσ_d;\n                    }).call(this));\n                }\n                imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key].srchash = srchash;\n                var ρσ_Iter57 = ρσ_Iterable(Object.keys(imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key].baselib));\n                for (var ρσ_Index57 = 0; ρσ_Index57 < ρσ_Iter57.length; ρσ_Index57++) {\n                    bitem = ρσ_Iter57[ρσ_Index57];\n                    baselib_items[(typeof bitem === \"number\" && bitem < 0) ? baselib_items.length + bitem : bitem] = true;\n                }\n            };\n            if (!do_import.__argnames__) Object.defineProperties(do_import, {\n                __argnames__ : {value: [\"key\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function read_python_flags() {\n                var bracketed, name, val;\n                expect_token(\"keyword\", \"import\");\n                bracketed = is_(\"punc\", \"(\");\n                if (bracketed) {\n                    next();\n                }\n                while (true) {\n                    if (!is_(\"name\")) {\n                        croak(\"Name expected\");\n                    }\n                    name = S.token.value;\n                    val = (name.startsWith(\"no_\")) ? false : true;\n                    if (!val) {\n                        name = name.slice(3);\n                    }\n                    if (!PYTHON_FLAGS) {\n                        croak(\"Unknown __python__ flag: \" + name);\n                    }\n                    S.scoped_flags.set(name, val);\n                    next();\n                    if (is_(\"punc\", \",\")) {\n                        next();\n                    } else {\n                        if (bracketed) {\n                            if (is_(\"punc\", \")\")) {\n                                next();\n                            } else {\n                                continue;\n                            }\n                        }\n                        break;\n                    }\n                }\n                return new AST_EmptyStatement((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"stype\"] = \"scoped_flags\";\n                    ρσ_d[\"start\"] = prev();\n                    ρσ_d[\"end\"] = prev();\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!read_python_flags.__module__) Object.defineProperties(read_python_flags, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function import_(from_import) {\n                var ans, tok, tmp, name, last_tok, key, alias, aimp, ρσ_unpack, classes, argnames, bracketed, exports, symdef, aname, obj, argvar, cname, imp;\n                ans = new AST_Imports((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"imports\"] = ρσ_list_decorate([]);\n                    return ρσ_d;\n                }).call(this));\n                while (true) {\n                    tok = tmp = name = last_tok = expression(false);\n                    key = \"\";\n                    while (is_node_type(tmp, AST_Dot)) {\n                        key = \".\" + tmp.property + key;\n                        tmp = last_tok = tmp.expression;\n                    }\n                    key = tmp.name + key;\n                    if (from_import && key === \"__python__\") {\n                        return read_python_flags();\n                    }\n                    alias = null;\n                    if (!from_import && is_(\"keyword\", \"as\")) {\n                        next();\n                        alias = as_symbol(AST_SymbolAlias);\n                    }\n                    aimp = new AST_Import((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"module\"] = name;\n                        ρσ_d[\"key\"] = key;\n                        ρσ_d[\"alias\"] = alias;\n                        ρσ_d[\"argnames\"] = null;\n                        ρσ_d[\"body\"] = (function() {\n                            var ρσ_anonfunc = function () {\n                                return imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key];\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"parse\"}\n                            });\n                            return ρσ_anonfunc;\n                        })();\n                        return ρσ_d;\n                    }).call(this));\n                    ρσ_unpack = [tok.start, last_tok.end];\n                    aimp.start = ρσ_unpack[0];\n                    aimp.end = ρσ_unpack[1];\n                    ans.imports.push(aimp);\n                    if (from_import) {\n                        break;\n                    }\n                    if (is_(\"punc\", \",\")) {\n                        next();\n                    } else {\n                        break;\n                    }\n                }\n                var ρσ_Iter58 = ρσ_Iterable(ans[\"imports\"]);\n                for (var ρσ_Index58 = 0; ρσ_Index58 < ρσ_Iter58.length; ρσ_Index58++) {\n                    imp = ρσ_Iter58[ρσ_Index58];\n                    do_import(imp.key);\n                    if (imported_module_ids.indexOf(imp.key) === -1) {\n                        imported_module_ids.push(imp.key);\n                    }\n                    classes = imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key].classes;\n                    if (from_import) {\n                        expect_token(\"keyword\", \"import\");\n                        imp.argnames = argnames = ρσ_list_decorate([]);\n                        bracketed = is_(\"punc\", \"(\");\n                        if (bracketed) {\n                            next();\n                        }\n                        exports = Object.create(null);\n                        var ρσ_Iter59 = ρσ_Iterable(imported_modules[(typeof key === \"number\" && key < 0) ? imported_modules.length + key : key].exports);\n                        for (var ρσ_Index59 = 0; ρσ_Index59 < ρσ_Iter59.length; ρσ_Index59++) {\n                            symdef = ρσ_Iter59[ρσ_Index59];\n                            exports[ρσ_bound_index(symdef.name, exports)] = true;\n                        }\n                        while (true) {\n                            aname = as_symbol(AST_ImportedVar);\n                            if (!options.for_linting && !has_prop(exports, aname.name)) {\n                                import_error(\"The symbol \\\"\" + aname.name + \"\\\" is not exported from the module: \" + key);\n                            }\n                            if (is_(\"keyword\", \"as\")) {\n                                next();\n                                aname.alias = as_symbol(AST_SymbolAlias);\n                            }\n                            argnames.push(aname);\n                            if (is_(\"punc\", \",\")) {\n                                next();\n                            } else {\n                                if (bracketed) {\n                                    if (is_(\"punc\", \")\")) {\n                                        next();\n                                    } else {\n                                        continue;\n                                    }\n                                }\n                                break;\n                            }\n                        }\n                        var ρσ_Iter60 = ρσ_Iterable(argnames);\n                        for (var ρσ_Index60 = 0; ρσ_Index60 < ρσ_Iter60.length; ρσ_Index60++) {\n                            argvar = ρσ_Iter60[ρσ_Index60];\n                            obj = classes[ρσ_bound_index(argvar.name, classes)];\n                            if (obj) {\n                                key = (argvar.alias) ? argvar.alias.name : argvar.name;\n                                (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_expr_temp.length-1])[(typeof key === \"number\" && key < 0) ? ρσ_expr_temp.length + key : key] = (function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"static\"] = obj.static;\n                                    ρσ_d[\"bound\"] = obj.bound;\n                                    ρσ_d[\"classvars\"] = obj.classvars;\n                                    return ρσ_d;\n                                }).call(this);\n                            }\n                        }\n                    } else {\n                        var ρσ_Iter61 = ρσ_Iterable(Object.keys(classes));\n                        for (var ρσ_Index61 = 0; ρσ_Index61 < ρσ_Iter61.length; ρσ_Index61++) {\n                            cname = ρσ_Iter61[ρσ_Index61];\n                            obj = classes[(typeof cname === \"number\" && cname < 0) ? classes.length + cname : cname];\n                            key = (imp.alias) ? imp.alias.name : imp.key;\n                            (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_expr_temp.length-1])[ρσ_bound_index(key + \".\" + obj.name.name, ρσ_expr_temp)] = (function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"static\"] = obj.static;\n                                ρσ_d[\"bound\"] = obj.bound;\n                                ρσ_d[\"classvars\"] = obj.classvars;\n                                return ρσ_d;\n                            }).call(this);\n                        }\n                    }\n                }\n                return ans;\n            };\n            if (!import_.__argnames__) Object.defineProperties(import_, {\n                __argnames__ : {value: [\"from_import\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function class_() {\n                var name, externaldecorator, class_details, bases, class_parent, a, docstrings, definition, descriptor, stmt, class_var_names, visitor;\n                name = as_symbol(AST_SymbolDefun);\n                if (!name) {\n                    unexpected();\n                }\n                externaldecorator = has_simple_decorator(S.decorators, \"external\");\n                class_details = (function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"static\"] = Object.create(null);\n                    ρσ_d[\"bound\"] = [];\n                    ρσ_d[\"classvars\"] = Object.create(null);\n                    ρσ_d[\"processing\"] = name.name;\n                    ρσ_d[\"provisional_classvars\"] = Object.create(null);\n                    return ρσ_d;\n                }).call(this);\n                bases = [];\n                class_parent = null;\n                if (is_(\"punc\", \"(\")) {\n                    S.in_parenthesized_expr = true;\n                    next();\n                    while (true) {\n                        if (is_(\"punc\", \")\")) {\n                            S.in_parenthesized_expr = false;\n                            next();\n                            break;\n                        }\n                        a = expr_atom(false);\n                        if (class_parent === null) {\n                            class_parent = a;\n                        }\n                        bases.push(a);\n                        if (is_(\"punc\", \",\")) {\n                            next();\n                            continue;\n                        }\n                    }\n                }\n                docstrings = [];\n                definition = new AST_Class((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"name\"] = name;\n                    ρσ_d[\"docstrings\"] = docstrings;\n                    ρσ_d[\"module_id\"] = module_id;\n                    ρσ_d[\"dynamic_properties\"] = Object.create(null);\n                    ρσ_d[\"parent\"] = class_parent;\n                    ρσ_d[\"bases\"] = bases;\n                    ρσ_d[\"localvars\"] = ρσ_list_decorate([]);\n                    ρσ_d[\"classvars\"] = class_details.classvars;\n                    ρσ_d[\"static\"] = class_details.static;\n                    ρσ_d[\"external\"] = externaldecorator;\n                    ρσ_d[\"bound\"] = class_details.bound;\n                    ρσ_d[\"statements\"] = ρσ_list_decorate([]);\n                    ρσ_d[\"decorators\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            var d, decorator;\n                            d = ρσ_list_decorate([]);\n                            var ρσ_Iter62 = ρσ_Iterable(S.decorators);\n                            for (var ρσ_Index62 = 0; ρσ_Index62 < ρσ_Iter62.length; ρσ_Index62++) {\n                                decorator = ρσ_Iter62[ρσ_Index62];\n                                d.push(new AST_Decorator((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"expression\"] = decorator;\n                                    return ρσ_d;\n                                }).call(this)));\n                            }\n                            S.decorators = [];\n                            return d;\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })()();\n                    ρσ_d[\"body\"] = (function() {\n                        var ρσ_anonfunc = function (loop, labels) {\n                            var a;\n                            S.in_class.push(name.name);\n                            (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_bound_index(S.classes.length - 1, ρσ_expr_temp)])[ρσ_bound_index(name.name, ρσ_expr_temp)] = class_details;\n                            S.classes.push(Object.create(null));\n                            S.scoped_flags.push();\n                            S.in_function += 1;\n                            S.in_loop = 0;\n                            S.labels = ρσ_list_decorate([]);\n                            a = block_(docstrings);\n                            S.in_function -= 1;\n                            S.scoped_flags.pop();\n                            S.classes.pop();\n                            S.in_class.pop();\n                            S.in_loop = loop;\n                            S.labels = labels;\n                            return a;\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"loop\", \"labels\"]},\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })()(S.in_loop, S.labels);\n                    return ρσ_d;\n                }).call(this));\n                class_details.processing = false;\n                var ρσ_Iter63 = ρσ_Iterable(definition.body);\n                for (var ρσ_Index63 = 0; ρσ_Index63 < ρσ_Iter63.length; ρσ_Index63++) {\n                    stmt = ρσ_Iter63[ρσ_Index63];\n                    if (is_node_type(stmt, AST_Method)) {\n                        if (stmt.is_getter || stmt.is_setter) {\n                            descriptor = (ρσ_expr_temp = definition.dynamic_properties)[ρσ_bound_index(stmt.name.name, ρσ_expr_temp)];\n                            if (!descriptor) {\n                                descriptor = (ρσ_expr_temp = definition.dynamic_properties)[ρσ_bound_index(stmt.name.name, ρσ_expr_temp)] = Object.create(null);\n                            }\n                            descriptor[ρσ_bound_index((stmt.is_getter) ? \"getter\" : \"setter\", descriptor)] = stmt;\n                        } else if (stmt.name.name === \"__init__\") {\n                            definition.init = stmt;\n                        }\n                    }\n                }\n                class_var_names = Object.create(null);\n                function walker() {\n                    function visit_node(node, descend) {\n                        var varname;\n                        if (is_node_type(node, AST_Method)) {\n                            class_var_names[ρσ_bound_index(node.name.name, class_var_names)] = true;\n                            return;\n                        }\n                        if (is_node_type(node, AST_Function)) {\n                            return;\n                        }\n                        if (is_node_type(node, AST_Assign) && is_node_type(node.left, AST_SymbolRef)) {\n                            varname = node.left.name;\n                            if (FORBIDDEN_CLASS_VARS.indexOf(varname) !== -1) {\n                                token_error(node.left.start, varname + \" is not allowed as a class variable name\");\n                            }\n                            class_var_names[(typeof varname === \"number\" && varname < 0) ? class_var_names.length + varname : varname] = true;\n                            (ρσ_expr_temp = definition.classvars)[(typeof varname === \"number\" && varname < 0) ? ρσ_expr_temp.length + varname : varname] = true;\n                        } else if (is_node_type(node, AST_SymbolRef) && has_prop(class_var_names, node.name)) {\n                            node.thedef = new AST_SymbolDefun((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"name\"] = name.name + \".prototype.\" + node.name;\n                                return ρσ_d;\n                            }).call(this));\n                        }\n                        if (descend) {\n                            descend.call(node);\n                        }\n                    };\n                    if (!visit_node.__argnames__) Object.defineProperties(visit_node, {\n                        __argnames__ : {value: [\"node\", \"descend\"]},\n                        __module__ : {value: \"parse\"}\n                    });\n\n                    this._visit = visit_node;\n                };\n                if (!walker.__module__) Object.defineProperties(walker, {\n                    __module__ : {value: \"parse\"}\n                });\n\n                visitor = new walker;\n                var ρσ_Iter64 = ρσ_Iterable(definition.body);\n                for (var ρσ_Index64 = 0; ρσ_Index64 < ρσ_Iter64.length; ρσ_Index64++) {\n                    stmt = ρσ_Iter64[ρσ_Index64];\n                    if (!is_node_type(stmt, AST_Class)) {\n                        stmt.walk(visitor);\n                        definition.statements.push(stmt);\n                    }\n                }\n                return definition;\n            };\n            if (!class_.__module__) Object.defineProperties(class_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function function_(in_class, is_expression) {\n                var name, is_anonymous, staticmethod, property_getter, property_setter, staticloc, ctor, return_annotation, is_generator, docstrings, definition, assignments, j, i, nonlocals;\n                name = (is_(\"name\")) ? as_symbol((in_class) ? AST_SymbolDefun : AST_SymbolLambda) : null;\n                if (in_class && !name) {\n                    croak(\"Cannot use anonymous function as class methods\");\n                }\n                is_anonymous = !name;\n                staticmethod = property_getter = property_setter = false;\n                if (in_class) {\n                    staticloc = has_simple_decorator(S.decorators, \"staticmethod\");\n                    property_getter = has_simple_decorator(S.decorators, \"property\");\n                    property_setter = has_setter_decorator(S.decorators, name.name);\n                    if (staticloc) {\n                        if (property_getter || property_setter) {\n                            croak(\"A method cannot be both static and a property getter/setter\");\n                        }\n                        (ρσ_expr_temp = (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_bound_index(S.classes.length - 2, ρσ_expr_temp)])[(typeof in_class === \"number\" && in_class < 0) ? ρσ_expr_temp.length + in_class : in_class].static)[ρσ_bound_index(name.name, ρσ_expr_temp)] = true;\n                        staticmethod = true;\n                    } else if (name.name !== \"__init__\" && S.scoped_flags.get(\"bound_methods\")) {\n                        (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_bound_index(S.classes.length - 2, ρσ_expr_temp)])[(typeof in_class === \"number\" && in_class < 0) ? ρσ_expr_temp.length + in_class : in_class].bound.push(name.name);\n                    }\n                }\n                expect(\"(\");\n                S.in_parenthesized_expr = true;\n                ctor = (in_class) ? AST_Method : AST_Function;\n                return_annotation = null;\n                is_generator = [];\n                docstrings = [];\n                definition = new ctor((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"name\"] = name;\n                    ρσ_d[\"is_expression\"] = is_expression;\n                    ρσ_d[\"is_anonymous\"] = is_anonymous;\n                    ρσ_d[\"argnames\"] = (function() {\n                        var ρσ_anonfunc = function (a) {\n                            var defaults, first, seen_names, def_line, current_arg_name, name_token;\n                            defaults = Object.create(null);\n                            first = true;\n                            seen_names = Object.create(null);\n                            def_line = S.input.context().tokline;\n                            current_arg_name = null;\n                            name_token = null;\n                            function get_arg() {\n                                var name_ctx, ntok, annotation, sym;\n                                current_arg_name = S.token.value;\n                                if (has_prop(seen_names, current_arg_name)) {\n                                    token_error(prev(), \"Can't repeat parameter names\");\n                                }\n                                if (current_arg_name === \"arguments\") {\n                                    token_error(prev(), \"Can't use the name arguments as a parameter name, it is reserved by JavaScript\");\n                                }\n                                seen_names[(typeof current_arg_name === \"number\" && current_arg_name < 0) ? seen_names.length + current_arg_name : current_arg_name] = true;\n                                name_token = S.token;\n                                name_ctx = S.input.context();\n                                ntok = peek();\n                                if (ntok.type === \"punc\" && ntok.value === \":\") {\n                                    next();\n                                    expect(\":\");\n                                    annotation = maybe_conditional();\n                                    if (!is_token(name_token, \"name\")) {\n                                        croak(\"Name expected\", name_ctx.tokline);\n                                        return null;\n                                    }\n                                    sym = new AST_SymbolFunarg((function(){\n                                        var ρσ_d = Object.create(null);\n                                        ρσ_d[\"name\"] = name_token.value;\n                                        ρσ_d[\"start\"] = S.token;\n                                        ρσ_d[\"end\"] = S.token;\n                                        ρσ_d[\"annotation\"] = annotation;\n                                        return ρσ_d;\n                                    }).call(this));\n                                    return sym;\n                                } else {\n                                    if (!is_(\"name\")) {\n                                        if (S.input.context().tokline !== def_line) {\n                                            croak(\"Name expected\", def_line);\n                                        } else {\n                                            croak(\"Name expected\");\n                                        }\n                                        return null;\n                                    }\n                                    sym = new AST_SymbolFunarg((function(){\n                                        var ρσ_d = Object.create(null);\n                                        ρσ_d[\"name\"] = current_arg_name;\n                                        ρσ_d[\"start\"] = S.token;\n                                        ρσ_d[\"end\"] = S.token;\n                                        ρσ_d[\"annotation\"] = null;\n                                        return ρσ_d;\n                                    }).call(this));\n                                    next();\n                                    return sym;\n                                }\n                            };\n                            if (!get_arg.__module__) Object.defineProperties(get_arg, {\n                                __module__ : {value: \"parse\"}\n                            });\n\n                            while (!is_(\"punc\", \")\")) {\n                                if (first) {\n                                    first = false;\n                                } else {\n                                    expect(\",\");\n                                    if (is_(\"punc\", \")\")) {\n                                        break;\n                                    }\n                                }\n                                if (is_(\"operator\", \"**\")) {\n                                    next();\n                                    if (a.kwargs) {\n                                        token_error(name_token, \"Can't define multiple **kwargs in function definition\");\n                                    }\n                                    a.kwargs = get_arg();\n                                } else if (is_(\"operator\", \"*\")) {\n                                    next();\n                                    if (a.starargs) {\n                                        token_error(name_token, \"Can't define multiple *args in function definition\");\n                                    }\n                                    if (a.kwargs) {\n                                        token_error(name_token, \"Can't define *args after **kwargs in function definition\");\n                                    }\n                                    a.starargs = get_arg();\n                                } else {\n                                    if (a.starargs || a.kwargs) {\n                                        token_error(name_token, \"Can't define a formal parameter after *args or **kwargs\");\n                                    }\n                                    a.push(get_arg());\n                                    if (is_(\"operator\", \"=\")) {\n                                        if (a.kwargs) {\n                                            token_error(name_token, \"Can't define an optional formal parameter after **kwargs\");\n                                        }\n                                        next();\n                                        defaults[(typeof current_arg_name === \"number\" && current_arg_name < 0) ? defaults.length + current_arg_name : current_arg_name] = expression(false);\n                                        a.has_defaults = true;\n                                    } else {\n                                        if (a.has_defaults) {\n                                            token_error(name_token, \"Can't define required formal parameters after optional formal parameters\");\n                                        }\n                                    }\n                                }\n                            }\n                            next();\n                            if (is_(\"punc\", \"->\")) {\n                                next();\n                                return_annotation = maybe_conditional();\n                            }\n                            S.in_parenthesized_expr = false;\n                            a.defaults = defaults;\n                            a.is_simple_func = !a.starargs && !a.kwargs && !a.has_defaults;\n                            return a;\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"a\"]},\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })()([]);\n                    ρσ_d[\"localvars\"] = ρσ_list_decorate([]);\n                    ρσ_d[\"decorators\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            var d, decorator;\n                            d = [];\n                            var ρσ_Iter65 = ρσ_Iterable(S.decorators);\n                            for (var ρσ_Index65 = 0; ρσ_Index65 < ρσ_Iter65.length; ρσ_Index65++) {\n                                decorator = ρσ_Iter65[ρσ_Index65];\n                                d.push(new AST_Decorator((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"expression\"] = decorator;\n                                    return ρσ_d;\n                                }).call(this)));\n                            }\n                            S.decorators = [];\n                            return d;\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })()();\n                    ρσ_d[\"docstrings\"] = docstrings;\n                    ρσ_d[\"body\"] = (function() {\n                        var ρσ_anonfunc = function (loop, labels) {\n                            var a;\n                            S.in_class.push(false);\n                            S.classes.push(Object.create(null));\n                            S.scoped_flags.push();\n                            S.in_function += 1;\n                            S.functions.push(Object.create(null));\n                            S.in_loop = 0;\n                            S.labels = ρσ_list_decorate([]);\n                            a = block_(docstrings);\n                            S.in_function -= 1;\n                            S.scoped_flags.pop();\n                            is_generator.push(bool(S.functions.pop().is_generator));\n                            S.classes.pop();\n                            S.in_class.pop();\n                            S.in_loop = loop;\n                            S.labels = labels;\n                            return a;\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"loop\", \"labels\"]},\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })()(S.in_loop, S.labels);\n                    return ρσ_d;\n                }).call(this));\n                definition.return_annotation = return_annotation;\n                definition.is_generator = is_generator[0];\n                if (is_node_type(definition, AST_Method)) {\n                    definition.static = staticmethod;\n                    definition.is_getter = property_getter;\n                    definition.is_setter = property_setter;\n                    if (definition.argnames.length < 1 && !definition.static) {\n                        croak(\"Methods of a class must have at least one argument, traditionally named self\");\n                    }\n                    if (definition.name && definition.name.name === \"__init__\") {\n                        if (definition.is_generator) {\n                            croak(\"The __init__ method of a class cannot be a generator (yield not allowed)\");\n                        }\n                        if (property_getter || property_setter) {\n                            croak(\"The __init__ method of a class cannot be a property getter/setter\");\n                        }\n                    }\n                }\n                if (definition.is_generator) {\n                    baselib_items[\"yield\"] = true;\n                }\n                assignments = scan_for_local_vars(definition.body);\n                for (var ρσ_Index66 = 0; ρσ_Index66 < assignments.length; ρσ_Index66++) {\n                    i = ρσ_Index66;\n                    for (var ρσ_Index67 = 0; ρσ_Index67 < definition.argnames.length + 1; ρσ_Index67++) {\n                        j = ρσ_Index67;\n                        if (j === definition.argnames.length) {\n                            definition.localvars.push(new_symbol(AST_SymbolVar, assignments[(typeof i === \"number\" && i < 0) ? assignments.length + i : i]));\n                        } else if (j < definition.argnames.length && assignments[(typeof i === \"number\" && i < 0) ? assignments.length + i : i] === (ρσ_expr_temp = definition.argnames)[(typeof j === \"number\" && j < 0) ? ρσ_expr_temp.length + j : j].name) {\n                            break;\n                        }\n                    }\n                }\n                nonlocals = scan_for_nonlocal_defs(definition.body);\n                nonlocals = (function() {\n                    var ρσ_Iter = ρσ_Iterable(nonlocals), ρσ_Result = ρσ_set(), name;\n                    for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                        name = ρσ_Iter[ρσ_Index];\n                        ρσ_Result.add(name);\n                    }\n                    return ρσ_Result;\n                })();\n                definition.localvars = definition.localvars.filter((function() {\n                    var ρσ_anonfunc = function (v) {\n                        return !nonlocals.has(v.name);\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"v\"]},\n                        __module__ : {value: \"parse\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                return definition;\n            };\n            if (!function_.__argnames__) Object.defineProperties(function_, {\n                __argnames__ : {value: [\"in_class\", \"is_expression\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function if_() {\n                var cond, body, belse;\n                cond = expression(true);\n                body = statement();\n                belse = null;\n                if (is_(\"keyword\", \"elif\") || is_(\"keyword\", \"else\")) {\n                    if (is_(\"keyword\", \"else\")) {\n                        next();\n                    } else {\n                        S.token.value = \"if\";\n                    }\n                    belse = statement();\n                }\n                return new AST_If((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"condition\"] = cond;\n                    ρσ_d[\"body\"] = body;\n                    ρσ_d[\"alternative\"] = belse;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!if_.__module__) Object.defineProperties(if_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function is_docstring(stmt) {\n                if (is_node_type(stmt, AST_SimpleStatement)) {\n                    if (is_node_type(stmt.body, AST_String)) {\n                        return stmt.body;\n                    }\n                }\n                return false;\n            };\n            if (!is_docstring.__argnames__) Object.defineProperties(is_docstring, {\n                __argnames__ : {value: [\"stmt\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function block_(docstrings) {\n                var prev_whitespace, a, stmt, ds, current_whitespace;\n                prev_whitespace = S.token.leading_whitespace;\n                expect(\":\");\n                a = [];\n                if (!S.token.nlb) {\n                    while (!S.token.nlb) {\n                        if (is_(\"eof\")) {\n                            unexpected();\n                        }\n                        stmt = statement();\n                        if (docstrings) {\n                            ds = is_docstring(stmt);\n                            if (ds) {\n                                docstrings.push(ds);\n                                continue;\n                            }\n                        }\n                        a.push(stmt);\n                    }\n                } else {\n                    current_whitespace = S.token.leading_whitespace;\n                    if (current_whitespace.length === 0 || prev_whitespace === current_whitespace) {\n                        croak(\"Expected an indented block\");\n                    }\n                    while (!is_(\"punc\", \"}\")) {\n                        if (is_(\"eof\")) {\n                            return a;\n                        }\n                        stmt = statement();\n                        if (docstrings) {\n                            ds = is_docstring(stmt);\n                            if (ds) {\n                                docstrings.push(ds);\n                                continue;\n                            }\n                        }\n                        a.push(stmt);\n                    }\n                    next();\n                }\n                return a;\n            };\n            if (!block_.__argnames__) Object.defineProperties(block_, {\n                __argnames__ : {value: [\"docstrings\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function try_() {\n                var body, bcatch, bfinally, belse, start, exceptions, name;\n                body = block_();\n                bcatch = [];\n                bfinally = null;\n                belse = null;\n                while (is_(\"keyword\", \"except\")) {\n                    start = S.token;\n                    next();\n                    exceptions = ρσ_list_decorate([]);\n                    if (!is_(\"punc\", \":\") && !is_(\"keyword\", \"as\")) {\n                        exceptions.push(as_symbol(AST_SymbolVar));\n                        while (is_(\"punc\", \",\")) {\n                            next();\n                            exceptions.push(as_symbol(AST_SymbolVar));\n                        }\n                    }\n                    name = null;\n                    if (is_(\"keyword\", \"as\")) {\n                        next();\n                        name = as_symbol(AST_SymbolCatch);\n                    }\n                    bcatch.push(new AST_Except((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"argname\"] = name;\n                        ρσ_d[\"errors\"] = exceptions;\n                        ρσ_d[\"body\"] = block_();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)));\n                }\n                if (is_(\"keyword\", \"else\")) {\n                    start = S.token;\n                    next();\n                    belse = new AST_Else((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"body\"] = block_();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this));\n                }\n                if (is_(\"keyword\", \"finally\")) {\n                    start = S.token;\n                    next();\n                    bfinally = new AST_Finally((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"body\"] = block_();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this));\n                }\n                if (!bcatch.length && !bfinally) {\n                    croak(\"Missing except/finally blocks\");\n                }\n                return new AST_Try((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"body\"] = body;\n                    ρσ_d[\"bcatch\"] = (bcatch.length) ? new AST_Catch((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"body\"] = bcatch;\n                        return ρσ_d;\n                    }).call(this)) : null;\n                    ρσ_d[\"bfinally\"] = bfinally;\n                    ρσ_d[\"belse\"] = belse;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!try_.__module__) Object.defineProperties(try_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function vardefs(symbol_class) {\n                var a;\n                a = ρσ_list_decorate([]);\n                while (true) {\n                    a.push(new AST_VarDef((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = S.token;\n                        ρσ_d[\"name\"] = as_symbol(symbol_class);\n                        ρσ_d[\"value\"] = (is_(\"operator\", \"=\")) ? (next(), expression(false)) : null;\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)));\n                    if (!is_(\"punc\", \",\")) {\n                        break;\n                    }\n                    next();\n                }\n                return a;\n            };\n            if (!vardefs.__argnames__) Object.defineProperties(vardefs, {\n                __argnames__ : {value: [\"symbol_class\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function nonlocal_(is_global) {\n                var defs, vardef;\n                defs = vardefs(AST_SymbolNonlocal);\n                if (is_global) {\n                    var ρσ_Iter68 = ρσ_Iterable(defs);\n                    for (var ρσ_Index68 = 0; ρσ_Index68 < ρσ_Iter68.length; ρσ_Index68++) {\n                        vardef = ρσ_Iter68[ρσ_Index68];\n                        S.globals.push(vardef.name.name);\n                    }\n                }\n                return new AST_Var((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = prev();\n                    ρσ_d[\"definitions\"] = defs;\n                    ρσ_d[\"end\"] = prev();\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!nonlocal_.__argnames__) Object.defineProperties(nonlocal_, {\n                __argnames__ : {value: [\"is_global\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function new_() {\n                var start, newexp, args;\n                start = S.token;\n                expect_token(\"operator\", \"new\");\n                newexp = expr_atom(false);\n                if (is_(\"punc\", \"(\")) {\n                    S.in_parenthesized_expr = true;\n                    next();\n                    args = func_call_list();\n                    S.in_parenthesized_expr = false;\n                } else {\n                    args = func_call_list(true);\n                }\n                return subscripts(new AST_New((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = start;\n                    ρσ_d[\"expression\"] = newexp;\n                    ρσ_d[\"args\"] = args;\n                    ρσ_d[\"end\"] = prev();\n                    return ρσ_d;\n                }).call(this)), true);\n            };\n            if (!new_.__module__) Object.defineProperties(new_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function string_() {\n                var strings, start;\n                strings = [];\n                start = S.token;\n                while (true) {\n                    strings.push(S.token.value);\n                    if (peek().type !== \"string\") {\n                        break;\n                    }\n                    next();\n                }\n                return new AST_String((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = start;\n                    ρσ_d[\"end\"] = S.token;\n                    ρσ_d[\"value\"] = strings.join(\"\");\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!string_.__module__) Object.defineProperties(string_, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function token_as_atom_node() {\n                var tok, tmp_, tmp__;\n                tok = S.token;\n                tmp_ = tok.type;\n                if (tmp_ === \"name\") {\n                    return token_as_symbol(tok, AST_SymbolRef);\n                } else if (tmp_ === \"num\") {\n                    return new AST_Number((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = tok;\n                        ρσ_d[\"end\"] = tok;\n                        ρσ_d[\"value\"] = tok.value;\n                        return ρσ_d;\n                    }).call(this));\n                } else if (tmp_ === \"string\") {\n                    return string_();\n                } else if (tmp_ === \"regexp\") {\n                    return new AST_RegExp((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = tok;\n                        ρσ_d[\"end\"] = tok;\n                        ρσ_d[\"value\"] = tok.value;\n                        return ρσ_d;\n                    }).call(this));\n                } else if (tmp_ === \"atom\") {\n                    tmp__ = tok.value;\n                    if (tmp__ === \"False\") {\n                        return new AST_False((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = tok;\n                            ρσ_d[\"end\"] = tok;\n                            return ρσ_d;\n                        }).call(this));\n                    } else if (tmp__ === \"True\") {\n                        return new AST_True((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = tok;\n                            ρσ_d[\"end\"] = tok;\n                            return ρσ_d;\n                        }).call(this));\n                    } else if (tmp__ === \"None\") {\n                        return new AST_Null((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = tok;\n                            ρσ_d[\"end\"] = tok;\n                            return ρσ_d;\n                        }).call(this));\n                    }\n                } else if (tmp_ === \"js\") {\n                    return new AST_Verbatim((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = tok;\n                        ρσ_d[\"end\"] = tok;\n                        ρσ_d[\"value\"] = tok.value;\n                        return ρσ_d;\n                    }).call(this));\n                }\n                token_error(tok, \"Expecting an atomic token (number/string/bool/regexp/js/None)\");\n            };\n            if (!token_as_atom_node.__module__) Object.defineProperties(token_as_atom_node, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function as_atom_node() {\n                var ret;\n                ret = token_as_atom_node();\n                next();\n                return ret;\n            };\n            if (!as_atom_node.__module__) Object.defineProperties(as_atom_node, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function expr_atom(allow_calls) {\n                var start, tmp_, ex, ret, cls, func;\n                if (is_(\"operator\", \"new\")) {\n                    return new_();\n                }\n                start = S.token;\n                if (is_(\"punc\")) {\n                    tmp_ = start.value;\n                    if (tmp_ === \"(\") {\n                        S.in_parenthesized_expr = true;\n                        next();\n                        if (is_(\"punc\", \")\")) {\n                            next();\n                            return new AST_Array((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"elements\"] = ρσ_list_decorate([]);\n                                return ρσ_d;\n                            }).call(this));\n                        }\n                        ex = expression(true);\n                        if (is_(\"keyword\", \"for\")) {\n                            ret = read_comprehension(new AST_GeneratorComprehension((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"statement\"] = ex;\n                                return ρσ_d;\n                            }).call(this)), \")\");\n                            S.in_parenthesized_expr = false;\n                            return ret;\n                        }\n                        ex.start = start;\n                        ex.end = S.token;\n                        if (is_node_type(ex, AST_SymbolRef)) {\n                            ex.parens = true;\n                        }\n                        if (!is_node_type(ex, AST_GeneratorComprehension)) {\n                            expect(\")\");\n                        }\n                        if (is_node_type(ex, AST_UnaryPrefix)) {\n                            ex.parenthesized = true;\n                        }\n                        S.in_parenthesized_expr = false;\n                        return subscripts(ex, allow_calls);\n                    } else if (tmp_ === \"[\") {\n                        return subscripts(array_(), allow_calls);\n                    } else if (tmp_ === \"{\") {\n                        return subscripts(object_(), allow_calls);\n                    }\n                    unexpected();\n                }\n                if (is_(\"keyword\", \"class\")) {\n                    next();\n                    cls = class_();\n                    cls.start = start;\n                    cls.end = prev();\n                    return subscripts(cls, allow_calls);\n                }\n                if (is_(\"keyword\", \"def\")) {\n                    next();\n                    func = function_(false, true);\n                    func.start = start;\n                    func.end = prev();\n                    return subscripts(func, allow_calls);\n                }\n                if (is_(\"keyword\", \"yield\")) {\n                    next();\n                    return yield_();\n                }\n                if (ATOMIC_START_TOKEN[ρσ_bound_index(S.token.type, ATOMIC_START_TOKEN)]) {\n                    return subscripts(as_atom_node(), allow_calls);\n                }\n                unexpected();\n            };\n            if (!expr_atom.__argnames__) Object.defineProperties(expr_atom, {\n                __argnames__ : {value: [\"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expr_list(closing, allow_trailing_comma, allow_empty, func_call) {\n                var first, a, saw_starargs, tmp, arg;\n                first = true;\n                a = ρσ_list_decorate([]);\n                saw_starargs = false;\n                while (!is_(\"punc\", closing)) {\n                    if (saw_starargs) {\n                        token_error(prev(), \"*args must be the last argument in a function call\");\n                    }\n                    if (first) {\n                        first = false;\n                    } else {\n                        expect(\",\");\n                    }\n                    if (allow_trailing_comma && is_(\"punc\", closing)) {\n                        break;\n                    }\n                    if (is_(\"operator\", \"*\") && func_call) {\n                        saw_starargs = true;\n                        next();\n                    }\n                    if (is_(\"punc\", \",\") && allow_empty) {\n                        a.push(new AST_Hole((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = S.token;\n                            ρσ_d[\"end\"] = S.token;\n                            return ρσ_d;\n                        }).call(this)));\n                    } else {\n                        a.push(expression(false));\n                    }\n                }\n                if (func_call) {\n                    tmp = ρσ_list_decorate([]);\n                    tmp.kwargs = ρσ_list_decorate([]);\n                    var ρσ_Iter69 = ρσ_Iterable(a);\n                    for (var ρσ_Index69 = 0; ρσ_Index69 < ρσ_Iter69.length; ρσ_Index69++) {\n                        arg = ρσ_Iter69[ρσ_Index69];\n                        if (is_node_type(arg, AST_Assign)) {\n                            tmp.kwargs.push(ρσ_list_decorate([ arg.left, arg.right ]));\n                        } else {\n                            tmp.push(arg);\n                        }\n                    }\n                    a = tmp;\n                }\n                next();\n                if (saw_starargs) {\n                    a.starargs = true;\n                }\n                return a;\n            };\n            if (!expr_list.__argnames__) Object.defineProperties(expr_list, {\n                __argnames__ : {value: [\"closing\", \"allow_trailing_comma\", \"allow_empty\", \"func_call\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function func_call_list(empty) {\n                var a, first, single_comprehension, arg;\n                a = [];\n                first = true;\n                a.kwargs = [];\n                a.kwarg_items = [];\n                a.starargs = false;\n                if (empty) {\n                    return a;\n                }\n                single_comprehension = false;\n                while (!is_(\"punc\", \")\") && !is_(\"eof\")) {\n                    if (!first) {\n                        expect(\",\");\n                        if (is_(\"punc\", \")\")) {\n                            break;\n                        }\n                    }\n                    if (is_(\"operator\", \"*\")) {\n                        next();\n                        arg = expression(false);\n                        arg.is_array = true;\n                        a.push(arg);\n                        a.starargs = true;\n                    } else if (is_(\"operator\", \"**\")) {\n                        next();\n                        a.kwarg_items.push(as_symbol(AST_SymbolRef, false));\n                        a.starargs = true;\n                    } else {\n                        arg = expression(false);\n                        if (is_node_type(arg, AST_Assign)) {\n                            a.kwargs.push(ρσ_list_decorate([ arg.left, arg.right ]));\n                        } else {\n                            if (is_(\"keyword\", \"for\")) {\n                                if (!first) {\n                                    croak(\"Generator expression must be parenthesized if not sole argument\");\n                                }\n                                a.push(read_comprehension(new AST_GeneratorComprehension((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"statement\"] = arg;\n                                    return ρσ_d;\n                                }).call(this)), \")\"));\n                                single_comprehension = true;\n                                break;\n                            }\n                            a.push(arg);\n                        }\n                    }\n                    first = false;\n                }\n                if (!single_comprehension) {\n                    next();\n                }\n                return a;\n            };\n            if (!func_call_list.__argnames__) Object.defineProperties(func_call_list, {\n                __argnames__ : {value: [\"empty\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            \n            var array_ = embed_tokens((function() {\n                var ρσ_anonfunc = function array_() {\n                    var expr;\n                    expect(\"[\");\n                    expr = ρσ_list_decorate([]);\n                    if (!is_(\"punc\", \"]\")) {\n                        expr.push(expression(false));\n                        if (is_(\"keyword\", \"for\")) {\n                            return read_comprehension(new AST_ListComprehension((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"statement\"] = expr[0];\n                                return ρσ_d;\n                            }).call(this)), \"]\");\n                        }\n                        if (!is_(\"punc\", \"]\")) {\n                            expect(\",\");\n                        }\n                    }\n                    return new AST_Array((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"elements\"] = expr.concat(expr_list(\"]\", true, true));\n                        return ρσ_d;\n                    }).call(this));\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"parse\"}\n                });\n                return ρσ_anonfunc;\n            })());\n\n            \n            var object_ = embed_tokens((function() {\n                var ρσ_anonfunc = function object_() {\n                    var first, has_non_const_keys, is_pydict, is_jshash, a, start, ctx, orig, left, end;\n                    expect(\"{\");\n                    first = true;\n                    has_non_const_keys = false;\n                    is_pydict = S.scoped_flags.get(\"dict_literals\", false);\n                    is_jshash = S.scoped_flags.get(\"hash_literals\", false);\n                    a = ρσ_list_decorate([]);\n                    while (!is_(\"punc\", \"}\")) {\n                        if (!first) {\n                            expect(\",\");\n                        }\n                        if (is_(\"punc\", \"}\")) {\n                            break;\n                        }\n                        first = false;\n                        start = S.token;\n                        ctx = S.input.context();\n                        orig = ctx.expecting_object_literal_key;\n                        ctx.expecting_object_literal_key = true;\n                        try {\n                            left = expression(false);\n                        } finally {\n                            ctx.expecting_object_literal_key = orig;\n                        }\n                        if (is_(\"keyword\", \"for\")) {\n                            return read_comprehension(new AST_SetComprehension((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"statement\"] = left;\n                                return ρσ_d;\n                            }).call(this)), \"}\");\n                        }\n                        if (a.length === 0 && (is_(\"punc\", \",\") || is_(\"punc\", \"}\"))) {\n                            end = prev();\n                            return set_(start, end, left);\n                        }\n                        if (!is_node_type(left, AST_Constant)) {\n                            has_non_const_keys = true;\n                        }\n                        expect(\":\");\n                        a.push(new AST_ObjectKeyVal((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"key\"] = left;\n                            ρσ_d[\"value\"] = expression(false);\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)));\n                        if (a.length === 1 && is_(\"keyword\", \"for\")) {\n                            return dict_comprehension(a, is_pydict, is_jshash);\n                        }\n                    }\n                    next();\n                    return new ((has_non_const_keys) ? AST_ExpressiveObject : AST_Object)((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"properties\"] = a;\n                        ρσ_d[\"is_pydict\"] = is_pydict;\n                        ρσ_d[\"is_jshash\"] = is_jshash;\n                        return ρσ_d;\n                    }).call(this));\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"parse\"}\n                });\n                return ρσ_anonfunc;\n            })());\n\n            function set_(start, end, expr) {\n                var ostart, a;\n                ostart = start;\n                a = ρσ_list_decorate([ new AST_SetItem((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = start;\n                    ρσ_d[\"end\"] = end;\n                    ρσ_d[\"value\"] = expr;\n                    return ρσ_d;\n                }).call(this)) ]);\n                while (!is_(\"punc\", \"}\")) {\n                    expect(\",\");\n                    start = S.token;\n                    if (is_(\"punc\", \"}\")) {\n                        break;\n                    }\n                    a.push(new AST_SetItem((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"value\"] = expression(false);\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)));\n                }\n                next();\n                return new AST_Set((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"items\"] = a;\n                    ρσ_d[\"start\"] = ostart;\n                    ρσ_d[\"end\"] = prev();\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!set_.__argnames__) Object.defineProperties(set_, {\n                __argnames__ : {value: [\"start\", \"end\", \"expr\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function read_comprehension(obj, terminator) {\n                var forloop;\n                if (is_node_type(obj, AST_GeneratorComprehension)) {\n                    baselib_items[\"yield\"] = true;\n                }\n                S.in_comprehension = true;\n                S.in_parenthesized_expr = false;\n                expect_token(\"keyword\", \"for\");\n                forloop = for_(true);\n                obj.init = forloop.init;\n                obj.name = forloop.name;\n                obj.object = forloop.object;\n                obj.condition = (is_(\"punc\", terminator)) ? null : (expect_token(\"keyword\", \"if\"), \n                expression(true));\n                expect(terminator);\n                S.in_comprehension = false;\n                return obj;\n            };\n            if (!read_comprehension.__argnames__) Object.defineProperties(read_comprehension, {\n                __argnames__ : {value: [\"obj\", \"terminator\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function dict_comprehension(a, is_pydict, is_jshash) {\n                var ρσ_unpack, left, right;\n                if (a.length) {\n                    ρσ_unpack = [a[0].key, a[0].value];\n                    left = ρσ_unpack[0];\n                    right = ρσ_unpack[1];\n                } else {\n                    left = expression(false);\n                    if (!is_(\"punc\", \":\")) {\n                        return read_comprehension(new AST_SetComprehension((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"statement\"] = left;\n                            return ρσ_d;\n                        }).call(this)), \"}\");\n                    }\n                    expect(\":\");\n                    right = expression(false);\n                }\n                return read_comprehension(new AST_DictComprehension((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"statement\"] = left;\n                    ρσ_d[\"value_statement\"] = right;\n                    ρσ_d[\"is_pydict\"] = is_pydict;\n                    ρσ_d[\"is_jshash\"] = is_jshash;\n                    return ρσ_d;\n                }).call(this)), \"}\");\n            };\n            if (!dict_comprehension.__argnames__) Object.defineProperties(dict_comprehension, {\n                __argnames__ : {value: [\"a\", \"is_pydict\", \"is_jshash\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function as_name() {\n                var tmp, tmp_;\n                tmp = S.token;\n                next();\n                tmp_ = tmp.type;\n                if (tmp_ === \"name\" || tmp_ === \"operator\" || tmp_ === \"keyword\" || tmp_ === \"atom\") {\n                    return tmp.value;\n                } else {\n                    unexpected();\n                }\n            };\n            if (!as_name.__module__) Object.defineProperties(as_name, {\n                __module__ : {value: \"parse\"}\n            });\n\n            function token_as_symbol(tok, ttype) {\n                var name;\n                name = tok.value;\n                if (RESERVED_WORDS[(typeof name === \"number\" && name < 0) ? RESERVED_WORDS.length + name : name] && name !== \"this\") {\n                    croak(name + \" is a reserved word\");\n                }\n                return new ((name === \"this\") ? AST_This : ttype)((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"name\"] = String(tok.value);\n                    ρσ_d[\"start\"] = tok;\n                    ρσ_d[\"end\"] = tok;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!token_as_symbol.__argnames__) Object.defineProperties(token_as_symbol, {\n                __argnames__ : {value: [\"tok\", \"ttype\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function as_symbol(ttype, noerror) {\n                var sym;\n                if (!is_(\"name\")) {\n                    if (!noerror) {\n                        croak(\"Name expected\");\n                    }\n                    return null;\n                }\n                sym = token_as_symbol(S.token, ttype);\n                next();\n                return sym;\n            };\n            if (!as_symbol.__argnames__) Object.defineProperties(as_symbol, {\n                __argnames__ : {value: [\"ttype\", \"noerror\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function new_symbol(type, name) {\n                var sym;\n                sym = new ((name === \"this\") ? AST_This : type)((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"name\"] = String(name);\n                    ρσ_d[\"start\"] = null;\n                    ρσ_d[\"end\"] = null;\n                    return ρσ_d;\n                }).call(this));\n                return sym;\n            };\n            if (!new_symbol.__argnames__) Object.defineProperties(new_symbol, {\n                __argnames__ : {value: [\"type\", \"name\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function is_static_method(cls, method) {\n                if (has_prop(COMMON_STATIC, method) || cls.static && has_prop(cls.static, method)) {\n                    return true;\n                } else {\n                    return false;\n                }\n            };\n            if (!is_static_method.__argnames__) Object.defineProperties(is_static_method, {\n                __argnames__ : {value: [\"cls\", \"method\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function getitem(expr, allow_calls) {\n                var start, is_py_sub, slice_bounds, is_slice, i, assignment, assign_operator;\n                start = expr.start;\n                next();\n                is_py_sub = S.scoped_flags.get(\"overload_getitem\", false);\n                slice_bounds = [];\n                is_slice = false;\n                if (is_(\"punc\", \":\")) {\n                    slice_bounds.push(null);\n                } else {\n                    slice_bounds.push(expression(false));\n                }\n                if (is_(\"punc\", \":\")) {\n                    is_slice = true;\n                    next();\n                    if (is_(\"punc\", \":\")) {\n                        slice_bounds.push(null);\n                    } else if (!is_(\"punc\", \"]\")) {\n                        slice_bounds.push(expression(false));\n                    }\n                }\n                if (is_(\"punc\", \":\")) {\n                    next();\n                    if (is_(\"punc\", \"]\")) {\n                        unexpected();\n                    } else {\n                        slice_bounds.push(expression(false));\n                    }\n                }\n                expect(\"]\");\n                if (is_slice) {\n                    if (is_(\"operator\", \"=\")) {\n                        next();\n                        return subscripts(new AST_Splice((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"expression\"] = expr;\n                            ρσ_d[\"property\"] = slice_bounds[0] || new AST_Number((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"value\"] = 0;\n                                return ρσ_d;\n                            }).call(this));\n                            ρσ_d[\"property2\"] = slice_bounds[1];\n                            ρσ_d[\"assignment\"] = expression(true);\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)), allow_calls);\n                    } else if (slice_bounds.length === 3) {\n                        slice_bounds.unshift(slice_bounds.pop());\n                        if (!slice_bounds[slice_bounds.length-1]) {\n                            slice_bounds.pop();\n                            if (!slice_bounds[slice_bounds.length-1]) {\n                                slice_bounds.pop();\n                            }\n                        } else if (!slice_bounds[slice_bounds.length-2]) {\n                            slice_bounds[slice_bounds.length-2] = new AST_Undefined;\n                        }\n                        return subscripts(new AST_Call((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"expression\"] = new AST_SymbolRef((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"name\"] = (S.in_delete) ? \"ρσ_delslice\" : \"ρσ_eslice\";\n                                return ρσ_d;\n                            }).call(this));\n                            ρσ_d[\"args\"] = ρσ_list_decorate([ expr ]).concat(slice_bounds);\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)), allow_calls);\n                    } else {\n                        slice_bounds = (function() {\n                            var ρσ_Iter = ρσ_Iterable(slice_bounds), ρσ_Result = [], i;\n                            for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                                i = ρσ_Iter[ρσ_Index];\n                                ρσ_Result.push((i === null) ? new AST_Number((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"value\"] = 0;\n                                    return ρσ_d;\n                                }).call(this)) : i);\n                            }\n                            ρσ_Result = ρσ_list_constructor(ρσ_Result);\n                            return ρσ_Result;\n                        })();\n                        if (S.in_delete) {\n                            return subscripts(new AST_Call((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"expression\"] = new AST_SymbolRef((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"name\"] = \"ρσ_delslice\";\n                                    return ρσ_d;\n                                }).call(this));\n                                ρσ_d[\"args\"] = ρσ_list_decorate([ expr, new AST_Number((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"value\"] = 1;\n                                    return ρσ_d;\n                                }).call(this)) ]).concat(slice_bounds);\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this)), allow_calls);\n                        }\n                        return subscripts(new AST_Call((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"expression\"] = new AST_Dot((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"expression\"] = expr;\n                                ρσ_d[\"property\"] = \"slice\";\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                            ρσ_d[\"args\"] = slice_bounds;\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)), allow_calls);\n                    }\n                } else {\n                    if (is_py_sub) {\n                        assignment = null;\n                        assign_operator = \"\";\n                        if (is_(\"operator\") && ASSIGNMENT[ρσ_bound_index(S.token.value, ASSIGNMENT)]) {\n                            assign_operator = S.token.value.slice(0, -1);\n                            next();\n                            assignment = expression(true);\n                        }\n                        return subscripts(new AST_ItemAccess((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"expression\"] = expr;\n                            ρσ_d[\"property\"] = slice_bounds[0] || new AST_Number((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"value\"] = 0;\n                                return ρσ_d;\n                            }).call(this));\n                            ρσ_d[\"assignment\"] = assignment;\n                            ρσ_d[\"assign_operator\"] = assign_operator;\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)), allow_calls);\n                    }\n                    return subscripts(new AST_Sub((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"expression\"] = expr;\n                        ρσ_d[\"property\"] = slice_bounds[0] || new AST_Number((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"value\"] = 0;\n                            return ρσ_d;\n                        }).call(this));\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)), allow_calls);\n                }\n            };\n            if (!getitem.__argnames__) Object.defineProperties(getitem, {\n                __argnames__ : {value: [\"expr\", \"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function call_(expr) {\n                var start, ret, c, funcname, tmp_, args;\n                start = expr.start;\n                S.in_parenthesized_expr = true;\n                next();\n                if (!expr.parens && get_class_in_scope(expr)) {\n                    ret = subscripts(new AST_New((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"expression\"] = expr;\n                        ρσ_d[\"args\"] = func_call_list();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)), true);\n                    S.in_parenthesized_expr = false;\n                    return ret;\n                } else {\n                    if (is_node_type(expr, AST_Dot)) {\n                        c = get_class_in_scope(expr.expression);\n                    }\n                    if (c) {\n                        funcname = expr;\n                        ret = subscripts(new AST_ClassCall((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"class\"] = expr.expression;\n                            ρσ_d[\"method\"] = funcname.property;\n                            ρσ_d[\"static\"] = is_static_method(c, funcname.property);\n                            ρσ_d[\"args\"] = func_call_list();\n                            ρσ_d[\"end\"] = prev();\n                            return ρσ_d;\n                        }).call(this)), true);\n                        S.in_parenthesized_expr = false;\n                        return ret;\n                    } else if (is_node_type(expr, AST_SymbolRef)) {\n                        tmp_ = expr.name;\n                        if (tmp_ === \"jstype\") {\n                            ret = new AST_UnaryPrefix((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"operator\"] = \"typeof\";\n                                ρσ_d[\"expression\"] = func_call_list()[0];\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                            S.in_parenthesized_expr = false;\n                            return ret;\n                        } else if (tmp_ === \"isinstance\") {\n                            args = func_call_list();\n                            if (args.length !== 2) {\n                                croak(\"isinstance() must be called with exactly two arguments\");\n                            }\n                            ret = new AST_Binary((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"left\"] = args[0];\n                                ρσ_d[\"operator\"] = \"instanceof\";\n                                ρσ_d[\"right\"] = args[1];\n                                ρσ_d[\"end\"] = prev();\n                                return ρσ_d;\n                            }).call(this));\n                            S.in_parenthesized_expr = false;\n                            return ret;\n                        }\n                    }\n                    ret = subscripts(new AST_Call((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"expression\"] = expr;\n                        ρσ_d[\"args\"] = func_call_list();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this)), true);\n                    S.in_parenthesized_expr = false;\n                    return ret;\n                }\n            };\n            if (!call_.__argnames__) Object.defineProperties(call_, {\n                __argnames__ : {value: [\"expr\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function get_attr(expr, allow_calls) {\n                var prop, c, classvars;\n                next();\n                prop = as_name();\n                c = get_class_in_scope(expr);\n                if (c) {\n                    classvars = (c.processing) ? c.provisional_classvars : c.classvars;\n                    if (classvars && classvars[prop]) {\n                        prop = \"prototype.\" + prop;\n                    }\n                }\n                return subscripts(new AST_Dot((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = expr.start;\n                    ρσ_d[\"expression\"] = expr;\n                    ρσ_d[\"property\"] = prop;\n                    ρσ_d[\"end\"] = prev();\n                    return ρσ_d;\n                }).call(this)), allow_calls);\n            };\n            if (!get_attr.__argnames__) Object.defineProperties(get_attr, {\n                __argnames__ : {value: [\"expr\", \"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function existential(expr, allow_calls) {\n                var ans, ttype, val, is_py_sub;\n                ans = new AST_Existential((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"start\"] = expr.start;\n                    ρσ_d[\"end\"] = S.token;\n                    ρσ_d[\"expression\"] = expr;\n                    return ρσ_d;\n                }).call(this));\n                next();\n                ttype = S.token.type;\n                val = S.token.value;\n                if (S.token.nlb || ttype === \"keyword\" || ttype === \"operator\" || ttype === \"eof\") {\n                    ans.after = null;\n                    return ans;\n                }\n                if (ttype === \"punc\") {\n                    if (val === \".\") {\n                        ans.after = \".\";\n                    } else if (val === \"[\") {\n                        is_py_sub = S.scoped_flags.get(\"overload_getitem\", false);\n                        ans.after = (is_py_sub) ? \"g\" : \"[\";\n                    } else if (val === \"(\") {\n                        if (!allow_calls) {\n                            unexpected();\n                        }\n                        ans.after = \"(\";\n                    } else {\n                        ans.after = null;\n                        return ans;\n                    }\n                    return subscripts(ans, allow_calls);\n                }\n                ans.after = expression();\n                return ans;\n            };\n            if (!existential.__argnames__) Object.defineProperties(existential, {\n                __argnames__ : {value: [\"expr\", \"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function subscripts(expr, allow_calls) {\n                if (is_(\"punc\", \".\")) {\n                    return get_attr(expr, allow_calls);\n                }\n                if (is_(\"punc\", \"[\") && !S.token.nlb) {\n                    return getitem(expr, allow_calls);\n                }\n                if (allow_calls && is_(\"punc\", \"(\") && !S.token.nlb) {\n                    return call_(expr);\n                }\n                if (is_(\"punc\", \"?\")) {\n                    return existential(expr, allow_calls);\n                }\n                return expr;\n            };\n            if (!subscripts.__argnames__) Object.defineProperties(subscripts, {\n                __argnames__ : {value: [\"expr\", \"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function maybe_unary(allow_calls) {\n                var start, expr, is_parenthesized, ex, val;\n                start = S.token;\n                if (is_(\"operator\", \"@\")) {\n                    if (S.parsing_decorator) {\n                        croak(\"Nested decorators are not allowed\");\n                    }\n                    next();\n                    S.parsing_decorator = true;\n                    expr = expression();\n                    S.parsing_decorator = false;\n                    S.decorators.push(expr);\n                    return new AST_EmptyStatement((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"stype\"] = \"@\";\n                        ρσ_d[\"start\"] = prev();\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this));\n                }\n                if (is_(\"operator\") && UNARY_PREFIX[ρσ_bound_index(start.value, UNARY_PREFIX)]) {\n                    next();\n                    is_parenthesized = is_(\"punc\", \"(\");\n                    S.in_delete = start.value === \"delete\";\n                    expr = maybe_unary(allow_calls);\n                    S.in_delete = false;\n                    ex = make_unary(AST_UnaryPrefix, start.value, expr, is_parenthesized);\n                    ex.start = start;\n                    ex.end = prev();\n                    return ex;\n                }\n                val = expr_atom(allow_calls);\n                return val;\n            };\n            if (!maybe_unary.__argnames__) Object.defineProperties(maybe_unary, {\n                __argnames__ : {value: [\"allow_calls\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function make_unary(ctor, op, expr, is_parenthesized) {\n                return new ctor((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"operator\"] = op;\n                    ρσ_d[\"expression\"] = expr;\n                    ρσ_d[\"parenthesized\"] = is_parenthesized;\n                    return ρσ_d;\n                }).call(this));\n            };\n            if (!make_unary.__argnames__) Object.defineProperties(make_unary, {\n                __argnames__ : {value: [\"ctor\", \"op\", \"expr\", \"is_parenthesized\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expr_op(left, min_prec, no_in) {\n                var op, prec, right, ret;\n                op = (is_(\"operator\")) ? S.token.value : null;\n                if (op === \"!\" && peek().type === \"operator\" && peek().value === \"in\") {\n                    next();\n                    S.token.value = op = \"nin\";\n                }\n                if (no_in && (op === \"in\" || op === \"nin\")) {\n                    op = null;\n                }\n                prec = (op !== null) ? PRECEDENCE[(typeof op === \"number\" && op < 0) ? PRECEDENCE.length + op : op] : null;\n                if (prec !== null && prec > min_prec) {\n                    next();\n                    right = expr_op(maybe_unary(true), prec, no_in);\n                    ret = new AST_Binary((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = left.start;\n                        ρσ_d[\"left\"] = left;\n                        ρσ_d[\"operator\"] = op;\n                        ρσ_d[\"right\"] = right;\n                        ρσ_d[\"end\"] = right.end;\n                        return ρσ_d;\n                    }).call(this));\n                    return expr_op(ret, min_prec, no_in);\n                }\n                return left;\n            };\n            if (!expr_op.__argnames__) Object.defineProperties(expr_op, {\n                __argnames__ : {value: [\"left\", \"min_prec\", \"no_in\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expr_ops(no_in) {\n                return expr_op(maybe_unary(true), 0, no_in);\n            };\n            if (!expr_ops.__argnames__) Object.defineProperties(expr_ops, {\n                __argnames__ : {value: [\"no_in\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function maybe_conditional(no_in) {\n                var start, expr, ne, conditional;\n                start = S.token;\n                expr = expr_ops(no_in);\n                if (is_(\"keyword\", \"if\") && (S.in_parenthesized_expr || S.statement_starting_token !== S.token && !S.in_comprehension && !S.token.nlb)) {\n                    next();\n                    ne = expression(false);\n                    expect_token(\"keyword\", \"else\");\n                    conditional = new AST_Conditional((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"condition\"] = ne;\n                        ρσ_d[\"consequent\"] = expr;\n                        ρσ_d[\"alternative\"] = expression(false, no_in);\n                        ρσ_d[\"end\"] = peek();\n                        return ρσ_d;\n                    }).call(this));\n                    return conditional;\n                }\n                return expr;\n            };\n            if (!maybe_conditional.__argnames__) Object.defineProperties(maybe_conditional, {\n                __argnames__ : {value: [\"no_in\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function create_assign(data) {\n                var ans, class_name, c, lhs;\n                if (data.right && is_node_type(data.right, AST_Seq) && (is_node_type(data.right.car, AST_Assign) || is_node_type(data.right.cdr, AST_Assign)) && data.operator !== \"=\") {\n                    token_error(data.start, \"Invalid assignment operator for chained assignment: \" + data.operator);\n                }\n                ans = new AST_Assign(data);\n                if (S.in_class.length && (ρσ_expr_temp = S.in_class)[ρσ_expr_temp.length-1]) {\n                    class_name = (ρσ_expr_temp = S.in_class)[ρσ_expr_temp.length-1];\n                    if (is_node_type(ans.left, AST_SymbolRef) && S.classes.length > 1) {\n                        c = (ρσ_expr_temp = (ρσ_expr_temp = S.classes)[ρσ_expr_temp.length-2])[(typeof class_name === \"number\" && class_name < 0) ? ρσ_expr_temp.length + class_name : class_name];\n                        if (c) {\n                            if (ans.is_chained()) {\n                                var ρσ_Iter70 = ρσ_Iterable(ans.traverse_chain()[0]);\n                                for (var ρσ_Index70 = 0; ρσ_Index70 < ρσ_Iter70.length; ρσ_Index70++) {\n                                    lhs = ρσ_Iter70[ρσ_Index70];\n                                    (ρσ_expr_temp = c.provisional_classvars)[ρσ_bound_index(lhs.name, ρσ_expr_temp)] = true;\n                                }\n                            } else {\n                                (ρσ_expr_temp = c.provisional_classvars)[ρσ_bound_index(ans.left.name, ρσ_expr_temp)] = true;\n                            }\n                        }\n                    }\n                }\n                return ans;\n            };\n            if (!create_assign.__argnames__) Object.defineProperties(create_assign, {\n                __argnames__ : {value: [\"data\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function maybe_assign(no_in, only_plain_assignment) {\n                var start, left, val;\n                start = S.token;\n                left = maybe_conditional(no_in);\n                val = S.token.value;\n                if (is_(\"operator\") && ASSIGNMENT[(typeof val === \"number\" && val < 0) ? ASSIGNMENT.length + val : val]) {\n                    if (only_plain_assignment && val !== \"=\") {\n                        croak(\"Invalid assignment operator for chained assignment: \" + val);\n                    }\n                    next();\n                    return create_assign((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"left\"] = left;\n                        ρσ_d[\"operator\"] = val;\n                        ρσ_d[\"right\"] = maybe_assign(no_in, true);\n                        ρσ_d[\"end\"] = prev();\n                        return ρσ_d;\n                    }).call(this));\n                }\n                return left;\n            };\n            if (!maybe_assign.__argnames__) Object.defineProperties(maybe_assign, {\n                __argnames__ : {value: [\"no_in\", \"only_plain_assignment\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function expression(commas, no_in) {\n                var start, expr, left;\n                start = S.token;\n                expr = maybe_assign(no_in);\n                function build_seq(a) {\n                    if (a.length === 1) {\n                        return a[0];\n                    }\n                    return new AST_Seq((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"car\"] = a.shift();\n                        ρσ_d[\"cdr\"] = build_seq(a);\n                        ρσ_d[\"end\"] = peek();\n                        return ρσ_d;\n                    }).call(this));\n                };\n                if (!build_seq.__argnames__) Object.defineProperties(build_seq, {\n                    __argnames__ : {value: [\"a\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                if (commas) {\n                    left = [ expr ];\n                    while (is_(\"punc\", \",\") && !peek().nlb) {\n                        next();\n                        if (is_node_type(expr, AST_Assign)) {\n                            left[left.length-1] = left[left.length-1].left;\n                            return create_assign((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"start\"] = start;\n                                ρσ_d[\"left\"] = (left.length === 1) ? left[0] : new AST_Array((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"elements\"] = left;\n                                    return ρσ_d;\n                                }).call(this));\n                                ρσ_d[\"operator\"] = expr.operator;\n                                ρσ_d[\"right\"] = new AST_Seq((function(){\n                                    var ρσ_d = Object.create(null);\n                                    ρσ_d[\"car\"] = expr.right;\n                                    ρσ_d[\"cdr\"] = expression(true, no_in);\n                                    return ρσ_d;\n                                }).call(this));\n                                ρσ_d[\"end\"] = peek();\n                                return ρσ_d;\n                            }).call(this));\n                        }\n                        expr = maybe_assign(no_in);\n                        left.push(expr);\n                    }\n                    if (left.length > 1 && is_node_type(left[left.length-1], AST_Assign)) {\n                        left[left.length-1] = left[left.length-1].left;\n                        return create_assign((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"start\"] = start;\n                            ρσ_d[\"left\"] = new AST_Array((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"elements\"] = left;\n                                return ρσ_d;\n                            }).call(this));\n                            ρσ_d[\"operator\"] = expr.operator;\n                            ρσ_d[\"right\"] = expr.right;\n                            ρσ_d[\"end\"] = peek();\n                            return ρσ_d;\n                        }).call(this));\n                    }\n                    return build_seq(left);\n                }\n                return expr;\n            };\n            if (!expression.__argnames__) Object.defineProperties(expression, {\n                __argnames__ : {value: [\"commas\", \"no_in\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function in_loop(cont) {\n                var ret;\n                S.in_loop += 1;\n                ret = cont();\n                S.in_loop -= 1;\n                return ret;\n            };\n            if (!in_loop.__argnames__) Object.defineProperties(in_loop, {\n                __argnames__ : {value: [\"cont\"]},\n                __module__ : {value: \"parse\"}\n            });\n\n            function run_parser() {\n                var start, body, docstrings, first_token, toplevel, element, shebang, ds, end, seen_exports, item;\n                start = S.token = next();\n                body = [];\n                docstrings = [];\n                first_token = true;\n                toplevel = options.toplevel;\n                while (!is_(\"eof\")) {\n                    element = statement();\n                    if (first_token && is_node_type(element, AST_Directive) && element.value.indexOf(\"#!\") === 0) {\n                        shebang = element.value;\n                    } else {\n                        ds = !toplevel && is_docstring(element);\n                        if (ds) {\n                            docstrings.push(ds);\n                        } else {\n                            body.push(element);\n                        }\n                    }\n                    first_token = false;\n                }\n                end = prev();\n                if (toplevel) {\n                    toplevel.body = toplevel.body.concat(body);\n                    toplevel.end = end;\n                    toplevel.docstrings;\n                } else {\n                    toplevel = new AST_Toplevel((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"start\"] = start;\n                        ρσ_d[\"body\"] = body;\n                        ρσ_d[\"shebang\"] = shebang;\n                        ρσ_d[\"end\"] = end;\n                        ρσ_d[\"docstrings\"] = docstrings;\n                        return ρσ_d;\n                    }).call(this));\n                }\n                toplevel.nonlocalvars = scan_for_nonlocal_defs(toplevel.body).concat(S.globals);\n                toplevel.localvars = ρσ_list_decorate([]);\n                toplevel.exports = ρσ_list_decorate([]);\n                seen_exports = Object.create(null);\n                function add_item(item, isvar) {\n                    var symbol;\n                    if (toplevel.nonlocalvars.indexOf(item) < 0) {\n                        symbol = new_symbol(AST_SymbolVar, item);\n                        if (isvar) {\n                            toplevel.localvars.push(symbol);\n                        }\n                        if (!has_prop(seen_exports, item)) {\n                            toplevel.exports.push(symbol);\n                            seen_exports[(typeof item === \"number\" && item < 0) ? seen_exports.length + item : item] = true;\n                        }\n                    }\n                };\n                if (!add_item.__argnames__) Object.defineProperties(add_item, {\n                    __argnames__ : {value: [\"item\", \"isvar\"]},\n                    __module__ : {value: \"parse\"}\n                });\n\n                var ρσ_Iter71 = ρσ_Iterable(scan_for_local_vars(toplevel.body));\n                for (var ρσ_Index71 = 0; ρσ_Index71 < ρσ_Iter71.length; ρσ_Index71++) {\n                    item = ρσ_Iter71[ρσ_Index71];\n                    add_item(item, true);\n                }\n                var ρσ_Iter72 = ρσ_Iterable(scan_for_top_level_callables(toplevel.body));\n                for (var ρσ_Index72 = 0; ρσ_Index72 < ρσ_Iter72.length; ρσ_Index72++) {\n                    item = ρσ_Iter72[ρσ_Index72];\n                    add_item(item, false);\n                }\n                toplevel.filename = options.filename;\n                toplevel.imported_module_ids = imported_module_ids;\n                toplevel.classes = scan_for_classes(toplevel.body);\n                toplevel.import_order = Object.keys(imported_modules).length;\n                toplevel.module_id = module_id;\n                imported_modules[(typeof module_id === \"number\" && module_id < 0) ? imported_modules.length + module_id : module_id] = toplevel;\n                toplevel.imports = imported_modules;\n                toplevel.baselib = baselib_items;\n                toplevel.scoped_flags = S.scoped_flags.stack[0];\n                importing_modules[(typeof module_id === \"number\" && module_id < 0) ? importing_modules.length + module_id : module_id] = false;\n                toplevel.comments_after = S.token.comments_before || [];\n                return toplevel;\n            };\n            if (!run_parser.__module__) Object.defineProperties(run_parser, {\n                __module__ : {value: \"parse\"}\n            });\n\n            return run_parser;\n        };\n        if (!create_parser_ctx.__argnames__) Object.defineProperties(create_parser_ctx, {\n            __argnames__ : {value: [\"S\", \"import_dirs\", \"module_id\", \"baselib_items\", \"imported_module_ids\", \"imported_modules\", \"importing_modules\", \"options\"]},\n            __module__ : {value: \"parse\"}\n        });\n\n        function parse(text, options) {\n            var import_dirs, x, location, module_id, baselib_items, imported_module_ids, imported_modules, importing_modules, S, obj, cname;\n            options = defaults(options, (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"filename\"] = null;\n                ρσ_d[\"module_id\"] = \"__main__\";\n                ρσ_d[\"toplevel\"] = null;\n                ρσ_d[\"for_linting\"] = false;\n                ρσ_d[\"import_dirs\"] = [];\n                ρσ_d[\"classes\"] = undefined;\n                ρσ_d[\"scoped_flags\"] = Object.create(null);\n                ρσ_d[\"discard_asserts\"] = false;\n                ρσ_d[\"module_cache_dir\"] = \"\";\n                return ρσ_d;\n            }).call(this));\n            import_dirs = (function() {\n                var ρσ_Iter = ρσ_Iterable(options.import_dirs), ρσ_Result = [], x;\n                for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                    x = ρσ_Iter[ρσ_Index];\n                    ρσ_Result.push(x);\n                }\n                ρσ_Result = ρσ_list_constructor(ρσ_Result);\n                return ρσ_Result;\n            })();\n            var ρσ_Iter73 = ρσ_Iterable([options.libdir, options.basedir]);\n            for (var ρσ_Index73 = 0; ρσ_Index73 < ρσ_Iter73.length; ρσ_Index73++) {\n                location = ρσ_Iter73[ρσ_Index73];\n                if (location) {\n                    import_dirs.push(location);\n                }\n            }\n            module_id = options.module_id;\n            baselib_items = Object.create(null);\n            imported_module_ids = ρσ_list_decorate([]);\n            imported_modules = options.imported_modules || Object.create(null);\n            importing_modules = options.importing_modules || Object.create(null);\n            importing_modules[(typeof module_id === \"number\" && module_id < 0) ? importing_modules.length + module_id : module_id] = true;\n            S = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"input\"] = (typeof text === \"string\") ? tokenizer(text, options.filename) : text;\n                ρσ_d[\"token\"] = null;\n                ρσ_d[\"prev\"] = null;\n                ρσ_d[\"peeked\"] = ρσ_list_decorate([]);\n                ρσ_d[\"in_function\"] = 0;\n                ρσ_d[\"statement_starting_token\"] = null;\n                ρσ_d[\"in_comprehension\"] = false;\n                ρσ_d[\"in_parenthesized_expr\"] = false;\n                ρσ_d[\"in_delete\"] = false;\n                ρσ_d[\"in_loop\"] = 0;\n                ρσ_d[\"in_class\"] = ρσ_list_decorate([ false ]);\n                ρσ_d[\"classes\"] = ρσ_list_decorate([ Object.create(null) ]);\n                ρσ_d[\"functions\"] = ρσ_list_decorate([ Object.create(null) ]);\n                ρσ_d[\"labels\"] = ρσ_list_decorate([]);\n                ρσ_d[\"decorators\"] = [];\n                ρσ_d[\"parsing_decorator\"] = false;\n                ρσ_d[\"globals\"] = [];\n                ρσ_d[\"scoped_flags\"] = (function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"stack\"] = [options.scoped_flags || Object.create(null)];\n                    ρσ_d[\"push\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            this.stack.push(Object.create(null));\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    ρσ_d[\"pop\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            this.stack.pop();\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    ρσ_d[\"get\"] = (function() {\n                        var ρσ_anonfunc = function (name, defval) {\n                            var d, q;\n                            for (var i = this.stack.length - 1; i >= 0; i--) {\n                                d = (ρσ_expr_temp = this.stack)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n                                q = d[(typeof name === \"number\" && name < 0) ? d.length + name : name];\n                                if (q) {\n                                    return q;\n                                }\n                            }\n                            return defval;\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"name\", \"defval\"]},\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    ρσ_d[\"set\"] = (function() {\n                        var ρσ_anonfunc = function (name, val) {\n                            (ρσ_expr_temp = (ρσ_expr_temp = this.stack)[ρσ_expr_temp.length-1])[(typeof name === \"number\" && name < 0) ? ρσ_expr_temp.length + name : name] = val;\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"name\", \"val\"]},\n                            __module__ : {value: \"parse\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    return ρσ_d;\n                }).call(this);\n                return ρσ_d;\n            }).call(this);\n            if (options.classes) {\n                var ρσ_Iter74 = ρσ_Iterable(options.classes);\n                for (var ρσ_Index74 = 0; ρσ_Index74 < ρσ_Iter74.length; ρσ_Index74++) {\n                    cname = ρσ_Iter74[ρσ_Index74];\n                    obj = (ρσ_expr_temp = options.classes)[(typeof cname === \"number\" && cname < 0) ? ρσ_expr_temp.length + cname : cname];\n                    (ρσ_expr_temp = S.classes[0])[(typeof cname === \"number\" && cname < 0) ? ρσ_expr_temp.length + cname : cname] = (function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"static\"] = obj.static;\n                        ρσ_d[\"bound\"] = obj.bound;\n                        ρσ_d[\"classvars\"] = obj.classvars;\n                        return ρσ_d;\n                    }).call(this);\n                }\n            }\n            return create_parser_ctx(S, import_dirs, module_id, baselib_items, imported_module_ids, imported_modules, importing_modules, options)();\n        };\n        if (!parse.__argnames__) Object.defineProperties(parse, {\n            __argnames__ : {value: [\"text\", \"options\"]},\n            __module__ : {value: \"parse\"}\n        });\n\n        ρσ_modules.parse.COMPILER_VERSION = COMPILER_VERSION;\n        ρσ_modules.parse.PYTHON_FLAGS = PYTHON_FLAGS;\n        ρσ_modules.parse.NATIVE_CLASSES = NATIVE_CLASSES;\n        ρσ_modules.parse.ERROR_CLASSES = ERROR_CLASSES;\n        ρσ_modules.parse.COMMON_STATIC = COMMON_STATIC;\n        ρσ_modules.parse.FORBIDDEN_CLASS_VARS = FORBIDDEN_CLASS_VARS;\n        ρσ_modules.parse.UNARY_PREFIX = UNARY_PREFIX;\n        ρσ_modules.parse.ASSIGNMENT = ASSIGNMENT;\n        ρσ_modules.parse.PRECEDENCE = PRECEDENCE;\n        ρσ_modules.parse.STATEMENTS_WITH_LABELS = STATEMENTS_WITH_LABELS;\n        ρσ_modules.parse.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;\n        ρσ_modules.parse.compile_time_decorators = compile_time_decorators;\n        ρσ_modules.parse.get_compiler_version = get_compiler_version;\n        ρσ_modules.parse.static_predicate = static_predicate;\n        ρσ_modules.parse.has_simple_decorator = has_simple_decorator;\n        ρσ_modules.parse.has_setter_decorator = has_setter_decorator;\n        ρσ_modules.parse.create_parser_ctx = create_parser_ctx;\n        ρσ_modules.parse.parse = parse;\n    })();\n\n    (function(){\n        var __name__ = \"output\";\n\n    })();\n\n    (function(){\n        var __name__ = \"output.stream\";\n        var DANGEROUS, require_semi_colon_chars, output_stream_defaults;\n        var make_predicate = ρσ_modules.utils.make_predicate;\n        var defaults = ρσ_modules.utils.defaults;\n        var repeat_string = ρσ_modules.utils.repeat_string;\n\n        var is_identifier_char = ρσ_modules.tokenizer.is_identifier_char;\n\n        DANGEROUS = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\n        function as_hex(code, sz) {\n            var val;\n            val = code.toString(16);\n            if (val.length < sz) {\n                val = \"0\".repeat(sz - val.length) + val;\n            }\n            return val;\n        };\n        if (!as_hex.__argnames__) Object.defineProperties(as_hex, {\n            __argnames__ : {value: [\"code\", \"sz\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n\n        function to_ascii(str_, identifier) {\n            return str_.replace(/[\\u0080-\\uffff]/g, (function() {\n                var ρσ_anonfunc = function (ch) {\n                    var code;\n                    code = ch.charCodeAt(0).toString(16);\n                    if (code.length <= 2 && !identifier) {\n                        return \"\\\\x\" + as_hex(code, 2);\n                    } else {\n                        return \"\\\\u\" + as_hex(code, 4);\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"ch\"]},\n                    __module__ : {value: \"output.stream\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!to_ascii.__argnames__) Object.defineProperties(to_ascii, {\n            __argnames__ : {value: [\"str_\", \"identifier\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n\n        function encode_string(str_) {\n            return JSON.stringify(str_).replace(DANGEROUS, (function() {\n                var ρσ_anonfunc = function (a) {\n                    return \"\\\\u\" + as_hex(a.charCodeAt(0), 4);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"a\"]},\n                    __module__ : {value: \"output.stream\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!encode_string.__argnames__) Object.defineProperties(encode_string, {\n            __argnames__ : {value: [\"str_\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n\n        require_semi_colon_chars = make_predicate(\"( [ + * / - , .\");\n        output_stream_defaults = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"indent_start\"] = 0;\n            ρσ_d[\"indent_level\"] = 4;\n            ρσ_d[\"quote_keys\"] = false;\n            ρσ_d[\"space_colon\"] = true;\n            ρσ_d[\"ascii_only\"] = false;\n            ρσ_d[\"width\"] = 80;\n            ρσ_d[\"max_line_len\"] = 32e3;\n            ρσ_d[\"ie_proof\"] = true;\n            ρσ_d[\"beautify\"] = false;\n            ρσ_d[\"source_map\"] = null;\n            ρσ_d[\"bracketize\"] = false;\n            ρσ_d[\"semicolons\"] = true;\n            ρσ_d[\"comments\"] = false;\n            ρσ_d[\"preserve_line\"] = false;\n            ρσ_d[\"omit_baselib\"] = false;\n            ρσ_d[\"baselib_plain\"] = null;\n            ρσ_d[\"private_scope\"] = true;\n            ρσ_d[\"keep_docstrings\"] = false;\n            ρσ_d[\"discard_asserts\"] = false;\n            ρσ_d[\"module_cache_dir\"] = \"\";\n            ρσ_d[\"js_version\"] = 5;\n            ρσ_d[\"write_name\"] = true;\n            return ρσ_d;\n        }).call(this);\n        function OutputStream() {\n            if (this.ρσ_object_id === undefined) Object.defineProperty(this, \"ρσ_object_id\", {\"value\":++ρσ_object_counter});\n            OutputStream.prototype.__init__.apply(this, arguments);\n        }\n        OutputStream.prototype.__init__ = function __init__(options) {\n            var self = this;\n            self.options = defaults(options, output_stream_defaults, true);\n            self._indentation = 0;\n            self.current_col = 0;\n            self.current_line = 1;\n            self.current_pos = 0;\n            self.OUTPUT = \"\";\n            self.might_need_space = false;\n            self.might_need_semicolon = false;\n            self._last = null;\n            self._stack = ρσ_list_decorate([]);\n            self.index_counter = 0;\n            self.with_counter = 0;\n            self.try_else_counter = 0;\n        };\n        if (!OutputStream.prototype.__init__.__argnames__) Object.defineProperties(OutputStream.prototype.__init__, {\n            __argnames__ : {value: [\"options\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.__argnames__ = OutputStream.prototype.__init__.__argnames__;\n        OutputStream.__handles_kwarg_interpolation__ = OutputStream.prototype.__init__.__handles_kwarg_interpolation__;\n        OutputStream.prototype.new_try_else_counter = function new_try_else_counter() {\n            var self = this;\n            self.try_else_counter += 1;\n            return \"ρσ_try_else_\" + self.try_else_counter;\n        };\n        if (!OutputStream.prototype.new_try_else_counter.__module__) Object.defineProperties(OutputStream.prototype.new_try_else_counter, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.make_name = function make_name(name) {\n            var self = this;\n            name = name.toString();\n            if (self.options.ascii_only) {\n                name = to_ascii(name, true);\n            }\n            return name;\n        };\n        if (!OutputStream.prototype.make_name.__argnames__) Object.defineProperties(OutputStream.prototype.make_name, {\n            __argnames__ : {value: [\"name\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.print_name = function print_name(name) {\n            var self = this;\n            self.print(self.make_name(name));\n        };\n        if (!OutputStream.prototype.print_name.__argnames__) Object.defineProperties(OutputStream.prototype.print_name, {\n            __argnames__ : {value: [\"name\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.make_indent = function make_indent(back) {\n            var self = this;\n            return repeat_string(\" \", self.options.indent_start + self._indentation - back * self.options.indent_level);\n        };\n        if (!OutputStream.prototype.make_indent.__argnames__) Object.defineProperties(OutputStream.prototype.make_indent, {\n            __argnames__ : {value: [\"back\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.last_char = function last_char() {\n            var self = this;\n            return self._last.charAt(self._last.length - 1);\n        };\n        if (!OutputStream.prototype.last_char.__module__) Object.defineProperties(OutputStream.prototype.last_char, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.maybe_newline = function maybe_newline() {\n            var self = this;\n            if (self.options.max_line_len && self.current_col > self.options.max_line_len) {\n                self.print(\"\\n\");\n            }\n        };\n        if (!OutputStream.prototype.maybe_newline.__module__) Object.defineProperties(OutputStream.prototype.maybe_newline, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.print = function print(str_) {\n            var self = this;\n            var ch, target_line, prev, a, n;\n            str_ = String(str_);\n            ch = str_.charAt(0);\n            if (self.might_need_semicolon) {\n                if ((!ch || \";}\".indexOf(ch) < 0) && !/[;]$/.test(self._last)) {\n                    if (self.options.semicolons || require_semi_colon_chars[(typeof ch === \"number\" && ch < 0) ? require_semi_colon_chars.length + ch : ch]) {\n                        self.OUTPUT += \";\";\n                        self.current_col += 1;\n                        self.current_pos += 1;\n                    } else {\n                        self.OUTPUT += \"\\n\";\n                        self.current_pos += 1;\n                        self.current_line += 1;\n                        self.current_col = 0;\n                    }\n                    if (!self.options.beautify) {\n                        self.might_need_space = false;\n                    }\n                }\n                self.might_need_semicolon = false;\n                self.maybe_newline();\n            }\n            if (!self.options.beautify && self.options.preserve_line && (ρσ_expr_temp = self._stack)[ρσ_bound_index(self._stack.length - 1, ρσ_expr_temp)]) {\n                target_line = (ρσ_expr_temp = self._stack)[ρσ_bound_index(self._stack.length - 1, ρσ_expr_temp)].start.line;\n                while (self.current_line < target_line) {\n                    self.OUTPUT += \"\\n\";\n                    self.current_pos += 1;\n                    self.current_line += 1;\n                    self.current_col = 0;\n                    self.might_need_space = false;\n                }\n            }\n            if (self.might_need_space) {\n                prev = self.last_char();\n                if (is_identifier_char(prev) && (is_identifier_char(ch) || ch === \"\\\\\") || /^[\\+\\-\\/]$/.test(ch) && ch === prev) {\n                    self.OUTPUT += \" \";\n                    self.current_col += 1;\n                    self.current_pos += 1;\n                }\n                self.might_need_space = false;\n            }\n            a = str_.split(/\\r?\\n/);\n            n = a.length - 1;\n            self.current_line += n;\n            if (n === 0) {\n                self.current_col += a[(typeof n === \"number\" && n < 0) ? a.length + n : n].length;\n            } else {\n                self.current_col = a[(typeof n === \"number\" && n < 0) ? a.length + n : n].length;\n            }\n            self.current_pos += str_.length;\n            self._last = str_;\n            self.OUTPUT += str_;\n        };\n        if (!OutputStream.prototype.print.__argnames__) Object.defineProperties(OutputStream.prototype.print, {\n            __argnames__ : {value: [\"str_\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.space = function space() {\n            var self = this;\n            if (self.options.beautify) {\n                self.print(\" \");\n            } else {\n                self.might_need_space = true;\n            }\n        };\n        if (!OutputStream.prototype.space.__module__) Object.defineProperties(OutputStream.prototype.space, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.indent = function indent(half) {\n            var self = this;\n            if (self.options.beautify) {\n                self.print(self.make_indent((half) ? .5 : 0));\n            }\n        };\n        if (!OutputStream.prototype.indent.__argnames__) Object.defineProperties(OutputStream.prototype.indent, {\n            __argnames__ : {value: [\"half\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.with_indent = function with_indent(col, proceed) {\n            var self = this;\n            var save_indentation, ret;\n            if (self.options.beautify) {\n                if (col === true) {\n                    col = self.next_indent();\n                }\n                save_indentation = self._indentation;\n                self._indentation = col;\n                ret = proceed();\n                self._indentation = save_indentation;\n                return ret;\n            } else {\n                return proceed();\n            }\n        };\n        if (!OutputStream.prototype.with_indent.__argnames__) Object.defineProperties(OutputStream.prototype.with_indent, {\n            __argnames__ : {value: [\"col\", \"proceed\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.indentation = function indentation() {\n            var self = this;\n            return self._indentation;\n        };\n        if (!OutputStream.prototype.indentation.__module__) Object.defineProperties(OutputStream.prototype.indentation, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.set_indentation = function set_indentation(val) {\n            var self = this;\n            if (self.options.beautify) {\n                self._indentation = val;\n            }\n        };\n        if (!OutputStream.prototype.set_indentation.__argnames__) Object.defineProperties(OutputStream.prototype.set_indentation, {\n            __argnames__ : {value: [\"val\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.newline = function newline() {\n            var self = this;\n            if (self.options.beautify) {\n                self.print(\"\\n\");\n            }\n        };\n        if (!OutputStream.prototype.newline.__module__) Object.defineProperties(OutputStream.prototype.newline, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.semicolon = function semicolon() {\n            var self = this;\n            if (self.options.beautify) {\n                self.print(\";\");\n            } else {\n                self.might_need_semicolon = true;\n            }\n        };\n        if (!OutputStream.prototype.semicolon.__module__) Object.defineProperties(OutputStream.prototype.semicolon, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.force_semicolon = function force_semicolon() {\n            var self = this;\n            self.might_need_semicolon = false;\n            self.print(\";\");\n        };\n        if (!OutputStream.prototype.force_semicolon.__module__) Object.defineProperties(OutputStream.prototype.force_semicolon, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.next_indent = function next_indent() {\n            var self = this;\n            return self._indentation + self.options.indent_level;\n        };\n        if (!OutputStream.prototype.next_indent.__module__) Object.defineProperties(OutputStream.prototype.next_indent, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.spaced = function spaced() {\n            var self = this;\n            for (var i=0; i < arguments.length; i++) {\n                if (i > 0) {\n                    self.space();\n                }\n                if (typeof arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].print === \"function\") {\n                    arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i].print(self);\n                } else {\n                    self.print(arguments[(typeof i === \"number\" && i < 0) ? arguments.length + i : i]);\n                }\n            }\n        };\n        if (!OutputStream.prototype.spaced.__module__) Object.defineProperties(OutputStream.prototype.spaced, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.end_statement = function end_statement() {\n            var self = this;\n            self.semicolon();\n            self.newline();\n        };\n        if (!OutputStream.prototype.end_statement.__module__) Object.defineProperties(OutputStream.prototype.end_statement, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.with_block = function with_block(cont) {\n            var self = this;\n            var ret;\n            ret = null;\n            self.print(\"{\");\n            self.newline();\n            self.with_indent(self.next_indent(), (function() {\n                var ρσ_anonfunc = function () {\n                    ret = cont();\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.stream\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            self.indent();\n            self.print(\"}\");\n            return ret;\n        };\n        if (!OutputStream.prototype.with_block.__argnames__) Object.defineProperties(OutputStream.prototype.with_block, {\n            __argnames__ : {value: [\"cont\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.with_parens = function with_parens(cont) {\n            var self = this;\n            var ret;\n            self.print(\"(\");\n            ret = cont();\n            self.print(\")\");\n            return ret;\n        };\n        if (!OutputStream.prototype.with_parens.__argnames__) Object.defineProperties(OutputStream.prototype.with_parens, {\n            __argnames__ : {value: [\"cont\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.with_square = function with_square(cont) {\n            var self = this;\n            var ret;\n            self.print(\"[\");\n            ret = cont();\n            self.print(\"]\");\n            return ret;\n        };\n        if (!OutputStream.prototype.with_square.__argnames__) Object.defineProperties(OutputStream.prototype.with_square, {\n            __argnames__ : {value: [\"cont\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.comma = function comma() {\n            var self = this;\n            self.print(\",\");\n            self.space();\n        };\n        if (!OutputStream.prototype.comma.__module__) Object.defineProperties(OutputStream.prototype.comma, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.colon = function colon() {\n            var self = this;\n            self.print(\":\");\n            if (self.options.space_colon) {\n                self.space();\n            }\n        };\n        if (!OutputStream.prototype.colon.__module__) Object.defineProperties(OutputStream.prototype.colon, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.dump_yield = function dump_yield() {\n            var self = this;\n            var code, ci;\n            self.indent();\n            self.spaced(\"var\", \"ρσ_regenerator\", \"=\", \"{}\");\n            self.end_statement();\n            code = \"ρσ_regenerator.regeneratorRuntime = \" + regenerate(false, self.options.beautify);\n            if (self.options.beautify) {\n                code = code.replace(/\\/\\/.*$/gm, \"\\n\").replace(/^\\s*$/gm, \"\");\n                ci = self.make_indent(0);\n                code = (function() {\n                    var ρσ_Iter = ρσ_Iterable(code.split(\"\\n\")), ρσ_Result = [], x;\n                    for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                        x = ρσ_Iter[ρσ_Index];\n                        ρσ_Result.push(ci + x);\n                    }\n                    ρσ_Result = ρσ_list_constructor(ρσ_Result);\n                    return ρσ_Result;\n                })().join(\"\\n\");\n            }\n            self.print(code + \"})(ρσ_regenerator)\");\n            self.end_statement();\n        };\n        if (!OutputStream.prototype.dump_yield.__module__) Object.defineProperties(OutputStream.prototype.dump_yield, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.get = function get() {\n            var self = this;\n            return self.OUTPUT;\n        };\n        if (!OutputStream.prototype.get.__module__) Object.defineProperties(OutputStream.prototype.get, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.assign = function assign(name) {\n            var self = this;\n            if (typeof name === \"string\") {\n                self.print(name);\n            } else {\n                name.print(self);\n            }\n            self.space();\n            self.print(\"=\");\n            self.space();\n        };\n        if (!OutputStream.prototype.assign.__argnames__) Object.defineProperties(OutputStream.prototype.assign, {\n            __argnames__ : {value: [\"name\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.current_width = function current_width() {\n            var self = this;\n            return self.current_col - self._indentation;\n        };\n        if (!OutputStream.prototype.current_width.__module__) Object.defineProperties(OutputStream.prototype.current_width, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.should_break = function should_break() {\n            var self = this;\n            return self.options.width && self.current_width() >= self.options.width;\n        };\n        if (!OutputStream.prototype.should_break.__module__) Object.defineProperties(OutputStream.prototype.should_break, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.last = function last() {\n            var self = this;\n            return self._last;\n        };\n        if (!OutputStream.prototype.last.__module__) Object.defineProperties(OutputStream.prototype.last, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.print_string = function print_string(str_) {\n            var self = this;\n            self.print(encode_string(str_));\n        };\n        if (!OutputStream.prototype.print_string.__argnames__) Object.defineProperties(OutputStream.prototype.print_string, {\n            __argnames__ : {value: [\"str_\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.line = function line() {\n            var self = this;\n            return self.current_line;\n        };\n        if (!OutputStream.prototype.line.__module__) Object.defineProperties(OutputStream.prototype.line, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.col = function col() {\n            var self = this;\n            return self.current_col;\n        };\n        if (!OutputStream.prototype.col.__module__) Object.defineProperties(OutputStream.prototype.col, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.pos = function pos() {\n            var self = this;\n            return self.current_pos;\n        };\n        if (!OutputStream.prototype.pos.__module__) Object.defineProperties(OutputStream.prototype.pos, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.push_node = function push_node(node) {\n            var self = this;\n            self._stack.push(node);\n        };\n        if (!OutputStream.prototype.push_node.__argnames__) Object.defineProperties(OutputStream.prototype.push_node, {\n            __argnames__ : {value: [\"node\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.pop_node = function pop_node() {\n            var self = this;\n            return self._stack.pop();\n        };\n        if (!OutputStream.prototype.pop_node.__module__) Object.defineProperties(OutputStream.prototype.pop_node, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.stack = function stack() {\n            var self = this;\n            return self._stack;\n        };\n        if (!OutputStream.prototype.stack.__module__) Object.defineProperties(OutputStream.prototype.stack, {\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.parent = function parent(n) {\n            var self = this;\n            return (ρσ_expr_temp = self._stack)[ρσ_bound_index(self._stack.length - 2 - (n || 0), ρσ_expr_temp)];\n        };\n        if (!OutputStream.prototype.parent.__argnames__) Object.defineProperties(OutputStream.prototype.parent, {\n            __argnames__ : {value: [\"n\"]},\n            __module__ : {value: \"output.stream\"}\n        });\n        OutputStream.prototype.__repr__ = function __repr__ () {\n                        return \"<\" + __name__ + \".\" + this.constructor.name + \" #\" + this.ρσ_object_id + \">\";\n        };\n        OutputStream.prototype.__str__ = function __str__ () {\n            return this.__repr__();\n        };\n        Object.defineProperty(OutputStream.prototype, \"__bases__\", {value: []});\n        OutputStream.prototype.toString = OutputStream.prototype.get;\n\n        ρσ_modules[\"output.stream\"].DANGEROUS = DANGEROUS;\n        ρσ_modules[\"output.stream\"].require_semi_colon_chars = require_semi_colon_chars;\n        ρσ_modules[\"output.stream\"].output_stream_defaults = output_stream_defaults;\n        ρσ_modules[\"output.stream\"].as_hex = as_hex;\n        ρσ_modules[\"output.stream\"].to_ascii = to_ascii;\n        ρσ_modules[\"output.stream\"].encode_string = encode_string;\n        ρσ_modules[\"output.stream\"].OutputStream = OutputStream;\n    })();\n\n    (function(){\n        var __name__ = \"output.statements\";\n        var AST_Definitions = ρσ_modules.ast.AST_Definitions;\n        var AST_Scope = ρσ_modules.ast.AST_Scope;\n        var AST_Method = ρσ_modules.ast.AST_Method;\n        var AST_Except = ρσ_modules.ast.AST_Except;\n        var AST_EmptyStatement = ρσ_modules.ast.AST_EmptyStatement;\n        var AST_Statement = ρσ_modules.ast.AST_Statement;\n        var AST_Seq = ρσ_modules.ast.AST_Seq;\n        var AST_BaseCall = ρσ_modules.ast.AST_BaseCall;\n        var AST_Dot = ρσ_modules.ast.AST_Dot;\n        var AST_Sub = ρσ_modules.ast.AST_Sub;\n        var AST_ItemAccess = ρσ_modules.ast.AST_ItemAccess;\n        var AST_Conditional = ρσ_modules.ast.AST_Conditional;\n        var AST_Binary = ρσ_modules.ast.AST_Binary;\n        var AST_BlockStatement = ρσ_modules.ast.AST_BlockStatement;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        function force_statement(stat, output) {\n            if (output.options.bracketize) {\n                if (!stat || is_node_type(stat, AST_EmptyStatement)) {\n                    output.print(\"{}\");\n                } else if (is_node_type(stat, AST_BlockStatement)) {\n                    stat.print(output);\n                } else {\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            output.indent();\n                            stat.print(output);\n                            output.newline();\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.statements\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                }\n            } else {\n                if (!stat || is_node_type(stat, AST_EmptyStatement)) {\n                    output.force_semicolon();\n                } else {\n                    stat.print(output);\n                }\n            }\n        };\n        if (!force_statement.__argnames__) Object.defineProperties(force_statement, {\n            __argnames__ : {value: [\"stat\", \"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function first_in_statement(output) {\n            var a, i, node, p;\n            a = output.stack();\n            i = a.length;\n            node = a[ρσ_bound_index(i -= 1, a)];\n            p = a[ρσ_bound_index(i -= 1, a)];\n            while (i > 0) {\n                if (is_node_type(p, AST_Statement) && p.body === node) {\n                    return true;\n                }\n                if (is_node_type(p, AST_Seq) && p.car === node || is_node_type(p, AST_BaseCall) && p.expression === node || is_node_type(p, AST_Dot) && p.expression === node || is_node_type(p, AST_Sub) && p.expression === node || is_node_type(p, AST_ItemAccess) && p.expression === node || is_node_type(p, AST_Conditional) && p.condition === node || is_node_type(p, AST_Binary) && p.left === node) {\n                    node = p;\n                    p = a[ρσ_bound_index(i -= 1, a)];\n                } else {\n                    return false;\n                }\n            }\n        };\n        if (!first_in_statement.__argnames__) Object.defineProperties(first_in_statement, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function declare_vars(vars, output) {\n            var ρσ_unpack, i, arg;\n            if (vars.length) {\n                output.indent();\n                output.print(\"var\");\n                output.space();\n                var ρσ_Iter75 = ρσ_Iterable(enumerate(vars));\n                for (var ρσ_Index75 = 0; ρσ_Index75 < ρσ_Iter75.length; ρσ_Index75++) {\n                    ρσ_unpack = ρσ_Iter75[ρσ_Index75];\n                    i = ρσ_unpack[0];\n                    arg = ρσ_unpack[1];\n                    if (i) {\n                        output.comma();\n                    }\n                    arg.print(output);\n                }\n                output.semicolon();\n                output.newline();\n            }\n        };\n        if (!declare_vars.__argnames__) Object.defineProperties(declare_vars, {\n            __argnames__ : {value: [\"vars\", \"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function display_body(body, is_toplevel, output) {\n            var last, ρσ_unpack, i, stmt;\n            last = body.length - 1;\n            var ρσ_Iter76 = ρσ_Iterable(enumerate(body));\n            for (var ρσ_Index76 = 0; ρσ_Index76 < ρσ_Iter76.length; ρσ_Index76++) {\n                ρσ_unpack = ρσ_Iter76[ρσ_Index76];\n                i = ρσ_unpack[0];\n                stmt = ρσ_unpack[1];\n                if (!(is_node_type(stmt, AST_EmptyStatement)) && !(is_node_type(stmt, AST_Definitions))) {\n                    output.indent();\n                    stmt.print(output);\n                    if (!((i === last && is_toplevel))) {\n                        output.newline();\n                    }\n                }\n            }\n        };\n        if (!display_body.__argnames__) Object.defineProperties(display_body, {\n            __argnames__ : {value: [\"body\", \"is_toplevel\", \"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function display_complex_body(node, is_toplevel, output, function_preamble) {\n            var offset;\n            offset = 0;\n            if (is_node_type(node, AST_Method) && !node.static) {\n                output.indent();\n                output.print(\"var\");\n                output.space();\n                output.assign(node.argnames[0]);\n                output.print(\"this\");\n                output.semicolon();\n                output.newline();\n                offset += 1;\n            }\n            if (is_node_type(node, AST_Scope)) {\n                function_preamble(node, output, offset);\n                declare_vars(node.localvars, output);\n            } else if (is_node_type(node, AST_Except)) {\n                if (node.argname) {\n                    output.indent();\n                    output.print(\"var\");\n                    output.space();\n                    output.assign(node.argname);\n                    output.print(\"ρσ_Exception\");\n                    output.semicolon();\n                    output.newline();\n                }\n            }\n            display_body(node.body, is_toplevel, output);\n        };\n        if (!display_complex_body.__argnames__) Object.defineProperties(display_complex_body, {\n            __argnames__ : {value: [\"node\", \"is_toplevel\", \"output\", \"function_preamble\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function print_bracketed(node, output, complex, function_preamble, before, after) {\n            if (node.body.length > 0) {\n                output.with_block((function() {\n                    var ρσ_anonfunc = function () {\n                        if (before) {\n                            before(output);\n                        }\n                        if (complex) {\n                            display_complex_body(node, false, output, function_preamble);\n                        } else {\n                            display_body(node.body, false, output);\n                        }\n                        if (after) {\n                            after(output);\n                        }\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.statements\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                if (before || after) {\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            if (before) {\n                                before(output);\n                            }\n                            if (after) {\n                                after(output);\n                            }\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.statements\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                } else {\n                    output.print(\"{}\");\n                }\n            }\n        };\n        if (!print_bracketed.__argnames__) Object.defineProperties(print_bracketed, {\n            __argnames__ : {value: [\"node\", \"output\", \"complex\", \"function_preamble\", \"before\", \"after\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function print_with(self, output) {\n            var exits, clause_name, clause;\n            exits = [];\n            [output.assign(\"ρσ_with_exception\"), output.print(\"undefined\"), output.end_statement()];\n            var ρσ_Iter77 = ρσ_Iterable(self.clauses);\n            for (var ρσ_Index77 = 0; ρσ_Index77 < ρσ_Iter77.length; ρσ_Index77++) {\n                clause = ρσ_Iter77[ρσ_Index77];\n                output.with_counter += 1;\n                clause_name = \"ρσ_with_clause_\" + output.with_counter;\n                exits.push(clause_name);\n                [output.indent(), output.print(\"var \"), output.assign(clause_name)];\n                clause.expression.print(output);\n                output.end_statement();\n                output.indent();\n                if (clause.alias) {\n                    output.assign(clause.alias.name);\n                }\n                output.print(clause_name + \".__enter__()\");\n                output.end_statement();\n            }\n            [output.indent(), output.print(\"try\"), output.space()];\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    output.indent();\n                    self._do_print_body(output);\n                    output.newline();\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.statements\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            [output.space(), output.print(\"catch(e)\")];\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    [output.indent(), output.assign(\"ρσ_with_exception\"), output.print(\"e\"), output.end_statement()];\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.statements\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            [output.newline(), output.indent(), output.spaced(\"if\", \"(ρσ_with_exception\", \"===\", \"undefined)\")];\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    var clause;\n                    var ρσ_Iter78 = ρσ_Iterable(exits);\n                    for (var ρσ_Index78 = 0; ρσ_Index78 < ρσ_Iter78.length; ρσ_Index78++) {\n                        clause = ρσ_Iter78[ρσ_Index78];\n                        [output.indent(), output.print(clause + \".__exit__()\"), output.end_statement()];\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.statements\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            [output.space(), output.print(\"else\"), output.space()];\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    var clause;\n                    [output.indent(), output.assign(\"ρσ_with_suppress\"), output.print(\"false\"), output.end_statement()];\n                    var ρσ_Iter79 = ρσ_Iterable(exits);\n                    for (var ρσ_Index79 = 0; ρσ_Index79 < ρσ_Iter79.length; ρσ_Index79++) {\n                        clause = ρσ_Iter79[ρσ_Index79];\n                        output.indent();\n                        output.spaced(\"ρσ_with_suppress\", \"|=\", \"ρσ_bool(\" + clause + \".__exit__(ρσ_with_exception.constructor,\", \"ρσ_with_exception,\", \"ρσ_with_exception.stack))\");\n                        output.end_statement();\n                    }\n                    [output.indent(), output.spaced(\"if\", \"(!ρσ_with_suppress)\", \"throw ρσ_with_exception\"), \n                    output.end_statement()];\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.statements\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!print_with.__argnames__) Object.defineProperties(print_with, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        function print_assert(self, output) {\n            if (output.options.discard_asserts) {\n                return;\n            }\n            [output.spaced(\"if\", \"(!(\"), self.condition.print(output), output.spaced(\"))\", \"throw new AssertionError\")];\n            if (self.message) {\n                output.print(\"(\");\n                self.message.print(output);\n                output.print(\")\");\n            }\n            output.end_statement();\n        };\n        if (!print_assert.__argnames__) Object.defineProperties(print_assert, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.statements\"}\n        });\n\n        ρσ_modules[\"output.statements\"].force_statement = force_statement;\n        ρσ_modules[\"output.statements\"].first_in_statement = first_in_statement;\n        ρσ_modules[\"output.statements\"].declare_vars = declare_vars;\n        ρσ_modules[\"output.statements\"].display_body = display_body;\n        ρσ_modules[\"output.statements\"].display_complex_body = display_complex_body;\n        ρσ_modules[\"output.statements\"].print_bracketed = print_bracketed;\n        ρσ_modules[\"output.statements\"].print_with = print_with;\n        ρσ_modules[\"output.statements\"].print_assert = print_assert;\n    })();\n\n    (function(){\n        var __name__ = \"output.exceptions\";\n        var print_bracketed = ρσ_modules[\"output.statements\"].print_bracketed;\n\n        function print_try(self, output) {\n            var else_var_name;\n            else_var_name = null;\n            function update_output_var(output) {\n                [output.indent(), output.assign(else_var_name), output.print(\"true\"), output.end_statement()];\n            };\n            if (!update_output_var.__argnames__) Object.defineProperties(update_output_var, {\n                __argnames__ : {value: [\"output\"]},\n                __module__ : {value: \"output.exceptions\"}\n            });\n\n            if (self.belse) {\n                else_var_name = output.new_try_else_counter();\n                [output.assign(\"var \" + else_var_name), output.print(\"false\"), output.end_statement(), \n                output.indent()];\n            }\n            output.print(\"try\");\n            output.space();\n            print_bracketed(self, output, false, null, null, (else_var_name) ? update_output_var : null);\n            if (self.bcatch) {\n                output.space();\n                print_catch(self.bcatch, output);\n            }\n            if (self.bfinally) {\n                output.space();\n                print_finally(self.bfinally, output, self.belse, else_var_name);\n            } else if (self.belse) {\n                output.newline();\n                print_else(self.belse, else_var_name, output);\n            }\n        };\n        if (!print_try.__argnames__) Object.defineProperties(print_try, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.exceptions\"}\n        });\n\n        function print_catch(self, output) {\n            output.print(\"catch\");\n            output.space();\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"ρσ_Exception\");\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.exceptions\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.space();\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    var no_default, ρσ_unpack, i, exception;\n                    output.indent();\n                    [output.spaced(\"ρσ_last_exception\", \"=\", \"ρσ_Exception\"), output.end_statement()];\n                    output.indent();\n                    no_default = true;\n                    var ρσ_Iter80 = ρσ_Iterable(enumerate(self.body));\n                    for (var ρσ_Index80 = 0; ρσ_Index80 < ρσ_Iter80.length; ρσ_Index80++) {\n                        ρσ_unpack = ρσ_Iter80[ρσ_Index80];\n                        i = ρσ_unpack[0];\n                        exception = ρσ_unpack[1];\n                        if (i) {\n                            output.print(\"else \");\n                        }\n                        if (exception.errors.length) {\n                            output.print(\"if\");\n                            output.space();\n                            output.with_parens((function() {\n                                var ρσ_anonfunc = function () {\n                                    var ρσ_unpack, i, err;\n                                    var ρσ_Iter81 = ρσ_Iterable(enumerate(exception.errors));\n                                    for (var ρσ_Index81 = 0; ρσ_Index81 < ρσ_Iter81.length; ρσ_Index81++) {\n                                        ρσ_unpack = ρσ_Iter81[ρσ_Index81];\n                                        i = ρσ_unpack[0];\n                                        err = ρσ_unpack[1];\n                                        if (i) {\n                                            output.newline();\n                                            output.indent();\n                                            output.print(\"||\");\n                                            output.space();\n                                        }\n                                        output.print(\"ρσ_Exception\");\n                                        output.space();\n                                        output.print(\"instanceof\");\n                                        output.space();\n                                        if (err.name === \"Exception\") {\n                                            output.print(\"Error\");\n                                        } else {\n                                            err.print(output);\n                                        }\n                                    }\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.exceptions\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            output.space();\n                        } else {\n                            no_default = false;\n                        }\n                        print_bracketed(exception, output, true);\n                        output.space();\n                    }\n                    if (no_default) {\n                        output.print(\"else\");\n                        output.space();\n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                output.indent();\n                                output.print(\"throw\");\n                                output.space();\n                                output.print(\"ρσ_Exception\");\n                                output.semicolon();\n                                output.newline();\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.exceptions\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    }\n                    output.newline();\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.exceptions\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!print_catch.__argnames__) Object.defineProperties(print_catch, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.exceptions\"}\n        });\n\n        function print_finally(self, output, belse, else_var_name) {\n            output.print(\"finally\");\n            output.space();\n            if (else_var_name) {\n                output.with_block((function() {\n                    var ρσ_anonfunc = function () {\n                        [output.indent(), output.print(\"try\")];\n                        output.space();\n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                print_else(belse, else_var_name, output);\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.exceptions\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                        print_finally(self, output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.exceptions\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                print_bracketed(self, output);\n            }\n        };\n        if (!print_finally.__argnames__) Object.defineProperties(print_finally, {\n            __argnames__ : {value: [\"self\", \"output\", \"belse\", \"else_var_name\"]},\n            __module__ : {value: \"output.exceptions\"}\n        });\n\n        function print_else(self, else_var_name, output) {\n            [output.indent(), output.spaced(\"if\", \"(\" + else_var_name + \")\")];\n            output.space();\n            print_bracketed(self, output);\n        };\n        if (!print_else.__argnames__) Object.defineProperties(print_else, {\n            __argnames__ : {value: [\"self\", \"else_var_name\", \"output\"]},\n            __module__ : {value: \"output.exceptions\"}\n        });\n\n        ρσ_modules[\"output.exceptions\"].print_try = print_try;\n        ρσ_modules[\"output.exceptions\"].print_catch = print_catch;\n        ρσ_modules[\"output.exceptions\"].print_finally = print_finally;\n        ρσ_modules[\"output.exceptions\"].print_else = print_else;\n    })();\n\n    (function(){\n        var __name__ = \"output.utils\";\n        var AST_BlockStatement = ρσ_modules.ast.AST_BlockStatement;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        function best_of(a) {\n            var best, len_, i;\n            best = a[0];\n            len_ = best.length;\n            for (var ρσ_Index82 = 1; ρσ_Index82 < a.length; ρσ_Index82++) {\n                i = ρσ_Index82;\n                if (a[(typeof i === \"number\" && i < 0) ? a.length + i : i].length < len_) {\n                    best = a[(typeof i === \"number\" && i < 0) ? a.length + i : i];\n                    len_ = best.length;\n                }\n            }\n            return best;\n        };\n        if (!best_of.__argnames__) Object.defineProperties(best_of, {\n            __argnames__ : {value: [\"a\"]},\n            __module__ : {value: \"output.utils\"}\n        });\n\n        function make_num(num) {\n            var str_, a, m;\n            str_ = num.toString(10);\n            a = ρσ_list_decorate([ str_.replace(/^0\\./, \".\").replace(\"e+\", \"e\") ]);\n            m = null;\n            if (Math.floor(num) === num) {\n                if (num >= 0) {\n                    a.push(\"0x\" + num.toString(16).toLowerCase(), \"0\" + num.toString(8));\n                } else {\n                    a.push(\"-0x\" + (-(num)).toString(16).toLowerCase(), \"-0\" + (-(num)).toString(8));\n                }\n                if (m = /^(.*?)(0+)$/.exec(num)) {\n                    a.push(m[1] + \"e\" + m[2].length);\n                }\n            } else if (m = /^0?\\.(0+)(.*)$/.exec(num)) {\n                a.push(m[2] + \"e-\" + (m[1].length + m[2].length), str_.substr(str_.indexOf(\".\")));\n            }\n            return best_of(a);\n        };\n        if (!make_num.__argnames__) Object.defineProperties(make_num, {\n            __argnames__ : {value: [\"num\"]},\n            __module__ : {value: \"output.utils\"}\n        });\n\n        function make_block(stmt, output) {\n            if (is_node_type(stmt, AST_BlockStatement)) {\n                stmt.print(output);\n                return;\n            }\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    output.indent();\n                    stmt.print(output);\n                    output.newline();\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.utils\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!make_block.__argnames__) Object.defineProperties(make_block, {\n            __argnames__ : {value: [\"stmt\", \"output\"]},\n            __module__ : {value: \"output.utils\"}\n        });\n\n        function create_doctring(docstrings) {\n            var ans, ds, lines, min_leading_whitespace, r, leading_whitespace, line, lw, ρσ_unpack, l;\n            ans = [];\n            var ρσ_Iter83 = ρσ_Iterable(docstrings);\n            for (var ρσ_Index83 = 0; ρσ_Index83 < ρσ_Iter83.length; ρσ_Index83++) {\n                ds = ρσ_Iter83[ρσ_Index83];\n                ds = str.rstrip(ds.value);\n                lines = [];\n                min_leading_whitespace = \"\";\n                var ρσ_Iter84 = ρσ_Iterable(ds.split(/$/gm));\n                for (var ρσ_Index84 = 0; ρσ_Index84 < ρσ_Iter84.length; ρσ_Index84++) {\n                    line = ρσ_Iter84[ρσ_Index84];\n                    r = /^\\s+/.exec(line);\n                    leading_whitespace = \"\";\n                    if (r) {\n                        leading_whitespace = (r) ? r[0].replace(/[\\n\\r]/g, \"\") : \"\";\n                        line = line.slice(r[0].length);\n                    }\n                    if (!str.strip(line)) {\n                        lines.push([\"\", \"\"]);\n                    } else {\n                        leading_whitespace = leading_whitespace.replace(/\\t/g, \"    \");\n                        if (leading_whitespace && (!min_leading_whitespace || leading_whitespace.length < min_leading_whitespace.length)) {\n                            min_leading_whitespace = leading_whitespace;\n                        }\n                        lines.push([leading_whitespace, line]);\n                    }\n                }\n                var ρσ_Iter85 = ρσ_Iterable(lines);\n                for (var ρσ_Index85 = 0; ρσ_Index85 < ρσ_Iter85.length; ρσ_Index85++) {\n                    ρσ_unpack = ρσ_Iter85[ρσ_Index85];\n                    lw = ρσ_unpack[0];\n                    l = ρσ_unpack[1];\n                    if (min_leading_whitespace) {\n                        lw = lw.slice(min_leading_whitespace.length);\n                    }\n                    ans.push(lw + l);\n                }\n                ans.push(\"\");\n            }\n            return str.rstrip(ans.join(\"\\n\"));\n        };\n        if (!create_doctring.__argnames__) Object.defineProperties(create_doctring, {\n            __argnames__ : {value: [\"docstrings\"]},\n            __module__ : {value: \"output.utils\"}\n        });\n\n        ρσ_modules[\"output.utils\"].best_of = best_of;\n        ρσ_modules[\"output.utils\"].make_num = make_num;\n        ρσ_modules[\"output.utils\"].make_block = make_block;\n        ρσ_modules[\"output.utils\"].create_doctring = create_doctring;\n    })();\n\n    (function(){\n        var __name__ = \"output.loops\";\n        var AST_BaseCall = ρσ_modules.ast.AST_BaseCall;\n        var AST_SymbolRef = ρσ_modules.ast.AST_SymbolRef;\n        var AST_Array = ρσ_modules.ast.AST_Array;\n        var AST_Unary = ρσ_modules.ast.AST_Unary;\n        var AST_Number = ρσ_modules.ast.AST_Number;\n        var has_calls = ρσ_modules.ast.has_calls;\n        var AST_Seq = ρσ_modules.ast.AST_Seq;\n        var AST_ListComprehension = ρσ_modules.ast.AST_ListComprehension;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        var OutputStream = ρσ_modules[\"output.stream\"].OutputStream;\n\n        function unpack_tuple(elems, output, in_statement) {\n            var ρσ_unpack, i, elem;\n            var ρσ_Iter86 = ρσ_Iterable(enumerate(elems));\n            for (var ρσ_Index86 = 0; ρσ_Index86 < ρσ_Iter86.length; ρσ_Index86++) {\n                ρσ_unpack = ρσ_Iter86[ρσ_Index86];\n                i = ρσ_unpack[0];\n                elem = ρσ_unpack[1];\n                output.indent();\n                output.assign(elem);\n                output.print(\"ρσ_unpack\");\n                output.with_square((function() {\n                    var ρσ_anonfunc = function () {\n                        output.print(i);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.loops\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                if (!in_statement || i < elems.length - 1) {\n                    output.semicolon();\n                    output.newline();\n                }\n            }\n        };\n        if (!unpack_tuple.__argnames__) Object.defineProperties(unpack_tuple, {\n            __argnames__ : {value: [\"elems\", \"output\", \"in_statement\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function print_do_loop(self, output) {\n            output.print(\"do\");\n            output.space();\n            self._do_print_body(output);\n            output.space();\n            output.print(\"while\");\n            output.space();\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    self.condition.print(output);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.loops\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.semicolon();\n        };\n        if (!print_do_loop.__argnames__) Object.defineProperties(print_do_loop, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function print_while_loop(self, output) {\n            output.print(\"while\");\n            output.space();\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    self.condition.print(output);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.loops\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.space();\n            self._do_print_body(output);\n        };\n        if (!print_while_loop.__argnames__) Object.defineProperties(print_while_loop, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function is_simple_for_in(self) {\n            if (is_node_type(self.object, AST_BaseCall) && is_node_type(self.object.expression, AST_SymbolRef) && self.object.expression.name === \"dir\" && self.object.args.length === 1) {\n                return true;\n            }\n            return false;\n        };\n        if (!is_simple_for_in.__argnames__) Object.defineProperties(is_simple_for_in, {\n            __argnames__ : {value: [\"self\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function is_simple_for(self) {\n            var a, l;\n            if (is_node_type(self.object, AST_BaseCall) && is_node_type(self.object.expression, AST_SymbolRef) && self.object.expression.name === \"range\" && !(is_node_type(self.init, AST_Array))) {\n                a = self.object.args;\n                l = a.length;\n                if (l < 3 || is_node_type(a[2], AST_Number) || is_node_type(a[2], AST_Unary) && a[2].operator === \"-\" && is_node_type(a[2].expression, AST_Number)) {\n                    if (l === 1 && !has_calls(a[0]) || l > 1 && !has_calls(a[1])) {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        };\n        if (!is_simple_for.__argnames__) Object.defineProperties(is_simple_for, {\n            __argnames__ : {value: [\"self\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function print_for_loop_body(output) {\n            var self;\n            self = this;\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    var itervar, flat, stmt;\n                    if (!((self.simple_for_index || is_simple_for_in(self)))) {\n                        output.indent();\n                        if (output.options.js_version === 5) {\n                            itervar = \"ρσ_Iter\" + output.index_counter + \"[ρσ_Index\" + output.index_counter + \"]\";\n                        } else {\n                            itervar = \"ρσ_Index\" + output.index_counter;\n                        }\n                        if (is_node_type(self.init, AST_Array)) {\n                            flat = self.init.flatten();\n                            output.assign(\"ρσ_unpack\");\n                            if (flat.length > self.init.elements.length) {\n                                output.print(\"ρσ_flatten(\" + itervar + \")\");\n                            } else {\n                                output.print(itervar);\n                            }\n                            output.end_statement();\n                            unpack_tuple(flat, output);\n                        } else {\n                            output.assign(self.init);\n                            output.print(itervar);\n                            output.end_statement();\n                        }\n                        output.index_counter += 1;\n                    }\n                    if (self.simple_for_index) {\n                        output.indent();\n                        output.assign(self.init);\n                        output.print(self.simple_for_index);\n                        output.end_statement();\n                    }\n                    var ρσ_Iter87 = ρσ_Iterable(self.body.body);\n                    for (var ρσ_Index87 = 0; ρσ_Index87 < ρσ_Iter87.length; ρσ_Index87++) {\n                        stmt = ρσ_Iter87[ρσ_Index87];\n                        output.indent();\n                        stmt.print(output);\n                        output.newline();\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.loops\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!print_for_loop_body.__argnames__) Object.defineProperties(print_for_loop_body, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function init_es6_itervar(output, itervar) {\n            output.indent();\n            output.spaced(itervar, \"=\", \"((typeof\", itervar + \"[Symbol.iterator]\", \"===\", \"\\\"function\\\")\", \"?\", \"(\" + itervar, \"instanceof\", \"Map\", \"?\", itervar + \".keys()\", \":\", itervar + \")\", \":\", \"Object.keys(\" + itervar + \"))\");\n            output.end_statement();\n        };\n        if (!init_es6_itervar.__argnames__) Object.defineProperties(init_es6_itervar, {\n            __argnames__ : {value: [\"output\", \"itervar\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function print_for_in(self, output) {\n            var increment, args, tmp_, start, end, idx, itervar;\n            function write_object() {\n                if (self.object.constructor === AST_Seq) {\n                    new AST_Array((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"elements\"] = self.object.to_array();\n                        return ρσ_d;\n                    }).call(this)).print(output);\n                } else {\n                    self.object.print(output);\n                }\n            };\n            if (!write_object.__module__) Object.defineProperties(write_object, {\n                __module__ : {value: \"output.loops\"}\n            });\n\n            if (is_simple_for(self)) {\n                increment = null;\n                args = self.object.args;\n                tmp_ = args.length;\n                if (tmp_ === 1) {\n                    start = 0;\n                    end = args[0];\n                } else if (tmp_ === 2) {\n                    start = args[0];\n                    end = args[1];\n                } else if (tmp_ === 3) {\n                    start = args[0];\n                    end = args[1];\n                    increment = args[2];\n                }\n                self.simple_for_index = idx = \"ρσ_Index\" + output.index_counter;\n                output.index_counter += 1;\n                output.print(\"for\");\n                output.space();\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        [output.spaced(\"var\", idx, \"=\"), output.space()];\n                        (start.print) ? start.print(output) : output.print(start);\n                        output.semicolon();\n                        output.space();\n                        output.print(idx);\n                        output.space();\n                        (is_node_type(increment, AST_Unary)) ? output.print(\">\") : output.print(\"<\");\n                        output.space();\n                        end.print(output);\n                        output.semicolon();\n                        output.space();\n                        output.print(idx);\n                        if (increment && (!(is_node_type(increment, AST_Unary)) || increment.expression.value !== \"1\")) {\n                            if (is_node_type(increment, AST_Unary)) {\n                                output.print(\"-=\");\n                                increment.expression.print(output);\n                            } else {\n                                output.print(\"+=\");\n                                increment.print(output);\n                            }\n                        } else {\n                            if (is_node_type(increment, AST_Unary)) {\n                                output.print(\"--\");\n                            } else {\n                                output.print(\"++\");\n                            }\n                        }\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.loops\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else if (is_simple_for_in(self)) {\n                output.print(\"for\");\n                output.space();\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.init.print(output);\n                        output.space();\n                        output.print(\"in\");\n                        output.space();\n                        self.object.args[0].print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.loops\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                if (output.options.js_version === 5) {\n                    output.assign(\"var ρσ_Iter\" + output.index_counter);\n                    output.print(\"ρσ_Iterable\");\n                    output.with_parens(write_object);\n                    output.semicolon();\n                    output.newline();\n                    output.indent();\n                    output.print(\"for\");\n                    output.space();\n                    output.with_parens((function() {\n                        var ρσ_anonfunc = function () {\n                            output.print(\"var\");\n                            output.space();\n                            output.assign(\"ρσ_Index\" + output.index_counter);\n                            output.print(\"0\");\n                            output.semicolon();\n                            output.space();\n                            output.print(\"ρσ_Index\" + output.index_counter);\n                            output.space();\n                            output.print(\"<\");\n                            output.space();\n                            output.print(\"ρσ_Iter\" + output.index_counter + \".length\");\n                            output.semicolon();\n                            output.space();\n                            output.print(\"ρσ_Index\" + output.index_counter + \"++\");\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.loops\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                } else {\n                    itervar = \"ρσ_Iter\" + output.index_counter;\n                    output.assign(\"var \" + itervar);\n                    write_object();\n                    output.end_statement();\n                    init_es6_itervar(output, itervar);\n                    output.indent();\n                    output.spaced(\"for\", \"(var\", \"ρσ_Index\" + output.index_counter, \"of\", itervar + \")\");\n                }\n            }\n            output.space();\n            self._do_print_body(output);\n        };\n        if (!print_for_in.__argnames__) Object.defineProperties(print_for_in, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        function print_list_comprehension(self, output) {\n            var tname, result_obj, is_generator, es5, add_to_result, push_func;\n            tname = self.constructor.name.slice(4);\n            result_obj = (ρσ_expr_temp = (function(){\n                var ρσ_d = Object.create(null);\n                ρσ_d[\"ListComprehension\"] = \"[]\";\n                ρσ_d[\"DictComprehension\"] = (self.is_jshash) ? \"Object.create(null)\" : \"{}\";\n                ρσ_d[\"SetComprehension\"] = \"ρσ_set()\";\n                return ρσ_d;\n            }).call(this))[(typeof tname === \"number\" && tname < 0) ? ρσ_expr_temp.length + tname : tname];\n            is_generator = tname === \"GeneratorComprehension\";\n            es5 = output.options.js_version === 5;\n            if (tname === \"DictComprehension\") {\n                if (self.is_pydict) {\n                    result_obj = \"ρσ_dict()\";\n                    add_to_result = (function() {\n                        var ρσ_anonfunc = function (output) {\n                            output.indent();\n                            output.print(\"ρσ_Result.set\");\n                            output.with_parens((function() {\n                                var ρσ_anonfunc = function () {\n                                    self.statement.print(output);\n                                    [output.space(), output.print(\",\"), output.space()];\n                                    output.with_parens((function() {\n                                        var ρσ_anonfunc = function () {\n                                            if (self.value_statement.constructor === AST_Seq) {\n                                                output.with_square((function() {\n                                                    var ρσ_anonfunc = function () {\n                                                        self.value_statement.print(output);\n                                                    };\n                                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                        __module__ : {value: \"output.loops\"}\n                                                    });\n                                                    return ρσ_anonfunc;\n                                                })());\n                                            } else {\n                                                self.value_statement.print(output);\n                                            }\n                                        };\n                                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                            __module__ : {value: \"output.loops\"}\n                                        });\n                                        return ρσ_anonfunc;\n                                    })());\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.loops\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            output.end_statement();\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"output\"]},\n                            __module__ : {value: \"output.loops\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                } else {\n                    add_to_result = (function() {\n                        var ρσ_anonfunc = function (output) {\n                            output.indent();\n                            output.print(\"ρσ_Result\");\n                            output.with_square((function() {\n                                var ρσ_anonfunc = function () {\n                                    self.statement.print(output);\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.loops\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            [output.space(), output.print(\"=\"), output.space()];\n                            output.with_parens((function() {\n                                var ρσ_anonfunc = function () {\n                                    if (self.value_statement.constructor === AST_Seq) {\n                                        output.with_square((function() {\n                                            var ρσ_anonfunc = function () {\n                                                self.value_statement.print(output);\n                                            };\n                                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                __module__ : {value: \"output.loops\"}\n                                            });\n                                            return ρσ_anonfunc;\n                                        })());\n                                    } else {\n                                        self.value_statement.print(output);\n                                    }\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.loops\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            output.end_statement();\n                        };\n                        if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                            __argnames__ : {value: [\"output\"]},\n                            __module__ : {value: \"output.loops\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                }\n            } else {\n                push_func = \"ρσ_Result.\" + ((self.constructor === AST_ListComprehension) ? \"push\" : \"add\");\n                if (is_generator) {\n                    push_func = \"yield \";\n                }\n                add_to_result = (function() {\n                    var ρσ_anonfunc = function (output) {\n                        output.indent();\n                        output.print(push_func);\n                        output.with_parens((function() {\n                            var ρσ_anonfunc = function () {\n                                if (self.statement.constructor === AST_Seq) {\n                                    output.with_square((function() {\n                                        var ρσ_anonfunc = function () {\n                                            self.statement.print(output);\n                                        };\n                                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                            __module__ : {value: \"output.loops\"}\n                                        });\n                                        return ρσ_anonfunc;\n                                    })());\n                                } else {\n                                    self.statement.print(output);\n                                }\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.loops\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                        output.end_statement();\n                    };\n                    if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                        __argnames__ : {value: [\"output\"]},\n                        __module__ : {value: \"output.loops\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"function\");\n                    output.print(\"()\");\n                    output.space();\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            var body_out, previous_indentation, i, transpiled, ci;\n                            body_out = output;\n                            if (is_generator) {\n                                if (es5) {\n                                    body_out = new OutputStream((function(){\n                                        var ρσ_d = Object.create(null);\n                                        ρσ_d[\"beautify\"] = true;\n                                        return ρσ_d;\n                                    }).call(this));\n                                }\n                                body_out.indent();\n                                [body_out.print(\"function* js_generator()\"), body_out.space(), body_out.print(\"{\")];\n                                body_out.newline();\n                                previous_indentation = output.indentation();\n                                output.set_indentation(output.next_indent());\n                            }\n                            body_out.indent();\n                            body_out.assign(\"var ρσ_Iter\");\n                            if (es5) {\n                                body_out.print(\"ρσ_Iterable\");\n                                body_out.with_parens((function() {\n                                    var ρσ_anonfunc = function () {\n                                        self.object.print(body_out);\n                                    };\n                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                        __module__ : {value: \"output.loops\"}\n                                    });\n                                    return ρσ_anonfunc;\n                                })());\n                            } else {\n                                self.object.print(body_out);\n                            }\n                            if (result_obj) {\n                                body_out.comma();\n                                body_out.assign(\"ρσ_Result\");\n                                body_out.print(result_obj);\n                            }\n                            if (is_node_type(self.init, AST_Array)) {\n                                var ρσ_Iter88 = ρσ_Iterable(self.init.elements);\n                                for (var ρσ_Index88 = 0; ρσ_Index88 < ρσ_Iter88.length; ρσ_Index88++) {\n                                    i = ρσ_Iter88[ρσ_Index88];\n                                    body_out.comma();\n                                    i.print(body_out);\n                                }\n                            } else {\n                                body_out.comma();\n                                self.init.print(body_out);\n                            }\n                            body_out.end_statement();\n                            if (!es5) {\n                                init_es6_itervar(body_out, \"ρσ_Iter\");\n                            }\n                            body_out.indent();\n                            body_out.print(\"for\");\n                            body_out.space();\n                            body_out.with_parens((function() {\n                                var ρσ_anonfunc = function () {\n                                    if (es5) {\n                                        body_out.print(\"var\");\n                                        body_out.space();\n                                        body_out.assign(\"ρσ_Index\");\n                                        body_out.print(\"0\");\n                                        body_out.semicolon();\n                                        body_out.space();\n                                        body_out.print(\"ρσ_Index\");\n                                        body_out.space();\n                                        body_out.print(\"<\");\n                                        body_out.space();\n                                        body_out.print(\"ρσ_Iter.length\");\n                                        body_out.semicolon();\n                                        body_out.space();\n                                        body_out.print(\"ρσ_Index++\");\n                                    } else {\n                                        body_out.spaced(\"var\", \"ρσ_Index\", \"of\", \"ρσ_Iter\");\n                                    }\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.loops\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            body_out.space();\n                            body_out.with_block((function() {\n                                var ρσ_anonfunc = function () {\n                                    var itervar, flat;\n                                    body_out.indent();\n                                    itervar = (es5) ? \"ρσ_Iter[ρσ_Index]\" : \"ρσ_Index\";\n                                    if (is_node_type(self.init, AST_Array)) {\n                                        flat = self.init.flatten();\n                                        body_out.assign(\"ρσ_unpack\");\n                                        if (flat.length > self.init.elements.length) {\n                                            body_out.print(\"ρσ_flatten(\" + itervar + \")\");\n                                        } else {\n                                            body_out.print(itervar);\n                                        }\n                                        body_out.end_statement();\n                                        unpack_tuple(flat, body_out);\n                                    } else {\n                                        body_out.assign(self.init);\n                                        body_out.print(itervar);\n                                        body_out.end_statement();\n                                    }\n                                    if (self.condition) {\n                                        body_out.indent();\n                                        body_out.print(\"if\");\n                                        body_out.space();\n                                        body_out.with_parens((function() {\n                                            var ρσ_anonfunc = function () {\n                                                self.condition.print(body_out);\n                                            };\n                                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                __module__ : {value: \"output.loops\"}\n                                            });\n                                            return ρσ_anonfunc;\n                                        })());\n                                        body_out.space();\n                                        body_out.with_block((function() {\n                                            var ρσ_anonfunc = function () {\n                                                add_to_result(body_out);\n                                            };\n                                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                __module__ : {value: \"output.loops\"}\n                                            });\n                                            return ρσ_anonfunc;\n                                        })());\n                                        body_out.newline();\n                                    } else {\n                                        add_to_result(body_out);\n                                    }\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.loops\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            body_out.newline();\n                            if (self.constructor === AST_ListComprehension) {\n                                body_out.indent();\n                                body_out.spaced(\"ρσ_Result\", \"=\", \"ρσ_list_constructor(ρσ_Result)\");\n                                body_out.end_statement();\n                            }\n                            if (!is_generator) {\n                                body_out.indent();\n                                body_out.print(\"return ρσ_Result\");\n                                body_out.end_statement();\n                            }\n                            if (is_generator) {\n                                output.set_indentation(previous_indentation);\n                                [body_out.newline(), body_out.indent(), body_out.print(\"}\")];\n                                if (es5) {\n                                    transpiled = regenerate(body_out.get(), output.options.beautify).replace(/regeneratorRuntime.(wrap|mark)/g, \"ρσ_regenerator.regeneratorRuntime.$1\");\n                                    if (output.options.beautify) {\n                                        ci = output.make_indent(0);\n                                        transpiled = (function() {\n                                            var ρσ_Iter = ρσ_Iterable(transpiled.split(\"\\n\")), ρσ_Result = [], x;\n                                            for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                                                x = ρσ_Iter[ρσ_Index];\n                                                ρσ_Result.push(ci + x);\n                                            }\n                                            ρσ_Result = ρσ_list_constructor(ρσ_Result);\n                                            return ρσ_Result;\n                                        })().join(\"\\n\");\n                                    }\n                                    output.print(transpiled);\n                                }\n                                [output.newline(), output.indent()];\n                                output.spaced(\"var\", \"result\", \"=\", \"js_generator.call(this)\");\n                                output.end_statement();\n                                output.indent();\n                                output.spaced(\"result.send\", \"=\", \"result.next\");\n                                output.end_statement();\n                                output.indent();\n                                output.spaced(\"return\", \"result\");\n                                output.end_statement();\n                            }\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.loops\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.loops\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.print(\"()\");\n        };\n        if (!print_list_comprehension.__argnames__) Object.defineProperties(print_list_comprehension, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.loops\"}\n        });\n\n        ρσ_modules[\"output.loops\"].unpack_tuple = unpack_tuple;\n        ρσ_modules[\"output.loops\"].print_do_loop = print_do_loop;\n        ρσ_modules[\"output.loops\"].print_while_loop = print_while_loop;\n        ρσ_modules[\"output.loops\"].is_simple_for_in = is_simple_for_in;\n        ρσ_modules[\"output.loops\"].is_simple_for = is_simple_for;\n        ρσ_modules[\"output.loops\"].print_for_loop_body = print_for_loop_body;\n        ρσ_modules[\"output.loops\"].init_es6_itervar = init_es6_itervar;\n        ρσ_modules[\"output.loops\"].print_for_in = print_for_in;\n        ρσ_modules[\"output.loops\"].print_list_comprehension = print_list_comprehension;\n    })();\n\n    (function(){\n        var __name__ = \"output.operators\";\n        var comparators, function_ops, after_map;\n        var AST_Array = ρσ_modules.ast.AST_Array;\n        var AST_Assign = ρσ_modules.ast.AST_Assign;\n        var AST_BaseCall = ρσ_modules.ast.AST_BaseCall;\n        var AST_Binary = ρσ_modules.ast.AST_Binary;\n        var AST_Conditional = ρσ_modules.ast.AST_Conditional;\n        var AST_ItemAccess = ρσ_modules.ast.AST_ItemAccess;\n        var AST_Number = ρσ_modules.ast.AST_Number;\n        var AST_Object = ρσ_modules.ast.AST_Object;\n        var AST_Return = ρσ_modules.ast.AST_Return;\n        var AST_Seq = ρσ_modules.ast.AST_Seq;\n        var AST_Set = ρσ_modules.ast.AST_Set;\n        var AST_SimpleStatement = ρσ_modules.ast.AST_SimpleStatement;\n        var AST_Statement = ρσ_modules.ast.AST_Statement;\n        var AST_String = ρσ_modules.ast.AST_String;\n        var AST_Sub = ρσ_modules.ast.AST_Sub;\n        var AST_Symbol = ρσ_modules.ast.AST_Symbol;\n        var AST_SymbolRef = ρσ_modules.ast.AST_SymbolRef;\n        var AST_Unary = ρσ_modules.ast.AST_Unary;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        var unpack_tuple = ρσ_modules[\"output.loops\"].unpack_tuple;\n\n        function print_getattr(self, output, skip_expression) {\n            var expr;\n            if (!skip_expression) {\n                expr = self.expression;\n                expr.print(output);\n            }\n            if (is_node_type(expr, AST_Number) && expr.value >= 0) {\n                if (!/[xa-f.]/i.test(output.last())) {\n                    output.print(\".\");\n                }\n            }\n            output.print(\".\");\n            output.print_name(self.property);\n        };\n        if (!print_getattr.__argnames__) Object.defineProperties(print_getattr, {\n            __argnames__ : {value: [\"self\", \"output\", \"skip_expression\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_getitem(self, output) {\n            var expr, prop, is_negative_number, is_repeatable;\n            expr = self.expression;\n            prop = self.property;\n            if (is_node_type(prop, AST_Number) || is_node_type(prop, AST_String) || is_node_type(prop, AST_SymbolRef) && prop.name && prop.name.startsWith(\"ρσ_\")) {\n                expr.print(output);\n                [output.print(\"[\"), prop.print(output), output.print(\"]\")];\n                return;\n            }\n            is_negative_number = is_node_type(prop, AST_Unary) && prop.operator === \"-\" && is_node_type(prop.expression, AST_Number);\n            is_repeatable = is_node_type(expr, AST_SymbolRef);\n            if (is_repeatable) {\n                expr.print(output);\n            } else {\n                [output.spaced(\"(ρσ_expr_temp\", \"=\", expr), output.print(\")\")];\n                expr = (function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"print\"] = (function() {\n                        var ρσ_anonfunc = function () {\n                            output.print(\"ρσ_expr_temp\");\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.operators\"}\n                        });\n                        return ρσ_anonfunc;\n                    })();\n                    return ρσ_d;\n                }).call(this);\n            }\n            if (is_negative_number) {\n                [output.print(\"[\"), expr.print(output), output.print(\".length\"), prop.print(output), \n                output.print(\"]\")];\n                return;\n            }\n            is_repeatable = is_node_type(prop, AST_SymbolRef);\n            if (is_repeatable) {\n                output.spaced(\"[(typeof\", prop, \"===\", \"\\\"number\\\"\", \"&&\", prop);\n                [output.spaced(\"\", \"<\", \"0)\", \"?\", expr), output.spaced(\".length\", \"+\", prop, \":\", prop)];\n                output.print(\"]\");\n            } else {\n                [output.print(\"[ρσ_bound_index(\"), prop.print(output), output.comma(), expr.print(output), \n                output.print(\")]\")];\n            }\n        };\n        if (!print_getitem.__argnames__) Object.defineProperties(print_getitem, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_rich_getitem(self, output) {\n            var func, asg, as_op;\n            func = \"ρσ_\" + ((self.assignment) ? \"setitem\" : \"getitem\");\n            output.print(func + \"(\");\n            [self.expression.print(output), output.comma(), self.property.print(output)];\n            if (self.assignment) {\n                output.comma();\n                asg = self.assignment;\n                as_op = self.assign_operator;\n                if (as_op.length > 0) {\n                    self.assignment = null;\n                    print_rich_getitem(self, output);\n                    self.assignment = asg;\n                    output.space();\n                    output.print(as_op);\n                    output.space();\n                }\n                self.assignment.print(output);\n            }\n            output.print(\")\");\n        };\n        if (!print_rich_getitem.__argnames__) Object.defineProperties(print_rich_getitem, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_splice_assignment(self, output) {\n            output.print(\"ρσ_splice(\");\n            [self.expression.print(output), output.comma(), self.assignment.print(output), output.comma()];\n            (self.property) ? self.property.print(output) : output.print(\"0\");\n            if (self.property2) {\n                output.comma();\n                self.property2.print(output);\n            }\n            output.print(\")\");\n        };\n        if (!print_splice_assignment.__argnames__) Object.defineProperties(print_splice_assignment, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_delete(self, output) {\n            if (is_node_type(self, AST_Symbol)) {\n                [output.assign(self), output.print(\"undefined\")];\n            } else if (is_node_type(self, AST_Sub) || is_node_type(self, AST_ItemAccess)) {\n                [output.print(\"ρσ_delitem(\"), self.expression.print(output), output.comma(), self.property.print(output), \n                output.print(\")\")];\n            } else {\n                output.spaced(\"delete\", self);\n            }\n        };\n        if (!print_delete.__argnames__) Object.defineProperties(print_delete, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_unary_prefix(self, output) {\n            var op;\n            op = self.operator;\n            if (op === \"delete\") {\n                return print_delete(self.expression, output);\n            }\n            output.print(op);\n            if (/^[a-z]/i.test(op)) {\n                output.space();\n            }\n            if (self.parenthesized) {\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.expression.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.operators\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                self.expression.print(output);\n            }\n        };\n        if (!print_unary_prefix.__argnames__) Object.defineProperties(print_unary_prefix, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function write_instanceof(left, right, output) {\n            function do_many(vals) {\n                [output.print(\"ρσ_instanceof.apply(null,\"), output.space()];\n                [output.print(\"[\"), left.print(output), output.comma()];\n                for (var i = 0; i < vals.length; i++) {\n                    vals[(typeof i === \"number\" && i < 0) ? vals.length + i : i].print(output);\n                    if (i !== vals.length - 1) {\n                        output.comma();\n                    }\n                }\n                output.print(\"])\");\n            };\n            if (!do_many.__argnames__) Object.defineProperties(do_many, {\n                __argnames__ : {value: [\"vals\"]},\n                __module__ : {value: \"output.operators\"}\n            });\n\n            if (is_node_type(right, AST_Seq)) {\n                do_many(right.to_array());\n            } else if (is_node_type(right, AST_Array)) {\n                do_many(right.elements);\n            } else {\n                output.print(\"ρσ_instanceof(\");\n                [left.print(output), output.comma(), right.print(output), output.print(\")\")];\n            }\n        };\n        if (!write_instanceof.__argnames__) Object.defineProperties(write_instanceof, {\n            __argnames__ : {value: [\"left\", \"right\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function write_smart_equality(self, output) {\n            function is_ok(x) {\n                return !((is_node_type(x, AST_Array) || is_node_type(x, AST_Set) || is_node_type(x, AST_Object) || is_node_type(x, AST_Statement) || is_node_type(x, AST_Binary) || is_node_type(x, AST_Conditional) || is_node_type(x, AST_BaseCall)));\n            };\n            if (!is_ok.__argnames__) Object.defineProperties(is_ok, {\n                __argnames__ : {value: [\"x\"]},\n                __module__ : {value: \"output.operators\"}\n            });\n\n            if (is_ok(self.left) && is_ok(self.right)) {\n                if (self.operator === \"==\") {\n                    output.print(\"(\");\n                    output.spaced(self.left, \"===\", self.right, \"||\", \"typeof\", self.left, \"===\", \"\\\"object\\\"\", \"&&\", \"ρσ_equals(\");\n                    [self.left.print(output), output.print(\",\"), output.space(), self.right.print(output), \n                    output.print(\"))\")];\n                } else {\n                    output.print(\"(\");\n                    output.spaced(self.left, \"!==\", self.right, \"&&\", \"(typeof\", self.left, \"!==\", \"\\\"object\\\"\", \"||\", \"ρσ_not_equals(\");\n                    [self.left.print(output), output.print(\",\"), output.space(), self.right.print(output), \n                    output.print(\")))\")];\n                }\n            } else {\n                output.print(\"ρσ_\" + ((self.operator === \"==\") ? \"equals(\" : \"not_equals(\"));\n                [self.left.print(output), output.print(\",\"), output.space(), self.right.print(output), \n                output.print(\")\")];\n            }\n        };\n        if (!write_smart_equality.__argnames__) Object.defineProperties(write_smart_equality, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        comparators = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"<\"] = true;\n            ρσ_d[\">\"] = true;\n            ρσ_d[\"<=\"] = true;\n            ρσ_d[\">=\"] = true;\n            return ρσ_d;\n        }).call(this);\n        function_ops = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\"in\"] = \"ρσ_in\";\n            ρσ_d[\"nin\"] = \"!ρσ_in\";\n            return ρσ_d;\n        }).call(this);\n        function print_binary_op(self, output) {\n            var leftvar, left, nan_check;\n            if (function_ops[ρσ_bound_index(self.operator, function_ops)]) {\n                output.print(function_ops[ρσ_bound_index(self.operator, function_ops)]);\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.left.print(output);\n                        output.comma();\n                        self.right.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.operators\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else if (comparators[ρσ_bound_index(self.operator, comparators)] && is_node_type(self.left, AST_Binary) && comparators[ρσ_bound_index(self.left.operator, comparators)]) {\n                if (is_node_type(self.left.right, AST_Symbol)) {\n                    self.left.print(output);\n                    leftvar = self.left.right.name;\n                } else {\n                    self.left.left.print(output);\n                    output.space();\n                    output.print(self.left.operator);\n                    output.space();\n                    output.with_parens((function() {\n                        var ρσ_anonfunc = function () {\n                            output.assign(\"ρσ_cond_temp\");\n                            self.left.right.print(output);\n                            leftvar = \"ρσ_cond_temp\";\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.operators\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                }\n                output.space();\n                output.print(\"&&\");\n                output.space();\n                output.print(leftvar);\n                output.space();\n                output.print(self.operator);\n                output.space();\n                self.right.print(output);\n            } else if (self.operator === \"//\") {\n                output.print(\"Math.floor\");\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.left.print(output);\n                        output.space();\n                        output.print(\"/\");\n                        output.space();\n                        self.right.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.operators\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else if (self.operator === \"**\") {\n                left = self.left;\n                if (is_node_type(self.left, AST_Unary) && !self.left.parenthesized) {\n                    left = self.left.expression;\n                    output.print(self.left.operator);\n                }\n                if (output.options.js_version > 6) {\n                    [output.print(\"((\"), left.print(output), output.spaced(\")\", \"**\", \"(\"), self.right.print(output), \n                    output.print(\"))\")];\n                } else {\n                    [output.print(\"Math.pow(\"), left.print(output), output.comma(), self.right.print(output), \n                    output.print(\")\")];\n                }\n            } else if (self.operator === \"==\" || self.operator === \"!=\") {\n                write_smart_equality(self, output);\n            } else if (self.operator === \"instanceof\") {\n                write_instanceof(self.left, self.right, output);\n            } else if (self.operator === \"*\" && is_node_type(self.left, AST_String)) {\n                [self.left.print(output), output.print(\".repeat(\"), self.right.print(output), output.print(\")\")];\n            } else if (self.operator === \"===\" || self.operator === \"!==\") {\n                nan_check = null;\n                if (is_node_type(self.right, AST_Symbol) && self.right.name === \"NaN\") {\n                    nan_check = self.left;\n                }\n                if (is_node_type(self.left, AST_Symbol) && self.left.name === \"NaN\") {\n                    nan_check = self.right;\n                }\n                if (nan_check !== null) {\n                    output.spaced(nan_check, (self.operator === \"===\") ? \"!==\" : \"===\", nan_check);\n                } else {\n                    output.spaced(self.left, self.operator, self.right);\n                }\n            } else {\n                output.spaced(self.left, self.operator, self.right);\n            }\n        };\n        if (!print_binary_op.__argnames__) Object.defineProperties(print_binary_op, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        after_map = (function(){\n            var ρσ_d = Object.create(null);\n            ρσ_d[\".\"] = \"d\";\n            ρσ_d[\"(\"] = \"c\";\n            ρσ_d[\"[\"] = \"d\";\n            ρσ_d[\"g\"] = \"g\";\n            ρσ_d[\"null\"] = \"n\";\n            return ρσ_d;\n        }).call(this);\n        function print_existential(self, output) {\n            var key, after;\n            key = (self.after === null || typeof self.after === \"string\") ? after_map[ρσ_bound_index(self.after, after_map)] : \"e\";\n            if (is_node_type(self.expression, AST_SymbolRef)) {\n                if (key === \"n\") {\n                    output.spaced(\"(typeof\", self.expression, \"!==\", \"\\\"undefined\\\"\", \"&&\", self.expression, \"!==\", \"null)\");\n                    return;\n                }\n                if (key === \"c\") {\n                    output.spaced(\"(typeof\", self.expression, \"===\", \"\\\"function\\\"\", \"?\", self.expression, \":\", \"(function(){return undefined;}))\");\n                    return;\n                }\n                after = self.after;\n                if (key === \"d\") {\n                    after = \"Object.create(null)\";\n                } else if (key === \"g\") {\n                    after = \"{__getitem__:function(){return undefined;}}\";\n                }\n                output.spaced(\"(typeof\", self.expression, \"!==\", \"\\\"undefined\\\"\", \"&&\", self.expression, \"!==\", \"null\", \"?\", self.expression, \":\", after);\n                output.print(\")\");\n                return;\n            }\n            output.print(\"ρσ_exists.\" + key + \"(\");\n            self.expression.print(output);\n            if (key === \"e\") {\n                [output.comma(), self.after.print(output)];\n            }\n            output.print(\")\");\n        };\n        if (!print_existential.__argnames__) Object.defineProperties(print_existential, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_assignment(self, output) {\n            var flattened, left, flat;\n            flattened = false;\n            left = self.left;\n            if (is_node_type(left, AST_Seq)) {\n                left = new AST_Array((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"elements\"] = [left.car, left.cdr];\n                    return ρσ_d;\n                }).call(this));\n            }\n            if (is_node_type(left, AST_Array)) {\n                flat = left.flatten();\n                flattened = flat.length > left.elements.length;\n                output.print(\"ρσ_unpack\");\n            } else {\n                left.print(output);\n            }\n            output.space();\n            output.print(self.operator);\n            output.space();\n            if (flattened) {\n                output.print(\"ρσ_flatten\");\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.right.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.operators\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                self.right.print(output);\n            }\n            if (is_node_type(left, AST_Array)) {\n                output.end_statement();\n                if (!is_node_type(self.right, AST_Seq) && !is_node_type(self.right, AST_Array)) {\n                    output.assign(\"ρσ_unpack\");\n                    [output.print(\"ρσ_unpack_asarray(\" + flat.length), output.comma(), output.print(\"ρσ_unpack)\")];\n                    output.end_statement();\n                }\n                unpack_tuple(flat, output, true);\n            }\n        };\n        if (!print_assignment.__argnames__) Object.defineProperties(print_assignment, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_assign(self, output) {\n            var ρσ_unpack, left_hand_sides, rhs, is_compound_assign, lhs, temp_rhs;\n            if (self.operator === \"//=\") {\n                output.assign(self.left);\n                output.print(\"Math.floor\");\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.left.print(output);\n                        output.space();\n                        output.print(\"/\");\n                        output.space();\n                        self.right.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.operators\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                return;\n            }\n            if (self.operator === \"=\" && self.is_chained()) {\n                ρσ_unpack = self.traverse_chain();\nρσ_unpack = ρσ_unpack_asarray(2, ρσ_unpack);\n                left_hand_sides = ρσ_unpack[0];\n                rhs = ρσ_unpack[1];\n                is_compound_assign = false;\n                var ρσ_Iter89 = ρσ_Iterable(left_hand_sides);\n                for (var ρσ_Index89 = 0; ρσ_Index89 < ρσ_Iter89.length; ρσ_Index89++) {\n                    lhs = ρσ_Iter89[ρσ_Index89];\n                    if (is_node_type(lhs, AST_Seq) || is_node_type(lhs, AST_Array) || is_node_type(lhs, AST_ItemAccess)) {\n                        is_compound_assign = true;\n                        break;\n                    }\n                }\n                if (is_compound_assign) {\n                    temp_rhs = new AST_SymbolRef((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"name\"] = \"ρσ_chain_assign_temp\";\n                        return ρσ_d;\n                    }).call(this));\n                    print_assignment(new AST_Assign((function(){\n                        var ρσ_d = Object.create(null);\n                        ρσ_d[\"left\"] = temp_rhs;\n                        ρσ_d[\"operator\"] = \"=\";\n                        ρσ_d[\"right\"] = rhs;\n                        return ρσ_d;\n                    }).call(this)), output);\n                    var ρσ_Iter90 = ρσ_Iterable(left_hand_sides);\n                    for (var ρσ_Index90 = 0; ρσ_Index90 < ρσ_Iter90.length; ρσ_Index90++) {\n                        lhs = ρσ_Iter90[ρσ_Index90];\n                        [output.end_statement(), output.indent()];\n                        print_assignment(new AST_Assign((function(){\n                            var ρσ_d = Object.create(null);\n                            ρσ_d[\"left\"] = lhs;\n                            ρσ_d[\"right\"] = temp_rhs;\n                            ρσ_d[\"operator\"] = self.operator;\n                            return ρσ_d;\n                        }).call(this)), output);\n                    }\n                } else {\n                    var ρσ_Iter91 = ρσ_Iterable(left_hand_sides);\n                    for (var ρσ_Index91 = 0; ρσ_Index91 < ρσ_Iter91.length; ρσ_Index91++) {\n                        lhs = ρσ_Iter91[ρσ_Index91];\n                        output.spaced(lhs, \"=\", \"\");\n                    }\n                    rhs.print(output);\n                }\n            } else {\n                print_assignment(self, output);\n            }\n        };\n        if (!print_assign.__argnames__) Object.defineProperties(print_assign, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_conditional(self, output, condition, consequent, alternative) {\n            var ρσ_unpack;\n            ρσ_unpack = [self.condition, self.consequent, self.alternative];\n            condition = ρσ_unpack[0];\n            consequent = ρσ_unpack[1];\n            alternative = ρσ_unpack[2];\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    condition.print(output);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.operators\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.space();\n            output.print(\"?\");\n            output.space();\n            consequent.print(output);\n            output.space();\n            output.colon();\n            alternative.print(output);\n        };\n        if (!print_conditional.__argnames__) Object.defineProperties(print_conditional, {\n            __argnames__ : {value: [\"self\", \"output\", \"condition\", \"consequent\", \"alternative\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        function print_seq(output) {\n            var self, p, print_seq;\n            self = this;\n            p = output.parent();\n            print_seq = (function() {\n                var ρσ_anonfunc = function () {\n                    self.car.print(output);\n                    if (self.cdr) {\n                        output.comma();\n                        if (output.should_break()) {\n                            output.newline();\n                            output.indent();\n                        }\n                        self.cdr.print(output);\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.operators\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            if (is_node_type(p, AST_Binary) || is_node_type(p, AST_Return) || is_node_type(p, AST_Array) || is_node_type(p, AST_BaseCall) || is_node_type(p, AST_SimpleStatement)) {\n                output.with_square(print_seq);\n            } else {\n                print_seq();\n            }\n        };\n        if (!print_seq.__argnames__) Object.defineProperties(print_seq, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.operators\"}\n        });\n\n        ρσ_modules[\"output.operators\"].comparators = comparators;\n        ρσ_modules[\"output.operators\"].function_ops = function_ops;\n        ρσ_modules[\"output.operators\"].after_map = after_map;\n        ρσ_modules[\"output.operators\"].print_getattr = print_getattr;\n        ρσ_modules[\"output.operators\"].print_getitem = print_getitem;\n        ρσ_modules[\"output.operators\"].print_rich_getitem = print_rich_getitem;\n        ρσ_modules[\"output.operators\"].print_splice_assignment = print_splice_assignment;\n        ρσ_modules[\"output.operators\"].print_delete = print_delete;\n        ρσ_modules[\"output.operators\"].print_unary_prefix = print_unary_prefix;\n        ρσ_modules[\"output.operators\"].write_instanceof = write_instanceof;\n        ρσ_modules[\"output.operators\"].write_smart_equality = write_smart_equality;\n        ρσ_modules[\"output.operators\"].print_binary_op = print_binary_op;\n        ρσ_modules[\"output.operators\"].print_existential = print_existential;\n        ρσ_modules[\"output.operators\"].print_assignment = print_assignment;\n        ρσ_modules[\"output.operators\"].print_assign = print_assign;\n        ρσ_modules[\"output.operators\"].print_conditional = print_conditional;\n        ρσ_modules[\"output.operators\"].print_seq = print_seq;\n    })();\n\n    (function(){\n        var __name__ = \"output.functions\";\n        var anonfunc, module_name;\n        var AST_ClassCall = ρσ_modules.ast.AST_ClassCall;\n        var AST_New = ρσ_modules.ast.AST_New;\n        var has_calls = ρσ_modules.ast.has_calls;\n        var AST_Dot = ρσ_modules.ast.AST_Dot;\n        var AST_SymbolRef = ρσ_modules.ast.AST_SymbolRef;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        var OutputStream = ρσ_modules[\"output.stream\"].OutputStream;\n\n        var print_bracketed = ρσ_modules[\"output.statements\"].print_bracketed;\n\n        var create_doctring = ρσ_modules[\"output.utils\"].create_doctring;\n\n        var print_getattr = ρσ_modules[\"output.operators\"].print_getattr;\n\n        anonfunc = \"ρσ_anonfunc\";\n        module_name = \"null\";\n        function set_module_name(x) {\n            module_name = (x) ? \"\\\"\" + x + \"\\\"\" : \"null\";\n        };\n        if (!set_module_name.__argnames__) Object.defineProperties(set_module_name, {\n            __argnames__ : {value: [\"x\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function decorate(decorators, output, func) {\n            var pos;\n            pos = 0;\n            function wrap() {\n                if (pos < decorators.length) {\n                    decorators[(typeof pos === \"number\" && pos < 0) ? decorators.length + pos : pos].expression.print(output);\n                    pos += 1;\n                    output.with_parens((function() {\n                        var ρσ_anonfunc = function () {\n                            wrap();\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.functions\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                } else {\n                    func();\n                }\n            };\n            if (!wrap.__module__) Object.defineProperties(wrap, {\n                __module__ : {value: \"output.functions\"}\n            });\n\n            wrap();\n        };\n        if (!decorate.__argnames__) Object.defineProperties(decorate, {\n            __argnames__ : {value: [\"decorators\", \"output\", \"func\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function function_args(argnames, output, strip_first) {\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    var ρσ_unpack, i, arg;\n                    if (argnames && argnames.length && (argnames.is_simple_func === true || argnames.is_simple_func === undefined)) {\n                        var ρσ_Iter92 = ρσ_Iterable(enumerate((strip_first) ? argnames.slice(1) : argnames));\n                        for (var ρσ_Index92 = 0; ρσ_Index92 < ρσ_Iter92.length; ρσ_Index92++) {\n                            ρσ_unpack = ρσ_Iter92[ρσ_Index92];\n                            i = ρσ_unpack[0];\n                            arg = ρσ_unpack[1];\n                            if (i) {\n                                output.comma();\n                            }\n                            arg.print(output);\n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.functions\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.space();\n        };\n        if (!function_args.__argnames__) Object.defineProperties(function_args, {\n            __argnames__ : {value: [\"argnames\", \"output\", \"strip_first\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function function_preamble(node, output, offset) {\n            var a, fname, kw, i, ρσ_unpack, c, arg, dname, nargs;\n            a = node.argnames;\n            if (!a || a.is_simple_func) {\n                return;\n            }\n            fname = (node.name) ? node.name.name : anonfunc;\n            kw = \"arguments[arguments.length-1]\";\n            var ρσ_Iter93 = ρσ_Iterable(enumerate(a));\n            for (var ρσ_Index93 = 0; ρσ_Index93 < ρσ_Iter93.length; ρσ_Index93++) {\n                ρσ_unpack = ρσ_Iter93[ρσ_Index93];\n                c = ρσ_unpack[0];\n                arg = ρσ_unpack[1];\n                i = c - offset;\n                if (i >= 0) {\n                    output.indent();\n                    output.print(\"var\");\n                    output.space();\n                    output.assign(arg);\n                    if (Object.prototype.hasOwnProperty.call(a.defaults, arg.name)) {\n                        output.spaced(\"(arguments[\" + i + \"]\", \"===\", \"undefined\", \"||\", \"(\", i, \"===\", \"arguments.length-1\", \"&&\", kw, \"!==\", \"null\", \"&&\", \"typeof\", kw, \"===\", \"\\\"object\\\"\", \"&&\", kw, \"[ρσ_kwargs_symbol]\", \"===\", \"true))\", \"?\", \"\");\n                        [output.print(fname + \".__defaults__.\"), arg.print(output)];\n                        [output.space(), output.print(\":\"), output.space()];\n                    } else {\n                        output.spaced(\"(\", i, \"===\", \"arguments.length-1\", \"&&\", kw, \"!==\", \"null\", \"&&\", \"typeof\", kw, \"===\", \"\\\"object\\\"\", \"&&\", kw, \"[ρσ_kwargs_symbol]\", \"===\", \"true)\", \"?\", \"undefined\", \":\", \"\");\n                    }\n                    output.print(\"arguments[\" + i + \"]\");\n                    output.end_statement();\n                }\n            }\n            if (a.kwargs || a.has_defaults) {\n                kw = (a.kwargs) ? a.kwargs.name : \"ρσ_kwargs_obj\";\n                output.indent();\n                output.spaced(\"var\", kw, \"=\", \"arguments[arguments.length-1]\");\n                output.end_statement();\n                output.indent();\n                output.spaced(\"if\", \"(\" + kw, \"===\", \"null\", \"||\", \"typeof\", kw, \"!==\", \"\\\"object\\\"\", \"||\", kw, \"[ρσ_kwargs_symbol]\", \"!==\", \"true)\", kw, \"=\", \"{}\");\n                output.end_statement();\n                if (a.has_defaults) {\n                    var ρσ_Iter94 = ρσ_Iterable(Object.keys(a.defaults));\n                    for (var ρσ_Index94 = 0; ρσ_Index94 < ρσ_Iter94.length; ρσ_Index94++) {\n                        dname = ρσ_Iter94[ρσ_Index94];\n                        output.indent();\n                        output.spaced(\"if\", \"(Object.prototype.hasOwnProperty.call(\" + kw + \",\", \"\\\"\" + dname + \"\\\"))\");\n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                output.indent();\n                                output.spaced(dname, \"=\", kw + \".\" + dname);\n                                output.end_statement();\n                                if (a.kwargs) {\n                                    output.indent();\n                                    output.spaced(\"delete\", kw + \".\" + dname);\n                                    output.end_statement();\n                                }\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.functions\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                        output.newline();\n                    }\n                }\n            }\n            if (a.starargs !== undefined) {\n                nargs = a.length - offset;\n                output.indent();\n                output.spaced(\"var\", a.starargs.name, \"=\", \"Array.prototype.slice.call(arguments,\", nargs + \")\");\n                output.end_statement();\n                output.indent();\n                output.spaced(\"if\", \"(\" + kw, \"!==\", \"null\", \"&&\", \"typeof\", kw, \"===\", \"\\\"object\\\"\", \"&&\", kw, \"[ρσ_kwargs_symbol]\", \"===\", \"true)\", a.starargs.name);\n                output.print(\".pop()\");\n                output.end_statement();\n            }\n        };\n        if (!function_preamble.__argnames__) Object.defineProperties(function_preamble, {\n            __argnames__ : {value: [\"node\", \"output\", \"offset\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function has_annotations(self) {\n            var arg;\n            if (self.return_annotation) {\n                return true;\n            }\n            var ρσ_Iter95 = ρσ_Iterable(self.argnames);\n            for (var ρσ_Index95 = 0; ρσ_Index95 < ρσ_Iter95.length; ρσ_Index95++) {\n                arg = ρσ_Iter95[ρσ_Index95];\n                if (arg.annotation) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        if (!has_annotations.__argnames__) Object.defineProperties(has_annotations, {\n            __argnames__ : {value: [\"self\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function function_annotation(self, output, strip_first, name) {\n            var fname, props, defaults, dkeys, names;\n            fname = name || ((self.name) ? self.name.name : anonfunc);\n            props = Object.create(null);\n            if (has_annotations(self)) {\n                props.__annotations__ = (function() {\n                    var ρσ_anonfunc = function () {\n                        var ρσ_unpack, i, arg;\n                        output.print(\"{\");\n                        if (self.argnames && self.argnames.length) {\n                            var ρσ_Iter96 = ρσ_Iterable(enumerate(self.argnames));\n                            for (var ρσ_Index96 = 0; ρσ_Index96 < ρσ_Iter96.length; ρσ_Index96++) {\n                                ρσ_unpack = ρσ_Iter96[ρσ_Index96];\n                                i = ρσ_unpack[0];\n                                arg = ρσ_unpack[1];\n                                if (arg.annotation) {\n                                    arg.print(output);\n                                    [output.print(\":\"), output.space()];\n                                    arg.annotation.print(output);\n                                    if (i < self.argnames.length - 1 || self.return_annotation) {\n                                        output.comma();\n                                    }\n                                }\n                            }\n                        }\n                        if (self.return_annotation) {\n                            [output.print(\"return:\"), output.space()];\n                            self.return_annotation.print(output);\n                        }\n                        output.print(\"}\");\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            defaults = self.argnames.defaults;\n            dkeys = Object.keys(self.argnames.defaults);\n            if (dkeys.length) {\n                props.__defaults__ = (function() {\n                    var ρσ_anonfunc = function () {\n                        var ρσ_unpack, i, k;\n                        output.print(\"{\");\n                        var ρσ_Iter97 = ρσ_Iterable(enumerate(dkeys));\n                        for (var ρσ_Index97 = 0; ρσ_Index97 < ρσ_Iter97.length; ρσ_Index97++) {\n                            ρσ_unpack = ρσ_Iter97[ρσ_Index97];\n                            i = ρσ_unpack[0];\n                            k = ρσ_unpack[1];\n                            [output.print(k + \":\"), defaults[(typeof k === \"number\" && k < 0) ? defaults.length + k : k].print(output)];\n                            if (i !== dkeys.length - 1) {\n                                output.comma();\n                            }\n                        }\n                        output.print(\"}\");\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            if (!self.argnames.is_simple_func) {\n                props.__handles_kwarg_interpolation__ = (function() {\n                    var ρσ_anonfunc = function () {\n                        output.print(\"true\");\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            if (self.argnames.length > ((strip_first) ? 1 : 0)) {\n                props.__argnames__ = (function() {\n                    var ρσ_anonfunc = function () {\n                        var ρσ_unpack, i, arg;\n                        output.print(\"[\");\n                        var ρσ_Iter98 = ρσ_Iterable(enumerate(self.argnames));\n                        for (var ρσ_Index98 = 0; ρσ_Index98 < ρσ_Iter98.length; ρσ_Index98++) {\n                            ρσ_unpack = ρσ_Iter98[ρσ_Index98];\n                            i = ρσ_unpack[0];\n                            arg = ρσ_unpack[1];\n                            if (strip_first && i === 0) {\n                                continue;\n                            }\n                            output.print(JSON.stringify(arg.name));\n                            if (i !== self.argnames.length - 1) {\n                                output.comma();\n                            }\n                        }\n                        output.print(\"]\");\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            if (output.options.keep_docstrings && self.docstrings && self.docstrings.length) {\n                props.__doc__ = (function() {\n                    var ρσ_anonfunc = function () {\n                        output.print(JSON.stringify(create_doctring(self.docstrings)));\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })();\n            }\n            props.__module__ = (function() {\n                var ρσ_anonfunc = function () {\n                    output.print(module_name);\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.functions\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            names = Object.keys(props);\n            output.indent();\n            output.spaced(\"if\", \"(!\" + fname + \".\" + names[0] + \")\", \"Object.defineProperties(\" + fname);\n            output.comma();\n            output.with_block((function() {\n                var ρσ_anonfunc = function () {\n                    var name;\n                    for (var i = 0; i < names.length; i++) {\n                        name = names[(typeof i === \"number\" && i < 0) ? names.length + i : i];\n                        [output.indent(), output.spaced(name, \":\", \"{value:\", \"\"), props[(typeof name === \"number\" && name < 0) ? props.length + name : name](), \n                        output.print(\"}\")];\n                        if (i < names.length - 1) {\n                            output.print(\",\");\n                        }\n                        output.newline();\n                    }\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.functions\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            [output.print(\")\"), output.end_statement()];\n        };\n        if (!function_annotation.__argnames__) Object.defineProperties(function_annotation, {\n            __argnames__ : {value: [\"self\", \"output\", \"strip_first\", \"name\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function function_definition(self, output, strip_first, as_expression) {\n            var orig_indent;\n            as_expression = as_expression || self.is_expression || self.is_anonymous;\n            if (as_expression) {\n                orig_indent = output.indentation();\n                output.set_indentation(output.next_indent());\n                [output.spaced(\"(function()\", \"{\"), output.newline()];\n                [output.indent(), output.spaced(\"var\", anonfunc, \"=\"), output.space()];\n            }\n            [output.print(\"function\"), output.space()];\n            if (self.name) {\n                self.name.print(output);\n            }\n            if (self.is_generator) {\n                [output.print(\"()\"), output.space()];\n                output.with_block((function() {\n                    var ρσ_anonfunc = function () {\n                        var temp, transpiled, ci;\n                        if (output.options.js_version >= 6) {\n                            output.indent();\n                            output.print(\"function* js_generator\");\n                            function_args(self.argnames, output, strip_first);\n                            print_bracketed(self, output, true, function_preamble);\n                        } else {\n                            temp = new OutputStream((function(){\n                                var ρσ_d = Object.create(null);\n                                ρσ_d[\"beautify\"] = true;\n                                return ρσ_d;\n                            }).call(this));\n                            temp.print(\"function* js_generator\");\n                            function_args(self.argnames, temp, strip_first);\n                            print_bracketed(self, temp, true, function_preamble);\n                            transpiled = regenerate(temp.get(), output.options.beautify).replace(/regeneratorRuntime.(wrap|mark)/g, \"ρσ_regenerator.regeneratorRuntime.$1\");\n                            if (output.options.beautify) {\n                                ci = output.make_indent(0);\n                                transpiled = (function() {\n                                    var ρσ_Iter = ρσ_Iterable(transpiled.split(\"\\n\")), ρσ_Result = [], x;\n                                    for (var ρσ_Index = 0; ρσ_Index < ρσ_Iter.length; ρσ_Index++) {\n                                        x = ρσ_Iter[ρσ_Index];\n                                        ρσ_Result.push(ci + x);\n                                    }\n                                    ρσ_Result = ρσ_list_constructor(ρσ_Result);\n                                    return ρσ_Result;\n                                })().join(\"\\n\");\n                            }\n                            output.print(transpiled);\n                        }\n                        output.newline();\n                        output.indent();\n                        output.spaced(\"var\", \"result\", \"=\", \"js_generator.apply(this,\", \"arguments)\");\n                        output.end_statement();\n                        output.indent();\n                        output.spaced(\"result.send\", \"=\", \"result.next\");\n                        output.end_statement();\n                        output.indent();\n                        output.spaced(\"return\", \"result\");\n                        output.end_statement();\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            } else {\n                function_args(self.argnames, output, strip_first);\n                print_bracketed(self, output, true, function_preamble);\n            }\n            if (as_expression) {\n                output.end_statement();\n                function_annotation(self, output, strip_first, anonfunc);\n                [output.indent(), output.spaced(\"return\", anonfunc), output.end_statement()];\n                output.set_indentation(orig_indent);\n                [output.indent(), output.print(\"})()\")];\n            }\n        };\n        if (!function_definition.__argnames__) Object.defineProperties(function_definition, {\n            __argnames__ : {value: [\"self\", \"output\", \"strip_first\", \"as_expression\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function print_function(output) {\n            var self;\n            self = this;\n            if (self.decorators && self.decorators.length) {\n                output.print(\"var\");\n                output.space();\n                output.assign(self.name.name);\n                decorate(self.decorators, output, (function() {\n                    var ρσ_anonfunc = function () {\n                        function_definition(self, output, false, true);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                output.end_statement();\n            } else {\n                function_definition(self, output, false);\n                if (!self.is_expression && !self.is_anonymous) {\n                    output.end_statement();\n                    function_annotation(self, output, false);\n                }\n            }\n        };\n        if (!print_function.__argnames__) Object.defineProperties(print_function, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function find_this(expression) {\n            if (is_node_type(expression, AST_Dot)) {\n                return expression.expression;\n            }\n            if (!is_node_type(expression, AST_SymbolRef)) {\n                return expression;\n            }\n        };\n        if (!find_this.__argnames__) Object.defineProperties(find_this, {\n            __argnames__ : {value: [\"expression\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function print_this(expression, output) {\n            var obj;\n            obj = find_this(expression);\n            if (obj) {\n                obj.print(output);\n            } else {\n                output.print(\"this\");\n            }\n        };\n        if (!print_this.__argnames__) Object.defineProperties(print_this, {\n            __argnames__ : {value: [\"expression\", \"output\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        function print_function_call(self, output) {\n            var is_prototype_call, has_kwarg_items, has_kwarg_formals, has_kwargs, is_new, is_repeatable;\n            is_prototype_call = false;\n            function print_function_name(no_call) {\n                if (is_node_type(self, AST_ClassCall)) {\n                    if (self.static) {\n                        self.class.print(output);\n                        output.print(\".\");\n                        output.print(self.method);\n                    } else {\n                        is_prototype_call = true;\n                        self.class.print(output);\n                        output.print(\".prototype.\");\n                        output.print(self.method);\n                        if (!no_call) {\n                            output.print(\".call\");\n                        }\n                    }\n                } else {\n                    if (!is_repeatable) {\n                        output.print(\"ρσ_expr_temp\");\n                        if (is_node_type(self.expression, AST_Dot)) {\n                            print_getattr(self.expression, output, true);\n                        }\n                    } else {\n                        self.expression.print(output);\n                    }\n                }\n            };\n            if (!print_function_name.__argnames__) Object.defineProperties(print_function_name, {\n                __argnames__ : {value: [\"no_call\"]},\n                __module__ : {value: \"output.functions\"}\n            });\n\n            function print_kwargs() {\n                var ρσ_unpack, i, kwname, pair;\n                output.print(\"ρσ_desugar_kwargs(\");\n                if (has_kwarg_items) {\n                    var ρσ_Iter99 = ρσ_Iterable(enumerate(self.args.kwarg_items));\n                    for (var ρσ_Index99 = 0; ρσ_Index99 < ρσ_Iter99.length; ρσ_Index99++) {\n                        ρσ_unpack = ρσ_Iter99[ρσ_Index99];\n                        i = ρσ_unpack[0];\n                        kwname = ρσ_unpack[1];\n                        if (i > 0) {\n                            output.print(\",\");\n                            output.space();\n                        }\n                        kwname.print(output);\n                    }\n                    if (has_kwarg_formals) {\n                        output.print(\",\");\n                        output.space();\n                    }\n                }\n                if (has_kwarg_formals) {\n                    output.print(\"{\");\n                    var ρσ_Iter100 = ρσ_Iterable(enumerate(self.args.kwargs));\n                    for (var ρσ_Index100 = 0; ρσ_Index100 < ρσ_Iter100.length; ρσ_Index100++) {\n                        ρσ_unpack = ρσ_Iter100[ρσ_Index100];\n                        i = ρσ_unpack[0];\n                        pair = ρσ_unpack[1];\n                        if (i) {\n                            output.comma();\n                        }\n                        pair[0].print(output);\n                        output.print(\":\");\n                        output.space();\n                        pair[1].print(output);\n                    }\n                    output.print(\"}\");\n                }\n                output.print(\")\");\n            };\n            if (!print_kwargs.__module__) Object.defineProperties(print_kwargs, {\n                __module__ : {value: \"output.functions\"}\n            });\n\n            function print_new(apply) {\n                output.print(\"ρσ_interpolate_kwargs_constructor.call(\");\n                [output.print(\"Object.create(\"), self.expression.print(output), output.print(\".prototype)\")];\n                output.comma();\n                output.print((apply) ? \"true\" : \"false\");\n                output.comma();\n            };\n            if (!print_new.__argnames__) Object.defineProperties(print_new, {\n                __argnames__ : {value: [\"apply\"]},\n                __module__ : {value: \"output.functions\"}\n            });\n\n            function do_print_this() {\n                if (!is_repeatable) {\n                    output.print(\"ρσ_expr_temp\");\n                } else {\n                    print_this(self.expression, output);\n                }\n                output.comma();\n            };\n            if (!do_print_this.__module__) Object.defineProperties(do_print_this, {\n                __module__ : {value: \"output.functions\"}\n            });\n\n            function print_positional_args() {\n                var i, expr, is_first;\n                i = 0;\n                while (i < self.args.length) {\n                    expr = (ρσ_expr_temp = self.args)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n                    is_first = i === 0;\n                    if (!is_first) {\n                        output.print(\".concat(\");\n                    }\n                    if (expr.is_array) {\n                        expr.print(output);\n                        i += 1;\n                    } else {\n                        output.print(\"[\");\n                        while (i < self.args.length && !(ρσ_expr_temp = self.args)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].is_array) {\n                            (ρσ_expr_temp = self.args)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].print(output);\n                            if (i + 1 < self.args.length && !(ρσ_expr_temp = self.args)[ρσ_bound_index(i + 1, ρσ_expr_temp)].is_array) {\n                                output.print(\",\");\n                                output.space();\n                            }\n                            i += 1;\n                        }\n                        output.print(\"]\");\n                    }\n                    if (!is_first) {\n                        output.print(\")\");\n                    }\n                }\n            };\n            if (!print_positional_args.__module__) Object.defineProperties(print_positional_args, {\n                __module__ : {value: \"output.functions\"}\n            });\n\n            has_kwarg_items = self.args.kwarg_items && self.args.kwarg_items.length;\n            has_kwarg_formals = self.args.kwargs && self.args.kwargs.length;\n            has_kwargs = has_kwarg_items || has_kwarg_formals;\n            is_new = is_node_type(self, AST_New);\n            is_repeatable = true;\n            if (is_new && !self.args.length && !has_kwargs && !self.args.starargs) {\n                [output.print(\"new\"), output.space()];\n                print_function_name();\n                return;\n            }\n            if (!has_kwargs && !self.args.starargs) {\n                if (is_new) {\n                    [output.print(\"new\"), output.space()];\n                }\n                print_function_name();\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        var ρσ_unpack, i, a;\n                        var ρσ_Iter101 = ρσ_Iterable(enumerate(self.args));\n                        for (var ρσ_Index101 = 0; ρσ_Index101 < ρσ_Iter101.length; ρσ_Index101++) {\n                            ρσ_unpack = ρσ_Iter101[ρσ_Index101];\n                            i = ρσ_unpack[0];\n                            a = ρσ_unpack[1];\n                            if (i) {\n                                output.comma();\n                            }\n                            a.print(output);\n                        }\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.functions\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                return;\n            }\n            is_repeatable = is_new || !has_calls(self.expression);\n            if (!is_repeatable) {\n                [output.assign(\"(ρσ_expr_temp\"), print_this(self.expression, output), output.comma()];\n            }\n            if (has_kwargs) {\n                if (is_new) {\n                    print_new(false);\n                } else {\n                    output.print(\"ρσ_interpolate_kwargs.call(\");\n                    do_print_this();\n                }\n                print_function_name(true);\n                output.comma();\n            } else {\n                if (is_new) {\n                    print_new(true);\n                    print_function_name(true);\n                    output.comma();\n                } else {\n                    print_function_name(true);\n                    output.print(\".apply(\");\n                    do_print_this();\n                }\n            }\n            if (is_prototype_call && self.args.length > 1) {\n                self.args.shift();\n            }\n            print_positional_args();\n            if (has_kwargs) {\n                if (self.args.length) {\n                    output.print(\".concat(\");\n                }\n                output.print(\"[\");\n                print_kwargs();\n                output.print(\"]\");\n                if (self.args.length) {\n                    output.print(\")\");\n                }\n            }\n            output.print(\")\");\n            if (!is_repeatable) {\n                output.print(\")\");\n            }\n        };\n        if (!print_function_call.__argnames__) Object.defineProperties(print_function_call, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.functions\"}\n        });\n\n        ρσ_modules[\"output.functions\"].anonfunc = anonfunc;\n        ρσ_modules[\"output.functions\"].module_name = module_name;\n        ρσ_modules[\"output.functions\"].set_module_name = set_module_name;\n        ρσ_modules[\"output.functions\"].decorate = decorate;\n        ρσ_modules[\"output.functions\"].function_args = function_args;\n        ρσ_modules[\"output.functions\"].function_preamble = function_preamble;\n        ρσ_modules[\"output.functions\"].has_annotations = has_annotations;\n        ρσ_modules[\"output.functions\"].function_annotation = function_annotation;\n        ρσ_modules[\"output.functions\"].function_definition = function_definition;\n        ρσ_modules[\"output.functions\"].print_function = print_function;\n        ρσ_modules[\"output.functions\"].find_this = find_this;\n        ρσ_modules[\"output.functions\"].print_this = print_this;\n        ρσ_modules[\"output.functions\"].print_function_call = print_function_call;\n    })();\n\n    (function(){\n        var __name__ = \"output.classes\";\n        var AST_Class = ρσ_modules.ast.AST_Class;\n        var AST_Method = ρσ_modules.ast.AST_Method;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        var decorate = ρσ_modules[\"output.functions\"].decorate;\n        var function_definition = ρσ_modules[\"output.functions\"].function_definition;\n        var function_annotation = ρσ_modules[\"output.functions\"].function_annotation;\n\n        var create_doctring = ρσ_modules[\"output.utils\"].create_doctring;\n\n        var has_prop = ρσ_modules.utils.has_prop;\n\n        function print_class(output) {\n            var self, decorators, num, i, seen_methods, property_names, defined_methods, sname, attr, stmt, di;\n            self = this;\n            if (self.external) {\n                return;\n            }\n            function class_def(method, is_var) {\n                output.indent();\n                self.name.print(output);\n                if (!is_var && method && has_prop(self.static, method)) {\n                    output.assign(\".\" + method);\n                } else {\n                    if (is_var) {\n                        output.assign(\".prototype[\" + method + \"]\");\n                    } else {\n                        output.assign(\".prototype\" + ((method) ? \".\" + method : \"\"));\n                    }\n                }\n            };\n            if (!class_def.__argnames__) Object.defineProperties(class_def, {\n                __argnames__ : {value: [\"method\", \"is_var\"]},\n                __module__ : {value: \"output.classes\"}\n            });\n\n            function define_method(stmt, is_property) {\n                var name, is_static, strip_first, fname;\n                name = stmt.name.name;\n                if (!is_property) {\n                    class_def(name);\n                }\n                is_static = has_prop(self.static, name);\n                strip_first = !is_static;\n                if (stmt.decorators && stmt.decorators.length) {\n                    decorate(stmt.decorators, output, (function() {\n                        var ρσ_anonfunc = function () {\n                            function_definition(stmt, output, strip_first, true);\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.classes\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                    output.end_statement();\n                } else {\n                    function_definition(stmt, output, strip_first);\n                    if (!is_property) {\n                        output.end_statement();\n                        fname = self.name.name + ((is_static) ? \".\" : \".prototype.\") + name;\n                        function_annotation(stmt, output, strip_first, fname);\n                    }\n                }\n            };\n            if (!define_method.__argnames__) Object.defineProperties(define_method, {\n                __argnames__ : {value: [\"stmt\", \"is_property\"]},\n                __module__ : {value: \"output.classes\"}\n            });\n\n            function define_default_method(name, body) {\n                class_def(name);\n                output.spaced(\"function\", name, \"()\", \"\");\n                output.with_block((function() {\n                    var ρσ_anonfunc = function () {\n                        [output.indent(), body()];\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                output.end_statement();\n            };\n            if (!define_default_method.__argnames__) Object.defineProperties(define_default_method, {\n                __argnames__ : {value: [\"name\", \"body\"]},\n                __module__ : {value: \"output.classes\"}\n            });\n\n            function add_hidden_property(name, proceed) {\n                [output.indent(), output.print(\"Object.defineProperty(\")];\n                [self.name.print(output), output.print(\".prototype\"), output.comma(), output.print(JSON.stringify(name)), \n                output.comma()];\n                [output.spaced(\"{value:\", \"\"), proceed(), output.print(\"})\"), output.end_statement()];\n            };\n            if (!add_hidden_property.__argnames__) Object.defineProperties(add_hidden_property, {\n                __argnames__ : {value: [\"name\", \"proceed\"]},\n                __module__ : {value: \"output.classes\"}\n            });\n\n            function write_constructor() {\n                output.print(\"function\");\n                output.space();\n                self.name.print(output);\n                output.print(\"()\");\n                output.space();\n                output.with_block((function() {\n                    var ρσ_anonfunc = function () {\n                        output.indent();\n                        output.spaced(\"if\", \"(this.ρσ_object_id\", \"===\", \"undefined)\", \"Object.defineProperty(this,\", \"\\\"ρσ_object_id\\\",\", \"{\\\"value\\\":++ρσ_object_counter})\");\n                        output.end_statement();\n                        if (self.bound.length) {\n                            output.indent();\n                            [self.name.print(output), output.print(\".prototype.__bind_methods__.call(this)\")];\n                            output.end_statement();\n                        }\n                        output.indent();\n                        self.name.print(output);\n                        [output.print(\".prototype.__init__.apply(this\"), output.comma(), output.print(\"arguments)\")];\n                        output.end_statement();\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            };\n            if (!write_constructor.__module__) Object.defineProperties(write_constructor, {\n                __module__ : {value: \"output.classes\"}\n            });\n\n            decorators = self.decorators || [];\n            if (decorators.length) {\n                output.print(\"var \");\n                output.assign(self.name);\n                write_constructor();\n                output.semicolon();\n            } else {\n                write_constructor();\n            }\n            output.newline();\n            if (decorators.length) {\n                output.indent();\n                self.name.print(output);\n                output.spaced(\".ρσ_decorators\", \"=\", \"[\");\n                num = decorators.length;\n                for (var ρσ_Index102 = 0; ρσ_Index102 < num; ρσ_Index102++) {\n                    i = ρσ_Index102;\n                    decorators[(typeof i === \"number\" && i < 0) ? decorators.length + i : i].expression.print(output);\n                    output.spaced((i < num - 1) ? \",\" : \"]\");\n                }\n                output.semicolon();\n                output.newline();\n            }\n            if (self.parent) {\n                output.indent();\n                output.print(\"ρσ_extends\");\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        self.name.print(output);\n                        output.comma();\n                        self.parent.print(output);\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                output.end_statement();\n            }\n            if (self.bound.length) {\n                seen_methods = Object.create(null);\n                add_hidden_property(\"__bind_methods__\", (function() {\n                    var ρσ_anonfunc = function () {\n                        output.spaced(\"function\", \"()\", \"\");\n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                var base, bname;\n                                if (self.bases.length) {\n                                    for (var i = self.bases.length - 1; i >= 0; i--) {\n                                        base = (ρσ_expr_temp = self.bases)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i];\n                                        [output.indent(), base.print(output), output.spaced(\".prototype.__bind_methods__\", \"&&\", \"\")];\n                                        [base.print(output), output.print(\".prototype.__bind_methods__.call(this)\")];\n                                        output.end_statement();\n                                    }\n                                }\n                                var ρσ_Iter103 = ρσ_Iterable(self.bound);\n                                for (var ρσ_Index103 = 0; ρσ_Index103 < ρσ_Iter103.length; ρσ_Index103++) {\n                                    bname = ρσ_Iter103[ρσ_Index103];\n                                    if (seen_methods[(typeof bname === \"number\" && bname < 0) ? seen_methods.length + bname : bname] || (ρσ_expr_temp = self.dynamic_properties)[(typeof bname === \"number\" && bname < 0) ? ρσ_expr_temp.length + bname : bname]) {\n                                        continue;\n                                    }\n                                    seen_methods[(typeof bname === \"number\" && bname < 0) ? seen_methods.length + bname : bname] = true;\n                                    [output.indent(), output.assign(\"this.\" + bname)];\n                                    [self.name.print(output), output.print(\".prototype.\" + bname + \".bind(this)\")];\n                                    output.end_statement();\n                                }\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.classes\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            }\n            property_names = Object.keys(self.dynamic_properties);\n            if (property_names.length) {\n                output.indent();\n                output.print(\"Object.defineProperties\");\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        [self.name.print(output), output.print(\".prototype\"), output.comma(), output.space(), \n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                var prop, name;\n                                var ρσ_Iter104 = ρσ_Iterable(property_names);\n                                for (var ρσ_Index104 = 0; ρσ_Index104 < ρσ_Iter104.length; ρσ_Index104++) {\n                                    name = ρσ_Iter104[ρσ_Index104];\n                                    prop = (ρσ_expr_temp = self.dynamic_properties)[(typeof name === \"number\" && name < 0) ? ρσ_expr_temp.length + name : name];\n                                    [output.indent(), output.print(JSON.stringify(name) + \":\"), output.space()];\n                                    output.with_block((function() {\n                                        var ρσ_anonfunc = function () {\n                                            [output.indent(), output.print(\"\\\"enumerable\\\":\"), output.space(), output.print(\"true\"), \n                                            output.comma(), output.newline()];\n                                            if (prop.getter) {\n                                                [output.indent(), output.print(\"\\\"get\\\":\"), output.space()];\n                                                [define_method(prop.getter, true), output.comma(), output.newline()];\n                                            }\n                                            [output.indent(), output.print(\"\\\"set\\\":\"), output.space()];\n                                            if (prop.setter) {\n                                                [define_method(prop.setter, true), output.newline()];\n                                            } else {\n                                                [output.spaced(\"function\", \"()\", \"{\", \"throw new AttributeError(\\\"can't set attribute\\\")\", \"}\"), \n                                                output.newline()];\n                                            }\n                                        };\n                                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                            __module__ : {value: \"output.classes\"}\n                                        });\n                                        return ρσ_anonfunc;\n                                    })());\n                                    [output.comma(), output.newline()];\n                                }\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.classes\"}\n                            });\n                            return ρσ_anonfunc;\n                        })())];\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                output.end_statement();\n            }\n            if (!self.init) {\n                define_default_method(\"__init__\", (function() {\n                    var ρσ_anonfunc = function () {\n                        if (self.parent) {\n                            self.parent.print(output);\n                            output.spaced(\".prototype.__init__\", \"&&\");\n                            [output.space(), self.parent.print(output)];\n                            output.print(\".prototype.__init__.apply\");\n                            output.with_parens((function() {\n                                var ρσ_anonfunc = function () {\n                                    output.print(\"this\");\n                                    output.comma();\n                                    output.print(\"arguments\");\n                                };\n                                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                    __module__ : {value: \"output.classes\"}\n                                });\n                                return ρσ_anonfunc;\n                            })());\n                            output.end_statement();\n                        }\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            }\n            defined_methods = Object.create(null);\n            var ρσ_Iter105 = ρσ_Iterable(self.body);\n            for (var ρσ_Index105 = 0; ρσ_Index105 < ρσ_Iter105.length; ρσ_Index105++) {\n                stmt = ρσ_Iter105[ρσ_Index105];\n                if (is_node_type(stmt, AST_Method)) {\n                    if (stmt.is_getter || stmt.is_setter) {\n                        continue;\n                    }\n                    define_method(stmt);\n                    defined_methods[ρσ_bound_index(stmt.name.name, defined_methods)] = true;\n                    sname = stmt.name.name;\n                    if (sname === \"__init__\") {\n                        var ρσ_Iter106 = ρσ_Iterable(ρσ_list_decorate([ \".__argnames__\", \".__handles_kwarg_interpolation__\" ]));\n                        for (var ρσ_Index106 = 0; ρσ_Index106 < ρσ_Iter106.length; ρσ_Index106++) {\n                            attr = ρσ_Iter106[ρσ_Index106];\n                            [output.indent(), self.name.print(output), output.assign(attr)];\n                            [self.name.print(output), output.print(\".prototype.__init__\" + attr), output.end_statement()];\n                        }\n                    }\n                    if (sname === \"__iter__\") {\n                        class_def(\"ρσ_iterator_symbol\", true);\n                        self.name.print(output);\n                        output.print(\".prototype.\" + stmt.name.name);\n                        output.end_statement();\n                    }\n                } else if (is_node_type(stmt, AST_Class)) {\n                    console.error(\"Nested classes aren't supported yet\");\n                }\n            }\n            if (!defined_methods[\"__repr__\"]) {\n                define_default_method(\"__repr__\", (function() {\n                    var ρσ_anonfunc = function () {\n                        if (self.parent) {\n                            [output.print(\"if(\"), self.parent.print(output), output.spaced(\".prototype.__repr__)\", \"return\", self.parent)];\n                            [output.print(\".prototype.__repr__.call(this)\"), output.end_statement()];\n                        }\n                        [output.indent(), output.spaced(\"return\", \"\\\"<\\\"\", \"+\", \"__name__\", \"+\", \"\\\".\\\"\", \"+\", \"this.constructor.name\", \"\")];\n                        output.spaced(\"+\", \"\\\" #\\\"\", \"+\", \"this.ρσ_object_id\", \"+\", \"\\\">\\\"\");\n                        output.end_statement();\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            }\n            if (!defined_methods[\"__str__\"]) {\n                define_default_method(\"__str__\", (function() {\n                    var ρσ_anonfunc = function () {\n                        if (self.parent) {\n                            [output.print(\"if(\"), self.parent.print(output), output.spaced(\".prototype.__str__)\", \"return\", self.parent)];\n                            [output.print(\".prototype.__str__.call(this)\"), output.end_statement()];\n                        }\n                        output.spaced(\"return\", \"this.__repr__()\");\n                        output.end_statement();\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            }\n            add_hidden_property(\"__bases__\", (function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"[\");\n                    for (var i = 0; i < self.bases.length; i++) {\n                        (ρσ_expr_temp = self.bases)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].print(output);\n                        if (i < self.bases.length - 1) {\n                            output.comma();\n                        }\n                    }\n                    output.print(\"]\");\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.classes\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            if (self.bases.length > 1) {\n                output.indent();\n                output.print(\"ρσ_mixin(\");\n                self.name.print(output);\n                for (var i = 1; i < self.bases.length; i++) {\n                    output.comma();\n                    (ρσ_expr_temp = self.bases)[(typeof i === \"number\" && i < 0) ? ρσ_expr_temp.length + i : i].print(output);\n                }\n                [output.print(\")\"), output.end_statement()];\n            }\n            if (self.docstrings && self.docstrings.length && output.options.keep_docstrings) {\n                add_hidden_property(\"__doc__\", (function() {\n                    var ρσ_anonfunc = function () {\n                        output.print(JSON.stringify(create_doctring(self.docstrings)));\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.classes\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n            }\n            var ρσ_Iter107 = ρσ_Iterable(self.statements);\n            for (var ρσ_Index107 = 0; ρσ_Index107 < ρσ_Iter107.length; ρσ_Index107++) {\n                stmt = ρσ_Iter107[ρσ_Index107];\n                if (!is_node_type(stmt, AST_Method)) {\n                    output.indent();\n                    stmt.print(output);\n                    output.newline();\n                }\n            }\n            if (decorators.length) {\n                output.indent();\n                output.assign(self.name);\n                for (var ρσ_Index108 = 0; ρσ_Index108 < decorators.length; ρσ_Index108++) {\n                    di = ρσ_Index108;\n                    self.name.print(output);\n                    output.print(\".ρσ_decorators[\" + ρσ_str.format(\"{}\", di) + \"](\");\n                }\n                self.name.print(output);\n                output.print(\")\".repeat(decorators.length));\n                output.semicolon();\n                output.newline();\n                output.indent();\n                output.spaced(\"delete \");\n                self.name.print(output);\n                output.print(\".ρσ_decorators\");\n                output.semicolon();\n                output.newline();\n            }\n        };\n        if (!print_class.__argnames__) Object.defineProperties(print_class, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.classes\"}\n        });\n\n        ρσ_modules[\"output.classes\"].print_class = print_class;\n    })();\n\n    (function(){\n        var __name__ = \"output.literals\";\n        var AST_Binary = ρσ_modules.ast.AST_Binary;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        function print_array(self, output) {\n            output.print(\"ρσ_list_decorate\");\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.with_square((function() {\n                        var ρσ_anonfunc = function () {\n                            var a, len_, ρσ_unpack, i, exp;\n                            a = self.elements;\n                            len_ = a.length;\n                            if (len_ > 0) {\n                                output.space();\n                            }\n                            var ρσ_Iter109 = ρσ_Iterable(enumerate(a));\n                            for (var ρσ_Index109 = 0; ρσ_Index109 < ρσ_Iter109.length; ρσ_Index109++) {\n                                ρσ_unpack = ρσ_Iter109[ρσ_Index109];\n                                i = ρσ_unpack[0];\n                                exp = ρσ_unpack[1];\n                                if (i) {\n                                    output.comma();\n                                }\n                                exp.print(output);\n                            }\n                            if (len_ > 0) {\n                                output.space();\n                            }\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.literals\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.literals\"}\n                });\n                return ρσ_anonfunc;\n            })());\n        };\n        if (!print_array.__argnames__) Object.defineProperties(print_array, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.literals\"}\n        });\n\n        function print_obj_literal(self, output) {\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"function()\");\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            var ρσ_unpack, i, prop;\n                            output.indent();\n                            if (self.is_pydict) {\n                                output.spaced.apply(output, \"var ρσ_d = ρσ_dict()\".split(\" \"));\n                            } else {\n                                output.spaced(\"var\", \"ρσ_d\", \"=\", (self.is_jshash) ? \"Object.create(null)\" : \"{}\");\n                            }\n                            output.end_statement();\n                            var ρσ_Iter110 = ρσ_Iterable(enumerate(self.properties));\n                            for (var ρσ_Index110 = 0; ρσ_Index110 < ρσ_Iter110.length; ρσ_Index110++) {\n                                ρσ_unpack = ρσ_Iter110[ρσ_Index110];\n                                i = ρσ_unpack[0];\n                                prop = ρσ_unpack[1];\n                                output.indent();\n                                if (self.is_pydict) {\n                                    output.print(\"ρσ_d.set\");\n                                    output.with_parens((function() {\n                                        var ρσ_anonfunc = function () {\n                                            prop.key.print(output);\n                                            [output.print(\",\"), output.space()];\n                                            prop.value.print(output);\n                                        };\n                                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                            __module__ : {value: \"output.literals\"}\n                                        });\n                                        return ρσ_anonfunc;\n                                    })());\n                                } else {\n                                    output.print(\"ρσ_d\");\n                                    output.with_square((function() {\n                                        var ρσ_anonfunc = function () {\n                                            prop.key.print(output);\n                                        };\n                                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                            __module__ : {value: \"output.literals\"}\n                                        });\n                                        return ρσ_anonfunc;\n                                    })());\n                                    [output.space(), output.print(\"=\"), output.space()];\n                                    prop.value.print(output);\n                                }\n                                output.end_statement();\n                            }\n                            output.indent();\n                            output.spaced(\"return\", \"ρσ_d\");\n                            output.end_statement();\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.literals\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.literals\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.print(\".call(this)\");\n        };\n        if (!print_obj_literal.__argnames__) Object.defineProperties(print_obj_literal, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.literals\"}\n        });\n\n        function print_object(self, output) {\n            if (self.is_pydict) {\n                if (self.properties.length > 0) {\n                    print_obj_literal(self, output);\n                } else {\n                    output.print(\"ρσ_dict()\");\n                }\n            } else {\n                if (self.properties.length > 0) {\n                    print_obj_literal(self, output);\n                } else {\n                    output.print((self.is_jshash) ? \"Object.create(null)\" : \"{}\");\n                }\n            }\n        };\n        if (!print_object.__argnames__) Object.defineProperties(print_object, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.literals\"}\n        });\n\n        function print_set(self, output) {\n            if (self.items.length === 0) {\n                output.print(\"ρσ_set()\");\n                return;\n            }\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"function()\");\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            var item;\n                            output.indent();\n                            output.spaced.apply(output, \"var s = ρσ_set()\".split(\" \"));\n                            output.end_statement();\n                            var ρσ_Iter111 = ρσ_Iterable(self.items);\n                            for (var ρσ_Index111 = 0; ρσ_Index111 < ρσ_Iter111.length; ρσ_Index111++) {\n                                item = ρσ_Iter111[ρσ_Index111];\n                                output.indent();\n                                output.print(\"s.jsset.add\");\n                                output.with_parens((function() {\n                                    var ρσ_anonfunc = function () {\n                                        item.value.print(output);\n                                    };\n                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                        __module__ : {value: \"output.literals\"}\n                                    });\n                                    return ρσ_anonfunc;\n                                })());\n                                output.end_statement();\n                            }\n                            output.indent();\n                            output.spaced(\"return\", \"s\");\n                            output.end_statement();\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.literals\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.literals\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.print(\"()\");\n        };\n        if (!print_set.__argnames__) Object.defineProperties(print_set, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.literals\"}\n        });\n\n        function print_regexp(self, output) {\n            var str_, p;\n            str_ = self.value.toString();\n            if (output.options.ascii_only) {\n                str_ = output.to_ascii(str_);\n            }\n            output.print(str_);\n            p = output.parent();\n            if (is_node_type(p, AST_Binary) && /^in/.test(p.operator) && p.left === self) {\n                output.print(\" \");\n            }\n        };\n        if (!print_regexp.__argnames__) Object.defineProperties(print_regexp, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.literals\"}\n        });\n\n        ρσ_modules[\"output.literals\"].print_array = print_array;\n        ρσ_modules[\"output.literals\"].print_obj_literal = print_obj_literal;\n        ρσ_modules[\"output.literals\"].print_object = print_object;\n        ρσ_modules[\"output.literals\"].print_set = print_set;\n        ρσ_modules[\"output.literals\"].print_regexp = print_regexp;\n    })();\n\n    (function(){\n        var __name__ = \"output.comments\";\n        var AST_Exit = ρσ_modules.ast.AST_Exit;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n\n        function output_comments(comments, output, nlb) {\n            var comm;\n            var ρσ_Iter112 = ρσ_Iterable(comments);\n            for (var ρσ_Index112 = 0; ρσ_Index112 < ρσ_Iter112.length; ρσ_Index112++) {\n                comm = ρσ_Iter112[ρσ_Index112];\n                if (comm.type === \"comment1\") {\n                    output.print(\"//\" + comm.value + \"\\n\");\n                    output.indent();\n                } else if (comm.type === \"comment2\") {\n                    output.print(\"/*\" + comm.value + \"*/\");\n                    if (nlb) {\n                        output.print(\"\\n\");\n                        output.indent();\n                    } else {\n                        output.space();\n                    }\n                }\n            }\n        };\n        if (!output_comments.__argnames__) Object.defineProperties(output_comments, {\n            __argnames__ : {value: [\"comments\", \"output\", \"nlb\"]},\n            __module__ : {value: \"output.comments\"}\n        });\n\n        function print_comments(self, output) {\n            var c, start, comments;\n            c = output.options.comments;\n            if (c) {\n                start = self.start;\n                if (start && !start._comments_dumped) {\n                    start._comments_dumped = true;\n                    comments = start.comments_before;\n                    if (is_node_type(self, AST_Exit) && self.value && self.value.start.comments_before && self.value.start.comments_before.length > 0) {\n                        comments = (comments || []).concat(self.value.start.comments_before);\n                        self.value.start.comments_before = [];\n                    }\n                    if (c.test) {\n                        comments = comments.filter((function() {\n                            var ρσ_anonfunc = function (comment) {\n                                return c.test(comment.value);\n                            };\n                            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                                __argnames__ : {value: [\"comment\"]},\n                                __module__ : {value: \"output.comments\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    } else if (typeof c === \"function\") {\n                        comments = comments.filter((function() {\n                            var ρσ_anonfunc = function (comment) {\n                                return c(self, comment);\n                            };\n                            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                                __argnames__ : {value: [\"comment\"]},\n                                __module__ : {value: \"output.comments\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    }\n                    output_comments(comments, output, start.nlb);\n                }\n            }\n        };\n        if (!print_comments.__argnames__) Object.defineProperties(print_comments, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.comments\"}\n        });\n\n        ρσ_modules[\"output.comments\"].output_comments = output_comments;\n        ρσ_modules[\"output.comments\"].print_comments = print_comments;\n    })();\n\n    (function(){\n        var __name__ = \"output.modules\";\n        var declare_vars = ρσ_modules[\"output.statements\"].declare_vars;\n        var display_body = ρσ_modules[\"output.statements\"].display_body;\n\n        var OutputStream = ρσ_modules[\"output.stream\"].OutputStream;\n\n        var create_doctring = ρσ_modules[\"output.utils\"].create_doctring;\n\n        var print_comments = ρσ_modules[\"output.comments\"].print_comments;\n        var output_comments = ρσ_modules[\"output.comments\"].output_comments;\n\n        var set_module_name = ρσ_modules[\"output.functions\"].set_module_name;\n\n        var get_compiler_version = ρσ_modules.parse.get_compiler_version;\n\n        var cache_file_name = ρσ_modules.utils.cache_file_name;\n\n        function write_imports(module, output) {\n            var imports, import_id, nonlocalvars, name, module_, module_id;\n            imports = ρσ_list_decorate([]);\n            var ρσ_Iter113 = ρσ_Iterable(Object.keys(module.imports));\n            for (var ρσ_Index113 = 0; ρσ_Index113 < ρσ_Iter113.length; ρσ_Index113++) {\n                import_id = ρσ_Iter113[ρσ_Index113];\n                imports.push((ρσ_expr_temp = module.imports)[(typeof import_id === \"number\" && import_id < 0) ? ρσ_expr_temp.length + import_id : import_id]);\n            }\n            imports.sort((function() {\n                var ρσ_anonfunc = function (a, b) {\n                    var ρσ_unpack;\n                    ρσ_unpack = [a.import_order, b.import_order];\n                    a = ρσ_unpack[0];\n                    b = ρσ_unpack[1];\n                    return (a < b) ? -1 : (a > b) ? 1 : 0;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"a\", \"b\"]},\n                    __module__ : {value: \"output.modules\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            if (imports.length > 1) {\n                output.indent();\n                output.print(\"var ρσ_modules = {};\");\n                output.newline();\n            }\n            nonlocalvars = Object.create(null);\n            var ρσ_Iter114 = ρσ_Iterable(imports);\n            for (var ρσ_Index114 = 0; ρσ_Index114 < ρσ_Iter114.length; ρσ_Index114++) {\n                module_ = ρσ_Iter114[ρσ_Index114];\n                var ρσ_Iter115 = ρσ_Iterable(module_.nonlocalvars);\n                for (var ρσ_Index115 = 0; ρσ_Index115 < ρσ_Iter115.length; ρσ_Index115++) {\n                    name = ρσ_Iter115[ρσ_Index115];\n                    nonlocalvars[(typeof name === \"number\" && name < 0) ? nonlocalvars.length + name : name] = true;\n                }\n            }\n            nonlocalvars = Object.getOwnPropertyNames(nonlocalvars).join(\", \");\n            if (nonlocalvars.length) {\n                output.indent();\n                output.print(\"var \" + nonlocalvars);\n                output.semicolon();\n                output.newline();\n            }\n            var ρσ_Iter116 = ρσ_Iterable(imports);\n            for (var ρσ_Index116 = 0; ρσ_Index116 < ρσ_Iter116.length; ρσ_Index116++) {\n                module_ = ρσ_Iter116[ρσ_Index116];\n                module_id = module_.module_id;\n                if (module_id !== \"__main__\") {\n                    output.indent();\n                    if (module_id.indexOf(\".\") === -1) {\n                        output.print(\"ρσ_modules.\" + module_id);\n                    } else {\n                        output.print(\"ρσ_modules[\\\"\" + module_id + \"\\\"]\");\n                    }\n                    [output.space(), output.print(\"=\"), output.space(), output.print(\"{}\")];\n                    output.end_statement();\n                }\n            }\n            var ρσ_Iter117 = ρσ_Iterable(imports);\n            for (var ρσ_Index117 = 0; ρσ_Index117 < ρσ_Iter117.length; ρσ_Index117++) {\n                module_ = ρσ_Iter117[ρσ_Index117];\n                if (module_.module_id !== \"__main__\") {\n                    print_module(module_, output);\n                }\n            }\n        };\n        if (!write_imports.__argnames__) Object.defineProperties(write_imports, {\n            __argnames__ : {value: [\"module\", \"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function write_main_name(output) {\n            if (output.options.write_name) {\n                output.newline();\n                output.indent();\n                output.print(\"var __name__ = \\\"__main__\\\"\");\n                output.semicolon();\n                output.newline();\n                output.newline();\n            }\n        };\n        if (!write_main_name.__argnames__) Object.defineProperties(write_main_name, {\n            __argnames__ : {value: [\"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function const_decl(js_version) {\n            return \"var\";\n        };\n        if (!const_decl.__argnames__) Object.defineProperties(const_decl, {\n            __argnames__ : {value: [\"js_version\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function declare_exports(module_id, exports, output, docstrings) {\n            var seen, v, symbol;\n            seen = Object.create(null);\n            if (output.options.keep_docstrings && docstrings && docstrings.length) {\n                exports.push((function(){\n                    var ρσ_d = Object.create(null);\n                    ρσ_d[\"name\"] = \"__doc__\";\n                    ρσ_d[\"refname\"] = \"ρσ_module_doc__\";\n                    return ρσ_d;\n                }).call(this));\n                [output.newline(), output.indent()];\n                v = const_decl(output.options.js_version);\n                [output.assign(v + \" ρσ_module_doc__\"), output.print(JSON.stringify(create_doctring(docstrings)))];\n                output.end_statement();\n            }\n            output.newline();\n            var ρσ_Iter118 = ρσ_Iterable(exports);\n            for (var ρσ_Index118 = 0; ρσ_Index118 < ρσ_Iter118.length; ρσ_Index118++) {\n                symbol = ρσ_Iter118[ρσ_Index118];\n                if (!Object.prototype.hasOwnProperty.call(seen, symbol.name)) {\n                    output.indent();\n                    if (module_id.indexOf(\".\") === -1) {\n                        output.print(\"ρσ_modules.\" + module_id + \".\" + symbol.name);\n                    } else {\n                        output.print(\"ρσ_modules[\\\"\" + module_id + \"\\\"].\" + symbol.name);\n                    }\n                    [output.space(), output.print(\"=\"), output.space(), output.print(symbol.refname || symbol.name)];\n                    seen[ρσ_bound_index(symbol.name, seen)] = true;\n                    output.end_statement();\n                }\n            }\n        };\n        if (!declare_exports.__argnames__) Object.defineProperties(declare_exports, {\n            __argnames__ : {value: [\"module_id\", \"exports\", \"output\", \"docstrings\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function prologue(module, output) {\n            var v, needs_yield;\n            if (output.options.omit_baselib) {\n                return;\n            }\n            output.indent();\n            v = const_decl(output.options.js_version);\n            [output.print(v), output.space()];\n            output.spaced.apply(output, \"ρσ_iterator_symbol = (typeof Symbol === \\\"function\\\" && typeof Symbol.iterator === \\\"symbol\\\") ? Symbol.iterator : \\\"iterator-Symbol-5d0927e5554349048cf0e3762a228256\\\"\".split(\" \"));\n            output.end_statement();\n            [output.indent(), output.print(v), output.space()];\n            output.spaced.apply(output, \"ρσ_kwargs_symbol = (typeof Symbol === \\\"function\\\") ? Symbol(\\\"kwargs-object\\\") : \\\"kwargs-object-Symbol-5d0927e5554349048cf0e3762a228256\\\"\".split(\" \"));\n            output.end_statement();\n            [output.indent(), output.spaced(\"var\", \"ρσ_cond_temp,\", \"ρσ_expr_temp,\", \"ρσ_last_exception\"), \n            output.end_statement()];\n            [output.indent(), output.spaced(\"var\", \"ρσ_object_counter\", \"=\", \"0\"), output.end_statement()];\n            if (output.options.js_version > 5) {\n                [output.indent(), output.spaced(\"if(\", \"typeof\", \"HTMLCollection\", \"!==\", \"\\\"undefined\\\"\", \"&&\", \"typeof\", \"Symbol\", \"===\", \"\\\"function\\\")\", \"NodeList.prototype[Symbol.iterator]\", \"=\", \"HTMLCollection.prototype[Symbol.iterator]\", \"=\", \"NamedNodeMap.prototype[Symbol.iterator]\", \"=\", \"Array.prototype[Symbol.iterator]\")];\n                output.end_statement();\n            }\n            needs_yield = output.options.js_version < 6 && module.baselib[\"yield\"];\n            if (needs_yield) {\n                output.dump_yield();\n            }\n            if (!output.options.baselib_plain) {\n                throw new ValueError(\"The baselib is missing! Remember to set the baselib_plain field on the options for OutputStream\");\n            }\n            output.print(output.options.baselib_plain);\n            output.end_statement();\n        };\n        if (!prologue.__argnames__) Object.defineProperties(prologue, {\n            __argnames__ : {value: [\"module\", \"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function print_top_level(self, output) {\n            var is_main;\n            set_module_name(self.module_id);\n            is_main = self.module_id === \"__main__\";\n            function write_docstrings() {\n                var v;\n                if (is_main && output.options.keep_docstrings && self.docstrings && self.docstrings.length) {\n                    [output.newline(), output.indent()];\n                    v = const_decl(output.options.js_version);\n                    [output.assign(v + \" ρσ_module_doc__\"), output.print(JSON.stringify(create_doctring(self.docstrings)))];\n                    output.end_statement();\n                }\n            };\n            if (!write_docstrings.__module__) Object.defineProperties(write_docstrings, {\n                __module__ : {value: \"output.modules\"}\n            });\n\n            if (output.options.private_scope && is_main) {\n                output.with_parens((function() {\n                    var ρσ_anonfunc = function () {\n                        output.print(\"function()\");\n                        output.with_block((function() {\n                            var ρσ_anonfunc = function () {\n                                output.indent();\n                                output.print(\"\\\"use strict\\\"\");\n                                output.end_statement();\n                                prologue(self, output);\n                                write_imports(self, output);\n                                output.newline();\n                                output.indent();\n                                output.with_parens((function() {\n                                    var ρσ_anonfunc = function () {\n                                        output.print(\"function()\");\n                                        output.with_block((function() {\n                                            var ρσ_anonfunc = function () {\n                                                write_main_name(output);\n                                                output.newline();\n                                                declare_vars(self.localvars, output);\n                                                display_body(self.body, true, output);\n                                                output.newline();\n                                                write_docstrings();\n                                                if (self.comments_after && self.comments_after.length) {\n                                                    output.indent();\n                                                    output_comments(self.comments_after, output);\n                                                    output.newline();\n                                                }\n                                            };\n                                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                __module__ : {value: \"output.modules\"}\n                                            });\n                                            return ρσ_anonfunc;\n                                        })());\n                                    };\n                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                        __module__ : {value: \"output.modules\"}\n                                    });\n                                    return ρσ_anonfunc;\n                                })());\n                                output.print(\"();\");\n                                output.newline();\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.modules\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    };\n                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                        __module__ : {value: \"output.modules\"}\n                    });\n                    return ρσ_anonfunc;\n                })());\n                output.print(\"();\");\n                output.print(\"\");\n            } else {\n                if (is_main) {\n                    prologue(self, output);\n                    write_imports(self, output);\n                    write_main_name(output);\n                }\n                declare_vars(self.localvars, output);\n                display_body(self.body, true, output);\n                if (self.comments_after && self.comments_after.length) {\n                    output_comments(self.comments_after, output);\n                }\n            }\n            set_module_name();\n        };\n        if (!print_top_level.__argnames__) Object.defineProperties(print_top_level, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function print_module(self, output) {\n            set_module_name(self.module_id);\n            function output_module(output) {\n                declare_vars(self.localvars, output);\n                display_body(self.body, true, output);\n                declare_exports(self.module_id, self.exports, output, self.docstrings);\n            };\n            if (!output_module.__argnames__) Object.defineProperties(output_module, {\n                __argnames__ : {value: [\"output\"]},\n                __module__ : {value: \"output.modules\"}\n            });\n\n            output.newline();\n            output.indent();\n            output.with_parens((function() {\n                var ρσ_anonfunc = function () {\n                    output.print(\"function()\");\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            var okey, cached, cobj, cname, symdef, co, raw, js_version, keep_docstrings, beautify;\n                            print_comments(self, output);\n                            if (output.options.write_name) {\n                                output.indent();\n                                output.print(\"var \");\n                                output.assign(\"__name__\");\n                                output.print(\"\\\"\" + self.module_id + \"\\\"\");\n                                output.semicolon();\n                                output.newline();\n                            }\n                            function output_key(beautify, keep_docstrings, js_version) {\n                                return \"beautify:\" + beautify + \" keep_docstrings:\" + keep_docstrings + \" js_version:\" + js_version;\n                            };\n                            if (!output_key.__argnames__) Object.defineProperties(output_key, {\n                                __argnames__ : {value: [\"beautify\", \"keep_docstrings\", \"js_version\"]},\n                                __module__ : {value: \"output.modules\"}\n                            });\n\n                            okey = output_key(output.options.beautify, output.options.keep_docstrings, output.options.js_version);\n                            if (self.is_cached && ρσ_in(okey, self.outputs)) {\n                                output.print((ρσ_expr_temp = self.outputs)[(typeof okey === \"number\" && okey < 0) ? ρσ_expr_temp.length + okey : okey]);\n                            } else {\n                                output_module(output);\n                                if (self.srchash && self.filename) {\n                                    cached = (function(){\n                                        var ρσ_d = Object.create(null);\n                                        ρσ_d[\"version\"] = get_compiler_version();\n                                        ρσ_d[\"signature\"] = self.srchash;\n                                        ρσ_d[\"classes\"] = Object.create(null);\n                                        ρσ_d[\"baselib\"] = self.baselib;\n                                        ρσ_d[\"nonlocalvars\"] = self.nonlocalvars;\n                                        ρσ_d[\"imported_module_ids\"] = self.imported_module_ids;\n                                        ρσ_d[\"exports\"] = ρσ_list_decorate([]);\n                                        ρσ_d[\"outputs\"] = Object.create(null);\n                                        ρσ_d[\"discard_asserts\"] = !!output.options.discard_asserts;\n                                        return ρσ_d;\n                                    }).call(this);\n                                    var ρσ_Iter119 = ρσ_Iterable(Object.keys(self.classes));\n                                    for (var ρσ_Index119 = 0; ρσ_Index119 < ρσ_Iter119.length; ρσ_Index119++) {\n                                        cname = ρσ_Iter119[ρσ_Index119];\n                                        cobj = (ρσ_expr_temp = self.classes)[(typeof cname === \"number\" && cname < 0) ? ρσ_expr_temp.length + cname : cname];\n                                        (ρσ_expr_temp = cached.classes)[(typeof cname === \"number\" && cname < 0) ? ρσ_expr_temp.length + cname : cname] = (function(){\n                                            var ρσ_d = Object.create(null);\n                                            ρσ_d[\"name\"] = (function(){\n                                                var ρσ_d = Object.create(null);\n                                                ρσ_d[\"name\"] = cobj.name.name;\n                                                return ρσ_d;\n                                            }).call(this);\n                                            ρσ_d[\"static\"] = cobj.static;\n                                            ρσ_d[\"bound\"] = cobj.bound;\n                                            ρσ_d[\"classvars\"] = cobj.classvars;\n                                            return ρσ_d;\n                                        }).call(this);\n                                    }\n                                    var ρσ_Iter120 = ρσ_Iterable(self.exports);\n                                    for (var ρσ_Index120 = 0; ρσ_Index120 < ρσ_Iter120.length; ρσ_Index120++) {\n                                        symdef = ρσ_Iter120[ρσ_Index120];\n                                        cached.exports.push((function(){\n                                            var ρσ_d = Object.create(null);\n                                            ρσ_d[\"name\"] = symdef.name;\n                                            return ρσ_d;\n                                        }).call(this));\n                                    }\n                                    var ρσ_Iter121 = ρσ_Iterable(ρσ_list_decorate([ true, false ]));\n                                    for (var ρσ_Index121 = 0; ρσ_Index121 < ρσ_Iter121.length; ρσ_Index121++) {\n                                        beautify = ρσ_Iter121[ρσ_Index121];\n                                        var ρσ_Iter122 = ρσ_Iterable(ρσ_list_decorate([ true, false ]));\n                                        for (var ρσ_Index122 = 0; ρσ_Index122 < ρσ_Iter122.length; ρσ_Index122++) {\n                                            keep_docstrings = ρσ_Iter122[ρσ_Index122];\n                                            var ρσ_Iter123 = ρσ_Iterable(ρσ_list_decorate([ 5, 6 ]));\n                                            for (var ρσ_Index123 = 0; ρσ_Index123 < ρσ_Iter123.length; ρσ_Index123++) {\n                                                js_version = ρσ_Iter123[ρσ_Index123];\n                                                co = new OutputStream((function(){\n                                                    var ρσ_d = Object.create(null);\n                                                    ρσ_d[\"beautify\"] = beautify;\n                                                    ρσ_d[\"keep_docstrings\"] = keep_docstrings;\n                                                    ρσ_d[\"js_version\"] = js_version;\n                                                    ρσ_d[\"private_scope\"] = false;\n                                                    ρσ_d[\"write_name\"] = false;\n                                                    ρσ_d[\"discard_asserts\"] = output.options.discard_asserts;\n                                                    return ρσ_d;\n                                                }).call(this));\n                                                co.with_indent(output.indentation(), (function() {\n                                                    var ρσ_anonfunc = function () {\n                                                        output_module(co);\n                                                    };\n                                                    if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                                        __module__ : {value: \"output.modules\"}\n                                                    });\n                                                    return ρσ_anonfunc;\n                                                })());\n                                                raw = co.get();\n                                                (ρσ_expr_temp = cached.outputs)[ρσ_bound_index(output_key(beautify, keep_docstrings, js_version), ρσ_expr_temp)] = raw;\n                                            }\n                                        }\n                                    }\n                                    try {\n                                        writefile(cache_file_name(self.filename, output.options.module_cache_dir), JSON.stringify(cached, null, \"\\t\"));\n                                    } catch (ρσ_Exception) {\n                                        ρσ_last_exception = ρσ_Exception;\n                                        if (ρσ_Exception instanceof Error) {\n                                            var e = ρσ_Exception;\n                                            console.error(\"Failed to write output cache file:\", self.filename + \"-cached\", \"with error:\", e);\n                                        } else {\n                                            throw ρσ_Exception;\n                                        }\n                                    }\n                                }\n                            }\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.modules\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.modules\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            output.print(\"()\");\n            output.semicolon();\n            output.newline();\n            set_module_name();\n        };\n        if (!print_module.__argnames__) Object.defineProperties(print_module, {\n            __argnames__ : {value: [\"self\", \"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        function print_imports(container, output) {\n            var is_first_aname, akey, argname, parts, q, ρσ_unpack, i, part, self;\n            is_first_aname = true;\n            function add_aname(aname, key, from_import) {\n                if (is_first_aname) {\n                    is_first_aname = false;\n                } else {\n                    output.indent();\n                }\n                output.print(\"var \");\n                output.assign(aname);\n                if (key.indexOf(\".\") === -1) {\n                    [output.print(\"ρσ_modules.\"), output.print(key)];\n                } else {\n                    [output.print(\"ρσ_modules[\\\"\"), output.print(key), output.print(\"\\\"]\")];\n                }\n                if (from_import) {\n                    output.print(\".\");\n                    output.print(from_import);\n                }\n                output.end_statement();\n            };\n            if (!add_aname.__argnames__) Object.defineProperties(add_aname, {\n                __argnames__ : {value: [\"aname\", \"key\", \"from_import\"]},\n                __module__ : {value: \"output.modules\"}\n            });\n\n            var ρσ_Iter124 = ρσ_Iterable(container.imports);\n            for (var ρσ_Index124 = 0; ρσ_Index124 < ρσ_Iter124.length; ρσ_Index124++) {\n                self = ρσ_Iter124[ρσ_Index124];\n                if (self.argnames) {\n                    var ρσ_Iter125 = ρσ_Iterable(self.argnames);\n                    for (var ρσ_Index125 = 0; ρσ_Index125 < ρσ_Iter125.length; ρσ_Index125++) {\n                        argname = ρσ_Iter125[ρσ_Index125];\n                        akey = (argname.alias) ? argname.alias.name : argname.name;\n                        add_aname(akey, self.key, argname.name);\n                    }\n                } else {\n                    if (self.alias) {\n                        add_aname(self.alias.name, self.key, false);\n                    } else {\n                        parts = self.key.split(\".\");\n                        var ρσ_Iter126 = ρσ_Iterable(enumerate(parts));\n                        for (var ρσ_Index126 = 0; ρσ_Index126 < ρσ_Iter126.length; ρσ_Index126++) {\n                            ρσ_unpack = ρσ_Iter126[ρσ_Index126];\n                            i = ρσ_unpack[0];\n                            part = ρσ_unpack[1];\n                            if (i === 0) {\n                                add_aname(part, part, false);\n                            } else {\n                                q = parts.slice(0, i + 1).join(\".\");\n                                output.indent();\n                                output.spaced(q, \"=\", \"ρσ_modules[\\\"\" + q + \"\\\"]\");\n                                output.end_statement();\n                            }\n                        }\n                    }\n                }\n            }\n        };\n        if (!print_imports.__argnames__) Object.defineProperties(print_imports, {\n            __argnames__ : {value: [\"container\", \"output\"]},\n            __module__ : {value: \"output.modules\"}\n        });\n\n        ρσ_modules[\"output.modules\"].write_imports = write_imports;\n        ρσ_modules[\"output.modules\"].write_main_name = write_main_name;\n        ρσ_modules[\"output.modules\"].const_decl = const_decl;\n        ρσ_modules[\"output.modules\"].declare_exports = declare_exports;\n        ρσ_modules[\"output.modules\"].prologue = prologue;\n        ρσ_modules[\"output.modules\"].print_top_level = print_top_level;\n        ρσ_modules[\"output.modules\"].print_module = print_module;\n        ρσ_modules[\"output.modules\"].print_imports = print_imports;\n    })();\n\n    (function(){\n        var __name__ = \"output.codegen\";\n        var noop = ρσ_modules.utils.noop;\n\n        var PRECEDENCE = ρσ_modules.parse.PRECEDENCE;\n\n        var AST_Array = ρσ_modules.ast.AST_Array;\n        var AST_Assign = ρσ_modules.ast.AST_Assign;\n        var AST_BaseCall = ρσ_modules.ast.AST_BaseCall;\n        var AST_Binary = ρσ_modules.ast.AST_Binary;\n        var AST_BlockStatement = ρσ_modules.ast.AST_BlockStatement;\n        var AST_Break = ρσ_modules.ast.AST_Break;\n        var AST_Class = ρσ_modules.ast.AST_Class;\n        var AST_Conditional = ρσ_modules.ast.AST_Conditional;\n        var AST_Constant = ρσ_modules.ast.AST_Constant;\n        var AST_Continue = ρσ_modules.ast.AST_Continue;\n        var AST_Debugger = ρσ_modules.ast.AST_Debugger;\n        var AST_Definitions = ρσ_modules.ast.AST_Definitions;\n        var AST_Directive = ρσ_modules.ast.AST_Directive;\n        var AST_Do = ρσ_modules.ast.AST_Do;\n        var AST_Dot = ρσ_modules.ast.AST_Dot;\n        var is_node_type = ρσ_modules.ast.is_node_type;\n        var AST_EmptyStatement = ρσ_modules.ast.AST_EmptyStatement;\n        var AST_Exit = ρσ_modules.ast.AST_Exit;\n        var AST_ExpressiveObject = ρσ_modules.ast.AST_ExpressiveObject;\n        var AST_ForIn = ρσ_modules.ast.AST_ForIn;\n        var AST_ForJS = ρσ_modules.ast.AST_ForJS;\n        var AST_Function = ρσ_modules.ast.AST_Function;\n        var AST_Hole = ρσ_modules.ast.AST_Hole;\n        var AST_If = ρσ_modules.ast.AST_If;\n        var AST_Imports = ρσ_modules.ast.AST_Imports;\n        var AST_Infinity = ρσ_modules.ast.AST_Infinity;\n        var AST_Lambda = ρσ_modules.ast.AST_Lambda;\n        var AST_ListComprehension = ρσ_modules.ast.AST_ListComprehension;\n        var AST_LoopControl = ρσ_modules.ast.AST_LoopControl;\n        var AST_NaN = ρσ_modules.ast.AST_NaN;\n        var AST_New = ρσ_modules.ast.AST_New;\n        var AST_Node = ρσ_modules.ast.AST_Node;\n        var AST_Number = ρσ_modules.ast.AST_Number;\n        var AST_Object = ρσ_modules.ast.AST_Object;\n        var AST_ObjectKeyVal = ρσ_modules.ast.AST_ObjectKeyVal;\n        var AST_ObjectProperty = ρσ_modules.ast.AST_ObjectProperty;\n        var AST_PropAccess = ρσ_modules.ast.AST_PropAccess;\n        var AST_RegExp = ρσ_modules.ast.AST_RegExp;\n        var AST_Return = ρσ_modules.ast.AST_Return;\n        var AST_Set = ρσ_modules.ast.AST_Set;\n        var AST_Seq = ρσ_modules.ast.AST_Seq;\n        var AST_SimpleStatement = ρσ_modules.ast.AST_SimpleStatement;\n        var AST_Splice = ρσ_modules.ast.AST_Splice;\n        var AST_Statement = ρσ_modules.ast.AST_Statement;\n        var AST_StatementWithBody = ρσ_modules.ast.AST_StatementWithBody;\n        var AST_String = ρσ_modules.ast.AST_String;\n        var AST_Sub = ρσ_modules.ast.AST_Sub;\n        var AST_ItemAccess = ρσ_modules.ast.AST_ItemAccess;\n        var AST_Symbol = ρσ_modules.ast.AST_Symbol;\n        var AST_This = ρσ_modules.ast.AST_This;\n        var AST_Throw = ρσ_modules.ast.AST_Throw;\n        var AST_Toplevel = ρσ_modules.ast.AST_Toplevel;\n        var AST_Try = ρσ_modules.ast.AST_Try;\n        var AST_Unary = ρσ_modules.ast.AST_Unary;\n        var AST_UnaryPrefix = ρσ_modules.ast.AST_UnaryPrefix;\n        var AST_Undefined = ρσ_modules.ast.AST_Undefined;\n        var AST_Var = ρσ_modules.ast.AST_Var;\n        var AST_VarDef = ρσ_modules.ast.AST_VarDef;\n        var AST_Assert = ρσ_modules.ast.AST_Assert;\n        var AST_Verbatim = ρσ_modules.ast.AST_Verbatim;\n        var AST_While = ρσ_modules.ast.AST_While;\n        var AST_With = ρσ_modules.ast.AST_With;\n        var AST_Yield = ρσ_modules.ast.AST_Yield;\n        var TreeWalker = ρσ_modules.ast.TreeWalker;\n        var AST_Existential = ρσ_modules.ast.AST_Existential;\n\n        var print_try = ρσ_modules[\"output.exceptions\"].print_try;\n\n        var print_class = ρσ_modules[\"output.classes\"].print_class;\n\n        var print_array = ρσ_modules[\"output.literals\"].print_array;\n        var print_obj_literal = ρσ_modules[\"output.literals\"].print_obj_literal;\n        var print_object = ρσ_modules[\"output.literals\"].print_object;\n        var print_set = ρσ_modules[\"output.literals\"].print_set;\n        var print_regexp = ρσ_modules[\"output.literals\"].print_regexp;\n\n        var print_do_loop = ρσ_modules[\"output.loops\"].print_do_loop;\n        var print_while_loop = ρσ_modules[\"output.loops\"].print_while_loop;\n        var print_for_loop_body = ρσ_modules[\"output.loops\"].print_for_loop_body;\n        var print_for_in = ρσ_modules[\"output.loops\"].print_for_in;\n        var print_list_comprehension = ρσ_modules[\"output.loops\"].print_list_comprehension;\n\n        var print_top_level = ρσ_modules[\"output.modules\"].print_top_level;\n        var print_imports = ρσ_modules[\"output.modules\"].print_imports;\n\n        var print_comments = ρσ_modules[\"output.comments\"].print_comments;\n\n        var print_getattr = ρσ_modules[\"output.operators\"].print_getattr;\n        var print_getitem = ρσ_modules[\"output.operators\"].print_getitem;\n        var print_rich_getitem = ρσ_modules[\"output.operators\"].print_rich_getitem;\n        var print_splice_assignment = ρσ_modules[\"output.operators\"].print_splice_assignment;\n        var print_unary_prefix = ρσ_modules[\"output.operators\"].print_unary_prefix;\n        var print_binary_op = ρσ_modules[\"output.operators\"].print_binary_op;\n        var print_assign = ρσ_modules[\"output.operators\"].print_assign;\n        var print_conditional = ρσ_modules[\"output.operators\"].print_conditional;\n        var print_seq = ρσ_modules[\"output.operators\"].print_seq;\n        var print_existential = ρσ_modules[\"output.operators\"].print_existential;\n\n        var print_function = ρσ_modules[\"output.functions\"].print_function;\n        var print_function_call = ρσ_modules[\"output.functions\"].print_function_call;\n\n        var print_bracketed = ρσ_modules[\"output.statements\"].print_bracketed;\n        var first_in_statement = ρσ_modules[\"output.statements\"].first_in_statement;\n        var force_statement = ρσ_modules[\"output.statements\"].force_statement;\n        var print_with = ρσ_modules[\"output.statements\"].print_with;\n        var print_assert = ρσ_modules[\"output.statements\"].print_assert;\n\n        var make_block = ρσ_modules[\"output.utils\"].make_block;\n        var make_num = ρσ_modules[\"output.utils\"].make_num;\n\n        function generate_code() {\n            function DEFPRINT(nodetype, generator) {\n                nodetype.prototype._codegen = generator;\n            };\n            if (!DEFPRINT.__argnames__) Object.defineProperties(DEFPRINT, {\n                __argnames__ : {value: [\"nodetype\", \"generator\"]},\n                __module__ : {value: \"output.codegen\"}\n            });\n\n            AST_Node.prototype.print = (function() {\n                var ρσ_anonfunc = function (stream, force_parens) {\n                    var self, generator;\n                    self = this;\n                    generator = self._codegen;\n                    stream.push_node(self);\n                    if (force_parens || self.needs_parens(stream)) {\n                        stream.with_parens((function() {\n                            var ρσ_anonfunc = function () {\n                                self.add_comments(stream);\n                                generator(self, stream);\n                            };\n                            if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                                __module__ : {value: \"output.codegen\"}\n                            });\n                            return ρσ_anonfunc;\n                        })());\n                    } else {\n                        self.add_comments(stream);\n                        generator(self, stream);\n                    }\n                    stream.pop_node();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"stream\", \"force_parens\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            AST_Node.prototype.add_comments = (function() {\n                var ρσ_anonfunc = function (output) {\n                    if (!is_node_type(this, AST_Toplevel)) {\n                        print_comments(this, output);\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            function PARENS(nodetype, func) {\n                nodetype.prototype.needs_parens = func;\n            };\n            if (!PARENS.__argnames__) Object.defineProperties(PARENS, {\n                __argnames__ : {value: [\"nodetype\", \"func\"]},\n                __module__ : {value: \"output.codegen\"}\n            });\n\n            PARENS(AST_Node, (function() {\n                var ρσ_anonfunc = function () {\n                    return false;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Function, (function() {\n                var ρσ_anonfunc = function (output) {\n                    return first_in_statement(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Object, (function() {\n                var ρσ_anonfunc = function (output) {\n                    return first_in_statement(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Unary, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    return is_node_type(p, AST_PropAccess) && p.expression === this;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Seq, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    return is_node_type(p, AST_Unary) || is_node_type(p, AST_VarDef) || is_node_type(p, AST_Dot) || is_node_type(p, AST_ObjectProperty) || is_node_type(p, AST_Conditional);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Binary, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p, po, pp, so, sp;\n                    p = output.parent();\n                    if (is_node_type(p, AST_BaseCall) && p.expression === this) {\n                        return true;\n                    }\n                    if (is_node_type(p, AST_Unary)) {\n                        return true;\n                    }\n                    if (is_node_type(p, AST_PropAccess) && p.expression === this) {\n                        return true;\n                    }\n                    if (is_node_type(p, AST_Binary)) {\n                        po = p.operator;\n                        pp = PRECEDENCE[(typeof po === \"number\" && po < 0) ? PRECEDENCE.length + po : po];\n                        so = this.operator;\n                        sp = PRECEDENCE[(typeof so === \"number\" && so < 0) ? PRECEDENCE.length + so : so];\n                        if (pp > sp || pp === sp && this === p.right && !((so === po && (so === \"*\" || so === \"&&\" || so === \"||\")))) {\n                            return true;\n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_PropAccess, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    if (is_node_type(p, AST_New) && p.expression === this) {\n                        try {\n                            this.walk(new TreeWalker((function() {\n                                var ρσ_anonfunc = function (node) {\n                                    if (is_node_type(node, AST_BaseCall)) {\n                                        throw p;\n                                    }\n                                };\n                                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                                    __argnames__ : {value: [\"node\"]},\n                                    __module__ : {value: \"output.codegen\"}\n                                });\n                                return ρσ_anonfunc;\n                            })()));\n                        } catch (ρσ_Exception) {\n                            ρσ_last_exception = ρσ_Exception;\n                            {\n                                var ex = ρσ_Exception;\n                                if (ex !== p) {\n                                    throw ex;\n                                }\n                                return true;\n                            } \n                        }\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_BaseCall, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    return is_node_type(p, AST_New) && p.expression === this;\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_New, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    if (this.args.length === 0 && (is_node_type(p, AST_PropAccess) || is_node_type(p, AST_BaseCall) && p.expression === this)) {\n                        return true;\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_Number, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    if (this.value < 0 && is_node_type(p, AST_PropAccess) && p.expression === this) {\n                        return true;\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            PARENS(AST_NaN, (function() {\n                var ρσ_anonfunc = function (output) {\n                    var p;\n                    p = output.parent();\n                    if (is_node_type(p, AST_PropAccess) && p.expression === this) {\n                        return true;\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            function assign_and_conditional_paren_rules(output) {\n                var p;\n                p = output.parent();\n                if (is_node_type(p, AST_Unary)) {\n                    return true;\n                }\n                if (is_node_type(p, AST_Binary) && !(is_node_type(p, AST_Assign))) {\n                    return true;\n                }\n                if (is_node_type(p, AST_BaseCall) && p.expression === this) {\n                    return true;\n                }\n                if (is_node_type(p, AST_Conditional) && p.condition === this) {\n                    return true;\n                }\n                if (is_node_type(p, AST_PropAccess) && p.expression === this) {\n                    return true;\n                }\n            };\n            if (!assign_and_conditional_paren_rules.__argnames__) Object.defineProperties(assign_and_conditional_paren_rules, {\n                __argnames__ : {value: [\"output\"]},\n                __module__ : {value: \"output.codegen\"}\n            });\n\n            PARENS(AST_Assign, assign_and_conditional_paren_rules);\n            PARENS(AST_Conditional, assign_and_conditional_paren_rules);\n            DEFPRINT(AST_Directive, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print_string(self.value);\n                    output.semicolon();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Debugger, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"debugger\");\n                    output.semicolon();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            AST_StatementWithBody.prototype._do_print_body = (function() {\n                var ρσ_anonfunc = function (output) {\n                    force_statement(this.body, output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_Statement, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self.body.print(output);\n                    output.semicolon();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Toplevel, print_top_level);\n            DEFPRINT(AST_Imports, print_imports);\n            DEFPRINT(AST_SimpleStatement, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    if (!(is_node_type(self.body, AST_EmptyStatement))) {\n                        self.body.print(output);\n                        output.semicolon();\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_BlockStatement, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    print_bracketed(self, output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_EmptyStatement, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Do, print_do_loop);\n            DEFPRINT(AST_While, print_while_loop);\n            AST_ForIn.prototype._do_print_body = print_for_loop_body;\n            DEFPRINT(AST_ForIn, print_for_in);\n            AST_ForJS.prototype._do_print_body = (function() {\n                var ρσ_anonfunc = function (output) {\n                    var self;\n                    self = this;\n                    output.with_block((function() {\n                        var ρσ_anonfunc = function () {\n                            var stmt;\n                            var ρσ_Iter127 = ρσ_Iterable(self.body.body);\n                            for (var ρσ_Index127 = 0; ρσ_Index127 < ρσ_Iter127.length; ρσ_Index127++) {\n                                stmt = ρσ_Iter127[ρσ_Index127];\n                                output.indent();\n                                stmt.print(output);\n                                output.newline();\n                            }\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.codegen\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_ForJS, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"for\");\n                    output.space();\n                    output.with_parens((function() {\n                        var ρσ_anonfunc = function () {\n                            self.condition.print(output);\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.codegen\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                    output.space();\n                    self._do_print_body(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_ListComprehension, print_list_comprehension);\n            DEFPRINT(AST_With, print_with);\n            DEFPRINT(AST_Assert, print_assert);\n            AST_Lambda.prototype._do_print = print_function;\n            DEFPRINT(AST_Lambda, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            AST_Class.prototype._do_print = print_class;\n            DEFPRINT(AST_Class, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            AST_Exit.prototype._do_print = (function() {\n                var ρσ_anonfunc = function (output, kind) {\n                    var self;\n                    self = this;\n                    output.print(kind);\n                    if (self.value) {\n                        output.space();\n                        self.value.print(output);\n                    }\n                    output.semicolon();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\", \"kind\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_Yield, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"yield\" + ((self.is_yield_from) ? \"*\" : \"\"));\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Return, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"return\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Throw, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"throw\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            AST_LoopControl.prototype._do_print = (function() {\n                var ρσ_anonfunc = function (output, kind) {\n                    output.print(kind);\n                    if (this.label) {\n                        output.space();\n                        this.label.print(output);\n                    }\n                    output.semicolon();\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\", \"kind\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_Break, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"break\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Continue, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"continue\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            function make_then(self, output) {\n                var b;\n                if (output.options.bracketize) {\n                    make_block(self.body, output);\n                    return;\n                }\n                if (!self.body) {\n                    return output.force_semicolon();\n                }\n                if (is_node_type(self.body, AST_Do) && output.options.ie_proof) {\n                    make_block(self.body, output);\n                    return;\n                }\n                b = self.body;\n                while (true) {\n                    if (is_node_type(b, AST_If)) {\n                        if (!b.alternative) {\n                            make_block(self.body, output);\n                            return;\n                        }\n                        b = b.alternative;\n                    } else if (is_node_type(b, AST_StatementWithBody)) {\n                        b = b.body;\n                    } else {\n                        break;\n                    }\n                }\n                force_statement(self.body, output);\n            };\n            if (!make_then.__argnames__) Object.defineProperties(make_then, {\n                __argnames__ : {value: [\"self\", \"output\"]},\n                __module__ : {value: \"output.codegen\"}\n            });\n\n            DEFPRINT(AST_If, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"if\");\n                    output.space();\n                    output.with_parens((function() {\n                        var ρσ_anonfunc = function () {\n                            self.condition.print(output);\n                        };\n                        if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                            __module__ : {value: \"output.codegen\"}\n                        });\n                        return ρσ_anonfunc;\n                    })());\n                    output.space();\n                    if (self.alternative) {\n                        make_then(self, output);\n                        output.space();\n                        output.print(\"else\");\n                        output.space();\n                        force_statement(self.alternative, output);\n                    } else {\n                        self._do_print_body(output);\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Try, print_try);\n            AST_Definitions.prototype._do_print = (function() {\n                var ρσ_anonfunc = function (output, kind) {\n                    var ρσ_unpack, i, def_, p, in_for, avoid_semicolon;\n                    output.print(kind);\n                    output.space();\n                    var ρσ_Iter128 = ρσ_Iterable(enumerate(this.definitions));\n                    for (var ρσ_Index128 = 0; ρσ_Index128 < ρσ_Iter128.length; ρσ_Index128++) {\n                        ρσ_unpack = ρσ_Iter128[ρσ_Index128];\n                        i = ρσ_unpack[0];\n                        def_ = ρσ_unpack[1];\n                        if (i) {\n                            output.comma();\n                        }\n                        def_.print(output);\n                    }\n                    p = output.parent();\n                    in_for = is_node_type(p, AST_ForIn);\n                    avoid_semicolon = in_for && p.init === this;\n                    if (!avoid_semicolon) {\n                        output.semicolon();\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"output\", \"kind\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_Var, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output, \"var\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            function parenthesize_for_noin(node, output, noin) {\n                if (!noin) {\n                    node.print(output);\n                } else {\n                    try {\n                        node.walk(new TreeWalker((function() {\n                            var ρσ_anonfunc = function (node) {\n                                if (is_node_type(node, AST_Binary) && node.operator === \"in\") {\n                                    throw output;\n                                }\n                            };\n                            if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                                __argnames__ : {value: [\"node\"]},\n                                __module__ : {value: \"output.codegen\"}\n                            });\n                            return ρσ_anonfunc;\n                        })()));\n                        node.print(output);\n                    } catch (ρσ_Exception) {\n                        ρσ_last_exception = ρσ_Exception;\n                        {\n                            var ex = ρσ_Exception;\n                            if (ex !== output) {\n                                throw ex;\n                            }\n                            node.print(output, true);\n                        } \n                    }\n                }\n            };\n            if (!parenthesize_for_noin.__argnames__) Object.defineProperties(parenthesize_for_noin, {\n                __argnames__ : {value: [\"node\", \"output\", \"noin\"]},\n                __module__ : {value: \"output.codegen\"}\n            });\n\n            DEFPRINT(AST_VarDef, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    var p, noin;\n                    self.name.print(output);\n                    if (self.value) {\n                        output.assign(\"\");\n                        p = output.parent(1);\n                        noin = is_node_type(p, AST_ForIn);\n                        parenthesize_for_noin(self.value, output, noin);\n                    }\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_BaseCall, print_function_call);\n            AST_Seq.prototype._do_print = print_seq;\n            DEFPRINT(AST_Seq, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self._do_print(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Dot, print_getattr);\n            DEFPRINT(AST_Sub, print_getitem);\n            DEFPRINT(AST_ItemAccess, print_rich_getitem);\n            DEFPRINT(AST_Splice, print_splice_assignment);\n            DEFPRINT(AST_UnaryPrefix, print_unary_prefix);\n            DEFPRINT(AST_Binary, print_binary_op);\n            DEFPRINT(AST_Existential, print_existential);\n            DEFPRINT(AST_Assign, print_assign);\n            DEFPRINT(AST_Conditional, print_conditional);\n            DEFPRINT(AST_Array, print_array);\n            DEFPRINT(AST_ExpressiveObject, print_obj_literal);\n            DEFPRINT(AST_Object, print_object);\n            DEFPRINT(AST_ObjectKeyVal, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    self.key.print(output);\n                    output.colon();\n                    self.value.print(output);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Set, print_set);\n            AST_Symbol.prototype.definition = (function() {\n                var ρσ_anonfunc = function () {\n                    return this.thedef;\n                };\n                if (!ρσ_anonfunc.__module__) Object.defineProperties(ρσ_anonfunc, {\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })();\n            DEFPRINT(AST_Symbol, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    var def_;\n                    def_ = self.definition();\n                    output.print_name((def_) ? def_.mangled_name || def_.name : self.name);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Undefined, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"void 0\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Hole, noop);\n            DEFPRINT(AST_Infinity, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"1/0\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_NaN, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"0/0\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_This, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(\"this\");\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Constant, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(self.value);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_String, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print_string(self.value);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Verbatim, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(self.value);\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_Number, (function() {\n                var ρσ_anonfunc = function (self, output) {\n                    output.print(make_num(self.value));\n                };\n                if (!ρσ_anonfunc.__argnames__) Object.defineProperties(ρσ_anonfunc, {\n                    __argnames__ : {value: [\"self\", \"output\"]},\n                    __module__ : {value: \"output.codegen\"}\n                });\n                return ρσ_anonfunc;\n            })());\n            DEFPRINT(AST_RegExp, print_regexp);\n        };\n        if (!generate_code.__module__) Object.defineProperties(generate_code, {\n            __module__ : {value: \"output.codegen\"}\n        });\n\n        ρσ_modules[\"output.codegen\"].generate_code = generate_code;\n    })();\n\n    (function(){\n\n        var __name__ = \"__main__\";\n\n\n        var ast, ast_node;\n        var DefaultsError = ρσ_modules.utils.DefaultsError;\n        var string_template = ρσ_modules.utils.string_template;\n\n        var ImportError = ρσ_modules.errors.ImportError;\n        var SyntaxError = ρσ_modules.errors.SyntaxError;\n\n        var ALL_KEYWORDS = ρσ_modules.tokenizer.ALL_KEYWORDS;\n        var IDENTIFIER_PAT = ρσ_modules.tokenizer.IDENTIFIER_PAT;\n        var tokenizer = ρσ_modules.tokenizer.tokenizer;\n\n        var parse = ρσ_modules.parse.parse;\n        var NATIVE_CLASSES = ρσ_modules.parse.NATIVE_CLASSES;\n        var compile_time_decorators = ρσ_modules.parse.compile_time_decorators;\n\n        var OutputStream = ρσ_modules[\"output.stream\"].OutputStream;\n\n        var generate_code = ρσ_modules[\"output.codegen\"].generate_code;\n\n        generate_code();\n        if (typeof exports === \"object\") {\n            exports.DefaultsError = DefaultsError;\n            exports.parse = parse;\n            exports.compile_time_decorators = compile_time_decorators;\n            exports.OutputStream = OutputStream;\n            exports.string_template = string_template;\n            exports.ALL_KEYWORDS = ALL_KEYWORDS;\n            exports.IDENTIFIER_PAT = IDENTIFIER_PAT;\n            exports.NATIVE_CLASSES = NATIVE_CLASSES;\n            exports.ImportError = ImportError;\n            exports.SyntaxError = SyntaxError;\n            exports.tokenizer = tokenizer;\n            ast = ρσ_modules[\"ast\"];\n            var ρσ_Iter129 = ρσ_Iterable(ast);\n            for (var ρσ_Index129 = 0; ρσ_Index129 < ρσ_Iter129.length; ρσ_Index129++) {\n                ast_node = ρσ_Iter129[ρσ_Index129];\n                if (ast_node.substr(0, 4) === \"AST_\") {\n                    exports[(typeof ast_node === \"number\" && ast_node < 0) ? exports.length + ast_node : ast_node] = ast[(typeof ast_node === \"number\" && ast_node < 0) ? ast.length + ast_node : ast_node];\n                }\n            }\n        }\n    })();\n})();"
  },
  {
    "path": "release/signatures.json",
    "content": "{\n    \"ast\": \"7a1a1800d9ee7af7f7153eee38002e4e9dcfb71e\",\n    \"baselib-builtins\": \"50927b38fded9bd9dbe14c42a20dd8e930ac021f\",\n    \"baselib-containers\": \"59936060f92bff9c83a70489276f7e2f6edb6630\",\n    \"baselib-errors\": \"f2423e1e2489bdd7fb8c8725bb76436898c8008c\",\n    \"baselib-internal\": \"7a8544ec19d35ac9f6cea9bf1a8584b105d648b2\",\n    \"baselib-itertools\": \"ab1f3257642c8d26fab1ff9d392814a459a60cdb\",\n    \"baselib-str\": \"8c396e4fae02ae34b6d3d805becf7bfdd36625ee\",\n    \"compiler\": \"cfbfceb0439fed3302f78d80b303dca713b25e7b\",\n    \"errors\": \"d1b33848d19b141e19cc079cf78421f29b6d2c05\",\n    \"output/__init__\": \"da39a3ee5e6b4b0d3255bfef95601890afd80709\",\n    \"output/classes\": \"d05c1992cc91b337a4e4ff137b0aa3d626e6624b\",\n    \"output/codegen\": \"0519a88c2704fe60b98fe747ca39f6be43b9abf3\",\n    \"output/comments\": \"78ec38d8b34da96c078653e2d0d4049d7003906b\",\n    \"output/exceptions\": \"c7d90155694c7108e94d0940a160ae83725421d7\",\n    \"output/functions\": \"abaa81b171359eb77be6ea87cbdf9d7421d4622b\",\n    \"output/literals\": \"fdbfb744fec8dfea1e1c62cb49767c60160fd402\",\n    \"output/loops\": \"f59cc623320f57edb01953f7877d712758e9f825\",\n    \"output/modules\": \"bd3e3f3f6794fb6e401867b4d011c4e3aab98893\",\n    \"output/operators\": \"bcda6aeab9214523252481c8dba2741c01f725bb\",\n    \"output/statements\": \"7d8dfdc0b43e3e430be7ce3b23ffaf1b41408d8c\",\n    \"output/stream\": \"46375cb467477ac898546e818bfdfa5be738c352\",\n    \"output/utils\": \"595968f96f6fdcc51eb41c34d64c92bb595e3cb1\",\n    \"parse\": \"d5c1a77662dfcff841dfcd368d5dbb129a592f5d\",\n    \"string_interpolation\": \"bff1cc76d772d24d35707f6c794f38734ca08376\",\n    \"tokenizer\": \"1b23dc17814989686f4dc5b69f776b127f63c520\",\n    \"unicode_aliases\": \"79ac6eaa5e6be44a5397d62c561f854a8fe7528e\",\n    \"utils\": \"c1666db819aa7c8db38697e34e18362e3cb45869\",\n    \"#compiler#\": \"0b52100610a7474259047753e409de52cdb3e12c\",\n    \"#compiled_with#\": \"0b52100610a7474259047753e409de52cdb3e12c\"\n}"
  },
  {
    "path": "session.vim",
    "content": "set wildignore+=*.pyj-cached\nset wildignore+=node_modules\nimap <F4> ρσ_\ncmap <F4> ρσ_\n"
  },
  {
    "path": "setup.cfg",
    "content": "[rapydscript]\nglobals=assert,RapydScript\n"
  },
  {
    "path": "src/ast.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom utils import noop\n\ndef is_node_type(node, typ):\n    return v'node instanceof typ'\n\n# Basic classes {{{\n\nclass AST:\n\n    properties = {}\n\n    def __init__(self, initializer):\n        # Walk the prototype change and copy all defined properties from the\n        # initializer object\n        if initializer:\n            obj = self\n            while True:\n                obj = Object.getPrototypeOf(obj)\n                if obj is None:\n                    break\n                for v'var i in obj.properties':  # noqa: unused-local\n                    v'self[i] = initializer[i]'\n\n    def clone(self):\n        return v'new self.constructor(self)'\n\n\nclass AST_Token(AST):\n    ' Tokens generated by the tokenizer in the first stage of parsing '\n    properties = {\n        'type': 'The type of the token',\n        'value': 'The value of the token',\n        'line': 'The line number at which the token occurs',\n        'col': 'The column number at which the token occurs',\n        'pos': '',\n        'endpos': '',\n        'nlb':'True iff there was a newline before this token',\n        'comments_before':'True iff there were comments before this token',\n        'file':'The filename in which this token occurs',\n        'leading_whitespace': 'The leading whitespace for the line on which this token occurs',\n    }\n\nclass AST_Node(AST):\n    \"Base class of all AST nodes\"\n    properties = {\n        'start': \"[AST_Token] The first token of this node\",\n        'end': \"[AST_Token] The last token of this node\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self)\n\n    def walk(self, visitor):\n        return self._walk(visitor)\n\n    def _dump(self, depth=100, omit={'start', 'end'}, offset=0, include_name=True):\n        p = console.log\n        reset = \"\\x1b[0m\"\n        yellow = \"\\x1b[33m\"\n        blue = \"\\x1b[34m\"\n        green = \"\\x1b[32m\"\n        red = \"\\x1b[31m\"\n        magenta = \"\\x1b[35m\"\n        pad = Array(offset + 1).join('  ')\n\n        if include_name:\n            p(pad + yellow + self.constructor.name.slice(4) + reset)\n        for key in self:\n            if key in omit:\n                continue\n\n            if Array.isArray(self[key]):\n                if self[key].length:\n                    p(pad + ' ' + blue + key + ': ' + reset + '[')\n                    if depth > 1:\n                        for element in self[key]:\n                            element._dump(depth-1, omit, offset+1, True)\n                    else:\n                        for element in self[key]:\n                            p(pad + '   ' + yellow + element.constructor.name.slice(4) + reset)\n                    p(pad + ' ]')\n                else:\n                    p(pad + ' ' + blue + key + ': ' + reset + '[]')\n            elif self[key]:\n                if is_node_type(self[key], AST):\n                    tname = self[key].constructor.name.slice(4)\n                    if tname is 'Token':\n                        p(pad + ' ' + blue + key + ': ' + magenta + tname + reset)\n                        for property in self[key]:\n                            p(pad + '   ' + blue + property + ': ' + reset + self[key][property])\n                    else:\n                        p(pad + ' ' + blue + key + ': ' + yellow + tname + reset)\n                        if depth > 1:\n                            self[key]._dump(depth-1, omit, offset+1, False)\n                elif jstype(self[key]) is \"string\":\n                    p(pad + ' ' + blue + key + ': ' + green + '\"' + self[key] + '\"' + reset)\n                elif jstype(self[key]) is \"number\":\n                    p(pad + ' ' + blue + key + ': ' + green + self[key] + reset)\n                else:\n                    # unexpected object\n                    p(pad + ' ' + blue + key + ': ' + red + self[key] + reset)\n            else:\n                # none/undefined\n                p(pad + ' ' + blue + key + ': ' + reset + self[key])\n\n    def dump(self, depth=2, omit={}):\n        ' a more user-friendly way to dump the AST tree than console.log'\n        return self._dump(depth, omit, 0, True)\n# }}}\n\n# Statements {{{\n\nclass AST_Statement(AST_Node):\n    \"Base class of all statements\"\n\nclass AST_Debugger(AST_Statement):\n    \"Represents a debugger statement\"\n\nclass AST_Directive(AST_Statement):\n    'Represents a directive, like \"use strict\";'\n    properties = {\n        'value': \"[string] The value of this directive as a plain string (it's not an AST_String!)\",\n        'scope': \"[AST_Scope/S] The scope that this directive affects\"\n    }\n\nclass AST_SimpleStatement(AST_Statement):\n    \"A statement consisting of an expression, i.e. a = 1 + 2\"\n    properties =  {\n        'body': \"[AST_Node] an expression node (should not be instanceof AST_Statement)\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.body._walk(visitor)\n        )\n\nclass AST_Assert(AST_Statement):\n    \"An assert statement, e.g. assert True, 'an error message'\"\n    properties = {\n        'condition': \"[AST_Node] the expression that should be tested\",\n        'message': \"[AST_Node*] the expression that is the error message or None\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.condition._walk(visitor)\n            if self.message:\n                self.message._walk(visitor)\n        )\n\n\ndef walk_body(node, visitor):\n    if is_node_type(node.body, AST_Statement):\n        node.body._walk(visitor)\n    elif node.body:\n        for stat in node.body:\n            stat._walk(visitor)\n\nclass AST_Block(AST_Statement):\n    \"A body of statements (usually bracketed)\"\n    properties =  {\n        'body': \"[AST_Statement*] an array of statements\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            walk_body(self, visitor)\n        )\n\nclass AST_BlockStatement(AST_Block):\n    \"A block statement\"\n\nclass AST_EmptyStatement(AST_Statement):\n    \"The empty statement (empty block or simply a semicolon)\"\n    properties = {\n        'stype': \"[string] the type of empty statement. Is ; for semicolons\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self)\n\nclass AST_StatementWithBody(AST_Statement):\n    \"Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`\"\n    properties = {\n        'body': \"[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.body._walk(visitor)\n        )\n\nclass AST_DWLoop(AST_StatementWithBody):\n    \"Base class for do/while statements\"\n    properties = {\n        'condition': \"[AST_Node] the loop condition.  Should not be instanceof AST_Statement\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.condition._walk(visitor)\n            self.body._walk(visitor)\n        )\n\nclass AST_Do(AST_DWLoop):\n    \"A `do` statement\"\n\nclass AST_While(AST_DWLoop):\n    \"A `while` statement\"\n\nclass AST_ForIn(AST_StatementWithBody):\n    \"A `for ... in` statement\"\n    properties = {\n        'init': \"[AST_Node] the `for/in` initialization code\",\n        'name': \"[AST_SymbolRef?] the loop variable, only if `init` is AST_Var\",\n        'object': \"[AST_Node] the object that we're looping through\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.init._walk(visitor)\n            if (self.name) self.name._walk(visitor)\n            self.object._walk(visitor)\n            if self.body:\n                self.body._walk(visitor)\n        )\n\nclass AST_ForJS(AST_StatementWithBody):\n    \"A `for ... in` statement\"\n    properties = {\n        'condition': \"[AST_Verbatim] raw JavaScript conditional\"\n    }\n\nclass AST_ListComprehension(AST_ForIn):\n    \"A list comprehension expression\"\n    properties = {\n        'condition': \"[AST_Node] the `if` condition\",\n        'statement': \"[AST_Node] statement to perform on each element before returning it\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.init._walk(visitor)\n            self.object._walk(visitor)\n            self.statement._walk(visitor)\n            if (self.condition) self.condition._walk(visitor)\n        )\n\nclass AST_SetComprehension(AST_ListComprehension):\n    'A set comprehension'\n\nclass AST_DictComprehension(AST_ListComprehension):\n    'A set comprehension'\n    properties = {\n        'value_statement': \"[AST_Node] statement to perform on each value before returning it\",\n        'is_pydict': \"[bool] True if this comprehension is for a python dict\",\n        'is_jshash': \"[bool] True if this comprehension is for a js hash\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.init._walk(visitor)\n            self.object._walk(visitor)\n            self.statement._walk(visitor)\n            self.value_statement._walk(visitor)\n            if (self.condition) self.condition._walk(visitor)\n        )\n\nclass AST_GeneratorComprehension(AST_ListComprehension):\n    'A generator comprehension'\n\nclass AST_With(AST_StatementWithBody):\n    \"A `with` statement\"\n    properties = {\n        'clauses': \"[AST_WithClause*] the `with` clauses (comma separated)\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for exp in self.clauses:\n                exp._walk(visitor)\n            self.body._walk(visitor)\n        )\n\nclass AST_WithClause(AST_Node):\n    'A clause in a with statement'\n    properties = {\n        'expression': '[AST_Node] the expression',\n        'alias': '[AST_SymbolAlias?] optional alias for this expression',\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            if self.alias:\n                self.alias._walk(visitor)\n        )\n# }}}\n\n# Scope and functions {{{\n\nclass AST_Scope(AST_Block):\n    \"Base class for all statements introducing a lexical scope\"\n    properties = {\n        'localvars': \"[SymbolDef*] list of variables local to this scope\",\n        'docstrings': \"[AST_String*] list of docstrings for this scope\",\n    }\n\n\nclass AST_Toplevel(AST_Scope):\n    \"The toplevel scope\"\n    properties = {\n        'globals': \"[Object/S] a map of name -> SymbolDef for all undeclared names\",\n        'baselib': \"[Object/s] a collection of used parts of baselib\",\n        'imports': \"[Object/S] a map of module_id->AST_Toplevel for all imported modules (this represents all imported modules across all source files)\",\n        'imported_module_ids': \"[string*] a list of module ids that were imported by this module, specifically\",\n        'nonlocalvars': \"[String*] a list of all non-local variable names (names that come from the global scope)\",\n        'shebang': \"[string] If #! line is present, it will be stored here\",\n        'import_order': \"[number] The global order in which this scope was imported\",\n        'module_id': \"[string] The id of this module\",\n        'exports': \"[SymbolDef*] list of names exported from this module\",\n        'classes': \"[Object/S] a map of class names to AST_Class for classes defined in this module\",\n        'filename': \"[string] The absolute path to the file from which this module was read\",\n        'srchash': \"[string] SHA1 hash of source code, used for caching\",\n        'comments_after': '[array] True iff there were comments before this token',\n    }\n\nclass AST_Import(AST_Statement):\n    \"Container for a single import\"\n\n    properties = {\n        'module': \"[AST_SymbolVar] name of the module we're importing\",\n        'key':  \"[string] The key by which this module is stored in the global modules mapping\",\n        'alias': \"[AST_SymbolAlias] The name this module is imported as, can be None. For import x as y statements.\",\n        'argnames': \"[AST_ImportedVar*] names of objects to be imported\",\n        'body': \"[AST_TopLevel] parsed contents of the imported file\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if self.alias:\n                self.alias._walk(visitor)\n            if self.argnames:\n                for arg in self.argnames:\n                    arg._walk(visitor)\n        )\n\nclass AST_Imports(AST_Statement):\n    \"Container for a single import\"\n    properties = {\n        'imports': \"[AST_Import+] array of imports\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for imp in self.imports:\n                imp._walk(visitor)\n        )\n\nclass AST_Decorator(AST_Node):\n    \"Class for function decorators\"\n    properties = {\n        'expression': \"[AST_Node] the decorator expression\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if self.expression:\n                self.expression.walk(visitor)\n        )\n\nclass AST_Lambda(AST_Scope):\n    \"Base class for functions\"\n    properties = {\n        'name': \"[AST_SymbolDeclaration?] the name of this function\",\n        'argnames': \"[AST_SymbolFunarg*] array of function arguments\",\n        'decorators': \"[AST_Decorator*] function decorators, if any\",\n        'is_generator': \"[bool*] True iff this function is a generator\",\n        'is_expression': \"[bool*] True iff this function is a function expression\",\n        'is_anonymous': \"[bool*] True iff this function is an anonymous function\",\n        \"return_annotation\": \"[AST_Node?] The return type annotation provided (if any)\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if self.decorators:\n                for d in self.decorators:\n                    d.walk(visitor)\n            if self.name:\n                self.name._walk(visitor)\n\n            for arg in self.argnames:\n                arg._walk(visitor)\n            if self.argnames.starargs:\n                self.argnames.starargs._walk(visitor)\n            if self.argnames.kwargs:\n                self.argnames.kwargs._walk(visitor)\n            walk_body(self, visitor)\n        )\n\nclass AST_Function(AST_Lambda):\n    \"A function expression\"\n\nclass AST_Class(AST_Scope):\n    \"A class declaration\"\n    properties = {\n        'name': \"[AST_SymbolDeclaration?] the name of this class\",\n        'init': \"[AST_Function] constructor for the class\",\n        'parent': \"[AST_Symbol?] parent class this class inherits from\",\n        'bases': \"[AST_Symbol*] list of base classes this class inherits from\",\n        \"static\": \"[dict] A hash whose keys are names of static methods for this class\",\n        'external': \"[boolean] true if class is declared elsewhere, but will be within current scope at runtime\",\n        'bound': \"[string*] list of methods that need to be bound to self\",\n        'decorators': \"[AST_Decorator*] function decorators, if any\",\n        'module_id': \"[string] The id of the module this class is defined in\",\n        'statements': \"[AST_Node*] list of statements in the class scope (excluding method definitions)\",\n        'dynamic_properties': '[dict] map of dynamic property names to property descriptors of the form {getter:AST_Method, setter:AST_Method',\n        'classvars': '[dict] map containing all class variables as keys, to be used to easily test for existence of a class variable',\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if self.decorators:\n                for d in self.decorators:\n                    d.walk(visitor)\n            self.name._walk(visitor)\n            walk_body(self, visitor)\n            if (self.parent) self.parent._walk(visitor)\n        )\n\nclass AST_Method(AST_Lambda):\n    \"A class method definition\"\n    properties = {\n        \"static\": \"[boolean] true if method is static\",\n        \"is_getter\": \"[boolean] true if method is a property getter\",\n        \"is_setter\": \"[boolean] true if method is a property setter\",\n    }\n\n# }}}\n\n# Jumps(break/continue/etc) {{{\n\nclass AST_Jump(AST_Statement):\n    \"Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)\"\n\nclass AST_Exit(AST_Jump):\n    \"Base class for “exits” (`return` and `throw`)\"\n    properties = {\n        'value': \"[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if self.value:\n                self.value._walk(visitor)\n        )\n\nclass AST_Return(AST_Exit):\n    \"A `return` statement\"\n\nclass AST_Yield(AST_Return):\n    \"A `yield` statement\"\n    properties = {\n        'is_yield_from': \"[bool] True iff this is a yield from, False otherwise\"\n    }\n\nclass AST_Throw(AST_Exit):\n    \"A `throw` statement\"\n\nclass AST_LoopControl(AST_Jump):\n    \"Base class for loop control statements (`break` and `continue`)\"\n\nclass AST_Break(AST_LoopControl):\n    \"A `break` statement\"\n\nclass AST_Continue(AST_LoopControl):\n    \"A `continue` statement\"\n# }}}\n\n# If {{{\nclass AST_If(AST_StatementWithBody):\n    \"A `if` statement\"\n    properties = {\n        'condition': \"[AST_Node] the `if` condition\",\n        'alternative': \"[AST_Statement?] the `else` part, or null if not present\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.condition._walk(visitor)\n            self.body._walk(visitor)\n            if self.alternative:\n                self.alternative._walk(visitor)\n        )\n# }}}\n\n# EXCEPTIONS {{{\n\nclass AST_Try(AST_Block):\n    \"A `try` statement\"\n    properties = {\n        'bcatch': \"[AST_Catch?] the catch block, or null if not present\",\n        'bfinally': \"[AST_Finally?] the finally block, or null if not present\",\n        'belse': '[AST_Else?] the else block for null if not present',\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            walk_body(self, visitor)\n            if self.bcatch:\n                self.bcatch._walk(visitor)\n\n            if self.belse:\n                self.belse._walk(visitor)\n\n            if self.bfinally:\n                self.bfinally._walk(visitor)\n        )\n\nclass AST_Catch(AST_Block):\n    \"A `catch` node; only makes sense as part of a `try` statement\"\n\nclass AST_Except(AST_Block):\n    \"An `except` node for RapydScript, which resides inside the catch block\"\n    properties = {\n        'argname': \"[AST_SymbolCatch] symbol for the exception\",\n        'errors': \"[AST_SymbolVar*] error classes to catch in this block\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(this, def():\n            if (self.argname):\n                self.argname.walk(visitor)\n            if (self.errors):\n                for e in self.errors: e.walk(visitor)\n            walk_body(self, visitor)\n        )\n\nclass AST_Finally(AST_Block):\n    \"A `finally` node; only makes sense as part of a `try` statement\"\n\nclass AST_Else(AST_Block):\n    'An `else` node; only makes sense as part of `try` statement'\n\n# }}}\n\n# VAR/CONST {{{\nclass AST_Definitions(AST_Statement):\n    \"Base class for `var` or `const` nodes (variable declarations/initializations)\"\n    properties = {\n        'definitions': \"[AST_VarDef*] array of variable definitions\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for def_ in self.definitions:\n                def_._walk(visitor)\n        )\n\nclass AST_Var(AST_Definitions):\n    \"A `var` statement\"\n\nclass AST_VarDef(AST_Node):\n    \"A variable declaration; only appears in a AST_Definitions node\"\n    properties = {\n        'name': \"[AST_SymbolVar|AST_SymbolNonlocal] name of the variable\",\n        'value': \"[AST_Node?] initializer, or null if there's no initializer\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.name._walk(visitor)\n            if self.value:\n                self.value._walk(visitor)\n        )\n# }}}\n\n# Miscellaneous {{{\n\nclass AST_BaseCall(AST_Node):\n    \"A base class for function calls\"\n    properties = {\n        'args': \"[AST_Node*] array of arguments\"\n    }\n\nclass AST_Call(AST_BaseCall):\n    \"A function call expression\"\n    properties = {\n        'expression': \"[AST_Node] expression to invoke as function\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            for arg in self.args:\n                arg._walk(visitor)\n            if self.args.kwargs:\n                for arg in self.args.kwargs:\n                    arg[0]._walk(visitor)\n                    arg[1]._walk(visitor)\n            if self.args.kwarg_items:\n                for arg in self.args.kwarg_items:\n                    arg._walk(visitor)\n        )\n\n\nclass AST_ClassCall(AST_BaseCall):\n    \"A function call expression\"\n    properties = {\n        \"class\": \"[string] name of the class method belongs to\",\n        'method': \"[string] class method being called\",\n        \"static\": \"[boolean] defines whether the method is static\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            if (self.expression) self.expression._walk(visitor)\n            for arg in self.args:\n                arg._walk(visitor)\n            for arg in self.args.kwargs:\n                arg[0]._walk(visitor)\n                arg[1]._walk(visitor)\n            for arg in self.args.kwarg_items:\n                arg._walk(visitor)\n        )\n\nclass AST_New(AST_Call):\n    \"An object instantiation. Derives from a function call since it has exactly the same properties\"\n\nclass AST_Seq(AST_Node):\n    \"A sequence expression (two comma-separated expressions)\"\n    properties = {\n        'car': \"[AST_Node] first element in sequence\",\n        'cdr': \"[AST_Node] second element in sequence\"\n    }\n\n    def to_array(self):\n        p = self\n        a = []\n        while p:\n            a.push(p.car)\n            if p.cdr and not (is_node_type(p.cdr, AST_Seq)):\n                a.push(p.cdr)\n                break\n            p = p.cdr\n        return a\n\n    def add(self, node):\n        p = self\n        while p:\n            if not (is_node_type(p.cdr, AST_Seq)):\n                cell = AST_Seq.cons(p.cdr, node)\n                return p.cdr = cell\n            p = p.cdr\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.car._walk(visitor)\n            if self.cdr:\n                self.cdr._walk(visitor)\n        )\n\n    def cons(self, x, y):\n        # Should be called as a classmethod: AST_Seq.cons()\n        seq = new AST_Seq(x)\n        seq.car = x\n        seq.cdr = y\n        return seq\n\n    def from_array(self, array):\n        # Should be called as a classmethod: AST_Seq.from_array()\n        if array.length is 0:\n            return None\n\n        if array.length is 1:\n            return array[0].clone()\n\n        ans = None\n        for i in range(array.length-1, -1, -1):\n            ans = AST_Seq.cons(array[i], ans)\n\n        p = ans\n        while p:\n            if p.cdr and not p.cdr.cdr:\n                p.cdr = p.cdr.car\n                break\n            p = p.cdr\n        return ans\n\nclass AST_PropAccess(AST_Node):\n    'Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`'\n    properties = {\n        'expression': \"[AST_Node] the “container” expression\",\n        'property': \"[AST_Node|string] the property to access.  For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node\",\n    }\n\nclass AST_Dot(AST_PropAccess):\n    \"A dotted property access expression\"\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n        )\n\nclass AST_Sub(AST_PropAccess):\n    'Index-style property access, i.e. `a[\"foo\"]`'\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            self.property._walk(visitor)\n        )\n\nclass AST_ItemAccess(AST_PropAccess):\n    'Python index-style property access, i.e. `a.__getitem__(\"foo\")`'\n    properties = {\n        'assignment': \"[AST_Node or None] Not None if this is an assignment (a[x] = y) rather than a simple access\",\n        'assign_operator': \"[String] The operator for a assignment like += or empty string if plain assignment\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            self.property._walk(visitor)\n            if self.assignment:\n                self.assignment._walk(visitor)\n        )\n\nclass AST_Splice(AST_PropAccess):\n    'Index-style property access, i.e. `a[3:5]`'\n    properties = {\n        'property2': \"[AST_Node] the 2nd property to access - typically ending index for the array.\",\n        'assignment': \"[AST_Node] The data being spliced in.\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            self.property._walk(visitor)\n            self.property2._walk(visitor)\n        )\n\nclass AST_Unary(AST_Node):\n    \"Base class for unary expressions\"\n    properties = {\n        'operator': \"[string] the operator\",\n        'expression': \"[AST_Node] expression that this unary operator applies to\",\n        'parenthesized': \"[bool] Whether this unary expression was parenthesized\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n        )\n\nclass AST_UnaryPrefix(AST_Unary):\n    \"Unary prefix expression, i.e. `typeof i` or `del i`\"\n\nclass AST_Binary(AST_Node):\n    \"Binary expression, i.e. `a + b`\"\n    properties = {\n        'left': \"[AST_Node] left-hand side expression\",\n        'operator': \"[string] the operator\",\n        'right': \"[AST_Node] right-hand side expression\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.left._walk(visitor)\n            self.right._walk(visitor)\n        )\n\nclass AST_Existential(AST_Node):\n    \"Existential operator a?\"\n    properties = {\n        'expression': \"[AST_Node] The expression whose existence we need to check\",\n    'after': \"[None|string|AST_Node] is None when there is nothing following this operator, is a string when there is as AST_PropAccess following this operator, is an AST_Node if it is used a a shorthand for the conditional ternary, i.e. a ? b == a if a? else b\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.expression._walk(visitor)\n            if self.after is not None and jstype(self.after) is 'object':\n                self.after._walk(visitor)\n        )\n\nclass AST_Conditional(AST_Node):\n    \"Conditional expression using the ternary operator, i.e. `a if b else c`\"\n    properties = {\n        'condition': \"[AST_Node]\",\n        'consequent': \"[AST_Node]\",\n        'alternative': \"[AST_Node]\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.condition._walk(visitor)\n            self.consequent._walk(visitor)\n            self.alternative._walk(visitor)\n        )\n\nclass AST_Assign(AST_Binary):\n    \"An assignment expression — `a = b + 5`\"\n\n    def is_chained(self):\n        return is_node_type(self.right, AST_Assign) or (\n            is_node_type(self.right, AST_Seq) and (\n                is_node_type(self.right.car, AST_Assign) or is_node_type(self.right.cdr, AST_Assign))\n        )\n\n    def traverse_chain(self):\n        right = self.right\n        while True:\n            if is_node_type(right, AST_Assign):\n                right = right.right\n                continue\n            if is_node_type(right, AST_Seq):\n                if is_node_type(right.car, AST_Assign):\n                    right = new AST_Seq({'car':right.car.right, 'cdr': right.cdr})\n                    continue\n                if is_node_type(right.cdr, AST_Assign):\n                    right = right.cdr.right\n                    continue\n            break\n        left_hand_sides = v'[self.left]'\n        next = self.right\n        while True:\n            if is_node_type(next, AST_Assign):\n                left_hand_sides.push(next.left)\n                next = next.right\n                continue\n            if is_node_type(next, AST_Seq):\n                if is_node_type(next.cdr, AST_Assign):\n                    assign = next.cdr\n                    left_hand_sides.push(new AST_Seq({'car':next.car, 'cdr':assign.left}))\n                    next = assign.right\n                    continue\n            break\n        return left_hand_sides, right\n\n\n# }}}\n\n# LITERALS {{{\n\nclass AST_Array(AST_Node):\n    \"An array literal\"\n    properties = {\n        'elements': \"[AST_Node*] array of elements\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for el in self.elements:\n                el._walk(visitor)\n        )\n\n    def flatten(self):\n        def flatten(arr):\n            ans = []\n            for value in arr:\n                if is_node_type(value, AST_Seq):\n                    value = value.to_array()\n                elif is_node_type(value, AST_Array):\n                    value = value.elements\n                if Array.isArray(value):\n                    ans = ans.concat(flatten(value))\n                else:\n                    ans.push(value)\n            return ans\n        return flatten(self.elements)\n\nclass AST_Object(AST_Node):\n    \"An object literal\"\n    properties = {\n        'properties': \"[AST_ObjectProperty*] array of properties\",\n        'is_pydict': \"[bool] True if this object is a python dict literal\",\n        'is_jshash': \"[bool] True if this object is a js hash literal\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for prop in self.properties:\n                prop._walk(visitor)\n        )\n\nclass AST_ExpressiveObject(AST_Object):\n    'An object literal with expressions for some keys'\n\nclass AST_ObjectProperty(AST_Node):\n    \"Base class for literal object properties\"\n    properties = {\n        'key': \"[AST_Node] the property expression\",\n        'value': \"[AST_Node] property value.  For setters and getters this is an AST_Function.\",\n        'quoted': '',\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.key._walk(visitor)\n            self.value._walk(visitor)\n        )\n\nclass AST_ObjectKeyVal(AST_ObjectProperty):\n    \"A key: value object property\"\n\nclass AST_Set(AST_Node):\n    \"A set literal\"\n    properties = {\n        'items': \"[AST_SetItem*] array of items\"\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            for prop in self.items:\n                prop._walk(visitor)\n        )\n\nclass AST_SetItem(AST_Node):\n    \"An item in a set literal\"\n    properties = {\n        'value': \"[AST_Node] The value of this item\",\n    }\n\n    def _walk(self, visitor):\n        return visitor._visit(self, def():\n            self.value._walk(visitor)\n        )\n\nclass AST_Symbol(AST_Node):\n    \"Base class for all symbols\"\n    properties = {\n        'name': \"[string] name of this symbol\",\n        'scope': \"[AST_Scope/S] the current scope (not necessarily the definition scope)\",\n        'thedef': \"[SymbolDef/S] the definition of this symbol\"\n    }\n\nclass AST_SymbolAlias(AST_Symbol):\n    \"An alias used in an import statement or with statement\"\n\nclass AST_SymbolDeclaration(AST_Symbol):\n    \"A declaration symbol (symbol in var/const, function name or argument, symbol in catch)\"\n    properties = {\n        'init': \"[AST_Node*/S] array of initializers for this declaration.\"\n    }\n\nclass AST_SymbolVar(AST_SymbolDeclaration):\n    \"Symbol defining a variable\"\n\nclass AST_ImportedVar(AST_SymbolVar):\n    \"Symbol defining an imported symbol\"\n    properties = {\n        'alias': \"AST_SymbolAlias the alias for this imported symbol\"\n    }\n\nclass AST_SymbolNonlocal(AST_SymbolDeclaration):\n    \"A nonlocal declaration\"\n\nclass AST_SymbolFunarg(AST_SymbolVar):\n    \"Symbol naming a function argument, possibly with an annotation.\"\n    properties = {\n        'annotation': \"[AST_Node?] The annotation provided for this argument (if any)\"\n    }\n\nclass AST_SymbolDefun(AST_SymbolDeclaration):\n    \"Symbol defining a function\"\n\nclass AST_SymbolLambda(AST_SymbolDeclaration):\n    \"Symbol naming a function expression\"\n\nclass AST_SymbolCatch(AST_SymbolDeclaration):\n    \"Symbol naming the exception in catch\"\n\nclass AST_SymbolRef(AST_Symbol):\n    \"Reference to some symbol (not definition/declaration)\"\n    properties = {\n        'parens': \"[boolean/S] if true, this variable is wrapped in parentheses\"\n    }\n\nclass AST_This(AST_Symbol):\n    \"The `this` symbol\"\n\nclass AST_Constant(AST_Node):\n    \"Base class for all constants\"\n\nclass AST_String(AST_Constant):\n    \"A string literal\"\n    properties = {\n        'value': \"[string] the contents of this string\"\n    }\n\nclass AST_Verbatim(AST_Constant):\n    \"Raw JavaScript code\"\n    properties = {\n        'value': \"[string] A string of raw JS code\"\n    }\n\nclass AST_Number(AST_Constant):\n    \"A number literal\"\n    properties = {\n        'value': \"[number] the numeric value\"\n    }\n\nclass AST_RegExp(AST_Constant):\n    \"A regexp literal\"\n    properties = {\n        'value': \"[RegExp] the actual regexp\"\n    }\n\nclass AST_Atom(AST_Constant):\n    \"Base class for atoms\"\n    def __init__(self, initializer):\n        if initializer:\n            self.start = initializer.start\n            self.end = initializer.end\n\nclass AST_Null(AST_Atom):\n    \"The `null` atom\"\n    value = None\n\nclass AST_NaN(AST_Atom):\n    \"The impossible value\"\n    value = v'NaN'\n\nclass AST_Undefined(AST_Atom):\n    \"The `undefined` value\"\n    value = v'undefined'\n\nclass AST_Hole(AST_Atom):\n    \"A hole in an array\"\n    value = v'undefined'\n\nclass AST_Infinity(AST_Atom):\n    \"The `Infinity` value\"\n    value = v'Infinity'\n\nclass AST_Boolean(AST_Atom):\n    \"Base class for booleans\"\n\nclass AST_False(AST_Boolean):\n    \"The `false` atom\"\n    value = False\n\nclass AST_True(AST_Boolean):\n    \"The `true` atom\"\n    value = True\n\n# }}}\n\n# TreeWalker {{{\n\nclass TreeWalker:\n\n    def __init__(self, callback):\n        self.visit = callback\n        self.stack = []\n\n    def _visit(self, node, descend):\n        self.stack.push(node)\n        ret = self.visit(node, ((def(): descend.call(node);) if descend else noop))\n        if not ret and descend:\n            descend.call(node)\n\n        self.stack.pop()\n        return ret\n\n    def parent(self, n):\n        return self.stack[self.stack.length - 2 - (n or 0)]\n\n    def push(self, node):\n        self.stack.push(node)\n\n    def pop(self):\n        return self.stack.pop()\n\n    def self(s):\n        return s.stack[s.stack.length - 1]\n\n    def find_parent(self, type):\n        stack = self.stack\n        for i in range(stack.length-1, -1, -1):\n            x = stack[i]\n            if is_node_type(x, type):\n                return x\n\n    def in_boolean_context(self):\n        stack = self.stack\n        i = stack.length\n        self = stack[i -= 1]\n        while i > 0:\n            p = stack[i -= 1]\n            if is_node_type(p, AST_If) and p.condition is self\n            or is_node_type(p, AST_Conditional) and p.condition is self\n            or is_node_type(p, AST_DWLoop) and p.condition is self\n            or is_node_type(p, AST_UnaryPrefix) and p.operator is \"!\" and p.expression is self:\n                return True\n            if not (is_node_type(p, AST_Binary) and (p.operator is \"&&\" or p.operator is \"||\")):\n                return False\n            self = p\n# }}}\n\nclass Found(Exception):\n    pass\n\ndef has_calls(expression):\n    # Technically, in JavaScript property access is also dynamic and can\n    # involve function calls. However, there is no way to determine which\n    # property accesses are dynamic, so we ignore them, as they would lead to\n    # too many false positives.\n    if not expression:\n        return False\n    try:\n        expression.walk(new TreeWalker(def(node):\n            if is_node_type(node, AST_BaseCall) or is_node_type(node, AST_ItemAccess):\n                raise Found()\n        ))\n    except Found:\n        return True\n    return False\n"
  },
  {
    "path": "src/baselib-builtins.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# globals: exports, console, ρσ_iterator_symbol, ρσ_kwargs_symbol, ρσ_arraylike, ρσ_list_contains\n\ndef ρσ_bool(val):\n    return v'!!val'\n\ndef ρσ_print():\n    if v'typeof console' is 'object':\n        parts = v'[]'\n        for v'var i = 0; i < arguments.length; i++':\n            parts.push(ρσ_str(arguments[i]))  # noqa: undef\n        console.log(parts.join(' '))\n\ndef ρσ_int(val, base):\n    if jstype(val) is \"number\":\n        ans = val | 0\n    else:\n        ans = parseInt(val, base or 10)\n    if isNaN(ans):\n        raise ValueError('Invalid literal for int with base ' + (base or 10) + ': ' + val)\n    return ans\n\ndef ρσ_float(val):\n    if jstype(val) is \"number\":\n        ans = val\n    else:\n        ans = parseFloat(val)\n    if isNaN(ans):\n        raise ValueError('Could not convert string to float: ' + arguments[0])\n    return ans\n\ndef ρσ_arraylike_creator():\n    names = 'Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ')\n    if jstype(HTMLCollection) is 'function':\n        names = names.concat('HTMLCollection NodeList NamedNodeMap TouchList'.split(' '))\n    return def(x):\n        if Array.isArray(x) or v'typeof x' is 'string' or names.indexOf(Object.prototype.toString.call(x).slice(8, -1)) > -1:\n            return True\n        return False\n\ndef options_object(f):\n    return def():\n        if v'typeof arguments[arguments.length - 1] === \"object\"':\n            arguments[arguments.length - 1][ρσ_kwargs_symbol] = True\n        return f.apply(this, arguments)\n\ndef ρσ_id(x):\n    return x.ρσ_object_id\n\ndef ρσ_dir(item):\n    # TODO: this isn't really representative of real Python's dir(), nor is it\n    # an intuitive replacement for \"for ... in\" loop, need to update this logic\n    # and introduce a different way of achieving \"for ... in\"\n    arr = []\n    for v'var i in item': arr.push(i)  # noqa:undef\n    return arr\n\ndef ρσ_ord(x):\n    ans = x.charCodeAt(0)\n    if 0xD800 <= ans <= 0xDBFF:\n        second = x.charCodeAt(1)\n        if 0xDC00 <= second <= 0xDFFF:\n            return (ans - 0xD800) * 0x400 + second - 0xDC00 + 0x10000\n        raise TypeError('string is missing the low surrogate char')\n    return ans\n\ndef ρσ_chr(code):\n    if code <= 0xFFFF:\n        return String.fromCharCode(code)\n    code -= 0x10000\n    return String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n\ndef ρσ_callable(x):\n    return v'typeof x === \"function\"'\n\ndef ρσ_bin(x):\n    if jstype(x) is not 'number' or x % 1 is not 0:\n        raise TypeError('integer required')\n    ans = x.toString(2)\n    if ans[0] is '-':\n        ans = '-' + '0b' + ans[1:]\n    else:\n        ans = '0b' + ans\n    return ans\n\ndef ρσ_hex(x):\n    if jstype(x) is not 'number' or x % 1 is not 0:\n        raise TypeError('integer required')\n    ans = x.toString(16)\n    if ans[0] is '-':\n        ans = '-' + '0x' + ans[1:]\n    else:\n        ans = '0x' + ans\n    return ans\n\ndef ρσ_enumerate(iterable):\n    ans = v'{\"_i\":-1}'\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    if ρσ_arraylike(iterable):\n        ans['next'] = def():\n                this._i += 1\n                if this._i < iterable.length:\n                    return v\"{'done':false, 'value':[this._i, iterable[this._i]]}\"\n                return v\"{'done':true}\"\n        return ans\n    if jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n        ans['_iterator'] = iterator\n        ans['next'] = def():\n            r = this._iterator.next()\n            if r.done:\n                return v\"{'done':true}\"\n            this._i += 1\n            return v\"{'done':false, 'value':[this._i, r.value]}\"\n        return ans\n    return ρσ_enumerate(Object.keys(iterable))\n\ndef ρσ_reversed(iterable):\n    if ρσ_arraylike(iterable):\n        ans = v'{\"_i\": iterable.length}'\n        ans['next'] = def():\n            this._i -= 1\n            if this._i > -1:\n                return v\"{'done':false, 'value':iterable[this._i]}\"\n            return v\"{'done':true}\"\n        ans[ρσ_iterator_symbol] = def():\n            return this\n        return ans\n    raise TypeError('reversed() can only be called on arrays or strings')\n\ndef ρσ_iter(iterable):\n    # Generate a JavaScript iterator object from iterable\n    if jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        return iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n    if ρσ_arraylike(iterable):\n        ans = v'{\"_i\":-1}'\n        ans[ρσ_iterator_symbol] = def():\n            return this\n        ans['next'] = def():\n            this._i += 1\n            if this._i < iterable.length:\n                return v\"{'done':false, 'value':iterable[this._i]}\"\n            return v\"{'done':true}\"\n        return ans\n    return ρσ_iter(Object.keys(iterable))\n\ndef ρσ_range_next(step, length):\n    this._i += step\n    this._idx += 1\n    if this._idx >= length:\n        this._i, this._idx = this.__i, -1\n        return v\"{'done':true}\"\n    return v\"{'done':false, 'value':this._i}\"\n\ndef ρσ_range(start, stop, step):\n    if arguments.length <= 1:\n        stop = start or 0\n        start = 0\n    step = arguments[2] or 1\n    length = Math.max(Math.ceil((stop - start) / step), 0)\n    ans = v'{start:start, step:step, stop:stop}'\n    ans[ρσ_iterator_symbol] = def():\n        it = v'{\"_i\": start - step, \"_idx\": -1}'\n        it.next = ρσ_range_next.bind(it, step, length)\n        it[ρσ_iterator_symbol] = def():\n            return this\n        return it\n    ans.count = def(val):\n        if not this._cached:\n            this._cached = list(this)\n        return this._cached.count(val)\n    ans.index = def(val):\n        if not this._cached:\n            this._cached = list(this)\n        return this._cached.index(val)\n    ans.__len__ = def():\n        return length\n    ans.__repr__ = def():\n        return f'range({start}, {stop}, {step})'\n    ans.__str__ = ans.toString = ans.__repr__\n    if jstype(Proxy) is 'function':\n        ans = new Proxy(ans, {\n            'get': def(obj, prop):\n                if jstype(prop) is 'string':\n                    iprop = parseInt(prop)\n                    if not isNaN(iprop):\n                        prop = iprop\n                if jstype(prop) is 'number':\n                    if not obj._cached:\n                        obj._cached = list(obj)\n                    return obj._cached[prop]\n                return obj[prop]\n        })\n    return ans\n\ndef ρσ_getattr(obj, name, defval):\n    try:\n        ret = obj[name]\n    except TypeError:\n        if defval is undefined:\n            raise AttributeError('The attribute ' + name + ' is not present')\n        return defval\n    if ret is undefined and not v'(name in obj)':\n        if defval is undefined:\n            raise AttributeError('The attribute ' + name + ' is not present')\n        ret = defval\n    return ret\n\ndef ρσ_setattr(obj, name, value):\n    obj[name] = value\n\ndef ρσ_hasattr(obj, name):\n    return v'name in obj'\n\nρσ_len = (def ():\n\n    def len(obj):\n        if ρσ_arraylike(obj): return obj.length\n        if jstype(obj.__len__) is 'function': return obj.__len__()\n        if v'obj instanceof Set' or v'obj instanceof Map': return obj.size\n        return Object.keys(obj).length\n\n    def len5(obj):\n        if ρσ_arraylike(obj): return obj.length\n        if jstype(obj.__len__) is 'function': return obj.__len__()\n        return Object.keys(obj).length\n\n    return len if v'typeof Set' is 'function' and v'typeof Map' is 'function' else len5\n)()\n\ndef ρσ_get_module(name):\n    return ρσ_modules[name]\n\ndef ρσ_pow(x, y, z):\n    ans = Math.pow(x, y)\n    if z is not undefined:\n        ans %= z\n    return ans\n\ndef ρσ_type(x):\n    return x.constructor\n\n\ndef ρσ_divmod(x, y):\n    if y is 0:\n        raise ZeroDivisionError('integer division or modulo by zero')\n    d = Math.floor(x / y)\n    return d, x - d * y\n\n\ndef ρσ_max(*args, **kwargs):\n    if args.length is 0:\n        if kwargs.defval is not undefined:\n            return kwargs.defval\n        raise TypeError('expected at least one argument')\n    if args.length is 1:\n        args = args[0]\n    if kwargs.key:\n        args = [kwargs.key(x) for x in args]\n    if not Array.isArray(args):\n        args = list(args)\n    if args.length:\n        return this.apply(None, args)\n    if kwargs.defval is not undefined:\n        return kwargs.defval\n    raise TypeError('expected at least one argument')\n\n\nv'var abs = Math.abs, max = ρσ_max.bind(Math.max), min = ρσ_max.bind(Math.min), bool = ρσ_bool, type = ρσ_type'\nv'var float = ρσ_float, int = ρσ_int, arraylike = ρσ_arraylike_creator(), ρσ_arraylike = arraylike'\nv'var print = ρσ_print, id = ρσ_id, get_module = ρσ_get_module, pow = ρσ_pow, divmod = ρσ_divmod'\nv'var dir = ρσ_dir, ord = ρσ_ord, chr = ρσ_chr, bin = ρσ_bin, hex = ρσ_hex, callable = ρσ_callable'\nv'var enumerate = ρσ_enumerate, iter = ρσ_iter, reversed = ρσ_reversed, len = ρσ_len'\nv'var range = ρσ_range, getattr = ρσ_getattr, setattr = ρσ_setattr, hasattr = ρσ_hasattr'\n"
  },
  {
    "path": "src/baselib-containers.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# globals:ρσ_iterator_symbol, ρσ_kwargs_symbol, ρσ_arraylike, ρσ_repr\n\ndef ρσ_equals(a, b):\n    if a is b:\n        return True\n    if a and jstype(a.__eq__) is 'function':\n        return a.__eq__(b)\n    if b and jstype(b.__eq__) is 'function':\n        return b.__eq__(a)\n    if ρσ_arraylike(a) and ρσ_arraylike(b):\n        if a.length != b.length:\n            return False\n        for v'var i=0; i < a.length; i++':\n            if not (a[i] == b[i]):\n                return False\n        return True\n    if jstype(a) is 'object' and jstype(b) is 'object' and a is not None and b is not None and (\n        (a.constructor is Object and b.constructor is Object) or (Object.getPrototypeOf(a) is None and Object.getPrototypeOf(b) is None)\n    ):\n            # Do a dict like comparison as this is most likely either a JS has\n            # (Object.create(null) or a JS object used as a hash (v\"{}\"))\n            akeys, bkeys = Object.keys(a), Object.keys(b)\n            if akeys.length is not bkeys.length:\n                return False\n            for v'var j=0; j < akeys.length; j++':\n                key = akeys[j]\n                if not (a[key] == b[key]):\n                    return False\n            return True\n    return False\n\ndef ρσ_not_equals(a, b):\n    if a is b:\n        return False\n    if a and jstype(a.__ne__) is 'function':\n        return a.__ne__(b)\n    if b and jstype(b.__ne__) is 'function':\n        return b.__ne__(a)\n    return not ρσ_equals(a, b)\n\nv'var equals = ρσ_equals'\n\n# list {{{\n\ndef ρσ_list_extend(iterable):\n    if Array.isArray(iterable) or jstype(iterable) is 'string':\n        # Allocate all new memory in one operation\n        start = this.length\n        this.length += iterable.length\n        for v'var i = 0; i < iterable.length; i++':\n            this[start + i] = iterable[i]  # noqa:undef\n    else:\n        iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n        result = iterator.next()\n        while not result.done:\n            this.push(result.value)\n            result = iterator.next()\n\ndef ρσ_list_index(val, start, stop):\n    start = start or 0\n    if start < 0:\n        start = this.length + start\n    if start < 0:\n        raise ValueError(val + ' is not in list')\n    if stop is undefined:\n        stop = this.length\n    if stop < 0:\n        stop = this.length + stop\n    for v'var i = start; i < stop; i++':\n        if this[i] == val:\n            return i  # noqa:undef\n    raise ValueError(val + ' is not in list')\n\ndef ρσ_list_pop(index):\n    if this.length is 0:\n        raise IndexError('list is empty')\n    if index is undefined:\n        index = -1\n    ans = this.splice(index, 1)\n    if not ans.length:\n        raise IndexError('pop index out of range')\n    return ans[0]\n\ndef ρσ_list_remove(value):\n    for v'var i = 0; i < this.length; i++':\n        if this[i] == value:\n            this.splice(i, 1)\n            return\n    raise ValueError(value + ' not in list')\n\ndef ρσ_list_to_string():\n    return '[' + this.join(', ') + ']'\n\ndef ρσ_list_insert(index, val):\n    if index < 0:\n        index += this.length\n    index = min(this.length, max(index, 0))\n    if index is 0:\n        this.unshift(val)\n        return\n    for v'var i = this.length; i > index; i--':\n        this[i] = this[i - 1]  # noqa:undef\n    this[index] = val\n\ndef ρσ_list_copy():\n    return ρσ_list_constructor(this)\n\ndef ρσ_list_clear():\n    this.length = 0\n\ndef ρσ_list_as_array():\n    return Array.prototype.slice.call(this)\n\ndef ρσ_list_count(value):\n    return this.reduce(def(n, val): return n + (val is value);, 0)\n\ndef ρσ_list_sort_key(value):\n    t = jstype(value)\n    if t is 'string' or t is 'number':\n        return value\n    return value.toString()\n\ndef ρσ_list_sort_cmp(a, b, ap, bp):\n    if a < b:\n        return -1\n    if a > b:\n        return 1\n    return ap - bp\n\ndef ρσ_list_sort(key=None, reverse=False):\n    key = key or ρσ_list_sort_key\n    mult = -1 if reverse else 1\n    keymap = dict()\n    posmap = dict()\n    for v'var i=0; i < this.length; i++':\n        k = this[i]  # noqa:undef\n        keymap.set(k, key(k))\n        posmap.set(k, i)\n    this.sort(def (a, b): return mult * ρσ_list_sort_cmp(keymap.get(a), keymap.get(b), posmap.get(a), posmap.get(b));)\n\ndef ρσ_list_concat():  # ensure concat() returns an object of type list\n    ans = Array.prototype.concat.apply(this, arguments)\n    ρσ_list_decorate(ans)\n    return ans\n\ndef ρσ_list_slice():  # ensure slice() returns an object of type list\n    ans = Array.prototype.slice.apply(this, arguments)\n    ρσ_list_decorate(ans)\n    return ans\n\ndef ρσ_list_iterator(value):\n    self = this\n    return {\n        '_i':-1,\n        '_list':self,\n        'next':def():\n            this._i += 1\n            if this._i >= this._list.length:\n                return {'done':True}\n            return {'done':False, 'value':this._list[this._i]}\n        ,\n    }\n\ndef ρσ_list_len():\n    return this.length\n\ndef ρσ_list_contains(val):\n    for v'var i = 0; i < this.length; i++':\n        if this[i] == val:\n            return True\n    return False\n\ndef ρσ_list_eq(other):\n    if not ρσ_arraylike(other):\n        return False\n    if this.length != other.length:\n        return False\n    for v'var i = 0; i < this.length; i++':\n        if not (this[i] == other[i]):\n            return False\n    return True\n\ndef ρσ_list_decorate(ans):\n    ans.append = Array.prototype.push\n    ans.toString = ρσ_list_to_string\n    ans.inspect = ρσ_list_to_string\n    ans.extend = ρσ_list_extend\n    ans.index = ρσ_list_index\n    ans.pypop = ρσ_list_pop\n    ans.remove = ρσ_list_remove\n    ans.insert = ρσ_list_insert\n    ans.copy = ρσ_list_copy\n    ans.clear = ρσ_list_clear\n    ans.count = ρσ_list_count\n    ans.concat = ρσ_list_concat\n    ans.pysort = ρσ_list_sort\n    ans.slice = ρσ_list_slice\n    ans.as_array = ρσ_list_as_array\n    ans.__len__ = ρσ_list_len\n    ans.__contains__ = ρσ_list_contains\n    ans.__eq__ = ρσ_list_eq\n    ans.constructor = ρσ_list_constructor\n    if jstype(ans[ρσ_iterator_symbol]) is not 'function':\n        # Happens on ES 5 runtimes\n        ans[ρσ_iterator_symbol] = ρσ_list_iterator\n    return ans\n\ndef ρσ_list_constructor(iterable):\n    if iterable is undefined:\n        ans = v'[]'\n    elif ρσ_arraylike(iterable):\n        ans = new Array(iterable.length)\n        for v'var i = 0; i < iterable.length; i++':\n            ans[i] = iterable[i]  # noqa:undef\n    elif jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n        ans = []\n        result = iterator.next()\n        while not result.done:\n            ans.push(result.value)\n            result = iterator.next()\n    elif jstype(iterable) is 'number':\n        # non-pythonic optimization to allocate all needed memory in a single operation\n        ans = new Array(iterable)\n    else:\n        ans = Object.keys(iterable)\n    return ρσ_list_decorate(ans)\nρσ_list_constructor.__name__ = 'list'\n\nv'var list = ρσ_list_constructor, list_wrap = ρσ_list_decorate'\n\ndef sorted(iterable, key=None, reverse=False):\n    ans = ρσ_list_constructor(iterable)\n    ans.pysort(key, reverse)\n    return ans\n# }}}\n\n# set {{{\nv'var ρσ_global_object_id = 0, ρσ_set_implementation'\n\ndef ρσ_set_keyfor(x):\n    t = jstype(x)\n    if t is 'string' or t is 'number' or t is 'boolean':\n        return '_' + t[0] + x\n    if v'x === null': # also matches undefined\n        return \"__!@#$0\"\n    ans = x.ρσ_hash_key_prop\n    if ans is undefined:\n        v'ans = \"_!@#$\" + (++ρσ_global_object_id)'\n        Object.defineProperty(x, 'ρσ_hash_key_prop', { 'value': ans })\n    return ans\n\ndef ρσ_set_polyfill():\n    this._store = {}\n    this.size = 0\n\nρσ_set_polyfill.prototype.add = def(x):\n    key = ρσ_set_keyfor(x)\n    if not Object.prototype.hasOwnProperty.call(this._store, key):\n        this.size += 1\n        this._store[key] = x\n    return this\n\nρσ_set_polyfill.prototype.clear = def(x):\n    this._store = {}\n    this.size = 0\n\nρσ_set_polyfill.prototype.delete = def(x):\n    key = ρσ_set_keyfor(x)\n    if Object.prototype.hasOwnProperty.call(this._store, key):\n        this.size -= 1\n        v'delete this._store[key]'\n        return True\n    return False\n\nρσ_set_polyfill.prototype.has = def(x):\n    return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x))\n\nρσ_set_polyfill.prototype.values = def(x):\n    ans = v\"{'_keys': Object.keys(this._store), '_i':-1, '_s':this._store}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        this._i += 1\n        if this._i >= this._keys.length:\n            return v\"{'done': true}\"\n        return v\"{'done':false, 'value':this._s[this._keys[this._i]]}\"\n    return ans\n\nif jstype(Set) is not 'function' or jstype(Set.prototype.delete) is not 'function':\n    v'ρσ_set_implementation = ρσ_set_polyfill'\nelse:\n    v'ρσ_set_implementation = Set'\n\ndef ρσ_set(iterable):\n    if v'this instanceof ρσ_set':\n        this.jsset = new ρσ_set_implementation()  # noqa:undef\n        ans = this\n        if iterable is undefined:\n            return ans\n        s = ans.jsset\n        if ρσ_arraylike(iterable):\n            for v'var i = 0; i < iterable.length; i++':\n                s.add(iterable[i])\n        elif jstype(iterable[ρσ_iterator_symbol]) is 'function':\n            iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n            result = iterator.next()\n            while not result.done:\n                s.add(result.value)\n                result = iterator.next()\n        else:\n            keys = Object.keys(iterable)\n            for v'var j=0; j < keys.length; j++':\n                s.add(keys[j])\n        return ans\n    else:\n        return new ρσ_set(iterable)\nρσ_set.prototype.__name__ = 'set'\n\n# These are for JavaScript users' convenience\nObject.defineProperties(ρσ_set.prototype, {\n    'length': { 'get': def(): return this.jsset.size; },\n    'size': { 'get': def(): return this.jsset.size; },\n})\n\nρσ_set.prototype.__len__ = def(): return this.jsset.size\nρσ_set.prototype.has = ρσ_set.prototype.__contains__ = def(x): return this.jsset.has(x)\nρσ_set.prototype.add = def(x): this.jsset.add(x)\nρσ_set.prototype.clear = def(): this.jsset.clear()\nρσ_set.prototype.copy = def(): return ρσ_set(this)\nρσ_set.prototype.discard = def(x): this.jsset.delete(x)\nρσ_set.prototype[ρσ_iterator_symbol] = def(): return this.jsset.values()\n\nρσ_set.prototype.difference = def():\n    ans = new ρσ_set()\n    s = ans.jsset\n    iterator = this.jsset.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        has = False\n        for v'var i = 0; i < arguments.length; i++':\n            if arguments[i].has(x):  # noqa:undef\n                has = True\n                break\n        if not has:\n            s.add(x)\n        r = iterator.next()\n    return ans\n\nρσ_set.prototype.difference_update = def():\n    s = this.jsset\n    remove = v'[]'\n    iterator = s.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        for v'var i = 0; i < arguments.length; i++':\n            if arguments[i].has(x):  # noqa:undef\n                remove.push(x)\n                break\n        r = iterator.next()\n    for v'var j = 0; j < remove.length; j++':\n        s.delete(remove[j])  # noqa:undef\n\nρσ_set.prototype.intersection = def():\n    ans = new ρσ_set()\n    s = ans.jsset\n    iterator = this.jsset.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        has = True\n        for v'var i = 0; i < arguments.length; i++':\n            if not arguments[i].has(x):  # noqa:undef\n                has = False\n                break\n        if has:\n            s.add(x)\n        r = iterator.next()\n    return ans\n\nρσ_set.prototype.intersection_update = def():\n    s = this.jsset\n    remove = v'[]'\n    iterator = s.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        for v'var i = 0; i < arguments.length; i++':\n            if not arguments[i].has(x):  # noqa:undef\n                remove.push(x)\n                break\n        r = iterator.next()\n    for v'var j = 0; j < remove.length; j++':\n        s.delete(remove[j])  # noqa:undef\n\nρσ_set.prototype.isdisjoint = def(other):\n    iterator = this.jsset.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        if other.has(x):\n            return False\n        r = iterator.next()\n    return True\n\nρσ_set.prototype.issubset = def(other):\n    iterator = this.jsset.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        if not other.has(x):\n            return False\n        r = iterator.next()\n    return True\n\nρσ_set.prototype.issuperset = def(other):\n    s = this.jsset\n    iterator = other.jsset.values()\n    r = iterator.next()\n    while not r.done:\n        x = r.value\n        if not s.has(x):\n            return False\n        r = iterator.next()\n    return True\n\nρσ_set.prototype.pop = def():\n    iterator = this.jsset.values()\n    r = iterator.next()\n    if r.done:\n        raise KeyError('pop from an empty set')\n    this.jsset.delete(r.value)\n    return r.value\n\nρσ_set.prototype.remove = def(x):\n    if not this.jsset.delete(x):\n        raise KeyError(x.toString())\n\nρσ_set.prototype.symmetric_difference = def(other):\n    return this.union(other).difference(this.intersection(other))\n\nρσ_set.prototype.symmetric_difference_update = def(other):\n    common = this.intersection(other)\n    this.update(other)\n    this.difference_update(common)\n\nρσ_set.prototype.union = def():\n    ans = ρσ_set(this)\n    ans.update.apply(ans, arguments)\n    return ans\n\nρσ_set.prototype.update = def():\n    s = this.jsset\n    for v'var i=0; i < arguments.length; i++':\n        iterator = arguments[i][ρσ_iterator_symbol]()  # noqa:undef\n        r = iterator.next()\n        while not r.done:\n            s.add(r.value)\n            r = iterator.next()\n\nρσ_set.prototype.toString = ρσ_set.prototype.__repr__ = ρσ_set.prototype.__str__ = ρσ_set.prototype.inspect = def():\n    return '{' + list(this).join(', ') + '}'\n\nρσ_set.prototype.__eq__ = def(other):\n    if not v'other instanceof this.constructor':\n        return False\n    if other.size is not this.size:\n        return False\n    if other.size is 0:\n        return True\n    iterator = other[ρσ_iterator_symbol]()\n    r = iterator.next()\n    while not r.done:\n        if not this.has(r.value):\n            return False\n        r = iterator.next()\n    return True\n\ndef ρσ_set_wrap(x):\n    ans = new ρσ_set()\n    ans.jsset = x\n    return ans\n\nv'var set = ρσ_set, set_wrap = ρσ_set_wrap'\n# }}}\n\n# dict {{{\nv'var ρσ_dict_implementation'\n\ndef ρσ_dict_polyfill():\n    this._store = {}\n    this.size = 0\n\nρσ_dict_polyfill.prototype.set = def(x, value):\n    key = ρσ_set_keyfor(x)\n    if not Object.prototype.hasOwnProperty.call(this._store, key):\n        this.size += 1\n    this._store[key] = v'[x, value]'\n    return this\n\nρσ_dict_polyfill.prototype.clear = def(x):\n    this._store = {}\n    this.size = 0\n\nρσ_dict_polyfill.prototype.delete = def(x):\n    key = ρσ_set_keyfor(x)\n    if Object.prototype.hasOwnProperty.call(this._store, key):\n        this.size -= 1\n        v'delete this._store[key]'\n        return True\n    return False\n\nρσ_dict_polyfill.prototype.has = def(x):\n    return Object.prototype.hasOwnProperty.call(this._store, ρσ_set_keyfor(x))\n\nρσ_dict_polyfill.prototype.get = def(x):\n    try:\n        return this._store[ρσ_set_keyfor(x)][1]\n    except TypeError:  # Key is not present\n        return undefined\n\nρσ_dict_polyfill.prototype.values = def(x):\n    ans = v\"{'_keys': Object.keys(this._store), '_i':-1, '_s':this._store}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        this._i += 1\n        if this._i >= this._keys.length:\n            return v\"{'done': true}\"\n        return v\"{'done':false, 'value':this._s[this._keys[this._i]][1]}\"\n    return ans\n\nρσ_dict_polyfill.prototype.keys = def(x):\n    ans = v\"{'_keys': Object.keys(this._store), '_i':-1, '_s':this._store}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        this._i += 1\n        if this._i >= this._keys.length:\n            return v\"{'done': true}\"\n        return v\"{'done':false, 'value':this._s[this._keys[this._i]][0]}\"\n    return ans\n\nρσ_dict_polyfill.prototype.entries = def(x):\n    ans = v\"{'_keys': Object.keys(this._store), '_i':-1, '_s':this._store}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        this._i += 1\n        if this._i >= this._keys.length:\n            return v\"{'done': true}\"\n        return v\"{'done':false, 'value':this._s[this._keys[this._i]]}\"\n    return ans\n\nif jstype(Map) is not 'function' or jstype(Map.prototype.delete) is not 'function':\n    v'ρσ_dict_implementation = ρσ_dict_polyfill'\nelse:\n    v'ρσ_dict_implementation = Map'\n\ndef ρσ_dict(iterable, **kw):\n    if v'this instanceof ρσ_dict':\n        this.jsmap = new ρσ_dict_implementation()  # noqa:undef\n        if iterable is not undefined:\n            this.update(iterable)\n        this.update(kw)\n        return this\n    else:\n        return new ρσ_dict(iterable, **kw)\nρσ_dict.prototype.__name__ = 'dict'\n\n\n# These are for JavaScript users' convenience\nObject.defineProperties(ρσ_dict.prototype, {\n    'length': { 'get': def(): return this.jsmap.size; },\n    'size': { 'get': def(): return this.jsmap.size; },\n})\n\nρσ_dict.prototype.__len__ = def(): return this.jsmap.size\nρσ_dict.prototype.has = ρσ_dict.prototype.__contains__ = def(x): return this.jsmap.has(x)\nρσ_dict.prototype.set = ρσ_dict.prototype.__setitem__ = def(key, value): this.jsmap.set(key, value)\nρσ_dict.prototype.__delitem__ = def (key): this.jsmap.delete(key)\nρσ_dict.prototype.clear = def(): this.jsmap.clear()\nρσ_dict.prototype.copy = def(): return ρσ_dict(this)\nρσ_dict.prototype.keys = def(): return this.jsmap.keys()\nρσ_dict.prototype.values = def(): return this.jsmap.values()\nρσ_dict.prototype.items = ρσ_dict.prototype.entries = def(): return this.jsmap.entries()\nρσ_dict.prototype[ρσ_iterator_symbol] = def(): return this.jsmap.keys()\n\nρσ_dict.prototype.__getitem__ = def (key):\n    ans = this.jsmap.get(key)\n    if ans is undefined and not this.jsmap.has(key):\n        raise KeyError(key + '')\n    return ans\n\nρσ_dict.prototype.get = def (key, defval):\n    ans = this.jsmap.get(key)\n    if ans is undefined and not this.jsmap.has(key):\n        return None if defval is undefined else defval\n    return ans\n\nρσ_dict.prototype.set_default = ρσ_dict.prototype.setdefault = def (key, defval):\n    j = this.jsmap\n    if not j.has(key):\n        j.set(key, defval)\n        return defval\n    return j.get(key)\n\nρσ_dict.fromkeys = ρσ_dict.prototype.fromkeys = def (iterable, value=None):\n    ans = ρσ_dict()\n    iterator = iter(iterable)\n    r = iterator.next()\n    while not r.done:\n        ans.set(r.value, value)\n        r = iterator.next()\n    return ans\n\nρσ_dict.prototype.pop = def (key, defval):\n    ans = this.jsmap.get(key)\n    if ans is undefined and not this.jsmap.has(key):\n        if defval is undefined:\n            raise KeyError(key)\n        return defval\n    this.jsmap.delete(key)\n    return ans\n\nρσ_dict.prototype.popitem = def ():\n    last = None\n    e = this.jsmap.entries()\n    while True:\n        r = e.next()\n        if r.done:\n            if last is None:\n                raise KeyError('dict is empty')\n            this.jsmap.delete(last.value[0])\n            return last.value\n        last = r\n\nρσ_dict.prototype.update = def ():\n    if arguments.length is 0:\n        return\n    m = this.jsmap\n    iterable = arguments[0]\n    if Array.isArray(iterable):\n        for v'var i = 0; i < iterable.length; i++':\n            m.set(iterable[i][0], iterable[i][1])\n    elif v'iterable instanceof ρσ_dict':\n        iterator = iterable.items()\n        result = iterator.next()\n        while not result.done:\n            m.set(result.value[0], result.value[1])\n            result = iterator.next()\n    elif jstype(Map) is 'function' and v'iterable instanceof Map':\n        iterator = iterable.entries()\n        result = iterator.next()\n        while not result.done:\n            m.set(result.value[0], result.value[1])\n            result = iterator.next()\n    elif jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        iterator = iterable[ρσ_iterator_symbol]()\n        result = iterator.next()\n        while not result.done:\n            m.set(result.value[0], result.value[1])\n            result = iterator.next()\n    else:\n        keys = Object.keys(iterable)\n        for v'var j=0; j < keys.length; j++':\n            if keys[j] is not ρσ_iterator_symbol:\n                m.set(keys[j], iterable[keys[j]])\n    if arguments.length > 1:\n        ρσ_dict.prototype.update.call(this, arguments[1])\n\nρσ_dict.prototype.toString = ρσ_dict.prototype.inspect = ρσ_dict.prototype.__str__ = ρσ_dict.prototype.__repr__ = def():\n    entries = v'[]'\n    iterator = this.jsmap.entries()\n    r = iterator.next()\n    while not r.done:\n        entries.push(ρσ_repr(r.value[0]) + ': ' + ρσ_repr(r.value[1]))\n        r = iterator.next()\n    return '{' + entries.join(', ') + '}'\n\nρσ_dict.prototype.__eq__ = def(other):\n    if not v'(other instanceof this.constructor)':\n        return False\n    if other.size is not this.size:\n        return False\n    if other.size is 0:\n        return True\n    iterator = other.items()\n    r = iterator.next()\n    while not r.done:\n        x = this.jsmap.get(r.value[0])\n        if (x is undefined and not this.jsmap.has(r.value[0])) or x is not r.value[1]:\n            return False\n        r = iterator.next()\n    return True\n\nρσ_dict.prototype.as_object = def(other):\n    ans = {}\n    iterator = this.jsmap.entries()\n    r = iterator.next()\n    while not r.done:\n        ans[r.value[0]] = r.value[1]\n        r = iterator.next()\n    return ans\n\ndef ρσ_dict_wrap(x):\n    ans = new ρσ_dict()\n    ans.jsmap = x\n    return ans\n\nv'var dict = ρσ_dict, dict_wrap = ρσ_dict_wrap'\n\n# }}}\n"
  },
  {
    "path": "src/baselib-errors.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: ρσ_str\n\nNameError = ReferenceError\n\nclass Exception(Error):\n\n    def __init__(self, message):\n        self.message = message\n        self.stack = Error().stack\n        self.name = self.constructor.name\n\n    def __repr__(self):\n        return self.name + ': ' + self.message\n\nclass AttributeError(Exception):\n    pass\n\nclass IndexError(Exception):\n    pass\n\nclass KeyError(Exception):\n    pass\n\nclass ValueError(Exception):\n    pass\n\nclass UnicodeDecodeError(Exception):\n    pass\n\nclass AssertionError(Exception):\n    pass\n\nclass ZeroDivisionError(Exception):\n    pass\n"
  },
  {
    "path": "src/baselib-internal.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n\n# globals: exports, console, ρσ_iterator_symbol, ρσ_kwargs_symbol, ρσ_arraylike, ρσ_list_contains, ρσ_list_constructor, ρσ_str, ρσ_int, ρσ_float\n\ndef ρσ_eslice(arr, step, start, end):\n    if jstype(arr) is 'string' or v'arr instanceof String':\n        is_string = True\n        arr = arr.split('')\n\n    if step < 0:\n        step = -step\n        arr = arr.slice().reverse()\n        if jstype(start) is not \"undefined\": start = arr.length - start - 1\n        if jstype(end) is not \"undefined\": end = arr.length - end - 1\n    if jstype(start) is \"undefined\": start = 0\n    if jstype(end) is \"undefined\": end = arr.length\n\n    arr = arr.slice(start, end).filter(def(e, i): return i % step is 0;)\n    if is_string:\n        arr = arr.join('')\n    return arr\n\ndef ρσ_delslice(arr, step, start, end):\n    if jstype(arr) is 'string' or v'arr instanceof String':\n        is_string = True\n        arr = arr.split('')\n    if step < 0:\n        if jstype(start) is \"undefined\": start = arr.length\n        if jstype(end) is \"undefined\": end = 0\n        start, end, step = end, start, -step\n    if jstype(start) is \"undefined\": start = 0\n    if jstype(end) is \"undefined\": end = arr.length\n\n    if step is 1:\n        arr.splice(start, end - start)\n    else:\n        if end > start:\n            indices = v'[]'\n            for v'var i = start; i < end; i += step':\n                indices.push(i)\n            for v'var i = indices.length - 1; i >= 0; i--':\n                arr.splice(indices[i], 1)\n\n    if is_string:\n        arr = arr.join('')\n    return arr\n\ndef ρσ_flatten(arr):\n    ans = []\n    for v'var i=0; i < arr.length; i++':\n        value = arr[i]  # noqa:undef\n        if Array.isArray(value):\n            ans = ans.concat(ρσ_flatten(value))\n        else:\n            ans.push(value)\n    return ans\n\ndef ρσ_unpack_asarray(num, iterable):\n    if ρσ_arraylike(iterable):\n        return iterable\n    ans = v'[]'\n    if jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n        result = iterator.next()\n        while not result.done and ans.length < num:\n            ans.push(result.value)\n            result = iterator.next()\n    return ans\n\ndef ρσ_extends(child, parent):\n    child.prototype = Object.create(parent.prototype)\n    child.prototype.constructor = child\n\nρσ_in = (def ():\n    if jstype(Map) is 'function' and jstype(Set) is 'function':\n        return def(val, arr):\n            if jstype(arr) is 'string':\n                return arr.indexOf(val) is not -1\n            if jstype(arr.__contains__) is 'function':\n                return arr.__contains__(val)\n            if v'arr instanceof Map || arr instanceof Set':\n                return arr.has(val)\n            if ρσ_arraylike(arr):\n                return ρσ_list_contains.call(arr, val)\n            return Object.prototype.hasOwnProperty.call(arr, val)\n    return def(val, arr):\n        if jstype(arr) is 'string':\n            return arr.indexOf(val) is not -1\n        if jstype(arr.__contains__) is 'function':\n            return arr.__contains__(val)\n        if ρσ_arraylike(arr):\n            return ρσ_list_contains.call(arr, val)\n        return Object.prototype.hasOwnProperty.call(arr, val)\n)()\n\ndef ρσ_Iterable(iterable):\n    # Once ES6 is mature, change AST_ForIn to use the iterator protocol and get\n    # rid of this function entirely\n    if ρσ_arraylike(iterable):\n        return iterable\n    if jstype(iterable[ρσ_iterator_symbol]) is 'function':\n        iterator = iterable.keys() if jstype(Map) is 'function' and v'iterable instanceof Map' else iterable[ρσ_iterator_symbol]()\n        ans = []\n        result = iterator.next()\n        while not result.done:\n            ans.push(result.value)\n            result = iterator.next()\n        return ans\n    # so we can use 'for ... in' syntax with objects, as we would with dicts in python\n    return Object.keys(iterable)\n\nρσ_desugar_kwargs = (def ():\n    if jstype(Object.assign) is 'function':\n        return def():\n            ans = Object.create(None)\n            ans[ρσ_kwargs_symbol] = True\n            for v'var i = 0; i < arguments.length; i++':\n                Object.assign(ans, arguments[i])\n            return ans\n    return def():\n        ans = Object.create(None)\n        ans[ρσ_kwargs_symbol] = True\n        for v'var i = 0; i < arguments.length; i++':\n            keys = Object.keys(arguments[i])\n            for v'var j = 0; j < keys.length; j++':\n                ans[keys[j]] = arguments[i][keys[j]]\n        return ans\n)()\n\ndef ρσ_interpolate_kwargs(f, supplied_args):\n    if not f.__argnames__:\n        return f.apply(this, supplied_args)\n    has_prop = Object.prototype.hasOwnProperty\n    kwobj = supplied_args.pop()\n    if f.__handles_kwarg_interpolation__:\n        args = Array(Math.max(supplied_args.length, f.__argnames__.length) + 1)\n        args[-1] = kwobj\n        for v'var i = 0; i < args.length - 1; i++':\n            if i < f.__argnames__.length:\n                prop = f.__argnames__[i]\n                if has_prop.call(kwobj, prop):\n                    args[i] = kwobj[prop]\n                    v'delete kwobj[prop]'\n                elif i < supplied_args.length:\n                    args[i] = supplied_args[i]\n            else:\n                args[i] = supplied_args[i]\n        return f.apply(this, args)\n\n    for v'var i = 0; i < f.__argnames__.length; i++':\n        prop = f.__argnames__[i]\n        if has_prop.call(kwobj, prop):\n            supplied_args[i] = kwobj[prop]\n    return f.apply(this, supplied_args)\n\ndef ρσ_interpolate_kwargs_constructor(apply, f, supplied_args):\n    if apply:\n        f.apply(this, supplied_args)\n    else:\n        ρσ_interpolate_kwargs.call(this, f, supplied_args)\n    return this\n\ndef ρσ_getitem(obj, key):\n    if obj.__getitem__:\n        return obj.__getitem__(key)\n    if jstype(key) is 'number' and key < 0:\n        key += obj.length\n    return obj[key]\n\ndef ρσ_setitem(obj, key, val):\n    if obj.__setitem__:\n        obj.__setitem__(key, val)\n    else:\n        if jstype(key) is 'number' and key < 0:\n            key += obj.length\n        obj[key] = val\n    return val\n\ndef ρσ_delitem(obj, key):\n    if obj.__delitem__:\n        obj.__delitem__(key)\n    elif jstype(obj.splice) is 'function':\n        obj.splice(key, 1)\n    else:\n        if jstype(key) is 'number' and key < 0:\n            key += obj.length\n        v'delete obj[key]'\n\ndef ρσ_bound_index(idx, arr):\n    if jstype(idx) is 'number' and idx < 0:\n        idx += arr.length\n    return idx\n\ndef ρσ_splice(arr, val, start, end):\n    start = start or 0\n    if start < 0:\n        start += arr.length\n    if end is undefined:\n        end = arr.length\n    if end < 0:\n        end += arr.length\n    Array.prototype.splice.apply(arr, v'[start, end - start].concat(val)')\n\nρσ_exists = {\n     'n': def(expr):\n        return expr is not undefined and expr is not None\n    ,'d': def(expr):\n        if expr is undefined or expr is None:\n            return Object.create(None)\n        return expr\n    ,'c': def(expr):\n        if jstype(expr) is 'function':\n            return expr\n        return def():\n            return undefined\n    ,'g': def(expr):\n        if expr is undefined or expr is None or jstype(expr.__getitem__) is not 'function':\n            return {'__getitem__': def(): return undefined;}\n    ,'e': def(expr, alt):\n        return alt if expr is undefined or expr is None else expr\n}\n\ndef ρσ_mixin():\n    # Implement a depth-first left-to-right method resolution order This is not\n    # the same as python's MRO, but I really dont feel like implementing the C3\n    # linearization right now, if that is even possible with prototypical\n    # inheritance.\n    seen = Object.create(None)\n    # Ensure the following special properties are never copied\n    seen.__argnames__ = seen.__handles_kwarg_interpolation__ = seen.__init__ = seen.__annotations__ = seen.__doc__ = seen.__bind_methods__ = seen.__bases__ = seen.constructor = seen.__class__ = True\n    resolved_props = {}\n    p = target = arguments[0].prototype\n    while p and p is not Object.prototype:\n        props = Object.getOwnPropertyNames(p)\n        for v'var i = 0; i < props.length; i++':\n            seen[props[i]] = True\n        p = Object.getPrototypeOf(p)\n    for v'var c = 1; c < arguments.length; c++':\n        p = arguments[c].prototype\n        while p and p is not Object.prototype:\n            props = Object.getOwnPropertyNames(p)\n            for v'var i = 0; i < props.length; i++':\n                name = props[i]\n                if seen[name]:\n                    continue\n                seen[name] = True\n                resolved_props[name] = Object.getOwnPropertyDescriptor(p, name)\n            p = Object.getPrototypeOf(p)\n    Object.defineProperties(target, resolved_props)\n\ndef ρσ_instanceof():\n    obj = arguments[0]\n    bases = ''\n    if obj and obj.constructor and obj.constructor.prototype:\n        bases = obj.constructor.prototype.__bases__ or ''\n    for v'var i = 1; i < arguments.length; i++':\n        q = arguments[i]\n        if v'obj instanceof q':\n            return True\n        if (q is Array or q is ρσ_list_constructor) and Array.isArray(obj):\n            return True\n        if q is ρσ_str and (jstype(obj) is 'string' or v'obj instanceof String'):\n            return True\n        if q is ρσ_int and (jstype(obj) is 'number' and Number.isInteger(obj)):\n            return True\n        if q is ρσ_float and (jstype(obj) is 'number' and not Number.isInteger(obj)):\n            return True\n        if bases.length > 1:\n            for v'var c = 1; c < bases.length; c++':\n                cls = bases[c]\n                while cls:\n                    if q is cls:\n                        return True\n                    p = Object.getPrototypeOf(cls.prototype)\n                    if not p:\n                        break\n                    cls = p.constructor\n    return False\n"
  },
  {
    "path": "src/baselib-itertools.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# globals: ρσ_iterator_symbol, ρσ_bool\n\ndef sum(iterable, start):\n    if Array.isArray(iterable):\n        return iterable.reduce(\n            def(prev, cur): return prev+cur\n            ,\n            start or 0\n        )\n    ans = start or 0\n    iterator = iter(iterable)\n    r = iterator.next()\n    while not r.done:\n        ans += r.value\n        r = iterator.next()\n    return ans\n\ndef map():\n    iterators = new Array(arguments.length - 1)\n    func = arguments[0]  # noqa: unused-local\n    args = new Array(arguments.length - 1)  # noqa: unused-local\n    for v'var i = 1; i < arguments.length; i++':\n        iterators[i - 1] = iter(arguments[i])  # noqa:undef\n    ans = v\"{'_func':func, '_iterators':iterators, '_args':args}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        for v'var i = 0; i < this._iterators.length; i++':\n            r = this._iterators[i].next()\n            if r.done:\n                return v\"{'done':true}\"\n            this._args[i] = r.value  # noqa:undef\n        return v\"{'done':false, 'value':this._func.apply(undefined, this._args)}\"\n    return ans\n\ndef filter(func_or_none, iterable):\n    func = ρσ_bool if func_or_none is None else func_or_none  # noqa: unused-local\n    ans = v\"{'_func':func, '_iterator':ρσ_iter(iterable)}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        r = this._iterator.next()\n        while not r.done:\n            if this._func(r.value):\n                return r\n            r = this._iterator.next()\n        return v\"{'done':true}\"\n    return ans\n\ndef zip():\n    iterators = new Array(arguments.length)\n    for v'var i = 0; i < arguments.length; i++':\n        iterators[i] = iter(arguments[i])  # noqa:undef\n    ans = v\"{'_iterators':iterators}\"\n    ans[ρσ_iterator_symbol] = def():\n        return this\n    ans['next'] = def():\n        args = new Array(this._iterators.length)\n        for v'var i = 0; i < this._iterators.length; i++':\n            r = this._iterators[i].next()\n            if r.done:\n                return v\"{'done':true}\"\n            args[i] = r.value  # noqa:undef\n        return v\"{'done':false, 'value':args}\"\n    return ans\n\ndef any(iterable):\n    for i in iterable:\n        if i:\n            return True\n    return False\n\ndef all(iterable):\n    for i in iterable:\n        if not i:\n            return False\n    return True\n"
  },
  {
    "path": "src/baselib-str.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# globals: ρσ_kwargs_symbol, ρσ_list_decorate, ρσ_iterator_symbol, HTMLElement\n\n# Locale can’t be changed in-flight, so we just retrieve this once.\n# Sadly older node versions (< 8) don’t support formatToParts\n# decimal_sep = Intl.NumberFormat() \\\n#     .formatToParts(1.1) \\\n#     .find(def(part): return part.type == 'decimal';) \\\n#     .value\ndecimal_sep = (1.1).toLocaleString()[1]\n\ndef ρσ_repr_js_builtin(x, as_array):\n    ans = v'[]'\n    b = '{}'\n    if as_array:\n        b = '[]'\n        for v'var i = 0; i < x.length; i++':\n            ans.push(ρσ_repr(x[i]))\n    else:\n        keys = Object.keys(x)\n        for v'var k = 0; k < keys.length; k++':\n            key = keys[k]\n            ans.push(JSON.stringify(key) + ':' + ρσ_repr(x[key]))\n    return b[0] + ans.join(', ') + b[1]\n\ndef ρσ_html_element_to_string(elem):\n    attrs = v'[]'\n    for attr in elem.attributes:\n        if attr.specified:\n            val = attr.value\n            if val.length > 10:\n                val = val[:15] + '...'\n            val = JSON.stringify(val)\n            attrs.push(f'{attr.name}={val}')\n    attrs = (' ' + attrs.join(' ')) if attrs.length else ''\n    ans = f'<{elem.tagName}{attrs}>'\n    return ans\n\ndef ρσ_repr(x):\n    if x is None:\n        return 'None'\n    if x is undefined:\n        return 'undefined'\n    ans = x\n    if v'typeof x.__repr__ === \"function\"':\n        ans = x.__repr__()\n    elif x is True or x is False:\n        ans = 'True' if x else 'False'\n    elif Array.isArray(x):\n        ans = ρσ_repr_js_builtin(x, True)\n    elif jstype(x) is 'function':\n        ans = x.toString()\n    elif jstype(x) is 'object' and not x.toString:\n        # Assume this is a dictionary\n        ans = ρσ_repr_js_builtin(x)\n    else:\n        name = Object.prototype.toString.call(x).slice(8, -1)\n        if \"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name) != -1:\n            return name + '([' + x.map(def(i): return str.format('0x{:02x}', i);).join(', ') + '])'\n        if jstype(HTMLElement) is not 'undefined' and v'x instanceof HTMLElement':\n            ans = ρσ_html_element_to_string(x)\n        else:\n            ans = x.toString() if v'typeof x.toString === \"function\"' else x\n        if ans is '[object Object]':\n            # Assume this is a dictionary\n            return ρσ_repr_js_builtin(x)\n        try:\n            ans = JSON.stringify(x)\n        except:\n            pass\n    return ans + ''  # Ensures we return an object of type string (i.e. primitive value) rather than a String object\n\ndef ρσ_str(x):\n    if x is None:\n        return 'None'\n    if x is undefined:\n        return 'undefined'\n    ans = x\n    if v'typeof x.__str__ === \"function\"':\n        ans = x.__str__()\n    elif v'typeof x.__repr__ === \"function\"':\n        ans = x.__repr__()\n    elif x is True or x is False:\n        ans = 'True' if x else 'False'\n    elif Array.isArray(x):\n        ans = ρσ_repr_js_builtin(x, True)\n    elif v'typeof x.toString === \"function\"':\n        name = Object.prototype.toString.call(x).slice(8, -1)\n        if \"Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array\".indexOf(name) != -1:\n            return name + '([' + x.map(def(i): return str.format('0x{:02x}', i);).join(', ') + '])'\n        if jstype(HTMLElement) is not 'undefined' and v'x instanceof HTMLElement':\n            ans = ρσ_html_element_to_string(x)\n        else:\n            ans = x.toString()\n        if ans is '[object Object]':\n            # Assume this is a dictionary\n            ans = ρσ_repr_js_builtin(x)\n    elif jstype(x) is 'object' and not x.toString:\n        # Assume this is a dictionary\n        ans = ρσ_repr_js_builtin(x)\n    return ans + ''  # Ensures we return an object of type string (i.e. primitive value) rather than a String object\n\ndefine_str_func = def(name, func):\n    ρσ_str.prototype[name] = func\n    ρσ_str[name] = f = func.call.bind(func)\n    if func.__argnames__:\n        Object.defineProperty(f, '__argnames__', {'value':v\"['string']\".concat(func.__argnames__)})\n\nρσ_orig_split, ρσ_orig_replace = String.prototype.split.call.bind(String.prototype.split), String.prototype.replace.call.bind(String.prototype.replace)\n\n# format()  {{{\ndefine_str_func('format', def ():\n    template = this\n    if template is undefined:\n        raise TypeError(\"Template is required\")\n    args = Array.prototype.slice.call(arguments)\n    kwargs = {}\n    if args[-1] and args[-1][ρσ_kwargs_symbol] is not undefined:\n        kwargs = args[-1]\n        args = args[:-1]\n\n    explicit = implicit = False\n    idx = 0\n    split = ρσ_orig_split\n\n    if ρσ_str.format._template_resolve_pat is undefined:\n        ρσ_str.format._template_resolve_pat = /[.\\[]/\n\n    def resolve(arg, object):\n        if not arg:\n            return object\n        first, arg = arg[0], arg[1:]\n        key = split(arg, ρσ_str.format._template_resolve_pat, 1)[0]\n        rest = arg[key.length:]\n        ans = object[key[:-1]] if first is '[' else getattr(object, key)\n        if ans is undefined:\n            raise KeyError(key[:-1] if first is '[' else key)\n        return resolve(rest, ans)\n\n    def resolve_format_spec(format_spec):\n        if ρσ_str.format._template_resolve_fs_pat is undefined:\n            ρσ_str.format._template_resolve_fs_pat = /[{]([a-zA-Z0-9_]+)[}]/g\n        return format_spec.replace(ρσ_str.format._template_resolve_fs_pat, def (match, key):\n            if not Object.prototype.hasOwnProperty.call(kwargs, key):\n                return ''\n            return '' + kwargs[key]\n        )\n\n    def set_comma(ans, comma):\n        if comma is not ',':\n            sep = 1234\n            sep = sep.toLocaleString(undefined, v'{useGrouping: true}')[1]\n            ans = str.replace(ans, sep, comma)\n        return ans\n\n    def safe_comma(value, comma):\n        try:\n            return set_comma(value.toLocaleString(undefined, v'{useGrouping: true}'), comma)\n        except:\n            return value.toString(10)\n\n\n    def safe_fixed(value, precision, comma):\n        if not comma:\n            return value.toFixed(precision)\n        try:\n            return set_comma(value.toLocaleString(undefined, v'{useGrouping: true, minimumFractionDigits: precision, maximumFractionDigits: precision}'), comma)\n        except:\n            return value.toFixed(precision)\n\n\n    def apply_formatting(value, format_spec):\n        if format_spec.indexOf('{') is not -1:\n            format_spec = resolve_format_spec(format_spec)\n        if ρσ_str.format._template_format_pat is undefined:\n            ρσ_str.format._template_format_pat = ///\n                ([^{}](?=[<>=^]))?([<>=^])? # fill & align\n                ([-+\\x20])? # sign\n                (\\#)? # integer base specifier\n                (0)? # zero-padding\n                (\\d+)? # width\n                ([,_])? # use a grouping (thousands) seperator\n                (?:\\.(\\d+))? # precision\n                ([bcdeEfFgGnosxX%])? # type\n            ///\n\n        try:\n            fill, align, sign, fhash, zeropad, width, comma, precision, ftype = format_spec.match(ρσ_str.format._template_format_pat)[1:]\n        except TypeError:\n            return value\n        if zeropad:\n            fill = fill or '0'\n            align = align or '='\n        else:\n            fill = fill or ' '\n            align = align or '>'\n        is_numeric = v'Number(value) === value'\n        is_int = is_numeric and v'value % 1 === 0'\n        precision = parseInt(precision, 10)\n        lftype = (ftype or '').toLowerCase()\n\n        if ftype is 'n':\n            is_numeric = True\n            if is_int:\n                if comma:\n                    raise ValueError(\"Cannot specify ',' with 'n'\")\n                value = parseInt(value, 10).toLocaleString()\n            else:\n                value = parseFloat(value).toLocaleString()\n\n        elif v\"['b', 'c', 'd', 'o', 'x']\".indexOf(lftype) is not -1:\n            value = parseInt(value, 10)\n            is_numeric = True\n            if not isNaN(value):\n                if ftype is 'b':\n                    value = v'(value >>> 0).toString(2)'\n                    if fhash:\n                        value = '0b' + value\n                elif ftype is 'c':\n                    if value > 0xFFFF:\n                        code = value - 0x10000\n                        value = String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n                    else:\n                        value = String.fromCharCode(value)\n                elif ftype is 'd':\n                    if comma:\n                        value = safe_comma(value, comma)\n                    else:\n                        value = value.toString(10)\n                elif ftype is 'o':\n                    value = value.toString(8)\n                    if fhash:\n                        value = '0o' + value\n                elif lftype is 'x':\n                    value = value.toString(16)\n                    value = value.toLowerCase() if ftype is 'x' else value.toUpperCase()\n                    if fhash:\n                        value = '0x' + value\n\n        elif v\"['e','f','g','%']\".indexOf(lftype) is not -1:\n            is_numeric = True\n            value = parseFloat(value)\n            prec = 6 if isNaN(precision) else precision\n            if lftype is 'e':\n                value = value.toExponential(prec)\n                value = value.toUpperCase() if ftype is 'E' else value.toLowerCase()\n            elif lftype is 'f':\n                value = safe_fixed(value, prec, comma)\n                value = value.toUpperCase() if ftype is 'F' else value.toLowerCase()\n            elif lftype is '%':\n                value *= 100\n                value = safe_fixed(value, prec, comma) + '%'\n            elif lftype is 'g':\n                prec = max(1, prec)\n                exp = parseInt(split(value.toExponential(prec - 1).toLowerCase(), 'e')[1], 10)\n                if -4 <= exp < prec:\n                    value = safe_fixed(value, prec - 1 - exp, comma)\n                else:\n                    value = value.toExponential(prec - 1)\n                value = value.replace(/0+$/g, '')\n                if value[-1] is decimal_sep:\n                    value = value[:-1]\n                if ftype is 'G':\n                    value = value.toUpperCase()\n\n        else:\n            if comma:\n                value = parseInt(value, 10)\n                if isNaN(value):\n                    raise ValueError('Must use numbers with , or _')\n                value = safe_comma(value, comma)\n            value += ''  # Ensure we have a string\n            if not isNaN(precision):\n                value = value[:precision]\n\n        value += ''  # Ensure we have a string\n\n        if is_numeric and sign:\n            nval = v'Number(value)'\n            is_positive = not isNaN(nval) and nval >= 0\n            if is_positive and (sign is ' ' or sign is '+'):\n                value = sign + value\n\n        def repeat(char, num):\n            return v'(new Array(num+1)).join(char)'\n\n        if is_numeric and width and width[0] is '0':\n            width = width[1:]\n            fill, align = '0', '='\n\n        width = parseInt(width or '-1', 10)\n        if isNaN(width):\n            raise ValueError('Invalid width specification: ' + width)\n\n        if fill and value.length < width:\n            if align is '<':\n                value = value + repeat(fill, width - value.length)\n            elif align is '>':\n                value = repeat(fill, width - value.length) + value\n            elif align is '^':\n                left = (width - value.length) // 2\n                right = width - left - value.length\n                value = repeat(fill, left) + value + repeat(fill, right)\n            elif align is '=':\n                if value[0] in \"+- \":\n                    value = value[0] + repeat(fill, width - value.length) + value[1:]\n                else:\n                    value = repeat(fill, width - value.length) + value\n            else:\n                raise ValueError('Unrecognized alignment: ' + align)\n\n        return value\n\n    def parse_markup(markup):\n        key = transformer = format_spec = ''\n        pos = 0\n        state = 0\n        while pos < markup.length:\n            ch = markup[pos]\n            if state is 0:\n                if ch is '!':\n                    state = 1\n                elif ch is ':':\n                    state = 2\n                else:\n                    key += ch\n            elif state is 1:\n                if ch is ':':\n                    state = 2\n                else:\n                    transformer += ch\n            else:\n                format_spec += ch\n            pos += 1\n        return key, transformer, format_spec\n\n    def render_markup(markup):\n        nonlocal explicit, implicit, idx\n        key, transformer, format_spec = parse_markup(markup)\n        if transformer and v\"['a', 'r', 's']\".indexOf(transformer) is -1:\n            raise ValueError('Unknown conversion specifier: ' + transformer)\n        ends_with_equal = key.endsWith('=')\n        if ends_with_equal:\n            key = key[:-1]\n        lkey = key.length and split(key, /[.\\[]/, 1)[0]\n        if lkey:\n            explicit = True\n            if implicit:\n                raise ValueError('cannot switch from automatic field numbering to manual field specification')\n            nvalue = parseInt(lkey)\n            object = kwargs[lkey] if isNaN(nvalue) else args[nvalue]\n            if object is undefined:\n                if isNaN(nvalue):\n                    raise KeyError(lkey)\n                raise IndexError(lkey)\n            object = resolve(key[lkey.length:], object)\n        else:\n            implicit = True\n            if explicit:\n                raise ValueError('cannot switch from manual field specification to automatic field numbering')\n            if idx >= args.length:\n                raise IndexError('Not enough arguments to match template: ' + template)\n            object = args[idx]\n            idx += 1\n        if jstype(object) is 'function':\n            object = object()\n        ans = '' + object\n        if format_spec:\n            ans = apply_formatting(ans, format_spec)\n        if ends_with_equal:\n            ans = f'{key}={ans}'\n        return ans\n\n\n    ans = ''\n    pos = 0\n    in_brace = 0\n    markup = ''\n    while pos < template.length:\n        ch = template[pos]\n        if in_brace:\n            if ch is '{':\n                in_brace += 1\n                markup += '{'\n            elif ch is '}':\n                in_brace -= 1\n                if in_brace > 0:\n                    markup += '}'\n                else:\n                    ans += render_markup(markup)\n            else:\n                markup += ch\n        else:\n            if ch is '{':\n                if template[pos+1] is '{':\n                    pos += 1\n                    ans += '{'\n                else:\n                    in_brace = 1\n                    markup = ''\n            else:\n                ans += ch\n                if ch is '}' and template[pos+1] is '}':\n                    pos += 1\n\n        pos += 1\n\n    if in_brace:\n        raise ValueError(\"expected '}' before end of string\")\n\n    return ans\n)\n# }}}\n\ndefine_str_func('capitalize', def ():\n    string = this\n    if string:\n        string = string[0].toUpperCase() + string[1:].toLowerCase()\n    return string\n)\n\ndefine_str_func('center', def(width, fill):\n    left = (width - this.length) // 2\n    right = width - left - this.length  # noqa:unused-local\n    fill = fill or ' '\n    return v'new Array(left+1).join(fill)' + this + v'new Array(right+1).join(fill)'\n)\n\ndefine_str_func('count', def(needle, start, end):\n    string = this\n    start = start or 0\n    end = end or string.length\n    if start < 0 or end < 0:\n        string = string[start:end]\n        start, end = 0, string.length\n    pos = start\n    step = needle.length\n    if not step:\n        return 0\n    ans = 0\n    while pos is not -1:\n        pos = string.indexOf(needle, pos)\n        if pos is not -1:\n            ans += 1\n            pos += step\n    return ans\n)\n\ndefine_str_func('endswith', def(suffixes, start, end):\n    string = this\n    start = start or 0\n    if jstype(suffixes) is 'string':\n        suffixes = v'[suffixes]'\n    if end is not undefined:\n        string = string[:end]\n    for v'var i = 0; i < suffixes.length; i++':\n        q = suffixes[i]  # noqa:undef\n        if string.indexOf(q, Math.max(start, string.length - q.length)) is not -1:\n            return True\n    return False\n)\n\ndefine_str_func('startswith', def(prefixes, start, end):\n    start = start or 0\n    if jstype(prefixes) is 'string':\n        prefixes = v'[prefixes]'\n    for v'var i = 0; i < prefixes.length; i++':\n        prefix = prefixes[i]  # noqa:undef\n        end = this.length if end is undefined else end\n        if end - start >= prefix.length and prefix is this[start:start + prefix.length]:\n            return True\n    return False\n)\n\ndefine_str_func('find', def(needle, start, end):\n    while start < 0:\n        start += this.length\n    ans = this.indexOf(needle, start)\n    if end is not undefined and ans is not -1:\n        while end < 0:\n            end += this.length\n        if ans >= end - needle.length:\n            return -1\n    return ans\n)\n\ndefine_str_func('rfind', def(needle, start, end):\n    while end < 0:\n        end += this.length\n    ans = this.lastIndexOf(needle, end - 1)\n    if start is not undefined and ans is not -1:\n        while start < 0:\n            start += this.length\n        if ans < start:\n            return -1\n    return ans\n)\n\ndefine_str_func('index', def(needle, start, end):\n    ans = ρσ_str.prototype.find.apply(this, arguments)\n    if ans is -1:\n        raise ValueError('substring not found')\n    return ans\n)\n\ndefine_str_func('rindex', def(needle, start, end):\n    ans = ρσ_str.prototype.rfind.apply(this, arguments)\n    if ans is -1:\n        raise ValueError('substring not found')\n    return ans\n)\n\ndefine_str_func('islower', def():\n    return this.length > 0 and this.toLowerCase() is this.toString()\n)\n\ndefine_str_func('isupper', def():\n    return this.length > 0 and this.toUpperCase() is this.toString()\n)\n\ndefine_str_func('isspace', def():\n    return this.length > 0 and /^\\s+$/.test(this)\n)\n\ndefine_str_func('join', def(iterable):\n    if Array.isArray(iterable):\n        return iterable.join(this)\n    ans = ''\n    r = iterable.next()\n    while not r.done:\n        if ans:\n            ans += this\n        ans += r.value\n        r = iterable.next()\n    return ans\n)\n\ndefine_str_func('ljust', def(width, fill):\n    string = this\n    if width > string.length:\n        fill = fill or ' '\n        string += v'new Array(width - string.length + 1).join(fill)'\n    return string\n)\n\ndefine_str_func('rjust', def(width, fill):\n    string = this\n    if width > string.length:\n        fill = fill or ' '\n        string = v'new Array(width - string.length + 1).join(fill)' + string\n    return string\n)\n\ndefine_str_func('lower', def():\n    return this.toLowerCase()\n)\n\ndefine_str_func('upper', def():\n    return this.toUpperCase()\n)\n\ndefine_str_func('lstrip', def(chars):\n    string = this\n    pos = 0\n    chars = chars or ρσ_str.whitespace\n    while chars.indexOf(string[pos]) is not -1:\n        pos += 1\n    if pos:\n        string = string[pos:]\n    return string\n)\n\ndefine_str_func('rstrip', def(chars):\n    string = this\n    pos = string.length - 1\n    chars = chars or ρσ_str.whitespace\n    while chars.indexOf(string[pos]) is not -1:\n        pos -= 1\n    if pos < string.length - 1:\n        string = string[:pos + 1]\n    return string\n)\n\ndefine_str_func('strip', def(chars):\n    return ρσ_str.prototype.lstrip.call(ρσ_str.prototype.rstrip.call(this, chars), chars)\n)\n\ndefine_str_func('partition', def(sep):\n    idx = this.indexOf(sep)\n    if idx is -1:\n        return this, '', ''\n    return this[:idx], sep, this[idx + sep.length:]\n)\n\ndefine_str_func('rpartition', def(sep):\n    idx = this.lastIndexOf(sep)\n    if idx is -1:\n        return '', '', this\n    return this[:idx], sep, this[idx + sep.length:]\n)\n\ndefine_str_func('replace', def(old, repl, count):\n    string = this\n    if count is 1:\n        return ρσ_orig_replace(string, old, repl)\n    if count < 1:\n        return string\n    count = count or Number.MAX_VALUE\n    pos = 0\n    while count > 0:\n        count -= 1\n        idx = string.indexOf(old, pos)\n        if idx is -1:\n            break\n        pos = idx + repl.length\n        string = string[:idx] + repl + string[idx + old.length:]\n    return string\n)\n\ndefine_str_func('split', def(sep, maxsplit):\n    if maxsplit is 0:\n        return [this]\n    split = ρσ_orig_split\n    if sep is undefined or sep is None:\n        if maxsplit > 0:\n            ans = split(this, /(\\s+)/)\n            extra = ''\n            parts = v'[]'\n            for v'var i = 0; i < ans.length; i++':\n                if parts.length >= maxsplit + 1:\n                    extra += ans[i]\n                elif i % 2 is 0:\n                    parts.push(ans[i])  # noqa:undef\n            parts[-1] += extra\n            ans = parts\n        else:\n            ans = split(this, /\\s+/)\n    else:\n        if sep is '':\n            raise ValueError('empty separator')\n        ans = split(this, sep)\n        if maxsplit > 0 and ans.length > maxsplit:\n            extra = ans[maxsplit:].join(sep)\n            ans = ans[:maxsplit]\n            ans.push(extra)\n    return ρσ_list_decorate(ans)\n)\n\ndefine_str_func('rsplit', def(sep, maxsplit):\n    if not maxsplit:\n        return ρσ_str.prototype.split.call(this, sep)\n    split = ρσ_orig_split\n    if sep is undefined or sep is None:\n        if maxsplit > 0:\n            ans = v'[]'\n            is_space = /\\s/\n            pos = this.length - 1\n            current = ''\n            while pos > -1 and maxsplit > 0:\n                spc = False\n                ch = this[pos]\n                while pos > -1 and is_space.test(ch):\n                    spc = True\n                    ch = v'this[--pos]'\n                if spc:\n                    if current:\n                        ans.push(current)\n                        maxsplit -= 1\n                    current = ch\n                else:\n                    current += ch\n                pos -= 1\n            ans.push(this[:pos + 1] + current)\n            ans.reverse()\n        else:\n            ans = split(this, /\\s+/)\n    else:\n        if sep is '':\n            raise ValueError('empty separator')\n        ans = v'[]'\n        pos = end = this.length\n        while pos > -1 and maxsplit > 0:\n            maxsplit -= 1\n            idx = this.lastIndexOf(sep, pos)\n            if idx is -1:\n                break\n            ans.push(this[idx + sep.length:end])\n            pos = idx - 1\n            end = idx\n        ans.push(this[:end])\n        ans.reverse()\n    return ρσ_list_decorate(ans)\n)\n\ndefine_str_func('splitlines', def(keepends):\n    split = ρσ_orig_split\n    if keepends:\n        parts = split(this, /((?:\\r?\\n)|\\r)/)\n        ans = v'[]'\n        for v'var i = 0; i < parts.length; i++':\n            if i % 2 is 0:\n                ans.push(parts[i])\n            else:\n                ans[-1] += parts[i]  # noqa:undef\n    else:\n        ans = split(this, /(?:\\r?\\n)|\\r/)\n    return ρσ_list_decorate(ans)\n)\n\ndefine_str_func('swapcase', def():\n    ans = v'new Array(this.length)'\n    for v'var i = 0; i < ans.length; i++':\n        a = this[i]\n        # We dont care about non-BMP chars as they are not cased anyway\n        b = a.toLowerCase()\n        if a is b:\n            b = a.toUpperCase()\n        ans[i] = b  # noqa:undef\n    return ans.join('')\n)\n\ndefine_str_func('zfill', def(width):\n    string = this\n    if width > string.length:\n        string = v'new Array(width - string.length + 1).join(\"0\")' + string\n    return string\n)\n\nρσ_str.uchrs = def(string, with_positions):\n    # Return iterator over unicode chars in string. Will yield the unicode\n    # replacement char U+FFFD for broken surrogate pairs\n    return {\n        '_string': string,\n        '_pos': 0,\n        ρσ_iterator_symbol: def(): return this;,\n        'next' : def():\n            length = this._string.length\n            if this._pos >= length:\n                return {'done': True}\n            pos = this._pos\n            value = v'this._string.charCodeAt(this._pos++)'\n            ans = '\\ufffd'\n            if 0xD800 <= value <= 0xDBFF:\n                if this._pos < length:\n                    # high surrogate, and there is a next character\n                    extra = v'this._string.charCodeAt(this._pos++)'\n                    if (extra & 0xDC00) is 0xDC00: # low surrogate\n                        ans = String.fromCharCode(value, extra)\n            elif (value & 0xDC00) is not 0xDC00: # not a low surrogate\n                ans = String.fromCharCode(value)\n            if with_positions:\n                return {'done':False, 'value':[pos, ans]}\n            else:\n                return {'done':False, 'value':ans}\n    }\n\nρσ_str.uslice = def(string, start, end):\n    items = v'[]'\n    iterator = ρσ_str.uchrs(string)\n    r = iterator.next()\n    while not r.done:\n        items.push(r.value)\n        r = iterator.next()\n    return items[start or 0:items.length if end is undefined else end].join('')\n\nρσ_str.ulen = def(string):\n    iterator = ρσ_str.uchrs(string)\n    r = iterator.next()\n    ans = 0\n    while not r.done:\n        r = iterator.next()\n        ans += 1\n    return ans\n\nρσ_str.ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'\nρσ_str.ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nρσ_str.ascii_letters   = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\nρσ_str.digits   = '0123456789'\nρσ_str.punctuation = '!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~'\nρσ_str.printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&\\'()*+,-./:;<=>?@[\\\\]^_`{|}~ \\t\\n\\r\\x0b\\x0c'\nρσ_str.whitespace   = ' \\t\\n\\r\\x0b\\x0c'\n\nv'define_str_func = undefined'\nv'var str = ρσ_str, repr = ρσ_repr'\n"
  },
  {
    "path": "src/compiler.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: console\n\nfrom utils import DefaultsError, string_template\nfrom errors import ImportError, SyntaxError\nfrom tokenizer import ALL_KEYWORDS, IDENTIFIER_PAT, tokenizer\nfrom parse import parse, NATIVE_CLASSES, compile_time_decorators\nfrom output.stream import OutputStream\nfrom output.codegen import generate_code\n\ngenerate_code()  # create the print methods on the AST nodes\n\n# The following allows this module to be used from a pure javascript, require()\n# based environment like Node.js\nif jstype(exports) is 'object':\n    exports.DefaultsError = DefaultsError\n    exports.parse = parse\n    exports.compile_time_decorators = compile_time_decorators\n    exports.OutputStream = OutputStream\n    exports.string_template = string_template  # noqa:undef\n    # Needed for REPL and linter\n    exports.ALL_KEYWORDS = ALL_KEYWORDS\n    exports.IDENTIFIER_PAT = IDENTIFIER_PAT\n    exports.NATIVE_CLASSES = NATIVE_CLASSES\n    exports.ImportError = ImportError\n    exports.SyntaxError = SyntaxError\n    exports.tokenizer = tokenizer\n    # Magic! Export all the AST_* nodes\n    ast = ρσ_modules['ast']\n    for ast_node in ast:\n        if ast_node.substr(0, 4) is 'AST_':\n            exports[ast_node] = ast[ast_node]  # noqa:undef\n"
  },
  {
    "path": "src/errors.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nclass SyntaxError(Error):\n\n    def __init__(self, message, filename, line, col, pos, is_eof):\n        self.stack = Error().stack\n        self.message = message\n        self.line = line\n        self.col = col\n        self.pos = pos\n        self.is_eof = is_eof\n        self.filename = filename\n        # The \"standard\" form for these error attributes\n        self.lineNumber = line\n        self.fileName = filename\n\n    def toString(self):\n        ans = self.message + \" (line: \" + self.line + \", col: \" + self.col + \", pos: \" + self.pos + \")\"\n        if self.filename:\n            ans = self.filename + ':' + ans\n        if self.stack:\n            ans += \"\\n\\n\" + self.stack\n        return ans\n\n\nclass ImportError(SyntaxError):\n    pass\n\n"
  },
  {
    "path": "src/lib/aes.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\n# globals: crypto\n\n# Internal API {{{\n\ndef string_to_bytes_encoder(string):\n    return TextEncoder('utf-8').encode(string + '')\n\ndef string_to_bytes_slow(string):\n    escstr = encodeURIComponent(string)\n    binstr = escstr.replace(/%([0-9A-F]{2})/g, def(match, p1):\n        return String.fromCharCode('0x' + p1)\n    )\n    ua = Uint8Array(binstr.length)\n    for i, ch in enumerate(binstr):\n        ua[i] = ch.charCodeAt(0)\n    return ua\n\ndef as_hex(array, sep=''):\n    num = array.BYTES_PER_ELEMENT or 1\n    fmt = '{:0' + num * 2 + 'x}'\n    return [str.format(fmt, x) for x in array].join(sep)\n\ndef bytes_to_string_decoder(bytes, offset):\n    offset = offset or 0\n    if offset:\n        bytes = bytes.subarray(offset)\n    return TextDecoder('utf-8').decode(bytes)\n\ndef bytes_to_string_slow(bytes, offset):\n    ans = v'[]'\n    i = offset or 0\n    while i < bytes.length:\n        c = bytes[i]\n        if c < 128:\n            ans.push(String.fromCharCode(c))\n            i += 1\n        elif 191 < c < 224:\n            ans.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f)))\n            i += 2\n        else:\n            ans.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f)))\n            i += 3\n    return ans.join('')\n\nstring_to_bytes = string_to_bytes_encoder if jstype(TextEncoder) is 'function' else string_to_bytes_slow\nbytes_to_string = bytes_to_string_decoder if jstype(TextDecoder) is 'function' else bytes_to_string_slow\n\ndef increment_counter(c):\n    # c must be a Uint8Array of length 16\n    for v'var i = 15; i >= 12; i--':\n        if c[i] is 255:\n            c[i] = 0\n        else:\n            c[i] += 1\n            break\n\ndef convert_to_int32(bytes, output, offset, length):\n    offset = offset or 0\n    length = length or bytes.length\n    for v'var i = offset, j = 0; i < offset + length; i += 4, j++':\n        output[j] = (bytes[i] << 24) | (bytes[i + 1] << 16) | (bytes[i + 2] <<  8) | bytes[i + 3]\n\ndef convert_to_int32_pad(bytes):\n    extra = bytes.length % 4\n    if extra:\n        t = Uint8Array(bytes.length + 4 - extra)\n        t.set(bytes)\n        bytes = t\n    ans = Uint32Array(bytes.length / 4)\n    convert_to_int32(bytes, ans)\n    return ans\n\nif not Uint8Array.prototype.fill:\n    Uint8Array.prototype.fill = Uint32Array.prototype.fill = def(val, start, end):\n        start = start or 0\n        if end is undefined:\n            end = this.length\n        if start < 0:\n            start += this.length\n        if end < 0:\n            end += this.length\n        for v'var i = start; i < end; i++':\n            this[i] = val\n\ndef from_64_to_32(num):\n  # convert 64-bit number to two BE Int32s\n  ans = Uint32Array(2)\n  ans[0] = (num / 0x100000000) | 0\n  ans[1] = num & 0xFFFFFFFF\n  return ans\n\n# Lookup tables for AES {{{\n# Number of rounds by keysize\nnumber_of_rounds = {16: 10, 24: 12, 32: 14}\n# Round constant words\nrcon = v'new Uint32Array([0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91])'\n\n# S-box and Inverse S-box (S is for Substitution)\nS = v'new Uint32Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16])'\nSi = v'new Uint32Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d])'\n\n# Transformations for encryption\nT1 = v'new Uint32Array([0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a])'\nT2 = v'new Uint32Array([0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616])'\nT3 = v'new Uint32Array([0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16])'\nT4 = v'new Uint32Array([0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c])'\n\n# Transformations for decryption\nT5 = v'new Uint32Array([0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742])'\nT6 = v'new Uint32Array([0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857])'\nT7 = v'new Uint32Array([0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8])'\nT8 = v'new Uint32Array([0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0])'\n\n# Transformations for decryption key expansion\nU1 = v'new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3])'\nU2 = v'new Uint32Array([0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697])'\nU3 = v'new Uint32Array([0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46])'\nU4 = v'new Uint32Array([0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d])'\n\n# }}}\n\nclass AES: # {{{\n\n    def __init__(self, key):\n        self.working_mem = [Uint32Array(4), Uint32Array(4)]\n        rounds = number_of_rounds[key.length]\n        if not rounds:\n            raise ValueError('invalid key size (must be length 16, 24 or 32)')\n\n        # encryption round keys\n        self._Ke = v'[]'\n\n        # decryption round keys\n        self._Kd = v'[]'\n\n        for v'var i = 0; i <= rounds; i++':\n            self._Ke.push(Uint32Array(4))\n            self._Kd.push(Uint32Array(4))\n\n        round_key_count = (rounds + 1) * 4\n        KC = key.length / 4\n\n        # convert the key into ints\n        tk = Uint32Array(KC)\n        convert_to_int32(key, tk)\n\n        # copy values into round key arrays\n        index = 0\n        for v'var i = 0; i < KC; i++':\n            index = i >> 2\n            self._Ke[index][i % 4] = tk[i]\n            self._Kd[rounds - index][i % 4] = tk[i]\n\n        # key expansion (fips-197 section 5.2)\n        rconpointer = 0\n        t = KC\n        while t < round_key_count:\n            tt = tk[KC - 1]\n            tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^\n                      (S[(tt >>  8) & 0xFF] << 16) ^\n                      (S[ tt        & 0xFF] <<  8) ^\n                       S[(tt >> 24) & 0xFF]        ^\n                      (rcon[rconpointer] << 24))\n            rconpointer += 1\n\n            # key expansion (for non-256 bit)\n            if KC != 8:\n                for v'var i = 1; i < KC; i++':\n                    tk[i] ^= tk[i - 1]\n\n            # key expansion for 256-bit keys is \"slightly different\" (fips-197)\n            else:\n                for v'var i = 1; i < (KC / 2); i++':\n                    tk[i] ^= tk[i - 1]\n                tt = tk[(KC / 2) - 1]\n\n                tk[KC / 2] ^= (S[ tt        & 0xFF]        ^\n                              (S[(tt >>  8) & 0xFF] <<  8) ^\n                              (S[(tt >> 16) & 0xFF] << 16) ^\n                              (S[(tt >> 24) & 0xFF] << 24))\n\n                for v'var i = (KC / 2) + 1; i < KC; i++':\n                    tk[i] ^= tk[i - 1]\n\n            # copy values into round key arrays\n            i = 0\n            while i < KC and t < round_key_count:\n                r = t >> 2\n                c = t % 4\n                self._Ke[r][c] = tk[i]\n                self._Kd[rounds - r][c] = tk[v'i++']\n                t += 1\n\n        # inverse-cipher-ify the decryption round key (fips-197 section 5.3)\n        for v'var r = 1; r < rounds; r++':\n            for v'var c = 0; c < 4; c++':\n                tt = self._Kd[r][c]\n                self._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^\n                                  U2[(tt >> 16) & 0xFF] ^\n                                  U3[(tt >>  8) & 0xFF] ^\n                                  U4[ tt        & 0xFF])\n\n    def _crypt(self, ciphertext, offset, encrypt):\n        if encrypt:\n            R1 = T1; R2 = T2; R3 = T3; R4 = T4\n            o1 = 1; o3 = 3\n            SB = S\n            K = self._Ke\n        else:\n            R1 = T5; R2 = T6; R3 = T7; R4 = T8\n            o1 = 3; o3 = 1\n            SB = Si\n            K = self._Kd\n        rounds = K.length - 1\n        a = self.working_mem[0]\n        t = self.working_mem[1]\n\n        # XOR plaintext with key\n        for v'var i = 0; i < 4; i++':\n            t[i] ^= K[0][i]\n\n        # apply round transforms\n        for v'var r = 1; r < rounds; r++':\n            for v'var i = 0; i < 4; i++':\n                a[i] = (R1[(t[i] >> 24) & 0xff] ^\n                        R2[(t[(i + o1) % 4] >> 16) & 0xff] ^\n                        R3[(t[(i +  2) % 4] >>  8) & 0xff] ^\n                        R4[ t[(i + o3) % 4]        & 0xff] ^\n                        K[r][i])\n            t.set(a)\n\n        # the last round is special\n        for v'var i = 0; i < 4; i++':\n            tt = K[rounds][i]\n            ciphertext[offset + 4 * i] = (SB[(t[i] >> 24) & 0xff] ^ (tt >> 24)) & 0xff\n            ciphertext[offset + 4 * i + 1] = (SB[(t[(i + o1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff\n            ciphertext[offset + 4 * i + 2] = (SB[(t[(i +  2) % 4] >>  8) & 0xff] ^ (tt >>  8)) & 0xff\n            ciphertext[offset + 4 * i + 3] = (SB[ t[(i + o3) % 4]        & 0xff] ^  tt       ) & 0xff\n\n    def encrypt(self, plaintext, ciphertext, offset):\n        convert_to_int32(plaintext, self.working_mem[1], offset, 16)\n        return self._crypt(ciphertext, offset, True)\n\n    def encrypt32(self, plaintext, ciphertext, offset):\n        self.working_mem[1].set(plaintext)\n        return self._crypt(ciphertext, offset, True)\n\n    def decrypt(self, ciphertext, plaintext, offset):\n        convert_to_int32(ciphertext, self.working_mem[1], offset, 16)\n        return self._crypt(plaintext, offset, False)\n\n    def decrypt32(self, ciphertext, plaintext, offset):\n        self.working_mem[1].set(ciphertext)\n        return self._crypt(plaintext, offset, False)\n# }}}\n\ndef random_bytes_insecure(sz):\n    ans = Uint8Array(sz)\n    for v'var i = 0; i < sz; i++':\n        ans[i] = Math.floor(Math.random() * 256)\n    return ans\n\ndef random_bytes_secure(sz):\n    ans = Uint8Array(sz)\n    crypto.getRandomValues(ans)\n    return ans\n\nrandom_bytes = random_bytes_secure if jstype(crypto) is not 'undefined' and jstype(crypto.getRandomValues) is 'function' else random_bytes_insecure\nif random_bytes is random_bytes_insecure:\n    try:\n        noderandom = require('crypto').randomBytes\n        random_bytes = def(sz):\n            return Uint8Array(noderandom(sz))\n    except:\n        print('WARNING: Using insecure RNG for AES')\n\nclass ModeOfOperation:  # {{{\n\n    def __init__(self, key):\n        self.key = key or generate_key(32)\n        self.aes = AES(self.key)\n\n    @property\n    def key_as_js(self):\n        return typed_array_as_js(self.key)\n\n    def tag_as_bytes(self, tag):\n        if isinstance(tag, Uint8Array):\n            return tag\n        if not tag:\n            return Uint8Array(0)\n        if jstype(tag) is 'string':\n            return string_to_bytes(tag)\n        raise TypeError('Invalid tag, must be a string or a Uint8Array')\n# }}}\n\nclass GaloisField:  # {{{\n\n    def __init__(self, sub_key):\n        k32 = Uint32Array(4)\n        convert_to_int32(sub_key, k32, 0)\n        self.m = self.generate_hash_table(k32)\n        self.wmem = Uint32Array(4)\n\n    def power(self, x, out):\n        lsb = x[3] & 1\n        for v'var i = 3; i > 0; --i':\n            out[i] = (x[i] >>> 1) | ((x[i - 1] & 1) << 31)\n        out[0] = x[0] >>> 1\n        if lsb:\n            out[0] ^= 0xE1000000\n\n    def multiply(self, x, y):\n        z_i = Uint32Array(4)\n        v_i = Uint32Array(y)\n        for v'var i = 0; i < 128; ++i':\n            x_i = x[(i / 32) | 0] & (1 << (31 - i % 32))\n            if x_i:\n                z_i[0] ^= v_i[0]\n                z_i[1] ^= v_i[1]\n                z_i[2] ^= v_i[2]\n                z_i[3] ^= v_i[3]\n            self.power(v_i, v_i)\n        return z_i\n\n    def generate_sub_hash_table(self, mid):\n        bits = mid.length\n        size = 1 << bits\n        half = size >>> 1\n        m = Array(size)\n        m[half] = Uint32Array(mid)\n        i = half >>> 1\n        while i > 0:\n            m[i] = Uint32Array(4)\n            self.power(m[2 * i], m[i])\n            i >>= 1\n        i = 2\n        while i < half:\n            for v'var j = 1; j < i; ++j':\n                m_i = m[i]\n                m_j = m[j]\n                m[i + j] = x = Uint32Array(4)\n                for v'var c = 0; c < 4; c++':\n                    x[c] = m_i[c] ^ m_j[c]\n            i *= 2\n        m[0] = Uint32Array(4)\n        for v'i = half + 1; i < size; ++i':\n            x = m[i ^ half]\n            m[i] = y = Uint32Array(4)\n            for v'var c = 0; c < 4; c++':\n                y[c] = mid[c] ^ x[c]\n        return m\n\n    def generate_hash_table(self, key_as_int32_array):\n        bits = key_as_int32_array.length\n        multiplier = 8 / bits\n        per_int = 4 * multiplier\n        size = 16 * multiplier\n        ans = Array(size)\n        for v'var i =0; i < size; ++i':\n            tmp = Uint32Array(4)\n            idx = (i/ per_int) | 0\n            shft = ((per_int - 1 - (i % per_int)) * bits)\n            tmp[idx] = (1 << (bits - 1)) << shft\n            ans[i] = self.generate_sub_hash_table(self.multiply(tmp, key_as_int32_array))\n        return ans\n\n    def table_multiply(self, x):\n        z = Uint32Array(4)\n        for v'var i = 0; i < 32; ++i':\n            idx = (i / 8) | 0\n            x_i = (x[idx] >>> ((7 - (i % 8)) * 4)) & 0xF\n            ah = self.m[i][x_i]\n            z[0] ^= ah[0]\n            z[1] ^= ah[1]\n            z[2] ^= ah[2]\n            z[3] ^= ah[3]\n        return z\n\n    def ghash(self, x, y):\n        # Corresponds to the XOR + mult_H operation from the paper\n        z = self.wmem\n        z[0] = y[0] ^ x[0]\n        z[1] = y[1] ^ x[1]\n        z[2] = y[2] ^ x[2]\n        z[3] = y[3] ^ x[3]\n        return self.table_multiply(z)\n\n# }}}\n\n# }}}\n\ndef generate_key(sz):\n    if not number_of_rounds[sz]:\n        raise ValueError('Invalid key size, must be: 16, 24 or 32')\n    return random_bytes(sz)\n\ndef generate_tag(sz):\n    return random_bytes(sz or 32)\n\ndef typed_array_as_js(x):\n    name = x.constructor.name or 'Uint8Array'\n    return '(new ' + name + '(' + JSON.stringify(Array.prototype.slice.call(x)) + '))'\n\nclass CBC(ModeOfOperation):  # {{{\n\n    def encrypt_bytes(self, bytes, tag_bytes, iv):\n        iv = first_iv = iv or random_bytes(16)\n        mlen = bytes.length + tag_bytes.length\n        padsz = (16 - (mlen % 16)) % 16\n        inputbytes = Uint8Array(mlen + padsz)\n        if tag_bytes.length:\n            inputbytes.set(tag_bytes)\n        inputbytes.set(bytes, tag_bytes.length)\n\n        offset = 0\n        outputbytes = Uint8Array(inputbytes.length)\n        for v'var block = 0; block < inputbytes.length; block += 16':\n            if block > 0:\n                iv, offset = outputbytes, block - 16\n            for v'var i = 0; i < 16; i++':\n                inputbytes[block + i] ^= iv[offset + i]\n            self.aes.encrypt(inputbytes, outputbytes, block)\n        return {'iv':first_iv, 'cipherbytes':outputbytes}\n\n    def encrypt(self, plaintext, tag):\n        return self.encrypt_bytes(string_to_bytes(plaintext), self.tag_as_bytes(tag))\n\n    def decrypt_bytes(self, inputbytes, tag_bytes, iv):\n        offset = 0\n        outputbytes = Uint8Array(inputbytes.length)\n        for v'var block = 0; block < inputbytes.length; block += 16':\n            self.aes.decrypt(inputbytes, outputbytes, block)\n            if block > 0:\n                iv, offset = inputbytes, block - 16\n            for v'var i = 0; i < 16; i++':\n                outputbytes[block + i] ^= iv[offset + i]\n        for v'var i = 0; i < tag_bytes.length; i++':\n            if tag_bytes[i] != outputbytes[i]:\n                raise ValueError('Corrupt message')\n        outputbytes = outputbytes.subarray(tag_bytes.length)\n        return outputbytes\n\n    def decrypt(self, output_from_encrypt, tag):\n        ans = self.decrypt_bytes(output_from_encrypt.cipherbytes, self.tag_as_bytes(tag), output_from_encrypt.iv)\n        return str.rstrip(bytes_to_string(ans), '\\0')\n# }}}\n\nclass CTR(ModeOfOperation):  # {{{\n\n    # Note that this mode of operation requires the pair of (counterbytes,\n    # secret key) to always be unique, for every block. Therefore, if you are\n    # using it for bi-directional messaging it is best to use a different\n    # secret key for each direction\n\n    def __init__(self, key, iv):\n        ModeOfOperation.__init__(self, key)\n        self.wmem = Uint8Array(16)\n        self.counter_block = Uint8Array(iv or 16)\n        if self.counter_block.length != 16:\n            raise ValueError('iv must be 16 bytes long')\n        self.counter_index = 16\n\n    def _crypt(self, bytes):\n        for v'var i = 0; i < bytes.length; i++, self.counter_index++':\n            if self.counter_index is 16:\n                self.counter_index = 0\n                self.aes.encrypt(self.counter_block, self.wmem, 0)\n                increment_counter(self.counter_block)\n            bytes[i] ^= self.wmem[self.counter_index]\n        self.counter_index = 16\n\n    def encrypt(self, plaintext, tag):\n        outbytes = string_to_bytes(plaintext)\n        counterbytes = Uint8Array(self.counter_block)\n        if tag:\n            tag_bytes = self.tag_as_bytes(tag)\n            t = Uint8Array(outbytes.length + tag_bytes.length)\n            t.set(tag_bytes)\n            t.set(outbytes, tag_bytes.length)\n            outbytes = t\n        self._crypt(outbytes)\n        return {'cipherbytes':outbytes, 'counterbytes':counterbytes}\n\n    def __enter__(self):\n        self.before_index = self.counter_index\n        self.before_counter = Uint8Array(self.counter_block)\n\n    def __exit__(self):\n        self.counter_index = self.before_index\n        self.counter_block = self.before_counter\n\n    def decrypt(self, output_from_encrypt, tag):\n        b = Uint8Array(output_from_encrypt.cipherbytes)\n        with self:\n            self.counter_block = output_from_encrypt.counterbytes\n            self.counter_index = 16\n            self._crypt(b)\n        offset = 0\n        if tag:\n            tag_bytes = self.tag_as_bytes(tag)\n            for v'var i = 0; i < tag_bytes.length; i++':\n                if tag_bytes[i] != b[i]:\n                    raise ValueError('Corrupted message')\n            offset = tag_bytes.length\n        return bytes_to_string(b, offset)\n# }}}\n\nclass GCM(ModeOfOperation):  # {{{\n\n    # Note that this mode of operation requires the pair of (iv,\n    # secret key) to always be unique, for every message. Therefore, if you are\n    # using it for bi-directional messaging it is best to use a different\n    # secret key for each direction (you could also use random_key,\n    # but that has a non-zero probability of repeating keys).\n    # See http://web.cs.ucdavis.edu/~rogaway/ocb/gcm.pdf\n\n    def __init__(self, key, random_iv=False):\n        ModeOfOperation.__init__(self, key)\n        self.random_iv = random_iv\n        if not random_iv:\n            self.current_iv = Uint8Array(12)\n\n        # Generate the hash subkey\n        H = Uint8Array(16)\n        self.aes.encrypt(Uint8Array(16), H, 0)\n        self.galois = GaloisField(H)\n\n        # Working memory\n        self.J0 = Uint32Array(4)\n        self.wmem = Uint32Array(4)\n        self.byte_block = Uint8Array(16)\n\n    def increment_iv(self):\n        c = self.current_iv\n        for v'var i = 11; i >=0; i--':\n            if c[i] is 255:\n                if i is 0:\n                    raise ValueError('The GCM IV space is exhausted, cannot encrypt anymore messages with this key as doing so would cause the IV to repeat')\n                c[i] = 0\n            else:\n                c[i] += 1\n                break\n\n    def _create_j0(self, iv):\n        J0 = self.J0\n        if iv.length is 12:\n            convert_to_int32(iv, J0)\n            J0[3] = 1\n        else:\n            J0.fill(0)\n            tmp = convert_to_int32_pad(iv)\n            while tmp.length:\n                J0 = self.galois.ghash(J0, tmp)\n                tmp = tmp.subarray(4)\n            tmp = Uint32Array(4)\n            tmp.set(from_64_to_32(iv.length * 8), 2)\n            J0 = self.galois.ghash(J0, tmp)\n        return J0\n\n    def _start(self, iv, additional_data):\n        J0 = self._create_j0(iv)\n        # Generate initial counter block\n        in_block = Uint32Array(J0)\n        in_block[3] = (in_block[3] + 1) & 0xFFFFFFFF  # increment counter\n\n        # Process additional_data\n        S = Uint32Array(4)\n        overflow = additional_data.length % 16\n        for v'var i = 0; i < additional_data.length - overflow; i += 16':\n            convert_to_int32(additional_data, self.wmem, i, 16)\n            S = self.galois.ghash(S, self.wmem)\n        if overflow:\n            self.byte_block.fill(0)\n            self.byte_block.set(additional_data.subarray(additional_data.length - overflow))\n            convert_to_int32(self.byte_block, self.wmem)\n            S = self.galois.ghash(S, self.wmem)\n        return J0, in_block, S\n\n    def _finish(self, iv, J0, adata_len, S, outbytes):\n        # Mix the lengths into S\n        lengths = Uint32Array(4)\n        lengths.set(from_64_to_32(adata_len * 8))\n        lengths.set(from_64_to_32(outbytes.length * 8), 2)\n        S = self.galois.ghash(S, lengths)\n\n        # Create the tag\n        self.aes.encrypt32(J0, self.byte_block, 0)\n        convert_to_int32(self.byte_block, self.wmem)\n        tag = Uint32Array(4)\n        for v'var i = 0; i < S.length; i++':\n            tag[i] = S[i] ^ self.wmem[i]\n        return {'iv':iv, 'cipherbytes':outbytes, 'tag':tag}\n\n    def _crypt(self, iv, bytes, additional_data, decrypt):\n        ghash = self.galois.ghash.bind(self.galois)\n        outbytes = Uint8Array(bytes.length)\n        J0, in_block, S = self._start(iv, additional_data)\n        bb = self.byte_block\n        enc = self.aes.encrypt32.bind(self.aes)\n        hash_bytes = bytes if decrypt else outbytes\n\n        # Create the ciphertext, encrypting block by block\n        for v'var i = 0, counter_index = 16; i < bytes.length; i++, counter_index++':\n            if counter_index is 16:\n                # Encrypt counter and increment it\n                enc(in_block, bb, 0)\n                in_block[3] = (in_block[3] + 1) & 0xFFFFFFFF  # increment counter\n                counter_index = 0\n            # Output is XOR of encrypted counter with input\n            outbytes[i] = bytes[i] ^ bb[counter_index]\n            if counter_index is 15:\n                # We have completed a block, update the hash\n                convert_to_int32(hash_bytes, self.wmem, i - 15, 16)\n                S = ghash(S, self.wmem)\n\n        # Check if we have a last partial block\n        overflow = outbytes.length % 16\n        if overflow:\n            # partial output block\n            bb.fill(0)\n            bb.set(hash_bytes.subarray(hash_bytes.length - overflow))\n            convert_to_int32(bb, self.wmem)\n            S = ghash(S, self.wmem)\n\n        return self._finish(iv, J0, additional_data.length, S, outbytes)\n\n    def encrypt(self, plaintext, tag):\n        if self.random_iv:\n            iv = random_bytes(12)\n        else:\n            self.increment_iv()\n            iv = self.current_iv\n        return self._crypt(iv, string_to_bytes(plaintext), self.tag_as_bytes(tag), False)\n\n    def decrypt(self, output_from_encrypt, tag):\n        if output_from_encrypt.tag.length != 4:\n            raise ValueError('Corrupted message')\n        ans = self._crypt(output_from_encrypt.iv, output_from_encrypt.cipherbytes, self.tag_as_bytes(tag), True)\n        if ans.tag != output_from_encrypt.tag:\n            raise ValueError('Corrupted message')\n        return bytes_to_string(ans.cipherbytes)\n# }}}\n"
  },
  {
    "path": "src/lib/elementmaker.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: GPL v3 Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\nhtml_elements = {\n    'a', 'abbr', 'acronym', 'address', 'area',\n    'article', 'aside', 'audio', 'b', 'base', 'big', 'body', 'blockquote', 'br', 'button',\n    'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup',\n    'command', 'datagrid', 'datalist', 'dd', 'del', 'details', 'dfn',\n    'dialog', 'dir', 'div', 'dl', 'dt', 'em', 'event-source', 'fieldset',\n    'figcaption', 'figure', 'footer', 'font', 'form', 'header', 'h1',\n    'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'head', 'i', 'iframe', 'img', 'input', 'ins',\n    'keygen', 'kbd', 'label', 'legend', 'li', 'm', 'map', 'menu', 'meter',\n    'multicol', 'nav', 'nextid', 'ol', 'output', 'optgroup', 'option',\n    'p', 'pre', 'progress', 'q', 's', 'samp', 'script', 'section', 'select',\n    'small', 'sound', 'source', 'spacer', 'span', 'strike', 'strong', 'style',\n    'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',\n    'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video'\n}\n\nmathml_elements = {\n    'maction', 'math', 'merror', 'mfrac', 'mi',\n    'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom',\n    'mprescripts', 'mroot', 'mrow', 'mspace', 'msqrt', 'mstyle', 'msub',\n    'msubsup', 'msup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder',\n    'munderover', 'none'\n}\n\nsvg_elements = {\n    'a', 'animate', 'animateColor', 'animateMotion',\n    'animateTransform', 'clipPath', 'circle', 'defs', 'desc', 'ellipse',\n    'font-face', 'font-face-name', 'font-face-src', 'g', 'glyph', 'hkern',\n    'linearGradient', 'line', 'marker', 'metadata', 'missing-glyph',\n    'mpath', 'path', 'polygon', 'polyline', 'radialGradient', 'rect',\n    'set', 'stop', 'svg', 'switch', 'text', 'title', 'tspan', 'use'\n}\n\nhtml5_tags = html_elements.union(mathml_elements).union(svg_elements)\n\ndef _makeelement(tag, *args, **kwargs):\n    ans = this.createElement(tag)\n\n    for attr in kwargs:\n        vattr = str.replace(str.rstrip(attr, '_'), '_', '-')\n        val = kwargs[attr]\n        if callable(val):\n            if str.startswith(attr, 'on'):\n                attr = attr[2:]\n            ans.addEventListener(attr, val)\n        elif val is True:\n            ans.setAttribute(vattr, vattr)\n        elif jstype(val) is 'string':\n            ans.setAttribute(vattr, val)\n\n    for arg in args:\n        if jstype(arg) is 'string':\n            arg = this.createTextNode(arg)\n        ans.appendChild(arg)\n    return ans\n\ndef maker_for_document(document):\n    # Create an elementmaker to be used with the specified document\n    E = _makeelement.bind(document)\n    Object.defineProperties(E, {\n        tag: {\n            'value':_makeelement.bind(document, tag)\n        } for tag in html5_tags\n    })\n    return E\n\nif jstype(document) is 'undefined':\n    E = maker_for_document({\n        'createTextNode': def(value): return value;,\n        'createElement': def(name):\n            return  {\n                'name':name,\n                'children':[],\n                'attributes':{},\n                'setAttribute': def(name, val): this.attributes[name] = val;,\n                'appendChild': def(child): this.children.push(child);,\n            }\n    })\nelse:\n    E = maker_for_document(document)\n"
  },
  {
    "path": "src/lib/encodings.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\ndef base64encode(bytes, altchars, pad_char):\n    # Convert an array of bytes into a base-64 encoded string\n    l = bytes.length\n    remainder = l % 3\n    main_length = l - remainder\n    encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + (altchars or '+/')\n    pad_char = '=' if pad_char is undefined else pad_char\n    ans = v'[]'\n    for v'var i = 0; i < main_length; i += 3':\n        chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]\n        ans.push(encodings[(chunk & 16515072) >> 18], encodings[(chunk & 258048) >> 12], encodings[(chunk & 4032) >> 6], encodings[chunk & 63])\n    if remainder is 1:\n        chunk = bytes[main_length]\n        ans.push(encodings[(chunk & 252) >> 2], encodings[(chunk & 3) << 4], pad_char, pad_char)\n    elif remainder is 2:\n        chunk = (bytes[main_length] << 8) | bytes[main_length + 1]\n        ans.push(encodings[(chunk & 64512) >> 10], encodings[(chunk & 1008) >> 4], encodings[(chunk & 15) << 2], pad_char)\n    return ans.join('')\n\ndef base64decode(string):\n    # convert the output of base64encode back into an array of bytes\n    # (Uint8Array) only works with the standard altchars and pad_char\n    if jstype(window) is not 'undefined':\n        chars = window.atob(string)\n    else:\n        chars = new Buffer(string, 'base64').toString('binary')  # noqa: undef\n    ans = Uint8Array(chars.length)\n    for i in range(ans.length):\n        ans[i] = chars.charCodeAt(i)\n    return ans\n\ndef urlsafe_b64encode(bytes, pad_char):\n    return base64encode(bytes, '-_', pad_char)\n\ndef urlsafe_b64decode(string):\n    string = String.prototype.replace.call(string, /[_-]/g, def(m): return '+' if m is '-' else '/';)\n    return base64decode(string)\n\ndef hexlify(bytes):\n    ans = v'[]'\n    for v'var i = 0; i < bytes.length; i++':\n        x = bytes[i].toString(16)\n        if x.length is 1:\n            x = '0' + x\n        ans.push(x)\n    return ans.join('')\n\ndef unhexlify(string):\n    num = string.length // 2\n    if num * 2 is not string.length:\n        raise ValueError('string length is not a multiple of two')\n    ans = Uint8Array(num)\n    for v'var i = 0; i < num; i++':\n        x = parseInt(string[i*2:i*2+2], 16)\n        if isNaN(x):\n            raise ValueError('string is not hex-encoded')\n        ans[i] = x\n    return ans\n\nutf8_decoder_table = v'''[\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f\n  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf\n  8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df\n  0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef\n  0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff\n  0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2\n  1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4\n  1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6\n  1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8\n]'''\n\ndef _from_code_point(x):\n    if x <= 0xFFFF:\n        return String.fromCharCode(x)\n    x -= 0x10000\n    return String.fromCharCode((x >> 10) + 0xD800, (x % 0x400) + 0xDC00)\n\ndef utf8_decode(bytes, errors, replacement):\n    # Convert an array of UTF-8 encoded bytes into a string\n    state = 0\n    ans = v'[]'\n\n    for v'var i = 0, l = bytes.length; i < l; i++':  # noqa\n        byte = bytes[i]\n        typ = utf8_decoder_table[byte]\n        codep = (byte & 0x3f) | (codep << 6) if state is not 0 else (0xff >> typ) & (byte)\n        state = utf8_decoder_table[256 + state*16 + typ]\n        if state is 0:\n            ans.push(_from_code_point(codep))\n        elif state is 1:\n            if not errors or errors is 'strict':\n                raise UnicodeDecodeError(str.format('The byte 0x{:02x} at position {} is not valid UTF-8', byte, i))\n            elif errors is 'replace':\n                ans.push(replacement or '?')\n    return ans.join('')\n\ndef utf8_encode_js(string):\n    # Encode a string as an array of UTF-8 bytes\n    escstr = encodeURIComponent(string)\n    ans = v'[]'\n    for v'var i = 0; i < escstr.length; i++':\n        ch = escstr[i]\n        if ch is '%':\n            ans.push(parseInt(escstr[i+1:i+3], 16))\n            i += 2\n        else:\n            ans.push(ch.charCodeAt(0))\n    return Uint8Array(ans)\n\nif jstype(TextEncoder) is 'function':\n    _u8enc = TextEncoder('utf-8')\n    utf8_encode = _u8enc.encode.bind(_u8enc)\n    _u8enc = undefined\nelse:\n    utf8_encode = utf8_encode_js\n\ndef utf8_encode_native(string):\n    return _u8enc.encode(string)\n"
  },
  {
    "path": "src/lib/gettext.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# noqa: eol-semicolon\n\n# The Plural-Forms parser {{{\n# From: https://github.com/SlexAxton/Jed/blob/master/jed.js licensed under the WTFPL\n\nJed = {}\n\nvr'''\n  Jed.PF = {};\n\n  Jed.PF.parse = function ( p ) {\n    var plural_str = Jed.PF.extractPluralExpr( p );\n    return Jed.PF.parser.parse.call(Jed.PF.parser, plural_str);\n  };\n\n  Jed.PF.compile = function ( p ) {\n    // Handle trues and falses as 0 and 1\n    function imply( val ) {\n      return (val === true ? 1 : val ? val : 0);\n    }\n\n    var ast = Jed.PF.parse( p );\n    return function ( n ) {\n      return imply( Jed.PF.interpreter( ast )( n ) );\n    };\n  };\n\n  Jed.PF.interpreter = function ( ast ) {\n    return function ( n ) {\n      var res;\n      switch ( ast.type ) {\n        case 'GROUP':\n          return Jed.PF.interpreter( ast.expr )( n );\n        case 'TERNARY':\n          if ( Jed.PF.interpreter( ast.expr )( n ) ) {\n            return Jed.PF.interpreter( ast.truthy )( n );\n          }\n          return Jed.PF.interpreter( ast.falsey )( n );\n        case 'OR':\n          return Jed.PF.interpreter( ast.left )( n ) || Jed.PF.interpreter( ast.right )( n );\n        case 'AND':\n          return Jed.PF.interpreter( ast.left )( n ) && Jed.PF.interpreter( ast.right )( n );\n        case 'LT':\n          return Jed.PF.interpreter( ast.left )( n ) < Jed.PF.interpreter( ast.right )( n );\n        case 'GT':\n          return Jed.PF.interpreter( ast.left )( n ) > Jed.PF.interpreter( ast.right )( n );\n        case 'LTE':\n          return Jed.PF.interpreter( ast.left )( n ) <= Jed.PF.interpreter( ast.right )( n );\n        case 'GTE':\n          return Jed.PF.interpreter( ast.left )( n ) >= Jed.PF.interpreter( ast.right )( n );\n        case 'EQ':\n          return Jed.PF.interpreter( ast.left )( n ) == Jed.PF.interpreter( ast.right )( n );\n        case 'NEQ':\n          return Jed.PF.interpreter( ast.left )( n ) != Jed.PF.interpreter( ast.right )( n );\n        case 'MOD':\n          return Jed.PF.interpreter( ast.left )( n ) % Jed.PF.interpreter( ast.right )( n );\n        case 'VAR':\n          return n;\n        case 'NUM':\n          return ast.val;\n        default:\n          throw new Error(\"Invalid Token found.\");\n      }\n    };\n  };\n\n  Jed.PF.extractPluralExpr = function ( p ) {\n    // trim first\n    p = p.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\n    if (! /;\\s*$/.test(p)) {\n      p = p.concat(';');\n    }\n\n    var nplurals_re = /nplurals\\=(\\d+);/,\n        plural_re = /plural\\=(.*);/,\n        nplurals_matches = p.match( nplurals_re ),\n        res = {},\n        plural_matches;\n\n    // Find the nplurals number\n    if ( nplurals_matches.length > 1 ) {\n      res.nplurals = nplurals_matches[1];\n    }\n    else {\n      throw new Error('nplurals not found in plural_forms string: ' + p );\n    }\n\n    // remove that data to get to the formula\n    p = p.replace( nplurals_re, \"\" );\n    plural_matches = p.match( plural_re );\n\n    if (!( plural_matches && plural_matches.length > 1 ) ) {\n      throw new Error('`plural` expression not found: ' + p);\n    }\n    return plural_matches[ 1 ];\n  };\n\n  /* Jison generated parser */\n  Jed.PF.parser = (function(){\n\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"expressions\":3,\"e\":4,\"EOF\":5,\"?\":6,\":\":7,\"||\":8,\"&&\":9,\"<\":10,\"<=\":11,\">\":12,\">=\":13,\"!=\":14,\"==\":15,\"%\":16,\"(\":17,\")\":18,\"n\":19,\"NUMBER\":20,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",5:\"EOF\",6:\"?\",7:\":\",8:\"||\",9:\"&&\",10:\"<\",11:\"<=\",12:\">\",13:\">=\",14:\"!=\",15:\"==\",16:\"%\",17:\"(\",18:\")\",19:\"n\",20:\"NUMBER\"},\nproductions_: [0,[3,2],[4,5],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,1],[4,1]],\nperformAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1: return { type : 'GROUP', expr: $$[$0-1] };\ncase 2:this.$ = { type: 'TERNARY', expr: $$[$0-4], truthy : $$[$0-2], falsey: $$[$0] };\nbreak;\ncase 3:this.$ = { type: \"OR\", left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 4:this.$ = { type: \"AND\", left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 5:this.$ = { type: 'LT', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 6:this.$ = { type: 'LTE', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 7:this.$ = { type: 'GT', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 8:this.$ = { type: 'GTE', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 9:this.$ = { type: 'NEQ', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 10:this.$ = { type: 'EQ', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 11:this.$ = { type: 'MOD', left: $$[$0-2], right: $$[$0] };\nbreak;\ncase 12:this.$ = { type: 'GROUP', expr: $$[$0-1] };\nbreak;\ncase 13:this.$ = { type: 'VAR' };\nbreak;\ncase 14:this.$ = { type: 'NUM', val: Number(yytext) };\nbreak;\n}\n},\ntable: [{3:1,4:2,17:[1,3],19:[1,4],20:[1,5]},{1:[3]},{5:[1,6],6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{4:17,17:[1,3],19:[1,4],20:[1,5]},{5:[2,13],6:[2,13],7:[2,13],8:[2,13],9:[2,13],10:[2,13],11:[2,13],12:[2,13],13:[2,13],14:[2,13],15:[2,13],16:[2,13],18:[2,13]},{5:[2,14],6:[2,14],7:[2,14],8:[2,14],9:[2,14],10:[2,14],11:[2,14],12:[2,14],13:[2,14],14:[2,14],15:[2,14],16:[2,14],18:[2,14]},{1:[2,1]},{4:18,17:[1,3],19:[1,4],20:[1,5]},{4:19,17:[1,3],19:[1,4],20:[1,5]},{4:20,17:[1,3],19:[1,4],20:[1,5]},{4:21,17:[1,3],19:[1,4],20:[1,5]},{4:22,17:[1,3],19:[1,4],20:[1,5]},{4:23,17:[1,3],19:[1,4],20:[1,5]},{4:24,17:[1,3],19:[1,4],20:[1,5]},{4:25,17:[1,3],19:[1,4],20:[1,5]},{4:26,17:[1,3],19:[1,4],20:[1,5]},{4:27,17:[1,3],19:[1,4],20:[1,5]},{6:[1,7],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[1,28]},{6:[1,7],7:[1,29],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16]},{5:[2,3],6:[2,3],7:[2,3],8:[2,3],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,3]},{5:[2,4],6:[2,4],7:[2,4],8:[2,4],9:[2,4],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,4]},{5:[2,5],6:[2,5],7:[2,5],8:[2,5],9:[2,5],10:[2,5],11:[2,5],12:[2,5],13:[2,5],14:[2,5],15:[2,5],16:[1,16],18:[2,5]},{5:[2,6],6:[2,6],7:[2,6],8:[2,6],9:[2,6],10:[2,6],11:[2,6],12:[2,6],13:[2,6],14:[2,6],15:[2,6],16:[1,16],18:[2,6]},{5:[2,7],6:[2,7],7:[2,7],8:[2,7],9:[2,7],10:[2,7],11:[2,7],12:[2,7],13:[2,7],14:[2,7],15:[2,7],16:[1,16],18:[2,7]},{5:[2,8],6:[2,8],7:[2,8],8:[2,8],9:[2,8],10:[2,8],11:[2,8],12:[2,8],13:[2,8],14:[2,8],15:[2,8],16:[1,16],18:[2,8]},{5:[2,9],6:[2,9],7:[2,9],8:[2,9],9:[2,9],10:[2,9],11:[2,9],12:[2,9],13:[2,9],14:[2,9],15:[2,9],16:[1,16],18:[2,9]},{5:[2,10],6:[2,10],7:[2,10],8:[2,10],9:[2,10],10:[2,10],11:[2,10],12:[2,10],13:[2,10],14:[2,10],15:[2,10],16:[1,16],18:[2,10]},{5:[2,11],6:[2,11],7:[2,11],8:[2,11],9:[2,11],10:[2,11],11:[2,11],12:[2,11],13:[2,11],14:[2,11],15:[2,11],16:[2,11],18:[2,11]},{5:[2,12],6:[2,12],7:[2,12],8:[2,12],9:[2,12],10:[2,12],11:[2,12],12:[2,12],13:[2,12],14:[2,12],15:[2,12],16:[2,12],18:[2,12]},{4:30,17:[1,3],19:[1,4],20:[1,5]},{5:[2,2],6:[1,7],7:[2,2],8:[1,8],9:[1,9],10:[1,10],11:[1,11],12:[1,12],13:[1,13],14:[1,14],15:[1,15],16:[1,16],18:[2,2]}],\ndefaultActions: {6:[2,1]},\nparseError: function parseError(str, hash) {\n    throw new Error(str);\n},\nparse: function parse(input) {\n    var self = this,\n        stack = [0],\n        vstack = [null], // semantic value stack\n        lstack = [], // location stack\n        table = this.table,\n        yytext = '',\n        yylineno = 0,\n        yyleng = 0,\n        recovering = 0,\n        TERROR = 2,\n        EOF = 1;\n\n    //this.reductionCount = this.shiftCount = 0;\n\n    this.lexer.setInput(input);\n    this.lexer.yy = this.yy;\n    this.yy.lexer = this.lexer;\n    if (typeof this.lexer.yylloc == 'undefined')\n        this.lexer.yylloc = {};\n    var yyloc = this.lexer.yylloc;\n    lstack.push(yyloc);\n\n    if (typeof this.yy.parseError === 'function')\n        this.parseError = this.yy.parseError;\n\n    function popStack (n) {\n        stack.length = stack.length - 2*n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n\n    function lex() {\n        var token;\n        token = self.lexer.lex() || 1; // $end = 1\n        // if token isn't its numeric value, convert\n        if (typeof token !== 'number') {\n            token = self.symbols_[token] || token;\n        }\n        return token;\n    }\n\n    var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected, errStr;\n    while (true) {\n        // retreive state number from top of stack\n        state = stack[stack.length-1];\n\n        // use default actions if available\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || symbol === undefined)\n                symbol = lex();\n            // read action for current state and first input\n            action = table[state] && table[state][symbol];\n        }\n\n        // handle parse error\n        _handle_error:\n        if (typeof action === 'undefined' || !action.length || !action[0]) {\n\n            if (!recovering) {\n                // Report error\n                expected = [];\n                for (p in table[state]) if (this.terminals_[p] && p > 2) {\n                    expected.push(\"'\"+this.terminals_[p]+\"'\");\n                }\n                errStr = '';\n                if (this.lexer.showPosition) {\n                    errStr = 'Parse error on line '+(yylineno+1)+\":\\n\"+this.lexer.showPosition()+\"\\nExpecting \"+expected.join(', ') + \", got '\" + this.terminals_[symbol]+ \"'\";\n                } else {\n                    errStr = 'Parse error on line '+(yylineno+1)+\": Unexpected \" +\n                                  (symbol == 1 /*EOF*/ ? \"end of input\" :\n                                              (\"'\"+(this.terminals_[symbol] || symbol)+\"'\"));\n                }\n                this.parseError(errStr,\n                    {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\n            }\n\n            // just recovered from another error\n            if (recovering == 3) {\n                if (symbol == EOF) {\n                    throw new Error(errStr || 'Parsing halted.');\n                }\n\n                // discard current lookahead and grab another\n                yyleng = this.lexer.yyleng;\n                yytext = this.lexer.yytext;\n                yylineno = this.lexer.yylineno;\n                yyloc = this.lexer.yylloc;\n                symbol = lex();\n            }\n\n            // try to recover from error\n            while (1) {\n                // check for error recovery rule in this state\n                if ((TERROR.toString()) in table[state]) {\n                    break;\n                }\n                if (state === 0) {\n                    throw new Error(errStr || 'Parsing halted.');\n                }\n                popStack(1);\n                state = stack[stack.length-1];\n            }\n\n            preErrorSymbol = symbol; // save the lookahead token\n            symbol = TERROR;         // insert generic error symbol as new lookahead\n            state = stack[stack.length-1];\n            action = table[state] && table[state][TERROR];\n            recovering = 3; // allow 3 real symbols to be shifted before reporting a new error\n        }\n\n        // this shouldn't happen, unless resolve defaults are off\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);\n        }\n\n        switch (action[0]) {\n\n            case 1: // shift\n                //this.shiftCount++;\n\n                stack.push(symbol);\n                vstack.push(this.lexer.yytext);\n                lstack.push(this.lexer.yylloc);\n                stack.push(action[1]); // push state\n                symbol = null;\n                if (!preErrorSymbol) { // normal execution/no error\n                    yyleng = this.lexer.yyleng;\n                    yytext = this.lexer.yytext;\n                    yylineno = this.lexer.yylineno;\n                    yyloc = this.lexer.yylloc;\n                    if (recovering > 0)\n                        recovering--;\n                } else { // error just occurred, resume old lookahead f/ before error\n                    symbol = preErrorSymbol;\n                    preErrorSymbol = null;\n                }\n                break;\n\n            case 2: // reduce\n                //this.reductionCount++;\n\n                len = this.productions_[action[1]][1];\n\n                // perform semantic action\n                yyval.$ = vstack[vstack.length-len]; // default to $$ = $1\n                // default location, uses first token for firsts, last for lasts\n                yyval._$ = {\n                    first_line: lstack[lstack.length-(len||1)].first_line,\n                    last_line: lstack[lstack.length-1].last_line,\n                    first_column: lstack[lstack.length-(len||1)].first_column,\n                    last_column: lstack[lstack.length-1].last_column\n                };\n                r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n\n                if (typeof r !== 'undefined') {\n                    return r;\n                }\n\n                // pop off stack\n                if (len) {\n                    stack = stack.slice(0,-1*len*2);\n                    vstack = vstack.slice(0, -1*len);\n                    lstack = lstack.slice(0, -1*len);\n                }\n\n                stack.push(this.productions_[action[1]][0]);    // push nonterminal (reduce)\n                vstack.push(yyval.$);\n                lstack.push(yyval._$);\n                // goto new state = table[STATE][NONTERMINAL]\n                newState = table[stack[stack.length-2]][stack[stack.length-1]];\n                stack.push(newState);\n                break;\n\n            case 3: // accept\n                return true;\n        }\n\n    }\n\n    return true;\n}};/* Jison generated lexer */\nvar lexer = (function(){\n\nvar lexer = ({EOF:1,\nparseError:function parseError(str, hash) {\n        if (this.yy.parseError) {\n            this.yy.parseError(str, hash);\n        } else {\n            throw new Error(str);\n        }\n    },\nsetInput:function (input) {\n        this._input = input;\n        this._more = this._less = this.done = false;\n        this.yylineno = this.yyleng = 0;\n        this.yytext = this.matched = this.match = '';\n        this.conditionStack = ['INITIAL'];\n        this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};\n        return this;\n    },\ninput:function () {\n        var ch = this._input[0];\n        this.yytext+=ch;\n        this.yyleng++;\n        this.match+=ch;\n        this.matched+=ch;\n        var lines = ch.match(/\\n/);\n        if (lines) this.yylineno++;\n        this._input = this._input.slice(1);\n        return ch;\n    },\nunput:function (ch) {\n        this._input = ch + this._input;\n        return this;\n    },\nmore:function () {\n        this._more = true;\n        return this;\n    },\npastInput:function () {\n        var past = this.matched.substr(0, this.matched.length - this.match.length);\n        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n    },\nupcomingInput:function () {\n        var next = this.match;\n        if (next.length < 20) {\n            next += this._input.substr(0, 20-next.length);\n        }\n        return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\\n/g, \"\");\n    },\nshowPosition:function () {\n        var pre = this.pastInput();\n        var c = new Array(pre.length + 1).join(\"-\");\n        return pre + this.upcomingInput() + \"\\n\" + c+\"^\";\n    },\nnext:function () {\n        if (this.done) {\n            return this.EOF;\n        }\n        if (!this._input) this.done = true;\n\n        var token,\n            match,\n            col,\n            lines;\n        if (!this._more) {\n            this.yytext = '';\n            this.match = '';\n        }\n        var rules = this._currentRules();\n        for (var i=0;i < rules.length; i++) {\n            match = this._input.match(this.rules[rules[i]]);\n            if (match) {\n                lines = match[0].match(/\\n.*/g);\n                if (lines) this.yylineno += lines.length;\n                this.yylloc = {first_line: this.yylloc.last_line,\n                               last_line: this.yylineno+1,\n                               first_column: this.yylloc.last_column,\n                               last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length};\n                this.yytext += match[0];\n                this.match += match[0];\n                this.matches = match;\n                this.yyleng = this.yytext.length;\n                this._more = false;\n                this._input = this._input.slice(match[0].length);\n                this.matched += match[0];\n                token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);\n                if (token) return token;\n                else return;\n            }\n        }\n        if (this._input === \"\") {\n            return this.EOF;\n        } else {\n            this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\\n'+this.showPosition(),\n                    {text: \"\", token: null, line: this.yylineno});\n        }\n    },\nlex:function lex() {\n        var r = this.next();\n        if (typeof r !== 'undefined') {\n            return r;\n        } else {\n            return this.lex();\n        }\n    },\nbegin:function begin(condition) {\n        this.conditionStack.push(condition);\n    },\npopState:function popState() {\n        return this.conditionStack.pop();\n    },\n_currentRules:function _currentRules() {\n        return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;\n    },\ntopState:function () {\n        return this.conditionStack[this.conditionStack.length-2];\n    },\npushState:function begin(condition) {\n        this.begin(condition);\n    }});\nlexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\nvar YYSTATE=YY_START;\nswitch($avoiding_name_collisions) {\ncase 0:/* skip whitespace */\nbreak;\ncase 1:return 20\nbreak;\ncase 2:return 19\nbreak;\ncase 3:return 8\nbreak;\ncase 4:return 9\nbreak;\ncase 5:return 6\nbreak;\ncase 6:return 7\nbreak;\ncase 7:return 11\nbreak;\ncase 8:return 13\nbreak;\ncase 9:return 10\nbreak;\ncase 10:return 12\nbreak;\ncase 11:return 14\nbreak;\ncase 12:return 15\nbreak;\ncase 13:return 16\nbreak;\ncase 14:return 17\nbreak;\ncase 15:return 18\nbreak;\ncase 16:return 5\nbreak;\ncase 17:return 'INVALID'\nbreak;\n}\n};\nlexer.rules = [/^\\s+/,/^[0-9]+(\\.[0-9]+)?\\b/,/^n\\b/,/^\\|\\|/,/^&&/,/^\\?/,/^:/,/^<=/,/^>=/,/^</,/^>/,/^!=/,/^==/,/^%/,/^\\(/,/^\\)/,/^$/,/^./];\nlexer.conditions = {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],\"inclusive\":true}};return lexer;})()\nparser.lexer = lexer;\nreturn parser;\n})();\n'''\nplural_forms_parser = Jed.PF\n# }}}\n\ndef _get_plural_forms_function(plural_forms_string):\n    return plural_forms_parser.compile(plural_forms_string or \"nplurals=2; plural=(n != 1);\")\n\n_gettext = def(text): return text\n\n_ngettext = def(text, plural, n): return text if n is 1 else plural\n\ndef gettext(text):\n    return _gettext(text)\n\ndef ngettext(text, plural, n):\n    return _ngettext(text, plural, n)\n\ndef install(translation_data):\n    t = new Translations(translation_data)\n    t.install()\n    for func in register_callback.install_callbacks:\n        try:\n            func(t)\n        except:\n            pass\n    return t\n\nhas_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n\ndef register_callback(func):\n    # Register callbacks that will be called when new translation data is\n    # installed\n    register_callback.install_callbacks.push(func)\nregister_callback.install_callbacks = v'[]'\n\nempty_translation_data = {'entries': {}}\n\nclass Translations:\n\n    def __init__(self, translation_data):\n        translation_data = translation_data or empty_translation_data\n        func = _get_plural_forms_function(translation_data.plural_forms)\n        self.translations = [[translation_data, func]]\n        self.language = translation_data['language']\n\n    def add_fallback(self, fallback):\n        fallback = fallback or empty_translation_data\n        func = _get_plural_forms_function(fallback.plural_forms)\n        self.translations.push([fallback, func])\n\n    def gettext(self, text):\n        for t in self.translations:\n            m = t[0].entries\n            if has_prop(m, text):\n                return m[text][0]\n        return text\n\n    def ngettext(self, text, plural, n):\n        for t in self.translations:\n            m = t[0].entries\n            if has_prop(m, text):\n                idx = t[1](n)\n                return m[text][idx] or (text if n is 1 else plural)\n        return text if n is 1 else plural\n\n    def install(self):\n        nonlocal _gettext, _ngettext\n        _gettext = def ():\n            return self.gettext.apply(self, arguments)\n        _ngettext = def ():\n            return self.ngettext.apply(self, arguments)\n"
  },
  {
    "path": "src/lib/math.pyj",
    "content": "###########################################################\n# RapydScript Standard Library\n# Author: Alexander Tsepkov\n# Copyright 2013 Pyjeon Software LLC\n# License: Apache License    2.0\n# This library is covered under Apache license, so that\n# you can distribute it with your RapydScript applications.\n###########################################################\n\n\n# basic implementation of Python's 'math' library\n\n# NOTE: this is only meant to aid those porting lots of Python code into RapydScript,\n# if you're writing a new RapydScript application, in most cases you probably want to\n# use JavaScript's Math module directly instead\n\n\npi = Math.PI\ne = Math.E\ninf = Infinity\n\n########################################\n# Number-theoretic and representation functions\n########################################\ndef ceil(x):\n    return Math.ceil(x)\ndef copysign(x, y):\n    x = Math.abs(x)\n    if y < 0:\n        return -x\n    else:\n        return x\ndef fabs(x):\n    return Math.abs(x)\ndef factorial(x):\n    if Math.abs(int(x)) is not x:\n        raise ValueError(\"factorial() only accepts integral values\")\n    factorial.cache = []\n    r = def(n):\n        if n is 0 or n is 1:\n            return 1\n        if not factorial.cache[n]:\n            factorial.cache[n] = r(n-1) * n\n        return factorial.cache[n]\n    return r(x)\ndef floor(x):\n    return Math.floor(x)\ndef fmod(x, y):\n    # javascript's % operator isn't consistent with C fmod implementation, this function is\n    while y <= x:\n        x -= y\n    return x\ndef fsum(iterable):\n    # like Python's fsum, this method is much more resilient to rounding errors than regular sum\n    partials = []   # sorted, non-overlapping partial sums\n    for x in iterable:\n        i = 0\n        for y in partials:\n            if Math.abs(x) < Math.abs(y):\n                x, y = y, x\n            hi = x + y\n            lo = y - (hi - x)\n            if lo:\n                partials[i] = lo\n                i += 1\n            x = hi\n        #partials[i:] = [x]\n        partials.splice(i, partials.length-i, x)\n    return sum(partials)\ndef isinf(x):\n    return not isFinite(x)\ndef isnan(x):\n    return isNaN(x)\ndef modf(x):\n    m = fmod(x, 1)\n    return m, x-m\ndef trunc(x):\n    return x | 0\n\n########################################\n# Power and logarithmic functions\n########################################\ndef exp(x):\n    return Math.exp(x)\ndef expm1(x):\n    # NOTE: Math.expm1() is currently only implemented in Firefox, this provides alternative implementation\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/expm1\n    #return Math.expm1(x)\n    if Math.abs(x) < 1e-5:\n        return x + 0.5*x*x\n    else:\n        return Math.exp(x) - 1\ndef log(x, base=e):\n    return Math.log(x)/Math.log(base)\ndef log1p(x):\n    # NOTE: Math.log1p() is currently only implemented in Firefox, this provides alternative implementation\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log1p\n    # this version has been taken from http://phpjs.org/functions/log1p/\n    # admittedly it's not as accurate as MDN version, as you can see from math.log1p(1) result\n    ret = 0\n    n = 50\n    if x <= -1:\n        return Number.NEGATIVE_INFINITY\n    if x < 0 or x > 1:\n        return Math.log(1 + x)\n    for i in range(1, n):\n        if i % 2 is 0:\n            ret -= Math.pow(x, i) / i\n        else:\n            ret += Math.pow(x, i) / i\n    return ret\ndef log10(x):\n    # NOTE: Math.log10() is currently only implemented in Firefox, this provides alternative implementation\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log10\n    # I didn't find a more accurate algorithm so I'm using the basic implementation\n    return Math.log(x)/Math.LN10\ndef pow(x, y):\n    if x < 0 and int(y) is not y:\n        raise ValueError('math domain error')\n    if isnan(y) and x is 1:\n        return 1\n    return Math.pow(x, y)\ndef sqrt(x):\n    return Math.sqrt(x)\n\n########################################\n# Trigonometric functions\n########################################\ndef acos(x):        return Math.acos(x)\ndef asin(x):        return Math.asin(x)\ndef atan(x):        return Math.atan(x)\ndef atan2(y, x):    return Math.atan2(y, x)\ndef cos(x):         return Math.cos(x)\ndef sin(x):         return Math.sin(x)\ndef hypot(x, y):    return Math.sqrt(x*x + y*y)\ndef tan(x):         return Math.tan(x)\n\n########################################\n# Angular conversion\n########################################\ndef degrees(x):     return x*180/pi\ndef radians(x):     return x*pi/180\n\n########################################\n# Hyperbolic functions\n########################################\ndef acosh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh\n    return Math.log(x + Math.sqrt(x*x - 1))\ndef asinh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh\n    return Math.log(x + Math.sqrt(x*x + 1))\ndef atanh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh\n    return 0.5 * Math.log((1 + x) / (1 - x))\ndef cosh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh\n    return (Math.exp(x) + Math.exp(-x)) / 2\ndef sinh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh\n    return (Math.exp(x) - Math.exp(-x)) / 2\ndef tanh(x):\n    # NOTE: will be replaced with official, when it becomes mainstream\n    # https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh\n    return (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x))\n\n\n\n#import stdlib\n#print(math.ceil(4.2))\n#print(math.floor(4.2))\n#print(math.fabs(-6))\n#print(math.copysign(-5, 7))\n#print(math.factorial(4))\n#print(math.fmod(-1e100, 1e100))\n#\n#d = [0.9999999, 1, 2, 3]\n#print(sum(d), math.fsum(d))\n#print(math.isinf(5), math.isinf(Infinity))\n#print(math.modf(5.5))\n#print(math.trunc(2.6), math.trunc(-2.6))\n#print(math.exp(1e-5), math.expm1(1e-5))\n#print(math.log(10), math.log(10, 1000))\n#print(math.log1p(1e-15), math.log1p(1))\n#print(math.log10(1000), math.log(1000, 10))\n#print(math.pow(1, 0), math.pow(1, NaN), math.pow(0, 0), math.pow(NaN, 0), math.pow(4,3), math.pow(100, -2))\n#print(math.hypot(3,4))\n#print(math.acosh(2), math.asinh(1), math.atanh(0.5), math.cosh(1), math.cosh(-1), math.sinh(1), math.tanh(1))\n"
  },
  {
    "path": "src/lib/operator.pyj",
    "content": "add = __add__ = def(x, y): return x + y\nsub = __sub__ = def(x, y): return x - y\nmul = __mul__ = def(x, y): return x * y\ndiv = __div__ = def(x, y): return x / y\n\nlt = __lt__ = def(x, y): return x < y\nle = __le__ = def(x, y): return x <= y\neq = __eq__ = def(x, y): return x is y\nne = __ne__ = def(x, y): return x is not y\nge = __ge__ = def(x, y): return x >= y\ngt = __gt__ = def(x, y): return x > y\n"
  },
  {
    "path": "src/lib/pythonize.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: ρσ_str\n\ndef strings():\n    string_funcs = set((\n        'capitalize strip lstrip rstrip islower isupper isspace lower upper swapcase'\n        ' center count endswith startswith find rfind index rindex format join ljust rjust'\n        ' partition rpartition replace split rsplit splitlines zfill').split(' '))\n\n    if not arguments.length:\n        exclude = {'split', 'replace'}\n    elif arguments[0]:\n        exclude = Array.prototype.slice.call(arguments)\n    else:\n        exclude = None\n    if exclude:\n        string_funcs = string_funcs.difference(set(exclude))\n    for name in string_funcs:\n        String.prototype[name] = ρσ_str.prototype[name]\n"
  },
  {
    "path": "src/lib/random.pyj",
    "content": "###########################################################\n# RapydScript Standard Library\n# Author: Alexander Tsepkov\n# Copyright 2013 Pyjeon Software LLC\n# License: Apache License    2.0\n# This library is covered under Apache license, so that\n# you can distribute it with your RapydScript applications.\n###########################################################\n\n\n# basic implementation of Python's 'random' library\n\n# JavaScript's Math.random() does not allow seeding its random generator, to bypass that, this module implements its own\n# version that can be seeded. I decided on RC4 algorithm for this.\n\n# please don't mess with this from the outside\n\nρσ_seed_state = {\n    'key': [],\n    'key_i': 0,\n    'key_j': 0\n}\n\nρσ_get_random_byte = def():\n    ρσ_seed_state.key_i = (ρσ_seed_state.key_i + 1) % 256\n    ρσ_seed_state.key_j = (ρσ_seed_state.key_j + ρσ_seed_state.key[ρσ_seed_state.key_i]) % 256\n    ρσ_seed_state.key[ρσ_seed_state.key_i], ρσ_seed_state.key[ρσ_seed_state.key_j] = \\\n            ρσ_seed_state.key[ρσ_seed_state.key_j], ρσ_seed_state.key[ρσ_seed_state.key_i]\n    return ρσ_seed_state.key[(ρσ_seed_state.key[ρσ_seed_state.key_i] + \\\n            ρσ_seed_state.key[ρσ_seed_state.key_j]) % 256]\n\ndef seed(x=Date().getTime()):\n    ρσ_seed_state.key_i = ρσ_seed_state.key_j = 0\n    if jstype(x) is 'number':\n        x = x.toString()\n    elif jstype(x) is not 'string':\n        raise TypeError(\"unhashable type: '\" + jstype(x) + \"'\")\n    for i in range(256):\n        ρσ_seed_state.key[i] = i\n    j = 0\n    for i in range(256):\n        j = (j + ρσ_seed_state.key[i] + x.charCodeAt(i % x.length)) % 256\n        ρσ_seed_state.key[i], ρσ_seed_state.key[j] = ρσ_seed_state.key[j], ρσ_seed_state.key[i]\nseed()\n\ndef random():\n    n = 0\n    m = 1\n    for i in range(8):\n        n += ρσ_get_random_byte() * m\n        m *= 256\n    return v'n / 0x10000000000000000'\n\ndef randrange():\n    if arguments.length is 1:\n        return randbelow(int(arguments[0]))\n    start = int(arguments[0])\n    stop = int(arguments[1])\n    if arguments.length < 3:\n        step = 1\n    else:\n        step = int(arguments[2])\n    width = stop - start\n    if step is 1:\n        if width > 0:\n            return start + randbelow(width)\n        raise ValueError(\"empty range for randrange()\")\n    if step > 0:\n        n = (width + step - 1) // step\n    elif step < 0:\n        n = (width + step + 1) // step\n    else:\n        raise ValueError(\"zero step for randrange()\")\n    if n <= 0:\n        raise ValueError(f\"empty range in randrange({start}, {stop}, {step})\")\n    return start + step * randbelow(n)\n\n\ndef randint(a, b):\n    return int(random()*(b-a+1) + a)\n\ndef uniform(a, b):\n    return random()*(b-a) + a\n\ndef randbelow(n):\n    return Math.floor(random()*n)\n\ndef choice(seq):\n    if seq.length > 0:\n        return seq[randbelow(seq.length)]\n    else:\n        raise IndexError()\n\n# uses Fisher-Yates algorithm to shuffle an array\ndef shuffle(x, random_f=random):\n    for i in range(x.length):\n        j = Math.floor(random_f() * (i+1))\n        x[i], x[j] = x[j], x[i]\n    return x\n\n# similar to shuffle, but only shuffles a subset and creates a copy\ndef sample(population, k):\n    x = population.slice()\n    for i in range(population.length-1, population.length-k-1, -1):\n        j = Math.floor(random() * (i+1))\n        x[i], x[j] = x[j], x[i]\n    return x.slice(population.length-k)\n\n\n#import stdlib\n#a = range(50)\n#random.seed(5)\n#print(random.choice(a))\n#print(random.shuffle(a))\n#print(random.randrange(10))\n#print(random.randint(1,5))\n#print(random.uniform(1,5))\n#print(random.sample(range(20),5))\n"
  },
  {
    "path": "src/lib/re.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n# Copyright: 2013, Alexander Tsepkov\n\n# globals: ρσ_iterator_symbol, ρσ_list_decorate\n\n# basic implementation of Python's 're' library\n\nfrom __python__ import bound_methods\n\n# Alias DB from http://www.unicode.org/Public/8.0.0/ucd/NameAliases.txt {{{\n_ALIAS_MAP = {\"null\":0,\"nul\":0,\"start of heading\":1,\"soh\":1,\"start of text\":2,\"stx\":2,\"end of text\":3,\"etx\":3,\"end of transmission\":4,\"eot\":4,\"enquiry\":5,\"enq\":5,\"acknowledge\":6,\"ack\":6,\"alert\":7,\"bel\":7,\"backspace\":8,\"bs\":8,\"character tabulation\":9,\"horizontal tabulation\":9,\"ht\":9,\"tab\":9,\"line feed\":10,\"new line\":10,\"end of line\":10,\"lf\":10,\"nl\":10,\"eol\":10,\"line tabulation\":11,\"vertical tabulation\":11,\"vt\":11,\"form feed\":12,\"ff\":12,\"carriage return\":13,\"cr\":13,\"shift out\":14,\"locking-shift one\":14,\"so\":14,\"shift in\":15,\"locking-shift zero\":15,\"si\":15,\"data link escape\":16,\"dle\":16,\"device control one\":17,\"dc1\":17,\"device control two\":18,\"dc2\":18,\"device control three\":19,\"dc3\":19,\"device control four\":20,\"dc4\":20,\"negative acknowledge\":21,\"nak\":21,\"synchronous idle\":22,\"syn\":22,\"end of transmission block\":23,\"etb\":23,\"cancel\":24,\"can\":24,\"end of medium\":25,\"eom\":25,\"substitute\":26,\"sub\":26,\"escape\":27,\"esc\":27,\"information separator four\":28,\"file separator\":28,\"fs\":28,\"information separator three\":29,\"group separator\":29,\"gs\":29,\"information separator two\":30,\"record separator\":30,\"rs\":30,\"information separator one\":31,\"unit separator\":31,\"us\":31,\"sp\":32,\"delete\":127,\"del\":127,\"padding character\":128,\"pad\":128,\"high octet preset\":129,\"hop\":129,\"break permitted here\":130,\"bph\":130,\"no break here\":131,\"nbh\":131,\"index\":132,\"ind\":132,\"next line\":133,\"nel\":133,\"start of selected area\":134,\"ssa\":134,\"end of selected area\":135,\"esa\":135,\"character tabulation set\":136,\"horizontal tabulation set\":136,\"hts\":136,\"character tabulation with justification\":137,\"horizontal tabulation with justification\":137,\"htj\":137,\"line tabulation set\":138,\"vertical tabulation set\":138,\"vts\":138,\"partial line forward\":139,\"partial line down\":139,\"pld\":139,\"partial line backward\":140,\"partial line up\":140,\"plu\":140,\"reverse line feed\":141,\"reverse index\":141,\"ri\":141,\"single shift two\":142,\"single-shift-2\":142,\"ss2\":142,\"single shift three\":143,\"single-shift-3\":143,\"ss3\":143,\"device control string\":144,\"dcs\":144,\"private use one\":145,\"private use-1\":145,\"pu1\":145,\"private use two\":146,\"private use-2\":146,\"pu2\":146,\"set transmit state\":147,\"sts\":147,\"cancel character\":148,\"cch\":148,\"message waiting\":149,\"mw\":149,\"start of guarded area\":150,\"start of protected area\":150,\"spa\":150,\"end of guarded area\":151,\"end of protected area\":151,\"epa\":151,\"start of string\":152,\"sos\":152,\"single graphic character introducer\":153,\"sgc\":153,\"single character introducer\":154,\"sci\":154,\"control sequence introducer\":155,\"csi\":155,\"string terminator\":156,\"st\":156,\"operating system command\":157,\"osc\":157,\"privacy message\":158,\"pm\":158,\"application program command\":159,\"apc\":159,\"nbsp\":160,\"shy\":173,\"latin capital letter gha\":418,\"latin small letter gha\":419,\"cgj\":847,\"alm\":1564,\"syriac sublinear colon skewed left\":1801,\"kannada letter llla\":3294,\"lao letter fo fon\":3741,\"lao letter fo fay\":3743,\"lao letter ro\":3747,\"lao letter lo\":3749,\"tibetan mark bka- shog gi mgo rgyan\":4048,\"fvs1\":6155,\"fvs2\":6156,\"fvs3\":6157,\"mvs\":6158,\"zwsp\":8203,\"zwnj\":8204,\"zwj\":8205,\"lrm\":8206,\"rlm\":8207,\"lre\":8234,\"rle\":8235,\"pdf\":8236,\"lro\":8237,\"rlo\":8238,\"nnbsp\":8239,\"mmsp\":8287,\"wj\":8288,\"lri\":8294,\"rli\":8295,\"fsi\":8296,\"pdi\":8297,\"weierstrass elliptic function\":8472,\"micr on us symbol\":9288,\"micr dash symbol\":9289,\"leftwards triangle-headed arrow with double vertical stroke\":11130,\"rightwards triangle-headed arrow with double vertical stroke\":11132,\"yi syllable iteration mark\":40981,\"presentation form for vertical right white lenticular bracket\":65048,\"vs1\":65024,\"vs2\":65025,\"vs3\":65026,\"vs4\":65027,\"vs5\":65028,\"vs6\":65029,\"vs7\":65030,\"vs8\":65031,\"vs9\":65032,\"vs10\":65033,\"vs11\":65034,\"vs12\":65035,\"vs13\":65036,\"vs14\":65037,\"vs15\":65038,\"vs16\":65039,\"byte order mark\":65279,\"bom\":65279,\"zwnbsp\":65279,\"cuneiform sign nu11 tenu\":74452,\"cuneiform sign nu11 over nu11 bur over bur\":74453,\"byzantine musical symbol fthora skliron chroma vasis\":118981,\"vs17\":917760,\"vs18\":917761,\"vs19\":917762,\"vs20\":917763,\"vs21\":917764,\"vs22\":917765,\"vs23\":917766,\"vs24\":917767,\"vs25\":917768,\"vs26\":917769,\"vs27\":917770,\"vs28\":917771,\"vs29\":917772,\"vs30\":917773,\"vs31\":917774,\"vs32\":917775,\"vs33\":917776,\"vs34\":917777,\"vs35\":917778,\"vs36\":917779,\"vs37\":917780,\"vs38\":917781,\"vs39\":917782,\"vs40\":917783,\"vs41\":917784,\"vs42\":917785,\"vs43\":917786,\"vs44\":917787,\"vs45\":917788,\"vs46\":917789,\"vs47\":917790,\"vs48\":917791,\"vs49\":917792,\"vs50\":917793,\"vs51\":917794,\"vs52\":917795,\"vs53\":917796,\"vs54\":917797,\"vs55\":917798,\"vs56\":917799,\"vs57\":917800,\"vs58\":917801,\"vs59\":917802,\"vs60\":917803,\"vs61\":917804,\"vs62\":917805,\"vs63\":917806,\"vs64\":917807,\"vs65\":917808,\"vs66\":917809,\"vs67\":917810,\"vs68\":917811,\"vs69\":917812,\"vs70\":917813,\"vs71\":917814,\"vs72\":917815,\"vs73\":917816,\"vs74\":917817,\"vs75\":917818,\"vs76\":917819,\"vs77\":917820,\"vs78\":917821,\"vs79\":917822,\"vs80\":917823,\"vs81\":917824,\"vs82\":917825,\"vs83\":917826,\"vs84\":917827,\"vs85\":917828,\"vs86\":917829,\"vs87\":917830,\"vs88\":917831,\"vs89\":917832,\"vs90\":917833,\"vs91\":917834,\"vs92\":917835,\"vs93\":917836,\"vs94\":917837,\"vs95\":917838,\"vs96\":917839,\"vs97\":917840,\"vs98\":917841,\"vs99\":917842,\"vs100\":917843,\"vs101\":917844,\"vs102\":917845,\"vs103\":917846,\"vs104\":917847,\"vs105\":917848,\"vs106\":917849,\"vs107\":917850,\"vs108\":917851,\"vs109\":917852,\"vs110\":917853,\"vs111\":917854,\"vs112\":917855,\"vs113\":917856,\"vs114\":917857,\"vs115\":917858,\"vs116\":917859,\"vs117\":917860,\"vs118\":917861,\"vs119\":917862,\"vs120\":917863,\"vs121\":917864,\"vs122\":917865,\"vs123\":917866,\"vs124\":917867,\"vs125\":917868,\"vs126\":917869,\"vs127\":917870,\"vs128\":917871,\"vs129\":917872,\"vs130\":917873,\"vs131\":917874,\"vs132\":917875,\"vs133\":917876,\"vs134\":917877,\"vs135\":917878,\"vs136\":917879,\"vs137\":917880,\"vs138\":917881,\"vs139\":917882,\"vs140\":917883,\"vs141\":917884,\"vs142\":917885,\"vs143\":917886,\"vs144\":917887,\"vs145\":917888,\"vs146\":917889,\"vs147\":917890,\"vs148\":917891,\"vs149\":917892,\"vs150\":917893,\"vs151\":917894,\"vs152\":917895,\"vs153\":917896,\"vs154\":917897,\"vs155\":917898,\"vs156\":917899,\"vs157\":917900,\"vs158\":917901,\"vs159\":917902,\"vs160\":917903,\"vs161\":917904,\"vs162\":917905,\"vs163\":917906,\"vs164\":917907,\"vs165\":917908,\"vs166\":917909,\"vs167\":917910,\"vs168\":917911,\"vs169\":917912,\"vs170\":917913,\"vs171\":917914,\"vs172\":917915,\"vs173\":917916,\"vs174\":917917,\"vs175\":917918,\"vs176\":917919,\"vs177\":917920,\"vs178\":917921,\"vs179\":917922,\"vs180\":917923,\"vs181\":917924,\"vs182\":917925,\"vs183\":917926,\"vs184\":917927,\"vs185\":917928,\"vs186\":917929,\"vs187\":917930,\"vs188\":917931,\"vs189\":917932,\"vs190\":917933,\"vs191\":917934,\"vs192\":917935,\"vs193\":917936,\"vs194\":917937,\"vs195\":917938,\"vs196\":917939,\"vs197\":917940,\"vs198\":917941,\"vs199\":917942,\"vs200\":917943,\"vs201\":917944,\"vs202\":917945,\"vs203\":917946,\"vs204\":917947,\"vs205\":917948,\"vs206\":917949,\"vs207\":917950,\"vs208\":917951,\"vs209\":917952,\"vs210\":917953,\"vs211\":917954,\"vs212\":917955,\"vs213\":917956,\"vs214\":917957,\"vs215\":917958,\"vs216\":917959,\"vs217\":917960,\"vs218\":917961,\"vs219\":917962,\"vs220\":917963,\"vs221\":917964,\"vs222\":917965,\"vs223\":917966,\"vs224\":917967,\"vs225\":917968,\"vs226\":917969,\"vs227\":917970,\"vs228\":917971,\"vs229\":917972,\"vs230\":917973,\"vs231\":917974,\"vs232\":917975,\"vs233\":917976,\"vs234\":917977,\"vs235\":917978,\"vs236\":917979,\"vs237\":917980,\"vs238\":917981,\"vs239\":917982,\"vs240\":917983,\"vs241\":917984,\"vs242\":917985,\"vs243\":917986,\"vs244\":917987,\"vs245\":917988,\"vs246\":917989,\"vs247\":917990,\"vs248\":917991,\"vs249\":917992,\"vs250\":917993,\"vs251\":917994,\"vs252\":917995,\"vs253\":917996,\"vs254\":917997,\"vs255\":917998,\"vs256\":917999}\n# }}}\n\n_ASCII_CONTROL_CHARS = {'a':7, 'b':8, 'f': 12, 'n': 10, 'r': 13, 't': 9, 'v': 11}\n_HEX_PAT = /^[a-fA-F0-9]/\n_NUM_PAT =  /^[0-9]/\n_GROUP_PAT = /<([^>]+)>/\n_NAME_PAT = /^[a-zA-Z ]/\n\nI = IGNORECASE = 2\nL = LOCALE = 4\nM = MULTILINE = 8\nD = DOTALL = 16\nU = UNICODE = 32\nX = VERBOSE = 64\nDEBUG = 128\nA = ASCII = 256\n\nsupports_unicode = RegExp.prototype.unicode is not undefined\n\n_RE_ESCAPE = /[-\\/\\\\^$*+?.()|[\\]{}]/g\n\n_re_cache_map = {}\n_re_cache_items = v'[]'\n\nerror = SyntaxError  # This is the error JS throws for invalid regexps\nhas_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n\ndef _expand(groups, repl, group_name_map):\n    i = 0\n\n    def next():\n        nonlocal i\n        return v'repl[i++]'\n\n    def peek():\n        return repl[i]\n\n    def read_digits(count, pat, base, maxval, prefix):\n        ans = prefix or ''\n        greedy = count is Number.MAX_VALUE\n        while count > 0:\n            count -= 1\n            if not pat.test(peek()):\n                if greedy:\n                    break\n                return ans\n            ans += next()\n        nval = parseInt(ans, base)\n        if nval > maxval:\n            return ans\n        return nval\n\n    def read_escape_sequence():\n        nonlocal i\n        q = next()\n        if not q or q is '\\\\':\n            return '\\\\'\n        if '\"\\''.indexOf(q) is not -1:\n            return q\n        if _ASCII_CONTROL_CHARS[q]:\n            return String.fromCharCode(_ASCII_CONTROL_CHARS[q])\n        if '0' <= q <= '9':\n            ans = read_digits(Number.MAX_VALUE, _NUM_PAT, 10, Number.MAX_VALUE, q)\n            if jstype(ans) is 'number':\n                return groups[ans] or ''\n            return '\\\\' + ans\n        if q is 'g':\n            m = _GROUP_PAT.exec(repl[i:])\n            if m is not None:\n                i += m[0].length\n                gn = m[1]\n                if isNaN(parseInt(gn, 10)):\n                    if not has_prop(group_name_map, gn):\n                        return ''\n                    gn = group_name_map[gn][-1]\n                return groups[gn] or ''\n        if q is 'x':\n            code = read_digits(2, _HEX_PAT, 16, 0x10FFFF)\n            if jstype(code) is 'number':\n                return String.fromCharCode(code)\n            return '\\\\x' + code\n        if q is 'u':\n            code = read_digits(4, _HEX_PAT, 16, 0x10FFFF)\n            if jstype(code) is 'number':\n                return String.fromCharCode(code)\n            return '\\\\u' + code\n        if q is 'U':\n            code = read_digits(8, _HEX_PAT, 16, 0x10FFFF)\n            if jstype(code) is 'number':\n                if code <= 0xFFFF:\n                    return String.fromCharCode(code)\n                code -= 0x10000\n                return String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n            return '\\\\U' + code\n        if q is 'N' and peek() is '{':\n            next()\n            name = ''\n            while _NAME_PAT.test(peek()):\n                name += next()\n            if peek() is not '}':\n                return '\\\\N{' + name\n            next()\n            key = (name or '').toLowerCase()\n            if not name or not has_prop(_ALIAS_MAP, key):\n                return '\\\\N{' + name + '}'\n            code = _ALIAS_MAP[key]\n            if code <= 0xFFFF:\n                return String.fromCharCode(code)\n            code -= 0x10000\n            return String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n\n        return '\\\\' + q\n\n    ans = ch = ''\n    while True:\n        ch = next()\n        if ch is '\\\\':\n            ans += read_escape_sequence()\n        elif not ch:\n            break\n        else:\n            ans += ch\n    return ans\n\ndef transform_regex(source, flags):\n    pos = 0\n    previous_backslash = in_class = False\n    ans = ''\n    group_map = {}\n    flags = flags or 0\n    group_count = 0\n\n    while pos < source.length:\n        ch = v'source[pos++]'\n        if previous_backslash:\n            ans += '\\\\' + ch\n            previous_backslash = False\n            continue\n\n        if in_class:\n            if ch is ']':\n                in_class = False\n            ans += ch\n            continue\n\n        if ch is '\\\\':\n            previous_backslash = True\n            continue\n\n        if ch is '[':\n            in_class = True\n            if source[pos] is ']':  # in python the empty set is not allowed, instead []] is the same as [\\]]\n                pos += 1\n                ch = r'[\\]'\n        elif ch is '(':\n            if source[pos] is '?':\n                extension = source[pos + 1]\n                if extension is '#':\n                    close = source.indexOf(')', pos + 1)\n                    if close is -1:\n                        raise ValueError('Expecting a closing )')\n                    pos = close + 1\n                    continue\n                if 'aiLmsux'.indexOf(extension) is not -1:\n                    flag_map = {'a':ASCII, 'i':IGNORECASE, 'L':LOCALE, 'm':MULTILINE, 's':DOTALL, 'u':UNICODE, 'x':VERBOSE}\n                    close = source.indexOf(')', pos + 1)\n                    if close is -1:\n                        raise SyntaxError('Expecting a closing )')\n                    flgs = source[pos+1:close]\n                    for v'var i = 0; i < flgs.length; i++':\n                        q = flgs[i]  # noqa:undef\n                        if not has_prop(flag_map, q):\n                            raise SyntaxError('Invalid flag: ' + q)\n                        flags |= flag_map[q]\n                    pos = close + 1\n                    continue\n                if extension is '(':\n                    raise SyntaxError('Group existence assertions are not supported in JavaScript')\n                if extension is 'P':\n                    pos += 2\n                    q = source[pos]\n                    if q is '<':\n                        close = source.indexOf('>', pos)\n                        if close is -1:\n                            raise SyntaxError('Named group not closed, expecting >')\n                        name = source[pos+1:close]\n                        if not has_prop(group_map, name):\n                            group_map[name] = v'[]'\n                        group_map[name].push(v'++group_count')\n                        pos = close + 1\n                    elif q is '=':\n                        close = source.indexOf(')', pos)\n                        if close is -1:\n                            raise SyntaxError('Named group back-reference not closed, expecting a )')\n                        name = source[pos+1:close]\n                        if not isNaN(parseInt(name, 10)):\n                            ans += '\\\\' + name\n                        else:\n                            if not has_prop(group_map, name):\n                                raise SyntaxError('Invalid back-reference. The named group: ' + name + ' has not yet been defined.')\n                            ans += '\\\\' + group_map[name][-1]\n                        pos = close + 1\n                        continue\n                    else:\n                        raise SyntaxError('Expecting < or = after (?P')\n            else:\n                group_count += 1\n        elif ch is '.' and (flags & DOTALL):\n            ans += r'[\\s\\S]'  # JavaScript has no DOTALL\n            continue\n\n        ans += ch\n\n    return ans, flags, group_map\n\nclass MatchObject:\n\n    def __init__(self, regex, match, pos, endpos):\n        self.re = regex\n        self.string = match.input\n        self._start_pos = match.index\n        self._groups = match\n        self.pos, self.endpos = pos, endpos\n\n    def _compute_extents(self):\n        # compute start/end for each group\n        match = self._groups\n        self._start = v'Array(match.length)'\n        self._end = v'Array(match.length)'\n        self._start[0] = self._start_pos\n        self._end[0] = self._start_pos + match[0].length\n        offset = self._start_pos\n        extent = match[0]\n        loc = 0\n        for v'var i = 1; i < match.length; i++':\n            g = match[i]\n            loc = extent.indexOf(g, loc)\n            if loc is -1:\n                self._start[i] = self._start[i-1]\n                self._end[i] = self._end[i-1]\n            else:\n                self._start[i] = offset + loc\n                loc += g.length\n                self._end[i] = offset + loc # noqa:undef\n\n    def groups(self, defval=None):\n        ans = v'[]'\n        for v'var i = 1; i < self._groups.length; i++':\n            val = self._groups[i]  # noqa:undef\n            if val is undefined:\n                val = defval\n            ans.push(val)\n        return ans\n\n    def _group_number(self, g):\n        if jstype(g) is 'number':\n            return g\n        if has_prop(self.re.group_name_map, g):\n            return self.re.group_name_map[g][-1]\n        return g\n\n    def _group_val(self, q, defval):\n        val = undefined\n        if jstype(q) is 'number' and -1 < q < self._groups.length:\n            val = self._groups[q]\n        else:\n            if has_prop(self.re.group_name_map, q):\n                val = self._groups[self.re.group_name_map[q][-1]]\n        if val is undefined:\n            val = defval\n        return val\n\n    def group(self):\n        if arguments.length is 0:\n            return self._groups[0]\n        ans = v'[]'\n        for v'var i = 0; i < arguments.length; i++':\n            q = arguments[i]  # noqa:undef\n            ans.push(self._group_val(q, None))\n        return ans[0] if ans.length is 1 else ans\n\n    def start(self, g):\n        if self._start is undefined:\n            self._compute_extents()\n        val = self._start[self._group_number(g or 0)]\n        if val is undefined:\n            val = -1\n        return val\n\n    def end(self, g):\n        if self._end is undefined:\n            self._compute_extents()\n        val = self._end[self._group_number(g or 0)]\n        if val is undefined:\n            val = -1\n        return val\n\n    def span(self, g):\n        return [self.start(g), self.end(g)]\n\n    def expand(self, repl):\n        return _expand(repl, this._groups, this.re.group_name_map)\n\n    def groupdict(self, defval=None):\n        gnm = self.re.group_name_map\n        names = Object.keys(gnm)\n        ans = {}\n        for v\"var i = 0; i < names.length; i++\":\n            name = names[i]  # noqa:undef\n            if has_prop(gnm, name):\n                val = self._groups[gnm[name][-1]]\n                if val is undefined:\n                    val = defval\n                ans[name] = val\n        return ans\n\n    def captures(self, group_name):\n        ans = []\n        if not has_prop(self.re.group_name_map, group_name):\n            return ans\n        groups = self.re.group_name_map[group_name]\n        for v'var i = 0; i < groups.length; i++':\n            val = self._groups[groups[i]]  # noqa:undef\n            if val is not undefined:\n                ans.push(val)\n        return ans\n\n    def capturesdict(self):\n        gnm = self.re.group_name_map\n        names = Object.keys(gnm)\n        ans = {}\n        for v'var i = 0; i < names.length; i++':\n            name = names[i]  # noqa:undef\n            ans[name] = self.captures(name)\n        return ans\n\nclass RegexObject:\n\n    def __init__(self, pattern, flags):\n        self.pattern = pattern.source if isinstance(pattern, RegExp) else pattern\n        self.js_pattern, self.flags, self.group_name_map = transform_regex(self.pattern, flags)\n\n        modifiers = ''\n        if self.flags & IGNORECASE: modifiers += 'i'\n        if self.flags & MULTILINE: modifiers += 'm'\n        if not (self.flags & ASCII) and supports_unicode:\n            modifiers += 'u'\n        self._modifiers = modifiers + 'g'\n        self._pattern = RegExp(self.js_pattern, self._modifiers)\n\n    def _do_search(self, pat, string, pos, endpos):\n        pat.lastIndex = 0\n        if endpos is not None:\n            string = string[:endpos]\n        while True:\n            n = pat.exec(string)\n            if n is None:\n                return None\n            if n.index >= pos:\n                return MatchObject(self, n, pos, endpos)\n\n    def search(self, string, pos=0, endpos=None):\n        return self._do_search(self._pattern, string, pos, endpos)\n\n    def match(self, string, pos=0, endpos=None):\n        return self._do_search(RegExp('^' + self.js_pattern, self._modifiers), string, pos, endpos)\n\n    def split(self, string, maxsplit=0):\n        self._pattern.lastIndex = 0\n        return string.split(self._pattern, maxsplit or undefined)\n\n    def findall(self, string):\n        self._pattern.lastIndex = 0\n        return ρσ_list_decorate(string.match(self._pattern) or v'[]')\n\n    def finditer(self, string):\n        # We have to copy pat since lastIndex is mutable\n        pat = RegExp(this._pattern.source, this._modifiers)  # noqa: unused-local\n        ans = v\"{'_string':string, '_r':pat, '_self':self}\"\n        ans[ρσ_iterator_symbol] = def():\n            return this\n        ans['next'] = def():\n            m = this._r.exec(this._string)\n            if m is None:\n                return v\"{'done':true}\"\n            return v\"{'done':false, 'value':new MatchObject(this._self, m, 0, null)}\"\n        return ans\n\n    def subn(self, repl, string, count=0):\n        expand = _expand\n        if jstype(repl) is 'function':\n            expand = def(m, repl, gnm): return '' + repl(MatchObject(self, m, 0, None))\n        this._pattern.lastIndex = 0\n        num = 0\n        matches = v'[]'\n\n        while count < 1 or num < count:\n            m = this._pattern.exec(string)\n            if m is None:\n                break\n            matches.push(m)\n            num += 1\n\n        for v'var i = matches.length - 1; i > -1; i--':\n            m = matches[i]  # noqa:undef\n            start = m.index\n            end = start + m[0].length\n            string = string[:start] + expand(m, repl, self.group_name_map) + string[end:]\n        return string, matches.length\n\n    def sub(self, repl, string, count=0):\n        return self.subn(repl, string, count)[0]\n\ndef _get_from_cache(pattern, flags):\n    if isinstance(pattern, RegExp):\n        pattern = pattern.source\n    key = JSON.stringify(v'[pattern, flags]')\n    if has_prop(_re_cache_map, key):\n        return _re_cache_map[key]\n    if _re_cache_items.length >= 100:\n        v'delete _re_cache_map[_re_cache_items.shift()]'\n    ans = RegexObject(pattern, flags)\n    _re_cache_map[key] = ans\n    _re_cache_items.push(key)\n    return ans\n\ndef compile(pattern, flags=0):\n    return _get_from_cache(pattern, flags)\n\ndef search(pattern, string, flags=0):\n    return _get_from_cache(pattern, flags).search(string)\n\ndef match(pattern, string, flags=0):\n    return _get_from_cache(pattern, flags).match(string)\n\ndef split(pattern, string, maxsplit=0, flags=0):\n    return _get_from_cache(pattern, flags).split(string)\n\ndef findall(pattern, string, flags=0):\n    return _get_from_cache(pattern, flags).findall(string)\n\ndef finditer(pattern, string, flags=0):\n    return _get_from_cache(pattern, flags).finditer(string)\n\ndef sub(pattern, repl, string, count=0, flags=0):\n    return _get_from_cache(pattern, flags).sub(repl, string, count)\n\ndef subn(pattern, repl, string, count=0, flags=0):\n    return _get_from_cache(pattern, flags).subn(repl, string, count)\n\ndef escape(string):\n    return string.replace(_RE_ESCAPE, '\\\\$&')\n\ndef purge():\n    nonlocal _re_cache_map, _re_cache_items\n    _re_cache_map = {}\n    _re_cache_items = v'[]'\n"
  },
  {
    "path": "src/lib/traceback.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: ρσ_str, ρσ_last_exception\n\n\ndef _get_internal_traceback(err):\n    if isinstance(err, Exception) and err.stack:\n        lines = ρσ_str.splitlines(err.stack)\n        final_lines = v'[]'\n        found_sentinel = False\n        for i, line in enumerate(lines):\n            sline = ρσ_str.strip(line)\n            if i is 0:\n                final_lines.push(line)\n                continue\n            if found_sentinel:\n                final_lines.push(line)\n                continue\n            # These two conditions work on desktop Chrome and Firefox to identify the correct\n            # line in the traceback.\n            if sline.startsWith('at new ' + err.name) or sline.startsWith(err.name + '@'):\n                found_sentinel = True\n        return final_lines.join('\\n')\n    return err and err.stack\n\ndef format_exception(exc, limit):\n    if jstype(exc) is 'undefined':\n        exc = ρσ_last_exception\n    if not isinstance(exc, Error):\n        if exc and exc.toString:\n            return [exc.toString()]\n        return []\n    tb = _get_internal_traceback(exc)\n    if tb:\n        lines = ρσ_str.splitlines(tb)\n        e = lines[0]\n        lines = lines[1:]\n        if limit:\n            lines = lines[:limit+1] if limit > 0 else lines[limit:]\n        lines.reverse()\n        lines.push(e)\n        lines.insert(0, 'Traceback (most recent call last):')\n        return [l+'\\n' for l in lines]\n    return [exc.toString()]\n\ndef format_exc(limit):\n    return format_exception(ρσ_last_exception, limit).join('')\n\ndef print_exc(limit):\n    print(format_exc(limit))\n\ndef format_stack(limit):\n    stack = Error().stack\n    if not stack:\n        return []\n    lines = str.splitlines(stack)[2:]\n    lines.reverse()\n    if limit:\n        lines = lines[:limit+1] if limit > 0 else lines[limit:]\n    return [l + '\\n' for l in lines]\n\ndef print_stack(limit):\n    print(format_stack(limit).join(''))\n"
  },
  {
    "path": "src/lib/uuid.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: crypto\nfrom __python__ import hash_literals\n\nfrom encodings import hexlify, urlsafe_b64decode, urlsafe_b64encode\n\nRFC_4122 = 1\n\nif jstype(crypto) is 'object' and crypto.getRandomValues:\n    random_bytes = def (num):\n        ans = Uint8Array(num or 16)\n        crypto.getRandomValues(ans)\n        return ans\nelse:\n    random_bytes = def (num):\n        ans = Uint8Array(num or 16)\n        for i in range(ans.length):\n            ans[i] = Math.floor(Math.random() * 256)\n        return ans\n\n\ndef uuid4_bytes():\n    data = random_bytes()\n    data[6] = 0b01000000 | (data[6] & 0b1111)\n    data[8] = (((data[8] >> 4) & 0b11 | 0b1000) << 4) | (data[8] & 0b1111)\n    return data\n\n\ndef as_str():\n    h = this.hex\n    return h[:8] + '-' + h[8:12] + '-' + h[12:16] + '-' + h[16:20] + '-' + h[20:]\n\n\ndef uuid4():\n    b = uuid4_bytes()\n    return {\n        'hex': hexlify(b),\n        'bytes': b,\n        'variant': RFC_4122,\n        'version': 4,\n        '__str__': as_str,\n        'toString': as_str,\n    }\n\n\ndef num_to_string(numbers, alphabet, pad_to_length):\n    ans = v'[]'\n    alphabet_len = alphabet.length\n    numbers = Array.prototype.slice.call(numbers)\n    for v'var i = 0; i < numbers.length - 1; i++':\n        x = divmod(numbers[i], alphabet_len)\n        numbers[i] = x[0]\n        numbers[i+1] += x[1]\n    for v'var i = 0; i < numbers.length; i++':\n        number = numbers[i]\n        while number:\n            x = divmod(number, alphabet_len)\n            number = x[0]\n            ans.push(alphabet[x[1]])\n    if pad_to_length and pad_to_length > ans.length:\n        ans.push(alphabet[0].repeat(pad_to_length - ans.length))\n    return ans.join('')\n\n\ndef short_uuid():\n    # A totally random uuid encoded using only URL and filename safe characters\n    return urlsafe_b64encode(random_bytes(), '')\n\n\ndef short_uuid4():\n    # A uuid4 encoded using only URL and filename safe characters\n    return urlsafe_b64encode(uuid4_bytes(), '')\n\n\ndef decode_short_uuid(val):\n    return urlsafe_b64decode(val + '==')\n"
  },
  {
    "path": "src/output/__init__.pyj",
    "content": ""
  },
  {
    "path": "src/output/classes.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom ast import AST_Class, AST_Method, is_node_type\nfrom output.functions import decorate, function_definition, function_annotation\nfrom output.utils import create_doctring\nfrom utils import has_prop\n\ndef print_class(output):\n    self = this\n    if self.external:\n        return\n\n    def class_def(method, is_var):\n        output.indent()\n        self.name.print(output)\n        if not is_var and method and has_prop(self.static, method):\n            output.assign(\".\" + method)\n        else:\n            if is_var:\n                output.assign(\".prototype[\" + method + \"]\")\n            else:\n                output.assign(\".prototype\" + ((\".\" + method) if method else \"\"))\n\n    def define_method(stmt, is_property):\n        name = stmt.name.name\n        if not is_property:\n            class_def(name)\n        # only strip first argument if the method is static\n        is_static = has_prop(self.static, name)\n        strip_first = not is_static\n\n        # decorate the method\n        if stmt.decorators and stmt.decorators.length:\n            decorate(stmt.decorators, output, def():function_definition(stmt, output, strip_first, True);)\n            output.end_statement()\n        else:\n            function_definition(stmt, output, strip_first)\n            if not is_property:\n                output.end_statement()\n                fname = self.name.name + ('.' if is_static else '.prototype.') + name\n                function_annotation(stmt, output, strip_first, fname)\n\n    def define_default_method(name, body):\n        class_def(name)\n        output.spaced('function', name, '()', '')\n        output.with_block(def(): output.indent(), body();)\n        output.end_statement()\n\n    def add_hidden_property(name, proceed):\n        output.indent(), output.print('Object.defineProperty(')\n        self.name.print(output), output.print('.prototype'), output.comma(), output.print(JSON.stringify(name)), output.comma()\n        output.spaced('{value:', ''), proceed(), output.print('})'), output.end_statement()\n\n    # generate constructor\n    def write_constructor():\n        output.print(\"function\")\n        output.space()\n        self.name.print(output)\n        output.print(\"()\")\n        output.space()\n\n        output.with_block(def():\n            output.indent()\n            output.spaced('if', '(this.ρσ_object_id', '===', 'undefined)', 'Object.defineProperty(this,', '\"ρσ_object_id\",', '{\"value\":++ρσ_object_counter})')\n            output.end_statement()\n            if self.bound.length:\n                output.indent()\n                self.name.print(output), output.print(\".prototype.__bind_methods__.call(this)\")\n                output.end_statement()\n            output.indent()\n            self.name.print(output)\n            output.print(\".prototype.__init__.apply(this\"), output.comma(), output.print('arguments)')\n            output.end_statement()\n        )\n\n    decorators = self.decorators or v'[]'\n    if decorators.length:\n        output.print('var ')\n        output.assign(self.name)\n        write_constructor()\n        output.semicolon()\n    else:\n        write_constructor()\n    output.newline()\n    if decorators.length:\n        output.indent()\n        self.name.print(output)\n        output.spaced('.ρσ_decorators', '=', '[')\n        num = decorators.length\n        for i in range(num):\n            decorators[i].expression.print(output)\n            output.spaced(',' if i < num - 1 else ']')\n        output.semicolon()\n        output.newline()\n\n    # inheritance\n    if self.parent:\n        output.indent()\n        output.print(\"ρσ_extends\")\n        output.with_parens(def():\n            self.name.print(output)\n            output.comma()\n            self.parent.print(output)\n        )\n        output.end_statement()\n\n    # method binding\n    if self.bound.length:\n        seen_methods = Object.create(None)\n        add_hidden_property('__bind_methods__', def():\n            output.spaced('function', '()', '')\n            output.with_block(def():\n                if self.bases.length:\n                    for v'var i = self.bases.length - 1; i >= 0; i--':\n                        base = self.bases[i]\n                        output.indent(), base.print(output), output.spaced('.prototype.__bind_methods__', '&&', '')\n                        base.print(output), output.print('.prototype.__bind_methods__.call(this)')\n                        output.end_statement()\n                for bname in self.bound:\n                    if seen_methods[bname] or self.dynamic_properties[bname]:\n                        continue\n                    seen_methods[bname] = True\n                    output.indent(), output.assign('this.' + bname)\n                    self.name.print(output), output.print('.prototype.' + bname + '.bind(this)')\n                    output.end_statement()\n            )\n        )\n\n    # dynamic properties\n    property_names = Object.keys(self.dynamic_properties)\n    if property_names.length:\n        output.indent()\n        output.print('Object.defineProperties')\n        output.with_parens(def():\n            self.name.print(output), output.print('.prototype'), output.comma(), output.space(), output.with_block(def():\n                for name in property_names:\n                    prop = self.dynamic_properties[name]\n                    output.indent(), output.print(JSON.stringify(name) + ':'), output.space()\n                    output.with_block(def():\n                        output.indent(), output.print('\"enumerable\":'), output.space(), output.print('true'), output.comma(), output.newline()\n                        if prop.getter:\n                            output.indent(), output.print('\"get\":'), output.space()\n                            define_method(prop.getter, True), output.comma(), output.newline()\n                        output.indent(), output.print('\"set\":'), output.space()\n                        if prop.setter:\n                            define_method(prop.setter, True), output.newline()\n                        else:\n                            output.spaced('function', '()', '{', '''throw new AttributeError(\"can't set attribute\")''', '}'), output.newline()\n                    )\n                    output.comma(), output.newline()\n            )\n        )\n        output.end_statement()\n\n    # actual methods\n    if not self.init:\n        # Create a default __init__ method\n        define_default_method('__init__', def():\n            if self.parent:\n                self.parent.print(output)\n                output.spaced('.prototype.__init__', '&&')\n                output.space(), self.parent.print(output)\n                output.print(\".prototype.__init__.apply\")\n                output.with_parens(def():\n                    output.print(\"this\")\n                    output.comma()\n                    output.print(\"arguments\")\n                )\n                output.end_statement()\n        )\n\n    defined_methods = {}\n\n    for stmt in self.body:\n        if is_node_type(stmt, AST_Method):\n            if stmt.is_getter or stmt.is_setter:\n                continue\n            define_method(stmt)\n            defined_methods[stmt.name.name] = True\n            sname = stmt.name.name\n            if sname is '__init__':\n                # Copy argument handling data so that kwarg interpolation works when calling the constructor\n                for attr in ['.__argnames__', '.__handles_kwarg_interpolation__']:\n                    output.indent(), self.name.print(output), output.assign(attr)\n                    self.name.print(output), output.print('.prototype.__init__' + attr), output.end_statement()\n            if sname is '__iter__':\n                class_def('ρσ_iterator_symbol', True)\n                self.name.print(output)\n                output.print('.prototype.' + stmt.name.name)\n                output.end_statement()\n\n        elif is_node_type(stmt, AST_Class):\n            console.error('Nested classes aren\\'t supported yet')  # noqa:undef\n\n    if not defined_methods['__repr__']:\n        define_default_method('__repr__', def():\n            if self.parent:\n                output.print('if('), self.parent.print(output), output.spaced('.prototype.__repr__)', 'return', self.parent)\n                output.print('.prototype.__repr__.call(this)'), output.end_statement()\n            output.indent(), output.spaced('return', '\"<\"', '+', '__name__', '+', '\".\"', '+', 'this.constructor.name', '')\n            output.spaced('+', '\" #\"', '+', 'this.ρσ_object_id', '+', '\">\"')\n            output.end_statement()\n        )\n\n    if not defined_methods['__str__']:\n        define_default_method('__str__', def():\n            if self.parent:\n                output.print('if('), self.parent.print(output), output.spaced('.prototype.__str__)', 'return', self.parent)\n                output.print('.prototype.__str__.call(this)'), output.end_statement()\n            output.spaced('return', 'this.__repr__()')\n            output.end_statement()\n        )\n\n    # Multiple inheritance\n    add_hidden_property('__bases__', def():\n        output.print('[')\n        for v'var i = 0; i < self.bases.length; i++':\n            self.bases[i].print(output)\n            if i < self.bases.length - 1:\n                output.comma()\n        output.print(']')\n    )\n\n    if self.bases.length > 1:\n        output.indent()\n        output.print(\"ρσ_mixin(\")\n        self.name.print(output)\n        for v'var i = 1; i < self.bases.length; i++':\n            output.comma()\n            self.bases[i].print(output)\n        output.print(')'), output.end_statement()\n\n    # Docstring\n    if self.docstrings and self.docstrings.length and output.options.keep_docstrings:\n        add_hidden_property('__doc__', def():\n            output.print(JSON.stringify(create_doctring(self.docstrings)))\n        )\n\n    # Other statements in the class context\n    for stmt in self.statements:\n        if not is_node_type(stmt, AST_Method):\n            output.indent()\n            stmt.print(output)\n            output.newline()\n\n    if decorators.length:\n        output.indent()\n        output.assign(self.name)\n        for di in range(decorators.length):\n            self.name.print(output)\n            output.print(f'.ρσ_decorators[{di}](')\n        self.name.print(output)\n        output.print(')' * decorators.length)\n        output.semicolon()\n        output.newline()\n        output.indent()\n        output.spaced('delete ')\n        self.name.print(output)\n        output.print('.ρσ_decorators')\n        output.semicolon()\n        output.newline()\n"
  },
  {
    "path": "src/output/codegen.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\n# globals:console,regenerate,writefile\n\nfrom utils import noop\nfrom parse import PRECEDENCE\nfrom ast import (\n    AST_Array, AST_Assign, AST_BaseCall, AST_Binary, AST_BlockStatement, AST_Break,\n    AST_Class, AST_Conditional, AST_Constant, AST_Continue,\n    AST_Debugger, AST_Definitions, AST_Directive, AST_Do, AST_Dot, is_node_type,\n    AST_EmptyStatement, AST_Exit, AST_ExpressiveObject, AST_ForIn,\n    AST_ForJS, AST_Function, AST_Hole, AST_If, AST_Imports, AST_Infinity,\n    AST_Lambda, AST_ListComprehension, AST_LoopControl, AST_NaN, AST_New, AST_Node,\n    AST_Number, AST_Object, AST_ObjectKeyVal, AST_ObjectProperty, AST_PropAccess,\n    AST_RegExp, AST_Return, AST_Set, AST_Seq, AST_SimpleStatement, AST_Splice,\n    AST_Statement, AST_StatementWithBody, AST_String, AST_Sub, AST_ItemAccess,\n    AST_Symbol, AST_This, AST_Throw, AST_Toplevel, AST_Try, AST_Unary,\n    AST_UnaryPrefix, AST_Undefined, AST_Var, AST_VarDef, AST_Assert,\n    AST_Verbatim, AST_While, AST_With, AST_Yield, TreeWalker, AST_Existential\n)\nfrom output.exceptions import print_try\nfrom output.classes import print_class\nfrom output.literals import print_array, print_obj_literal, print_object, print_set, print_regexp\nfrom output.loops import print_do_loop, print_while_loop, print_for_loop_body, print_for_in, print_list_comprehension\nfrom output.modules import print_top_level, print_imports\nfrom output.comments import print_comments\nfrom output.operators import (\n    print_getattr, print_getitem, print_rich_getitem, print_splice_assignment,\n    print_unary_prefix, print_binary_op, print_assign,\n    print_conditional, print_seq, print_existential\n)\nfrom output.functions import print_function, print_function_call\nfrom output.statements import print_bracketed, first_in_statement, force_statement, print_with, print_assert\nfrom output.utils import make_block, make_num\n\n# -----[ code generators ]-----\ndef generate_code():\n    # -----[ utils ]-----\n    def DEFPRINT(nodetype, generator):\n        nodetype.prototype._codegen = generator\n\n    AST_Node.prototype.print = def(stream, force_parens):\n        self = this\n        generator = self._codegen\n        stream.push_node(self)\n        if force_parens or self.needs_parens(stream):\n            stream.with_parens(def():\n                self.add_comments(stream)\n                generator(self, stream)\n            )\n        else:\n            self.add_comments(stream)\n            generator(self, stream)\n\n        stream.pop_node()\n\n    # -----[ comments ]-----\n    AST_Node.prototype.add_comments = def(output):\n        if not is_node_type(this, AST_Toplevel):\n            print_comments(this, output)\n\n    # -----[ PARENTHESES ]-----\n    def PARENS(nodetype, func):\n        nodetype.prototype.needs_parens = func\n\n    PARENS(AST_Node, def():\n        return False\n    )\n    # a function expression needs parens around it when it's provably\n    # the first token to appear in a statement.\n    PARENS(AST_Function, def(output):\n        return first_in_statement(output)\n    )\n    # same goes for an object literal, because otherwise it would be\n    # interpreted as a block of code.\n    PARENS(AST_Object, def(output):\n        return first_in_statement(output)\n    )\n    PARENS(AST_Unary, def(output):\n        p = output.parent()\n        return is_node_type(p, AST_PropAccess) and p.expression is this\n    )\n    PARENS(AST_Seq, def(output):\n        p = output.parent()\n        return is_node_type(p, AST_Unary) or is_node_type(p, AST_VarDef) or is_node_type(p, AST_Dot) or is_node_type(p, AST_ObjectProperty) or is_node_type(p, AST_Conditional)\n    )\n    PARENS(AST_Binary, def(output):\n        p = output.parent()\n        # (foo && bar)()\n        if is_node_type(p, AST_BaseCall) and p.expression is this:\n            return True\n\n        # typeof (foo && bar)\n        if is_node_type(p, AST_Unary):\n            return True\n\n        # (foo && bar)[\"prop\"], (foo && bar).prop\n        if is_node_type(p, AST_PropAccess) and p.expression is this:\n            return True\n\n        # this deals with precedence: 3 * (2 + 1)\n        if is_node_type(p, AST_Binary):\n            po = p.operator\n            pp = PRECEDENCE[po]\n            so = this.operator\n            sp = PRECEDENCE[so]\n            if pp > sp or pp is sp and this is p.right and not (so is po and (so is \"*\" or so is \"&&\" or so is \"||\")):\n                return True\n    )\n    PARENS(AST_PropAccess, def(output):\n        p = output.parent()\n        if is_node_type(p, AST_New) and p.expression is this:\n            # i.e. new (foo.bar().baz)\n            #\n            # if there's one call into this subtree, then we need\n            # parens around it too, otherwise the call will be\n            # interpreted as passing the arguments to the upper New\n            # expression.\n            try:\n                this.walk(new TreeWalker(def(node):\n                    if is_node_type(node, AST_BaseCall):\n                        raise p\n                ))\n            except as ex:\n                if ex is not p:\n                    raise ex\n                return True\n    )\n    PARENS(AST_BaseCall, def(output):\n        p = output.parent()\n        return is_node_type(p, AST_New) and p.expression is this\n    )\n    PARENS(AST_New, def(output):\n        p = output.parent()\n        if this.args.length is 0 and (is_node_type(p, AST_PropAccess) or is_node_type(p, AST_BaseCall) and p.expression is this):\n            # (new foo)(bar)\n            return True\n    )\n    PARENS(AST_Number, def(output):\n        p = output.parent()\n        if this.value < 0 and is_node_type(p, AST_PropAccess) and p.expression is this:\n            return True\n    )\n    PARENS(AST_NaN, def(output):\n        p = output.parent()\n        if is_node_type(p, AST_PropAccess) and p.expression is this:\n            return True\n    )\n    def assign_and_conditional_paren_rules(output):\n        p = output.parent()\n        # !(a = false) → true\n        if is_node_type(p, AST_Unary):\n            return True\n\n        # 1 + (a = 2) + 3 → 6, side effect setting a = 2\n        if is_node_type(p, AST_Binary) and not (is_node_type(p, AST_Assign)):\n            return True\n\n        # (a = func)() —or— new (a = Object)()\n        if is_node_type(p, AST_BaseCall) and p.expression is this:\n            return True\n\n        # bar if a = foo else baz\n        if is_node_type(p, AST_Conditional) and p.condition is this:\n            return True\n\n        # (a = foo)[\"prop\"] —or— (a = foo).prop\n        if is_node_type(p, AST_PropAccess) and p.expression is this:\n            return True\n\n    PARENS(AST_Assign, assign_and_conditional_paren_rules)\n    PARENS(AST_Conditional, assign_and_conditional_paren_rules)\n\n    # -----[ PRINTERS ]-----\n    DEFPRINT(AST_Directive, def(self, output):\n        output.print_string(self.value)\n        output.semicolon()\n    )\n    DEFPRINT(AST_Debugger, def(self, output):\n        output.print(\"debugger\")\n        output.semicolon()\n    )\n    AST_StatementWithBody.prototype._do_print_body = def(output):\n        force_statement(this.body, output)\n\n    DEFPRINT(AST_Statement, def(self, output):\n        self.body.print(output)\n        output.semicolon()\n    )\n    DEFPRINT(AST_Toplevel, print_top_level)\n\n    DEFPRINT(AST_Imports, print_imports)\n\n    DEFPRINT(AST_SimpleStatement, def(self, output):\n        if not (is_node_type(self.body, AST_EmptyStatement)):\n            self.body.print(output)\n            output.semicolon()\n    )\n    DEFPRINT(AST_BlockStatement, def(self, output):\n        print_bracketed(self, output)\n    )\n\n    DEFPRINT(AST_EmptyStatement, def(self, output):\n        pass\n    )\n\n    DEFPRINT(AST_Do, print_do_loop)\n\n    DEFPRINT(AST_While, print_while_loop)\n\n    AST_ForIn.prototype._do_print_body = print_for_loop_body\n\n    DEFPRINT(AST_ForIn, print_for_in)\n\n    AST_ForJS.prototype._do_print_body = def(output):\n        self = this\n        output.with_block(def():\n            for stmt in self.body.body:\n                output.indent()\n                stmt.print(output)\n                output.newline()\n        )\n\n    DEFPRINT(AST_ForJS, def(self, output):\n        output.print(\"for\")\n        output.space()\n        output.with_parens(def():\n            self.condition.print(output)\n        )\n        output.space()\n        self._do_print_body(output)\n    )\n\n    DEFPRINT(AST_ListComprehension, print_list_comprehension)\n\n    DEFPRINT(AST_With, print_with)\n\n    DEFPRINT(AST_Assert, print_assert)\n\n    AST_Lambda.prototype._do_print = print_function\n\n    DEFPRINT(AST_Lambda, def(self, output):\n        self._do_print(output)\n    )\n    AST_Class.prototype._do_print = print_class\n    DEFPRINT(AST_Class, def(self, output):\n        self._do_print(output)\n    )\n    # -----[ exits ]-----\n    AST_Exit.prototype._do_print = def(output, kind):\n        self = this\n        output.print(kind)\n        if self.value:\n            output.space()\n            self.value.print(output)\n\n        output.semicolon()\n\n    DEFPRINT(AST_Yield, def(self, output):\n        self._do_print(output, \"yield\" + ('*' if self.is_yield_from else ''))\n    )\n    DEFPRINT(AST_Return, def(self, output):\n        self._do_print(output, \"return\")\n    )\n    DEFPRINT(AST_Throw, def(self, output):\n        self._do_print(output, \"throw\")\n    )\n\n    # -----[ loop control ]-----\n    AST_LoopControl.prototype._do_print = def(output, kind):\n        output.print(kind)\n        if this.label:\n            output.space()\n            this.label.print(output)\n\n        output.semicolon()\n\n    DEFPRINT(AST_Break, def(self, output):\n        self._do_print(output, \"break\")\n    )\n    DEFPRINT(AST_Continue, def(self, output):\n        self._do_print(output, \"continue\")\n    )\n\n    # -----[ if ]-----\n    def make_then(self, output):\n        if output.options.bracketize:\n            make_block(self.body, output)\n            return\n\n        # The squeezer replaces \"block\"-s that contain only a single\n        # statement with the statement itself; technically, the AST\n        # is correct, but this can create problems when we output an\n        # IF having an ELSE clause where the THEN clause ends in an\n        # IF *without* an ELSE block (then the outer ELSE would refer\n        # to the inner IF).  This function checks for this case and\n        # adds the block brackets if needed.\n        if not self.body:\n            return output.force_semicolon()\n\n        if is_node_type(self.body, AST_Do) and output.options.ie_proof:\n            # https://github.com/mishoo/RapydScript/issues/#issue/57 IE\n            # croaks with \"syntax error\" on code like this: if (foo)\n            # do ... while(cond); else ...  we need block brackets\n            # around do/while\n            make_block(self.body, output)\n            return\n\n        b = self.body\n        while True:\n            if is_node_type(b, AST_If):\n                if not b.alternative:\n                    make_block(self.body, output)\n                    return\n\n                b = b.alternative\n            elif is_node_type(b, AST_StatementWithBody):\n                b = b.body\n            else:\n                break\n\n        force_statement(self.body, output)\n\n    DEFPRINT(AST_If, def(self, output):\n        output.print(\"if\")\n        output.space()\n        output.with_parens(def(): self.condition.print(output);)\n        output.space()\n        if self.alternative:\n            make_then(self, output)\n            output.space()\n            output.print(\"else\")\n            output.space()\n            force_statement(self.alternative, output)\n        else:\n            self._do_print_body(output)\n\n    )\n\n    # -----[ exceptions ]-----\n    DEFPRINT(AST_Try, print_try)\n\n    # -----[ var/const ]-----\n    AST_Definitions.prototype._do_print = def(output, kind):\n        output.print(kind)\n        output.space()\n        for i, def_ in enumerate(this.definitions):\n            if i:\n                output.comma()\n            def_.print(output)\n        p = output.parent()\n        in_for = is_node_type(p, AST_ForIn)\n        avoid_semicolon = in_for and p.init is this\n        if not avoid_semicolon:\n            output.semicolon()\n\n    DEFPRINT(AST_Var, def(self, output):\n        self._do_print(output, \"var\")\n    )\n    def parenthesize_for_noin(node, output, noin):\n        if not noin:\n            node.print(output)\n        else:\n            try:\n                # need to take some precautions here:\n                #    https://github.com/mishoo/RapydScript2/issues/60\n                node.walk(new TreeWalker(def(node):\n                    if is_node_type(node, AST_Binary) and node.operator is \"in\":\n                        raise output\n                ))\n                node.print(output)\n            except as ex:\n                if ex is not output:\n                    raise ex\n                node.print(output, True)\n\n    DEFPRINT(AST_VarDef, def(self, output):\n        self.name.print(output)\n        if self.value:\n            output.assign(\"\")\n            #            output.space()\n            #            output.print(\"=\")\n            #            output.space()\n            p = output.parent(1)\n            noin = is_node_type(p, AST_ForIn)\n            parenthesize_for_noin(self.value, output, noin)\n    )\n\n    # -----[ other expressions ]-----\n    DEFPRINT(AST_BaseCall, print_function_call)\n\n    AST_Seq.prototype._do_print = print_seq\n\n    DEFPRINT(AST_Seq, def(self, output):\n        self._do_print(output)\n    )\n    DEFPRINT(AST_Dot, print_getattr)\n\n    DEFPRINT(AST_Sub, print_getitem)\n\n    DEFPRINT(AST_ItemAccess, print_rich_getitem)\n\n    DEFPRINT(AST_Splice, print_splice_assignment)\n\n    DEFPRINT(AST_UnaryPrefix, print_unary_prefix)\n\n    DEFPRINT(AST_Binary, print_binary_op)\n\n    DEFPRINT(AST_Existential, print_existential)\n\n    DEFPRINT(AST_Assign, print_assign)\n\n    DEFPRINT(AST_Conditional, print_conditional)\n\n    # -----[ literals ]-----\n    DEFPRINT(AST_Array, print_array)\n\n    DEFPRINT(AST_ExpressiveObject, print_obj_literal)\n\n    DEFPRINT(AST_Object, print_object)\n\n    DEFPRINT(AST_ObjectKeyVal, def(self, output):\n        self.key.print(output)\n        output.colon()\n        self.value.print(output)\n    )\n    DEFPRINT(AST_Set, print_set)\n\n    AST_Symbol.prototype.definition = def():\n        return this.thedef\n\n    DEFPRINT(AST_Symbol, def(self, output):\n        def_ = self.definition()\n        output.print_name((def_.mangled_name or def_.name) if def_ else self.name)\n    )\n    DEFPRINT(AST_Undefined, def(self, output):\n        output.print(\"void 0\")\n    )\n    DEFPRINT(AST_Hole, noop)\n\n    DEFPRINT(AST_Infinity, def(self, output):\n        output.print(\"1/0\")\n    )\n    DEFPRINT(AST_NaN, def(self, output):\n        output.print(\"0/0\")\n    )\n    DEFPRINT(AST_This, def(self, output):\n        output.print(\"this\")\n    )\n    DEFPRINT(AST_Constant, def(self, output):\n        output.print(self.value)\n    )\n    DEFPRINT(AST_String, def(self, output):\n        output.print_string(self.value)\n    )\n    DEFPRINT(AST_Verbatim, def(self, output):\n        output.print(self.value)\n    )\n    DEFPRINT(AST_Number, def(self, output):\n        output.print(make_num(self.value))\n    )\n    DEFPRINT(AST_RegExp, print_regexp)\n"
  },
  {
    "path": "src/output/comments.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom ast import AST_Exit, is_node_type\n\n\ndef output_comments(comments, output, nlb):\n    for comm in comments:\n        if comm.type is \"comment1\":\n            output.print(\"//\" + comm.value + \"\\n\")\n            output.indent()\n        elif comm.type is \"comment2\":\n            output.print(\"/*\" + comm.value + \"*/\")\n            if nlb:\n                output.print(\"\\n\")\n                output.indent()\n            else:\n                output.space()\n\n\ndef print_comments(self, output):\n    c = output.options.comments\n    if c:\n        start = self.start\n        if start and not start._comments_dumped:\n            start._comments_dumped = True\n            comments = start.comments_before\n            # XXX: ugly fix for https://github.com/mishoo/RapydScript2/issues/112\n            #      if this node is `return` or `throw`, we cannot allow comments before\n            #      the returned or thrown value.\n            if is_node_type(self, AST_Exit) and self.value and self.value.start.comments_before and self.value.start.comments_before.length > 0:\n                comments = (comments or v'[]').concat(self.value.start.comments_before)\n                self.value.start.comments_before = v'[]'\n\n            if c.test:\n                comments = comments.filter(def(comment):\n                    return c.test(comment.value)\n                )\n            elif jstype(c) is \"function\":\n                comments = comments.filter(def(comment):\n                    return c(self, comment)\n                )\n\n            output_comments(comments, output, start.nlb)\n"
  },
  {
    "path": "src/output/exceptions.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom output.statements import print_bracketed\n\n\ndef print_try(self, output):\n    else_var_name = None\n    def update_output_var(output):\n        output.indent(), output.assign(else_var_name), output.print('true'), output.end_statement()\n    if self.belse:\n        else_var_name = output.new_try_else_counter()\n        output.assign('var ' + else_var_name), output.print('false'), output.end_statement(), output.indent()\n    output.print(\"try\")\n    output.space()\n    print_bracketed(self, output, False, None, None, update_output_var if else_var_name else None)\n    if self.bcatch:\n        output.space()\n        print_catch(self.bcatch, output)\n\n    if self.bfinally:\n        output.space()\n        print_finally(self.bfinally, output, self.belse, else_var_name)\n    elif self.belse:\n        output.newline()\n        print_else(self.belse, else_var_name, output)\n\n\ndef print_catch(self, output):\n    output.print(\"catch\")\n    output.space()\n    output.with_parens(def():\n        output.print(\"ρσ_Exception\")\n    )\n    output.space()\n    output.with_block(def():\n        output.indent()\n        output.spaced('ρσ_last_exception', '=', 'ρσ_Exception'), output.end_statement()\n        output.indent()\n        no_default = True\n        for i, exception in enumerate(self.body):\n            if i:\n                output.print(\"else \")\n\n            if exception.errors.length:\n                output.print(\"if\")\n                output.space()\n                output.with_parens(def():\n                    for i, err in enumerate(exception.errors):\n                        if i:\n                            output.newline()\n                            output.indent()\n                            output.print(\"||\")\n                            output.space()\n\n                        output.print(\"ρσ_Exception\")\n                        output.space()\n                        output.print(\"instanceof\")\n                        output.space()\n                        if err.name is 'Exception':\n                            output.print('Error')\n                        else:\n                            err.print(output)\n                )\n                output.space()\n            else:\n                no_default = False\n            print_bracketed(exception, output, True)\n            output.space()\n        if no_default:\n            output.print(\"else\")\n            output.space()\n            output.with_block(def():\n                output.indent()\n                output.print(\"throw\")\n                output.space()\n                output.print(\"ρσ_Exception\")\n                output.semicolon()\n                output.newline()\n            )\n        output.newline()\n    )\n\n\ndef print_finally(self, output, belse, else_var_name):\n    output.print(\"finally\")\n    output.space()\n    if else_var_name:\n        output.with_block(def():\n            output.indent(), output.print(\"try\")\n            output.space()\n            output.with_block(def():\n                print_else(belse, else_var_name, output)\n            )\n            print_finally(self, output)\n        )\n    else:\n        print_bracketed(self, output)\n\n\ndef print_else(self, else_var_name, output):\n    output.indent(), output.spaced('if', '(' + else_var_name + ')')\n    output.space()\n    print_bracketed(self, output)\n"
  },
  {
    "path": "src/output/functions.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals:regenerate\nfrom __python__ import hash_literals\n\nfrom ast import AST_ClassCall, AST_New, has_calls, AST_Dot, AST_SymbolRef, is_node_type\nfrom output.stream import OutputStream\nfrom output.statements import print_bracketed\nfrom output.utils import create_doctring\nfrom output.operators import print_getattr\n\nanonfunc = 'ρσ_anonfunc'\nmodule_name = 'null'\n\ndef set_module_name(x):\n    nonlocal module_name\n    module_name = '\"' + x + '\"' if x else 'null'\n\n\n# Function definition {{{\n\ndef decorate(decorators, output, func):\n    pos = 0\n    def wrap():\n        nonlocal pos\n        if pos < decorators.length:\n            decorators[pos].expression.print(output)\n            pos += 1\n            output.with_parens(def():\n                wrap()\n            )\n        else:\n            func()\n    wrap()\n\ndef function_args(argnames, output, strip_first):\n    output.with_parens(def():\n        if argnames and argnames.length and (argnames.is_simple_func is True or argnames.is_simple_func is undefined):\n            for i, arg in enumerate((argnames.slice(1) if strip_first else argnames)):\n                if i:\n                    output.comma()\n                arg.print(output)\n    )\n    output.space()\n\ndef function_preamble(node, output, offset):\n    a = node.argnames\n    if not a or a.is_simple_func:\n        return\n    # If this function has optional parameters/*args/**kwargs declare it differently\n    fname = node.name.name if node.name else anonfunc\n    kw = 'arguments[arguments.length-1]'\n    # Define all formal parameters\n    for c, arg in enumerate(a):\n        i = c - offset\n        if i >= 0:\n            output.indent()\n            output.print(\"var\")\n            output.space()\n            output.assign(arg)\n            if Object.prototype.hasOwnProperty.call(a.defaults, arg.name):\n                output.spaced('(arguments[' + i + ']', '===', 'undefined', '||',\n                                '(', i, '===', 'arguments.length-1', '&&', kw, '!==', 'null', '&&', 'typeof', kw, '===', '\"object\"', '&&',\n                                kw, '[ρσ_kwargs_symbol]', '===', 'true))', '?', '')\n                output.print(fname + '.__defaults__.'), arg.print(output)\n                output.space(), output.print(':'), output.space()\n            else:\n                output.spaced('(', i, '===', 'arguments.length-1', '&&', kw, '!==', 'null', '&&', 'typeof', kw, '===', '\"object\"', '&&',\n                                kw, '[ρσ_kwargs_symbol]', '===', 'true)', '?', 'undefined', ':', '')\n            output.print('arguments[' + i + ']')\n            output.end_statement()\n    if a.kwargs or a.has_defaults:\n        # Look for an options object\n        kw = a.kwargs.name if a.kwargs else 'ρσ_kwargs_obj'\n        output.indent()\n        output.spaced('var', kw, '=', 'arguments[arguments.length-1]')\n        output.end_statement()\n        # Ensure kwargs is the options object\n        output.indent()\n        output.spaced('if', '(' + kw, '===', 'null', '||', 'typeof', kw, '!==', '\"object\"', '||', kw, '[ρσ_kwargs_symbol]', '!==', 'true)', kw, '=', '{}')\n        output.end_statement()\n        # Read values from the kwargs object for any formal parameters\n        if a.has_defaults:\n            for dname in Object.keys(a.defaults):\n                output.indent()\n                output.spaced('if', '(Object.prototype.hasOwnProperty.call(' + kw + ',', '\"' + dname + '\"))')\n                output.with_block(def():\n                    output.indent()\n                    output.spaced(dname, '=', kw + '.' + dname)\n                    output.end_statement()\n                    if a.kwargs:\n                        output.indent()\n                        output.spaced('delete', kw + '.' + dname)\n                        output.end_statement()\n                )\n                output.newline()\n\n    if a.starargs is not undefined:\n        # Define the *args parameter, putting in whatever is left after assigning the formal parameters and the options object\n        nargs = a.length - offset\n        output.indent()\n        output.spaced('var', a.starargs.name, '=', 'Array.prototype.slice.call(arguments,', nargs + ')')\n        output.end_statement()\n        # Remove the options object, if present\n        output.indent()\n        output.spaced('if', '(' + kw, '!==', 'null', '&&', 'typeof', kw, '===', '\"object\"', '&&', kw, '[ρσ_kwargs_symbol]', '===', 'true)', a.starargs.name)\n        output.print('.pop()')\n        output.end_statement()\n\ndef has_annotations(self):\n    if self.return_annotation:\n        return True\n    for arg in self.argnames:\n        if arg.annotation:\n            return True\n    return False\n\ndef function_annotation(self, output, strip_first, name):\n    fname = name or (self.name.name if self.name else anonfunc)\n    props = Object.create(None)\n\n    # Create __annotations__\n    if has_annotations(self):\n        props.__annotations__ = def():\n            output.print('{')\n            if self.argnames and self.argnames.length:\n                for i, arg in enumerate(self.argnames):\n                    if arg.annotation:\n                        arg.print(output)\n                        output.print(':'), output.space()\n                        arg.annotation.print(output)\n                        if i < self.argnames.length - 1 or self.return_annotation:\n                            output.comma()\n            if self.return_annotation:\n                output.print('return:'), output.space()\n                self.return_annotation.print(output)\n            output.print('}')\n\n    # Create __defaults__\n    defaults = self.argnames.defaults\n    dkeys = Object.keys(self.argnames.defaults)\n    if dkeys.length:\n        props.__defaults__ = def():\n            output.print('{')\n            for i, k in enumerate(dkeys):\n                output.print(k + ':'), defaults[k].print(output)\n                if i is not dkeys.length - 1:\n                    output.comma()\n            output.print('}')\n\n    # Create __handles_kwarg_interpolation__\n    if not self.argnames.is_simple_func:\n        props.__handles_kwarg_interpolation__ = def():\n            output.print('true')\n\n    # Create __argnames__\n    if self.argnames.length > (1 if strip_first else 0):\n        props.__argnames__ = def():\n            output.print('[')\n            for i, arg in enumerate(self.argnames):\n                if strip_first and i is 0:\n                    continue\n                output.print(JSON.stringify(arg.name))\n                if i is not self.argnames.length - 1:\n                    output.comma()\n            output.print(']')\n\n    # Create __doc__\n    if output.options.keep_docstrings and self.docstrings and self.docstrings.length:\n        props.__doc__ = def():\n            output.print(JSON.stringify(create_doctring(self.docstrings)))\n\n    props.__module__ = def():\n        output.print(module_name)\n\n    names = Object.keys(props)\n    output.indent()\n    # Only define the properties if they were not already defined, which\n    # can happen if the function definition is inside a loop, for example.\n    output.spaced('if', '(!' + fname + '.' + names[0] + ')', 'Object.defineProperties(' + fname)\n    output.comma()\n    output.with_block(def():\n        for v'var i = 0; i < names.length; i++':\n            name = names[i]\n            output.indent(), output.spaced(name, ':', '{value:', ''), props[name](), output.print('}')\n            if i < names.length - 1:\n                output.print(',')\n            output.newline()\n    )\n    output.print(')'), output.end_statement()\n\n\ndef function_definition(self, output, strip_first, as_expression):\n    as_expression = as_expression or self.is_expression or self.is_anonymous\n    if as_expression:\n        orig_indent = output.indentation()\n        output.set_indentation(output.next_indent())\n        output.spaced('(function()', '{'), output.newline()\n        output.indent(), output.spaced('var', anonfunc, '='), output.space()\n    output.print(\"function\"), output.space()\n    if self.name:\n        self.name.print(output)\n\n    if self.is_generator:\n        output.print('()'), output.space()\n        output.with_block(def():\n            if output.options.js_version >= 6:\n                output.indent()\n                output.print('function* js_generator')\n                function_args(self.argnames, output, strip_first)\n                print_bracketed(self, output, True, function_preamble)\n            else:\n                temp = OutputStream({'beautify':True})\n                temp.print('function* js_generator')\n                function_args(self.argnames, temp, strip_first)\n                print_bracketed(self, temp, True, function_preamble)\n                transpiled = regenerate(temp.get(), output.options.beautify).replace(/regeneratorRuntime.(wrap|mark)/g, 'ρσ_regenerator.regeneratorRuntime.$1')\n                if output.options.beautify:\n                    ci = output.make_indent(0)\n                    transpiled = [ci + x for x in transpiled.split('\\n')].join('\\n')\n                output.print(transpiled)\n            output.newline()\n            output.indent()\n            output.spaced('var', 'result', '=', 'js_generator.apply(this,', 'arguments)')\n            output.end_statement()\n            # Python's generator objects use a separate method to send data to the generator\n            output.indent()\n            output.spaced('result.send', '=', 'result.next')\n            output.end_statement()\n            output.indent()\n            output.spaced('return', 'result')\n            output.end_statement()\n        )\n    else:\n        function_args(self.argnames, output, strip_first)\n        print_bracketed(self, output, True, function_preamble)\n\n    if as_expression:\n        output.end_statement()\n        function_annotation(self, output, strip_first, anonfunc)\n        output.indent(), output.spaced('return', anonfunc), output.end_statement()\n        output.set_indentation(orig_indent)\n        output.indent(), output.print(\"})()\")\n\ndef print_function(output):\n    self = this\n    if self.decorators and self.decorators.length:\n        output.print(\"var\")\n        output.space()\n        output.assign(self.name.name)\n        decorate(self.decorators, output, def():function_definition(self, output, False, True);)\n        output.end_statement()\n    else:\n        function_definition(self, output, False)\n        if not self.is_expression and not self.is_anonymous:\n            output.end_statement()\n            function_annotation(self, output, False)\n# }}}\n\n# Function call {{{\n\ndef find_this(expression):\n    if is_node_type(expression, AST_Dot):\n        return expression.expression\n    if not is_node_type(expression, AST_SymbolRef):\n        return expression\n\ndef print_this(expression, output):\n    obj = find_this(expression)\n    if obj:\n        obj.print(output)\n    else:\n        output.print('this')\n\ndef print_function_call(self, output):\n    is_prototype_call = False\n\n    def print_function_name(no_call):\n        nonlocal is_prototype_call\n        if is_node_type(self, AST_ClassCall):\n            # class methods are called through the prototype unless static\n            if self.static:\n                self.class.print(output)\n                output.print(\".\")\n                output.print(self.method)\n            else:\n                is_prototype_call = True\n                self.class.print(output)\n                output.print(\".prototype.\")\n                output.print(self.method)\n                if not no_call:\n                    output.print(\".call\")\n        else:\n            if not is_repeatable:\n                output.print('ρσ_expr_temp')\n                if is_node_type(self.expression, AST_Dot):\n                    print_getattr(self.expression, output, True)\n            else:\n                self.expression.print(output)\n\n    def print_kwargs():\n        output.print('ρσ_desugar_kwargs(')\n        if has_kwarg_items:\n            for i, kwname in enumerate(self.args.kwarg_items):\n                if i > 0:\n                    output.print(',')\n                    output.space()\n                kwname.print(output)\n            if has_kwarg_formals:\n                output.print(',')\n                output.space()\n\n        if has_kwarg_formals:\n            output.print('{')\n            for i, pair in enumerate(self.args.kwargs):\n                if i: output.comma()\n                pair[0].print(output)\n                output.print(':')\n                output.space()\n                pair[1].print(output)\n            output.print('}')\n        output.print(')')\n\n    def print_new(apply):\n        output.print('ρσ_interpolate_kwargs_constructor.call(')\n        output.print('Object.create('), self.expression.print(output), output.print('.prototype)')\n        output.comma()\n        output.print('true' if apply else 'false')\n        output.comma()\n\n    def do_print_this():\n        if not is_repeatable:\n            output.print('ρσ_expr_temp')\n        else:\n            print_this(self.expression, output)\n        output.comma()\n\n    def print_positional_args():\n        # basic arguments\n        i = 0\n        while i < self.args.length:\n            expr = self.args[i]\n            is_first = i is 0\n            if not is_first:\n                output.print('.concat(')\n            if expr.is_array:\n                expr.print(output)\n                i += 1\n            else:\n                output.print('[')\n                while i < self.args.length and not self.args[i].is_array:\n                    self.args[i].print(output)\n                    if i + 1 < self.args.length and not self.args[i+1].is_array:\n                        output.print(',')\n                        output.space()\n                    i += 1\n                output.print(']')\n            if not is_first:\n                output.print(')')\n\n    has_kwarg_items = self.args.kwarg_items and self.args.kwarg_items.length\n    has_kwarg_formals = self.args.kwargs and self.args.kwargs.length\n    has_kwargs = has_kwarg_items or has_kwarg_formals\n    is_new = is_node_type(self, AST_New)\n    is_repeatable = True\n\n    if is_new and not self.args.length and not has_kwargs and not self.args.starargs:\n        output.print('new'), output.space()\n        print_function_name()\n        return # new A is the same as new A() in javascript\n\n    if not has_kwargs and not self.args.starargs:\n        # A simple function call, do nothing special\n        if is_new:\n            output.print('new'), output.space()\n        print_function_name()\n        output.with_parens(def():\n            for i, a in enumerate(self.args):\n                if i:\n                    output.comma()\n                a.print(output)\n        )\n        return\n\n    is_repeatable = is_new or not has_calls(self.expression)\n    if not is_repeatable:\n        output.assign('(ρσ_expr_temp'), print_this(self.expression, output), output.comma()\n\n    if has_kwargs:\n        if is_new:\n            print_new(False)\n        else:\n            output.print('ρσ_interpolate_kwargs.call(')\n            do_print_this()\n        print_function_name(True)\n        output.comma()\n    else:\n        if is_new:\n            print_new(True)\n            print_function_name(True)\n            output.comma()\n        else:\n            print_function_name(True)\n            output.print('.apply(')\n            do_print_this()\n\n    if is_prototype_call and self.args.length > 1:\n        self.args.shift()\n\n    print_positional_args()\n\n    if has_kwargs:\n        if self.args.length:\n            output.print('.concat(')\n        output.print('[')\n        print_kwargs()\n        output.print(']')\n        if self.args.length:\n            output.print(')')\n\n    output.print(')')\n    if not is_repeatable:\n        output.print(')')\n# }}}\n"
  },
  {
    "path": "src/output/literals.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom ast import AST_Binary, is_node_type\n\ndef print_array(self, output):\n    output.print('ρσ_list_decorate')\n    output.with_parens(def():\n        output.with_square(def():\n            a = self.elements\n            len_ = a.length\n            if len_ > 0:\n                output.space()\n            for i, exp in enumerate(a):\n                if i:\n                    output.comma()\n                exp.print(output)\n            if len_ > 0:\n                output.space()\n        )\n    )\n\n\ndef print_obj_literal(self, output):\n    output.with_parens(def():\n        output.print('function()')\n        output.with_block(def():\n            output.indent()\n            if self.is_pydict:\n                output.spaced.apply(output, 'var ρσ_d = ρσ_dict()'.split(' '))\n            else:\n                output.spaced('var', 'ρσ_d', '=', ('Object.create(null)' if self.is_jshash else '{}'))\n            output.end_statement()\n            for i, prop in enumerate(self.properties):\n                output.indent()\n                if self.is_pydict:\n                    output.print('ρσ_d.set')\n                    output.with_parens(def():\n                        prop.key.print(output)\n                        output.print(','), output.space()\n                        prop.value.print(output)\n                    )\n                else:\n                    output.print('ρσ_d')\n                    output.with_square(def():prop.key.print(output);)\n                    output.space(), output.print('='), output.space()\n                    prop.value.print(output)\n                output.end_statement()\n            output.indent()\n            output.spaced('return', 'ρσ_d')\n            output.end_statement()\n        )\n    )\n    output.print('.call(this)')\n\ndef print_object(self, output):\n    if self.is_pydict:\n        if self.properties.length > 0:\n            print_obj_literal(self, output)\n        else:\n            output.print('ρσ_dict()')\n    else:\n        if self.properties.length > 0:\n            print_obj_literal(self, output)\n        else:\n            output.print(\"Object.create(null)\" if self.is_jshash else '{}')\n\ndef print_set(self, output):\n    if self.items.length is 0:\n        output.print('ρσ_set()')\n        return\n    output.with_parens(def():\n        output.print('function()')\n        output.with_block(def():\n            output.indent()\n            output.spaced.apply(output, 'var s = ρσ_set()'.split(' '))\n            output.end_statement()\n            for item in self.items:\n                output.indent()\n                output.print('s.jsset.add')\n                output.with_parens(def():item.value.print(output);)\n                output.end_statement()\n            output.indent()\n            output.spaced('return', 's')\n            output.end_statement()\n        )\n    )\n    output.print('()')\n\ndef print_regexp(self, output):\n    str_ = self.value.toString()\n    if output.options.ascii_only:\n        str_ = output.to_ascii(str_)\n    output.print(str_)\n    p = output.parent()\n    if is_node_type(p, AST_Binary) and /^in/.test(p.operator) and p.left is self:\n        output.print(\" \")\n"
  },
  {
    "path": "src/output/loops.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: regenerate\nfrom __python__ import hash_literals\n\nfrom ast import AST_BaseCall, AST_SymbolRef, AST_Array, AST_Unary, AST_Number, has_calls, AST_Seq, AST_ListComprehension, is_node_type\nfrom output.stream import OutputStream\n\ndef unpack_tuple(elems, output, in_statement):\n    for i, elem in enumerate(elems):\n        output.indent()\n        output.assign(elem)\n        output.print(\"ρσ_unpack\")\n        output.with_square(def():\n            output.print(i)\n        )\n        if not in_statement or i < elems.length - 1:\n            output.semicolon()\n            output.newline()\n\ndef print_do_loop(self, output):\n    output.print(\"do\")\n    output.space()\n    self._do_print_body(output)\n    output.space()\n    output.print(\"while\")\n    output.space()\n    output.with_parens(def(): self.condition.print(output);)\n    output.semicolon()\n\ndef print_while_loop(self, output):\n    output.print(\"while\")\n    output.space()\n    output.with_parens(def(): self.condition.print(output);)\n    output.space()\n    self._do_print_body(output)\n\ndef is_simple_for_in(self):\n    # return true if this loop can be simplified into a basic for (i in j) loop\n    if is_node_type(self.object, AST_BaseCall)\n    and is_node_type(self.object.expression, AST_SymbolRef)\n    and self.object.expression.name is \"dir\" and self.object.args.length is 1:\n        return True\n    return False\n\ndef is_simple_for(self):\n    # returns true if this loop can be simplified into a basic for(i=n;i<h;i++) loop\n    if (is_node_type(self.object, AST_BaseCall) and\n            is_node_type(self.object.expression, AST_SymbolRef) and\n            self.object.expression.name is \"range\" and\n            not (is_node_type(self.init, AST_Array))):\n        a = self.object.args\n        l = a.length\n        if l < 3 or (\n            is_node_type(a[2], AST_Number) or (\n                is_node_type(a[2], AST_Unary) and a[2].operator is '-' and is_node_type(a[2].expression, AST_Number)\n        )):\n            if (l is 1 and not has_calls(a[0])) or (l > 1 and not has_calls(a[1])):\n                return True\n    return False\n\ndef print_for_loop_body(output):\n    self = this\n    output.with_block(def():\n        if not (self.simple_for_index or is_simple_for_in(self)):\n            # if we're using multiple iterators, unpack them\n            output.indent()\n            if output.options.js_version is 5:\n                itervar = \"ρσ_Iter\" + output.index_counter + \"[ρσ_Index\" + output.index_counter + \"]\"\n            else:\n                itervar = \"ρσ_Index\" + output.index_counter\n            if is_node_type(self.init, AST_Array):\n                flat = self.init.flatten()\n                output.assign(\"ρσ_unpack\")\n                if flat.length > self.init.elements.length:\n                    output.print('ρσ_flatten(' + itervar + ')')\n                else:\n                    output.print(itervar)\n                output.end_statement()\n                unpack_tuple(flat, output)\n            else:\n                output.assign(self.init)\n                output.print(itervar)\n                output.end_statement()\n\n            output.index_counter += 1\n        if self.simple_for_index:\n            output.indent()\n            output.assign(self.init)\n            output.print(self.simple_for_index)\n            output.end_statement()\n\n        for stmt in self.body.body:\n            output.indent()\n            stmt.print(output)\n            output.newline()\n    )\n\ndef init_es6_itervar(output, itervar):\n    output.indent()\n    output.spaced(itervar, '=', '((typeof', itervar + '[Symbol.iterator]', '===', '\"function\")', '?',\n                    '('+itervar, 'instanceof', 'Map', '?', itervar + '.keys()', ':', itervar+')', ':', 'Object.keys(' + itervar + '))')\n    output.end_statement()\n\ndef print_for_in(self, output):\n    def write_object():\n        if self.object.constructor is AST_Seq:\n            (new AST_Array({'elements':self.object.to_array()})).print(output)\n        else:\n            self.object.print(output)\n\n    if is_simple_for(self):\n        # optimize range() into a simple for loop\n        increment = None\n        args = self.object.args\n        tmp_ = args.length\n        if tmp_ is 1:\n            start = 0\n            end = args[0]\n        elif tmp_ is 2:\n            start = args[0]\n            end = args[1]\n        elif tmp_ is 3:\n            start = args[0]\n            end = args[1]\n            increment = args[2]\n\n        self.simple_for_index = idx = 'ρσ_Index' + output.index_counter\n        output.index_counter += 1\n        output.print(\"for\")\n        output.space()\n        output.with_parens(def():\n            output.spaced('var', idx, '='), output.space()\n            start.print(output) if start.print else output.print(start)\n            output.semicolon()\n            output.space()\n            output.print(idx)\n            output.space()\n            output.print(\">\") if is_node_type(increment, AST_Unary) else output.print(\"<\")\n            output.space()\n            end.print(output)\n            output.semicolon()\n            output.space()\n            output.print(idx)\n            if increment and (not (is_node_type(increment, AST_Unary)) or increment.expression.value is not \"1\"):\n                if is_node_type(increment, AST_Unary):\n                    output.print(\"-=\")\n                    increment.expression.print(output)\n                else:\n                    output.print(\"+=\")\n                    increment.print(output)\n            else:\n                if is_node_type(increment, AST_Unary):\n                    output.print(\"--\")\n                else:\n                    output.print(\"++\")\n        )\n    elif is_simple_for_in(self):\n        # optimize dir() into a simple for in loop\n        output.print(\"for\")\n        output.space()\n        output.with_parens(def():\n            self.init.print(output)\n            output.space()\n            output.print('in')\n            output.space()\n            self.object.args[0].print(output)\n        )\n    else:\n        # regular loop\n        if output.options.js_version is 5:\n            output.assign(\"var ρσ_Iter\" + output.index_counter)\n            output.print(\"ρσ_Iterable\")\n            output.with_parens(write_object)\n            output.semicolon()\n            output.newline()\n            output.indent()\n            output.print(\"for\")\n            output.space()\n            output.with_parens(def():\n                output.print(\"var\")\n                output.space()\n                output.assign(\"ρσ_Index\" + output.index_counter)\n                output.print(\"0\")\n                output.semicolon()\n                output.space()\n                output.print(\"ρσ_Index\" + output.index_counter)\n                output.space()\n                output.print(\"<\")\n                output.space()\n                output.print(\"ρσ_Iter\" + output.index_counter + \".length\")\n                output.semicolon()\n                output.space()\n                output.print(\"ρσ_Index\" + output.index_counter + \"++\")\n            )\n        else:\n            itervar = \"ρσ_Iter\" + output.index_counter\n            output.assign(\"var \" + itervar)\n            write_object()\n            output.end_statement()\n            init_es6_itervar(output, itervar)\n            output.indent()\n            output.spaced('for', '(var', 'ρσ_Index' + output.index_counter, 'of', itervar + ')')\n\n    output.space()\n    self._do_print_body(output)\n\ndef print_list_comprehension(self, output):\n    tname = self.constructor.name.slice(4)\n    result_obj = {'ListComprehension':'[]', 'DictComprehension':('Object.create(null)' if self.is_jshash else '{}'), 'SetComprehension':'ρσ_set()'}[tname]\n    is_generator = tname is 'GeneratorComprehension'\n    es5 = output.options.js_version is 5\n    if tname is 'DictComprehension':\n        if self.is_pydict:\n            result_obj = 'ρσ_dict()'\n            add_to_result = def(output):\n                output.indent()\n                output.print('ρσ_Result.set')\n                output.with_parens(def():\n                    self.statement.print(output)\n                    output.space(), output.print(','), output.space()\n                    output.with_parens(def():\n                        if self.value_statement.constructor is AST_Seq:\n                            output.with_square(def():self.value_statement.print(output);)\n                        else:\n                            self.value_statement.print(output)\n                    )\n                )\n                output.end_statement()\n        else:\n            add_to_result = def(output):\n                output.indent()\n                output.print('ρσ_Result')\n                output.with_square(def():\n                    self.statement.print(output)\n                )\n                output.space(), output.print('='), output.space()\n                output.with_parens(def():\n                    if self.value_statement.constructor is AST_Seq:\n                        output.with_square(def():self.value_statement.print(output);)\n                    else:\n                        self.value_statement.print(output)\n                )\n                output.end_statement()\n    else:\n        push_func = \"ρσ_Result.\" + ('push' if self.constructor is AST_ListComprehension else 'add')\n        if is_generator:\n            push_func = 'yield '\n        add_to_result = def(output):\n            output.indent()\n            output.print(push_func)\n            output.with_parens(def():\n                if self.statement.constructor is AST_Seq:\n                    output.with_square(def():self.statement.print(output);)\n                else:\n                    self.statement.print(output)\n            )\n            output.end_statement()\n\n    output.with_parens(def():\n        output.print(\"function\")\n        output.print(\"()\")\n        output.space()\n        output.with_block(def():\n            body_out = output\n            if is_generator:\n                if es5:\n                    body_out = OutputStream({'beautify':True})\n                body_out.indent()\n                body_out.print('function* js_generator()'), body_out.space(), body_out.print('{')\n                body_out.newline()\n                previous_indentation = output.indentation()\n                output.set_indentation(output.next_indent())\n            body_out.indent()\n            body_out.assign(\"var ρσ_Iter\")\n            if es5:\n                body_out.print(\"ρσ_Iterable\")\n                body_out.with_parens(def():\n                    self.object.print(body_out)\n                )\n            else:\n                self.object.print(body_out)\n\n            if result_obj:\n                body_out.comma()\n                body_out.assign(\"ρσ_Result\")\n                body_out.print(result_obj)\n            # make sure to locally scope loop variables\n            if is_node_type(self.init, AST_Array):\n                for i in self.init.elements:\n                    body_out.comma()\n                    i.print(body_out)\n            else:\n                body_out.comma()\n                self.init.print(body_out)\n            body_out.end_statement()\n\n            if not es5:\n                init_es6_itervar(body_out, 'ρσ_Iter')\n            body_out.indent()\n            body_out.print(\"for\")\n            body_out.space()\n            body_out.with_parens(def():\n                if es5:\n                    body_out.print(\"var\")\n                    body_out.space()\n                    body_out.assign(\"ρσ_Index\")\n                    body_out.print(\"0\")\n                    body_out.semicolon()\n                    body_out.space()\n                    body_out.print(\"ρσ_Index\")\n                    body_out.space()\n                    body_out.print(\"<\")\n                    body_out.space()\n                    body_out.print(\"ρσ_Iter.length\")\n                    body_out.semicolon()\n                    body_out.space()\n                    body_out.print(\"ρσ_Index++\")\n                else:\n                    body_out.spaced('var', 'ρσ_Index', 'of', 'ρσ_Iter')\n            )\n            body_out.space()\n            body_out.with_block(def():\n                body_out.indent()\n                itervar = 'ρσ_Iter[ρσ_Index]' if es5 else 'ρσ_Index'\n                if is_node_type(self.init, AST_Array):\n                    flat = self.init.flatten()\n                    body_out.assign(\"ρσ_unpack\")\n                    if flat.length > self.init.elements.length:\n                        body_out.print('ρσ_flatten(' + itervar + ')')\n                    else:\n                        body_out.print(itervar)\n                    body_out.end_statement()\n                    unpack_tuple(flat, body_out)\n                else:\n                    body_out.assign(self.init)\n                    body_out.print(itervar)\n                    body_out.end_statement()\n\n                if self.condition:\n                    body_out.indent()\n                    body_out.print(\"if\")\n                    body_out.space()\n                    body_out.with_parens(def(): self.condition.print(body_out);)\n                    body_out.space()\n                    body_out.with_block(def():\n                        add_to_result(body_out)\n                    )\n                    body_out.newline()\n                else:\n                    add_to_result(body_out)\n            )\n            body_out.newline()\n            if self.constructor is AST_ListComprehension:\n                body_out.indent()\n                body_out.spaced('ρσ_Result', '=', 'ρσ_list_constructor(ρσ_Result)')\n                body_out.end_statement()\n            if not is_generator:\n                body_out.indent()\n                body_out.print(\"return ρσ_Result\")\n                body_out.end_statement()\n            if is_generator:\n                output.set_indentation(previous_indentation)\n                body_out.newline(), body_out.indent(), body_out.print('}')  # end js_generator\n                if es5:\n                    transpiled = regenerate(body_out.get(), output.options.beautify).replace(/regeneratorRuntime.(wrap|mark)/g, 'ρσ_regenerator.regeneratorRuntime.$1')\n                    if output.options.beautify:\n                        ci = output.make_indent(0)\n                        transpiled = [ci + x for x in transpiled.split('\\n')].join('\\n')\n                    output.print(transpiled)\n                output.newline(), output.indent()\n                output.spaced('var', 'result', '=', 'js_generator.call(this)')\n                output.end_statement()\n                # Python's generator objects use a separate method to send data to the generator\n                output.indent()\n                output.spaced('result.send', '=', 'result.next')\n                output.end_statement()\n                output.indent()\n                output.spaced('return', 'result')\n                output.end_statement()\n        )\n    )\n    output.print(\"()\")\n"
  },
  {
    "path": "src/output/modules.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: writefile\nfrom __python__ import hash_literals\n\nfrom output.statements import declare_vars, display_body\nfrom output.stream import OutputStream\nfrom output.utils import create_doctring\nfrom output.comments import print_comments, output_comments\nfrom output.functions import set_module_name\nfrom parse import get_compiler_version\nfrom utils import cache_file_name\n\n\ndef write_imports(module, output):\n    imports = []\n    for import_id in Object.keys(module.imports):\n        imports.push(module.imports[import_id])\n    imports.sort(def(a, b):\n        a, b = a.import_order, b.import_order\n        return -1 if a < b else (1 if a > b else 0)\n    )\n    if imports.length > 1:\n        output.indent()\n        output.print('var ρσ_modules = {};')\n        output.newline()\n\n    # Declare all variable names exported from the modules as global symbols\n    nonlocalvars = {}\n    for module_ in imports:\n        for name in module_.nonlocalvars:\n            nonlocalvars[name] = True\n    nonlocalvars = Object.getOwnPropertyNames(nonlocalvars).join(', ')\n    if nonlocalvars.length:\n        output.indent()\n        output.print('var ' + nonlocalvars)\n        output.semicolon()\n        output.newline()\n\n    # Create the module objects\n    for module_ in imports:\n        module_id = module_.module_id\n        if module_id is not '__main__':\n            output.indent()\n            if module_id.indexOf('.') is -1:\n                output.print('ρσ_modules.' + module_id)\n            else:\n                output.print('ρσ_modules[\"' + module_id + '\"]')\n            output.space(), output.print('='), output.space(), output.print('{}')\n            output.end_statement()\n\n    # Output module code\n    for module_ in imports:\n        if module_.module_id is not '__main__':\n            print_module(module_, output)\n\ndef write_main_name(output):\n    if output.options.write_name:\n        output.newline()\n        output.indent()\n        output.print('var __name__ = \"__main__\"')\n        output.semicolon()\n        output.newline()\n        output.newline()\n\ndef const_decl(js_version):\n    # return 'const' if js_version > 5 else 'var'\n    # Workaround for bug in Chrome eval(). eval() barfs if it sees const before a function.\n    # See https://github.com/kovidgoyal/rapydscript-ng/issues/29\n    return 'var'\n\ndef declare_exports(module_id, exports, output, docstrings):\n    seen = {}\n    if output.options.keep_docstrings and docstrings and docstrings.length:\n        exports.push({'name':'__doc__', 'refname': 'ρσ_module_doc__'})\n        output.newline(), output.indent()\n        v = const_decl(output.options.js_version)\n        output.assign(v + ' ρσ_module_doc__'), output.print(JSON.stringify(create_doctring(docstrings)))\n        output.end_statement()\n    output.newline()\n    for symbol in exports:\n        if not Object.prototype.hasOwnProperty.call(seen, symbol.name):\n            output.indent()\n            if module_id.indexOf('.') is -1:\n                output.print('ρσ_modules.' + module_id + '.' + symbol.name)\n            else:\n                output.print('ρσ_modules[\"' + module_id + '\"].' + symbol.name)\n            output.space(), output.print('='), output.space(), output.print(symbol.refname or symbol.name)\n            seen[symbol.name] = True\n            output.end_statement()\n\ndef prologue(module, output):\n    # any code that should appear before the main body\n    if output.options.omit_baselib:\n        return\n    output.indent()\n    v = const_decl(output.options.js_version)\n    output.print(v), output.space()\n    output.spaced.apply(output, (('ρσ_iterator_symbol = (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") ? Symbol.iterator : \"iterator-Symbol-5d0927e5554349048cf0e3762a228256\"'.split(' '))))\n    output.end_statement()\n    output.indent(), output.print(v), output.space()\n    output.spaced.apply(output, (('ρσ_kwargs_symbol = (typeof Symbol === \"function\") ? Symbol(\"kwargs-object\") : \"kwargs-object-Symbol-5d0927e5554349048cf0e3762a228256\"'.split(' '))))\n    output.end_statement()\n    output.indent(), output.spaced('var', 'ρσ_cond_temp,', 'ρσ_expr_temp,', 'ρσ_last_exception'), output.end_statement()\n    output.indent(), output.spaced('var', 'ρσ_object_counter', '=', '0'), output.end_statement()\n    if output.options.js_version > 5:\n        # Needed for Chrome < 51 and Edge as of August 2016\n        output.indent(), output.spaced('if(', 'typeof', 'HTMLCollection', '!==', '\"undefined\"', '&&', 'typeof', 'Symbol', '===', '\"function\")',\n            'NodeList.prototype[Symbol.iterator]', '=', 'HTMLCollection.prototype[Symbol.iterator]', '=', 'NamedNodeMap.prototype[Symbol.iterator]', '=', 'Array.prototype[Symbol.iterator]')\n        output.end_statement()\n    needs_yield = output.options.js_version < 6 and module.baselib['yield']\n    if needs_yield:\n        output.dump_yield()\n    # output the baselib\n    if not output.options.baselib_plain:\n        raise ValueError('The baselib is missing! Remember to set the baselib_plain field on the options for OutputStream')\n    output.print(output.options.baselib_plain)\n    output.end_statement()\n\n\ndef print_top_level(self, output):\n    set_module_name(self.module_id)\n    is_main = self.module_id is '__main__'\n\n    def write_docstrings():\n        if is_main and output.options.keep_docstrings and self.docstrings and self.docstrings.length:\n            output.newline(), output.indent()\n            v = const_decl(output.options.js_version)\n            output.assign(v + ' ρσ_module_doc__'), output.print(JSON.stringify(create_doctring(self.docstrings)))\n            output.end_statement()\n\n    if output.options.private_scope and is_main:\n        output.with_parens(def():\n            output.print(\"function()\")\n            output.with_block(def():\n                # strict mode is more verbose about errors, and less forgiving about them\n                # kind of like Python\n                output.indent()\n                output.print('\"use strict\"')\n                output.end_statement()\n\n                prologue(self, output)\n                write_imports(self, output)\n                output.newline()\n                output.indent()\n                output.with_parens(def():\n                    output.print(\"function()\")\n                    output.with_block(def():\n                        write_main_name(output)\n                        output.newline()\n                        declare_vars(self.localvars, output)\n                        display_body(self.body, True, output)\n                        output.newline()\n                        write_docstrings()\n                        if self.comments_after and self.comments_after.length:\n                            output.indent()\n                            output_comments(self.comments_after, output)\n                            output.newline()\n                    )\n                )\n                output.print(\"();\")\n                output.newline()\n            )\n        )\n        output.print(\"();\")\n        output.print(\"\")\n    else:\n        if is_main:\n            prologue(self, output)\n            write_imports(self, output)\n            write_main_name(output)\n\n        declare_vars(self.localvars, output)\n        display_body(self.body, True, output)\n        if self.comments_after and self.comments_after.length:\n            output_comments(self.comments_after, output)\n    set_module_name()\n\ndef print_module(self, output):\n    set_module_name(self.module_id)\n\n    def output_module(output):\n        declare_vars(self.localvars, output)\n        display_body(self.body, True, output)\n        declare_exports(self.module_id, self.exports, output, self.docstrings)\n\n    output.newline()\n    output.indent()\n    output.with_parens(def():\n        output.print(\"function()\")\n        output.with_block(def():\n            # dump the logic of this module\n            print_comments(self, output)\n            if output.options.write_name:\n                output.indent()\n                output.print('var ')\n                output.assign('__name__')\n                output.print('\"' + self.module_id + '\"')\n                output.semicolon()\n                output.newline()\n            def output_key(beautify, keep_docstrings, js_version):\n                return 'beautify:' + beautify + ' keep_docstrings:' + keep_docstrings + ' js_version:' + js_version\n            okey = output_key(output.options.beautify, output.options.keep_docstrings, output.options.js_version)\n            if self.is_cached and okey in self.outputs:\n                output.print(self.outputs[okey])\n            else:\n                output_module(output)\n                if self.srchash and self.filename:\n                    cached = {\n                        'version':get_compiler_version(), 'signature':self.srchash, 'classes': {}, 'baselib':self.baselib,\n                        'nonlocalvars':self.nonlocalvars, 'imported_module_ids':self.imported_module_ids, 'exports':[],\n                        'outputs':{}, 'discard_asserts': v'!!output.options.discard_asserts'\n                    }\n                    for cname in Object.keys(self.classes):\n                        cobj = self.classes[cname]\n                        cached.classes[cname] = {'name':{'name':cobj.name.name}, 'static':cobj.static, 'bound':cobj.bound, 'classvars':cobj.classvars}\n                    for symdef in self.exports:\n                        cached.exports.push({'name':symdef.name})\n                    for beautify in [True, False]:\n                        for keep_docstrings in [True, False]:\n                            for js_version in [5, 6]:\n                                co = OutputStream({\n                                    'beautify':beautify, 'keep_docstrings':keep_docstrings,\n                                    'js_version':js_version, 'private_scope':False,\n                                    'write_name':False, 'discard_asserts':output.options.discard_asserts\n                                })\n                                co.with_indent(output.indentation(), def():\n                                    output_module(co)\n                                )\n                                raw = co.get()\n                                cached.outputs[output_key(beautify, keep_docstrings, js_version)] = raw\n                    try:\n                        writefile(cache_file_name(self.filename, output.options.module_cache_dir), JSON.stringify(cached, None, '\\t'))\n                    except Error as e:\n                        console.error('Failed to write output cache file:', self.filename + '-cached', 'with error:', e)\n        )\n    )\n    output.print(\"()\")\n    output.semicolon()\n    output.newline()\n    set_module_name()\n\ndef print_imports(container, output):\n    is_first_aname = True\n    def add_aname(aname, key, from_import):\n        nonlocal is_first_aname\n        if is_first_aname:\n            is_first_aname = False\n        else:\n            output.indent()\n        output.print('var ')\n        output.assign(aname)\n        if key.indexOf('.') is -1:\n            output.print('ρσ_modules.'), output.print(key)\n        else:\n            output.print('ρσ_modules[\"'), output.print(key), output.print('\"]')\n        if from_import:\n            output.print('.')\n            output.print(from_import)\n        output.end_statement()\n\n    for self in container.imports:\n        if self.argnames:\n            # A from import\n            for argname in self.argnames:\n                akey = argname.alias.name if argname.alias else argname.name\n                add_aname(akey, self.key, argname.name)\n        else:\n            if self.alias:\n                add_aname(self.alias.name, self.key, False)\n            else:\n                parts = self.key.split('.')\n                for i, part in enumerate(parts):\n                    if i is 0:\n                        add_aname(part, part, False)\n                    else:\n                        q = parts[:i+1].join('.')\n                        output.indent()\n                        output.spaced(q, '=', 'ρσ_modules[\"' + q + '\"]')\n                        output.end_statement()\n"
  },
  {
    "path": "src/output/operators.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\nfrom ast import (\n    AST_Array, AST_Assign, AST_BaseCall, AST_Binary, AST_Conditional,\n    AST_ItemAccess, AST_Number, AST_Object, AST_Return, AST_Seq, AST_Set,\n    AST_SimpleStatement, AST_Statement, AST_String, AST_Sub, AST_Symbol,\n    AST_SymbolRef, AST_Unary, is_node_type\n)\nfrom output.loops import unpack_tuple\n\n\ndef print_getattr(self, output, skip_expression):  # AST_Dot\n    if not skip_expression:\n        expr = self.expression\n        expr.print(output)\n    if is_node_type(expr, AST_Number) and expr.value >= 0:\n        if not /[xa-f.]/i.test(output.last()):\n            output.print(\".\")\n    output.print(\".\")\n    # the name after dot would be mapped about here.\n    output.print_name(self.property)\n\ndef print_getitem(self, output):  # AST_Sub\n    expr = self.expression\n    prop = self.property\n    if (is_node_type(prop, AST_Number) or is_node_type(prop, AST_String)) or (is_node_type(prop, AST_SymbolRef) and prop.name and prop.name.startsWith('ρσ_')):\n        expr.print(output)\n        output.print('['), prop.print(output), output.print(']')\n        return\n    is_negative_number = is_node_type(prop, AST_Unary) and prop.operator is \"-\" and is_node_type(prop.expression, AST_Number)\n    is_repeatable = is_node_type(expr, AST_SymbolRef)\n    if is_repeatable:\n        expr.print(output)\n    else:\n        output.spaced('(ρσ_expr_temp', '=', expr), output.print(')')\n        expr = {'print': def(): output.print('ρσ_expr_temp');}\n\n    if is_negative_number:\n        output.print('['), expr.print(output), output.print('.length'), prop.print(output), output.print(']')\n        return\n    is_repeatable = is_node_type(prop, AST_SymbolRef)\n    # We have to check the type of the property because if it is a Symbol, it\n    # will raise a TypeError with the < operator.\n    if is_repeatable:\n        output.spaced('[(typeof', prop, '===', '\"number\"', '&&', prop)\n        output.spaced('', '<', '0)', '?', expr), output.spaced('.length', '+', prop, ':', prop)\n        output.print(\"]\")\n    else:\n        output.print('[ρσ_bound_index('), prop.print(output), output.comma(), expr.print(output), output.print(')]')\n\n\ndef print_rich_getitem(self, output):  # AST_ItemAccess\n    func = 'ρσ_' + ('setitem' if self.assignment else 'getitem')\n    output.print(func + '(')\n    self.expression.print(output), output.comma(), self.property.print(output)\n    if self.assignment:\n        output.comma()\n        asg = self.assignment\n        as_op = self.assign_operator\n        if as_op.length > 0:\n            self.assignment = None\n            print_rich_getitem(self, output)\n            self.assignment = asg\n            output.space()\n            output.print(as_op)\n            output.space()\n        self.assignment.print(output)\n    output.print(')')\n\ndef print_splice_assignment(self, output):  # AST_Splice\n    # splice assignment via pythonic array[start:end]\n    output.print('ρσ_splice(')\n    self.expression.print(output), output.comma(), self.assignment.print(output), output.comma()\n    self.property.print(output) if self.property else output.print('0')\n    if self.property2:\n        output.comma()\n        self.property2.print(output)\n    output.print(')')\n\ndef print_delete(self, output):\n    if is_node_type(self, AST_Symbol):\n        output.assign(self), output.print('undefined')\n    elif is_node_type(self, AST_Sub) or is_node_type(self, AST_ItemAccess):\n        output.print('ρσ_delitem('), self.expression.print(output), output.comma(), self.property.print(output), output.print(')')\n    else:\n        output.spaced('delete', self)\n\ndef print_unary_prefix(self, output):\n    op = self.operator\n    if op is 'delete':\n        return print_delete(self.expression, output)\n    output.print(op)\n    if /^[a-z]/i.test(op):\n        output.space()\n    if self.parenthesized:\n        output.with_parens(def():\n            self.expression.print(output)\n        )\n    else:\n        self.expression.print(output)\n\ndef write_instanceof(left, right, output):\n\n    def do_many(vals):\n        output.print('ρσ_instanceof.apply(null,'), output.space()\n        output.print('['), left.print(output), output.comma()\n        for v'var i = 0; i < vals.length; i++':\n            vals[i].print(output)\n            if i is not vals.length - 1:\n                output.comma()\n        output.print('])')\n\n    if is_node_type(right, AST_Seq):\n        do_many(right.to_array())\n    elif is_node_type(right, AST_Array):\n        do_many(right.elements)\n    else:\n        output.print('ρσ_instanceof(')\n        left.print(output), output.comma(), right.print(output), output.print(')')\n\ndef write_smart_equality(self, output):\n    def is_ok(x):\n        return not (\n            is_node_type(x, AST_Array) or is_node_type(x, AST_Set) or is_node_type(x, AST_Object) or\n            is_node_type(x, AST_Statement) or is_node_type(x, AST_Binary) or is_node_type(x, AST_Conditional)\n            or is_node_type(x, AST_BaseCall)\n        )\n    if is_ok(self.left) and is_ok(self.right):\n        if self.operator is '==':\n            output.print('(')\n            output.spaced(self.left, '===', self.right, '||', 'typeof', self.left, '===', '\"object\"', '&&', 'ρσ_equals(')\n            self.left.print(output), output.print(','), output.space(), self.right.print(output), output.print('))')\n        else:\n            output.print('(')\n            output.spaced(self.left, '!==', self.right, '&&', '(typeof', self.left, '!==', '\"object\"', '||', 'ρσ_not_equals(')\n            self.left.print(output), output.print(','), output.space(), self.right.print(output), output.print(')))')\n    else:\n        output.print('ρσ_' + ('equals(' if self.operator is '==' else 'not_equals('))\n        self.left.print(output), output.print(','), output.space(), self.right.print(output), output.print(')')\n\n\ncomparators = {\n    \"<\": True,\n    \">\": True,\n    \"<=\": True,\n    \">=\": True,\n}\n\nfunction_ops = {\n    \"in\": \"ρσ_in\",\n    'nin': '!ρσ_in',\n}\n\n\ndef print_binary_op(self, output):\n    if function_ops[self.operator]:\n        output.print(function_ops[self.operator])\n        output.with_parens(def():\n            self.left.print(output)\n            output.comma()\n            self.right.print(output)\n        )\n    elif comparators[self.operator] and is_node_type(self.left, AST_Binary) and comparators[self.left.operator]:\n        # A chained comparison such as a < b < c\n        if is_node_type(self.left.right, AST_Symbol):\n            # left side compares against a regular variable,\n            # no caching needed\n            self.left.print(output)\n            leftvar = self.left.right.name\n        else:\n            # some logic is being performed, let's cache it\n            self.left.left.print(output)\n            output.space()\n            output.print(self.left.operator)\n            output.space()\n            output.with_parens(def():\n                nonlocal leftvar\n                output.assign(\"ρσ_cond_temp\")\n                self.left.right.print(output)\n                leftvar = \"ρσ_cond_temp\"\n            )\n\n        output.space()\n        output.print(\"&&\")\n        output.space()\n        output.print(leftvar)\n        output.space()\n        output.print(self.operator)\n        output.space()\n        self.right.print(output)\n    elif self.operator is '//':\n        output.print('Math.floor')\n        output.with_parens(def():\n            self.left.print(output)\n            output.space()\n            output.print('/')\n            output.space()\n            self.right.print(output)\n        )\n    elif self.operator is '**':\n        left = self.left\n        if is_node_type(self.left, AST_Unary) and not self.left.parenthesized:\n            left = self.left.expression\n            output.print(self.left.operator)\n        if output.options.js_version > 6:\n            output.print('(('), left.print(output), output.spaced(')', '**', '('), self.right.print(output), output.print('))')\n        else:\n            output.print('Math.pow('), left.print(output), output.comma(), self.right.print(output), output.print(')')\n    elif self.operator is '==' or self.operator is '!=':\n        write_smart_equality(self, output)\n    elif self.operator is 'instanceof':\n        write_instanceof(self.left, self.right, output)\n    elif self.operator is '*' and is_node_type(self.left, AST_String):\n        self.left.print(output), output.print('.repeat('), self.right.print(output), output.print(')')\n    elif self.operator is '===' or self.operator is '!==':\n        nan_check = None\n        if is_node_type(self.right, AST_Symbol) and self.right.name is 'NaN':\n            nan_check = self.left\n        if is_node_type(self.left, AST_Symbol) and self.left.name is 'NaN':\n            nan_check = self.right\n        if nan_check is not None:\n            # We use the fact that NaN is the only object that is not equal to\n            # itself\n            output.spaced(nan_check, '!==' if self.operator is '===' else '===', nan_check)\n        else:\n            output.spaced(self.left, self.operator, self.right)\n    else:\n        output.spaced(self.left, self.operator, self.right)\n\nafter_map = {'.':'d', '(':'c', '[':'d', 'g':'g', 'null':'n'}\n\ndef print_existential(self, output):\n    key = after_map[self.after] if self.after is None or jstype(self.after) is 'string' else 'e'\n    if is_node_type(self.expression, AST_SymbolRef):\n        if key is 'n':\n            output.spaced('(typeof', self.expression, '!==', '\"undefined\"', '&&', self.expression, '!==', 'null)')\n            return\n        if key is 'c':\n            output.spaced('(typeof', self.expression, '===', '\"function\"', '?', self.expression, ':', '(function(){return undefined;}))')\n            return\n        after = self.after\n        if key is 'd':\n            after = 'Object.create(null)'\n        elif key is 'g':\n            after = '{__getitem__:function(){return undefined;}}'\n        output.spaced('(typeof', self.expression, '!==', '\"undefined\"', '&&', self.expression, '!==', 'null', '?', self.expression, ':', after)\n        output.print(')')\n        return\n    output.print('ρσ_exists.' + key + '(')\n    self.expression.print(output)\n    if key is 'e':\n        output.comma(), self.after.print(output)\n    output.print(')')\n\ndef print_assignment(self, output):\n    flattened = False\n    left = self.left\n    if is_node_type(left, AST_Seq):\n        left = new AST_Array({'elements':v'[left.car, left.cdr]'})\n    if is_node_type(left, AST_Array):\n        flat = left.flatten()\n        flattened = flat.length > left.elements.length\n        output.print(\"ρσ_unpack\")\n    else:\n        left.print(output)\n    output.space()\n    output.print(self.operator)\n    output.space()\n    if flattened:\n        output.print('ρσ_flatten')\n        output.with_parens(def():self.right.print(output);)\n    else:\n        self.right.print(output)\n    if is_node_type(left, AST_Array):\n        output.end_statement()\n        if not is_node_type(self.right, AST_Seq) and not is_node_type(self.right, AST_Array):\n            output.assign('ρσ_unpack')\n            output.print('ρσ_unpack_asarray(' + flat.length), output.comma(), output.print('ρσ_unpack)')\n            output.end_statement()\n        unpack_tuple(flat, output, True)\n\ndef print_assign(self, output):\n    if self.operator is '//=':\n        output.assign(self.left)\n        output.print('Math.floor')\n        output.with_parens(def():\n            self.left.print(output)\n            output.space()\n            output.print('/')\n            output.space()\n            self.right.print(output)\n        )\n        return\n    if self.operator is '=' and self.is_chained():\n        left_hand_sides, rhs = self.traverse_chain()\n        is_compound_assign = False\n        for lhs in left_hand_sides:\n            if is_node_type(lhs, AST_Seq) or is_node_type(lhs, AST_Array) or is_node_type(lhs, AST_ItemAccess):\n                is_compound_assign = True\n                break\n        if is_compound_assign:\n            temp_rhs = new AST_SymbolRef({'name':'ρσ_chain_assign_temp'})\n            print_assignment(new AST_Assign({'left':temp_rhs, 'operator':'=', 'right':rhs}), output)\n            for lhs in left_hand_sides:\n                output.end_statement(), output.indent()\n                print_assignment(new AST_Assign({'left':lhs, 'right':temp_rhs, 'operator':self.operator}), output)\n        else:\n            for lhs in left_hand_sides:\n                output.spaced(lhs, '=', '')\n            rhs.print(output)\n    else:\n        print_assignment(self, output)\n\ndef print_conditional(self, output, condition, consequent, alternative):\n    condition, consequent, alternative = self.condition, self.consequent, self.alternative\n    output.with_parens(def():condition.print(output);)\n    output.space()\n    output.print(\"?\")\n    output.space()\n    consequent.print(output)\n    output.space()\n    output.colon()\n    alternative.print(output)\n\ndef print_seq(output):\n    self = this\n    p = output.parent()\n    print_seq = def():\n        self.car.print(output)\n        if self.cdr:\n            output.comma()\n            if output.should_break():\n                output.newline()\n                output.indent()\n            self.cdr.print(output)\n\n    # this will effectively convert tuples to arrays\n    if is_node_type(p, AST_Binary)\n    or is_node_type(p, AST_Return)\n    or is_node_type(p, AST_Array)\n    or is_node_type(p, AST_BaseCall)\n    or is_node_type(p, AST_SimpleStatement):\n        output.with_square(print_seq)\n    else:\n        print_seq()\n"
  },
  {
    "path": "src/output/statements.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom ast import (\n    AST_Definitions, AST_Scope, AST_Method, AST_Except, AST_EmptyStatement,\n    AST_Statement, AST_Seq, AST_BaseCall, AST_Dot, AST_Sub, AST_ItemAccess,\n    AST_Conditional, AST_Binary, AST_BlockStatement, is_node_type\n)\n\ndef force_statement(stat, output):\n    if output.options.bracketize:\n        if not stat or is_node_type(stat, AST_EmptyStatement):\n            output.print(\"{}\")\n        elif is_node_type(stat, AST_BlockStatement):\n            stat.print(output)\n        else:\n            output.with_block(def():\n                output.indent()\n                stat.print(output)\n                output.newline()\n            )\n    else:\n        if not stat or is_node_type(stat, AST_EmptyStatement):\n            output.force_semicolon()\n        else:\n            stat.print(output)\n\n# return true if the node at the top of the stack (that means the\n# innermost node in the current output) is lexically the first in\n# a statement.\ndef first_in_statement(output):\n    a = output.stack()\n    i = a.length\n    node = a[i -= 1]\n    p = a[i -= 1]\n    while i > 0:\n        if is_node_type(p, AST_Statement) and p.body is node:\n            return True\n        if is_node_type(p, AST_Seq) and p.car is node\n        or is_node_type(p, AST_BaseCall) and p.expression is node\n        or is_node_type(p, AST_Dot) and p.expression is node\n        or is_node_type(p, AST_Sub) and p.expression is node\n        or is_node_type(p, AST_ItemAccess) and p.expression is node\n        or is_node_type(p, AST_Conditional) and p.condition is node\n        or is_node_type(p, AST_Binary) and p.left is node:\n            node = p\n            p = a[i -= 1]\n        else:\n            return False\n\n\ndef declare_vars(vars, output):\n    # declare all variables as local, unless explictly set otherwise\n    if vars.length:\n        output.indent()\n        output.print(\"var\")\n        output.space()\n        for i, arg in enumerate(vars):\n            if i:\n                output.comma()\n\n            arg.print(output)\n        output.semicolon()\n        output.newline()\n\ndef display_body(body, is_toplevel, output):\n    last = body.length - 1\n    for i, stmt in enumerate(body):\n        if not (is_node_type(stmt, AST_EmptyStatement)) and not (is_node_type(stmt, AST_Definitions)):\n            output.indent()\n            stmt.print(output)\n            if not (i is last and is_toplevel):\n                output.newline()\n\n\ndef display_complex_body(node, is_toplevel, output, function_preamble):\n    offset = 0\n    # argument offset\n    # this is a method, add 'var self = this'\n    if is_node_type(node, AST_Method) and not node.static:\n        output.indent()\n        output.print(\"var\")\n        output.space()\n        output.assign(node.argnames[0])\n        output.print(\"this\")\n        output.semicolon()\n        output.newline()\n        offset += 1\n\n    if is_node_type(node, AST_Scope):\n        function_preamble(node, output, offset)\n        declare_vars(node.localvars, output)\n\n    elif is_node_type(node, AST_Except):\n        if node.argname:\n            output.indent()\n            output.print(\"var\")\n            output.space()\n            output.assign(node.argname)\n            output.print(\"ρσ_Exception\")\n            output.semicolon()\n            output.newline()\n\n    display_body(node.body, is_toplevel, output)\n\ndef print_bracketed(node, output, complex, function_preamble, before, after):\n    if node.body.length > 0:\n        output.with_block(def():\n            if before:\n                before(output)\n            if complex:\n                display_complex_body(node, False, output, function_preamble)\n            else:\n                display_body(node.body, False, output)\n            if after:\n                after(output)\n        )\n    else:\n        if before or after:\n            output.with_block(def():\n                if before:\n                    before(output)\n                if after:\n                    after(output)\n            )\n        else:\n            output.print(\"{}\")\n\ndef print_with(self, output):\n    exits = v'[]'\n    output.assign('ρσ_with_exception'), output.print('undefined'), output.end_statement()\n    for clause in self.clauses:\n        output.with_counter += 1\n        clause_name = 'ρσ_with_clause_' + output.with_counter\n        exits.push(clause_name)\n        output.indent(), output.print('var '), output.assign(clause_name)\n        clause.expression.print(output)\n        output.end_statement()\n        output.indent()\n        if clause.alias:\n            output.assign(clause.alias.name)\n        output.print(clause_name + '.__enter__()')\n        output.end_statement()\n    output.indent(), output.print('try'), output.space()\n    output.with_block(def():\n        output.indent()\n        self._do_print_body(output)\n        output.newline()\n    )\n    output.space(), output.print('catch(e)')\n    output.with_block(def():\n        output.indent(), output.assign('ρσ_with_exception'), output.print('e'), output.end_statement()\n    )\n    output.newline(), output.indent(), output.spaced('if', '(ρσ_with_exception', '===', 'undefined)')\n    output.with_block(def():\n        for clause in exits:\n            output.indent(), output.print(clause + '.__exit__()'), output.end_statement()\n    )\n    output.space(), output.print('else'), output.space()\n    output.with_block(def():\n        output.indent(), output.assign('ρσ_with_suppress'), output.print('false'), output.end_statement()\n        for clause in exits:\n            output.indent()\n            output.spaced('ρσ_with_suppress', '|=', 'ρσ_bool(' + clause + '.__exit__(ρσ_with_exception.constructor,',\n                            'ρσ_with_exception,', 'ρσ_with_exception.stack))')\n            output.end_statement()\n        output.indent(), output.spaced('if', '(!ρσ_with_suppress)', 'throw ρσ_with_exception'), output.end_statement()\n    )\n\ndef print_assert(self, output):\n    if output.options.discard_asserts:\n        return\n    output.spaced('if', '(!('), self.condition.print(output), output.spaced('))', 'throw new AssertionError')\n    if self.message:\n        output.print('(')\n        self.message.print(output)\n        output.print(')')\n    output.end_statement()\n"
  },
  {
    "path": "src/output/stream.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals:regenerate\nfrom __python__ import hash_literals\n\nfrom utils import make_predicate, defaults, repeat_string\nfrom tokenizer import is_identifier_char\n\nDANGEROUS = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g\n\n\ndef as_hex(code, sz):\n    val = code.toString(16)\n    if val.length < sz:\n        val = '0'.repeat(sz - val.length) + val\n    return val\n\n\ndef to_ascii(str_, identifier):\n    return str_.replace(/[\\u0080-\\uffff]/g, def(ch):\n        code = ch.charCodeAt(0).toString(16)\n        if code.length <= 2 and not identifier:\n            return \"\\\\x\" + as_hex(code, 2)\n        else:\n            return '\\\\u' + as_hex(code, 4)\n\n    )\n\ndef encode_string(str_):\n    return JSON.stringify(str_).replace(DANGEROUS, def(a):\n            return '\\\\u' + as_hex(a.charCodeAt(0), 4)\n    )\nrequire_semi_colon_chars = make_predicate(\"( [ + * / - , .\")\n\noutput_stream_defaults = {\n    'indent_start': 0,\n    'indent_level': 4,\n    'quote_keys': False,\n    'space_colon': True,\n    'ascii_only': False,\n    'width': 80,\n    'max_line_len': 32000,\n    'ie_proof': True,\n    'beautify': False,\n    'source_map': None,\n    'bracketize': False,\n    'semicolons': True,\n    'comments': False,\n    'preserve_line': False,\n    'omit_baselib': False,\n    'baselib_plain': None,\n    'private_scope': True,\n    'keep_docstrings': False,\n    'discard_asserts': False,\n    'module_cache_dir': '',\n    'js_version':5,\n    'write_name': True,\n}\n\nclass OutputStream:\n\n    def __init__(self, options):\n        self.options = defaults(options, output_stream_defaults, True)\n        self._indentation = 0\n        self.current_col = 0\n        self.current_line = 1\n        self.current_pos = 0\n        self.OUTPUT = \"\"\n        self.might_need_space = False\n        self.might_need_semicolon = False\n        self._last = None\n        self._stack = []\n        self.index_counter = 0\n        self.with_counter = 0\n        self.try_else_counter = 0\n\n    def new_try_else_counter(self):\n        self.try_else_counter += 1\n        return 'ρσ_try_else_' + self.try_else_counter\n\n    def make_name(self, name):\n        name = name.toString()\n        if self.options.ascii_only:\n            name = to_ascii(name, True)\n\n        return name\n\n    def print_name(self, name):\n        self.print(self.make_name(name))\n\n    def make_indent(self, back):\n        return repeat_string(\" \", self.options.indent_start + self._indentation - back * self.options.indent_level)\n\n    # -----[ beautification/minification ]-----\n    def last_char(self):\n        return self._last.charAt(self._last.length - 1)\n\n    def maybe_newline(self):\n        if self.options.max_line_len and self.current_col > self.options.max_line_len:\n            self.print(\"\\n\")\n\n    def print(self, str_):\n        str_ = v\"String(str_)\"\n        ch = str_.charAt(0)\n        if self.might_need_semicolon:\n            if (not ch or \";}\".indexOf(ch) < 0) and not /[;]$/.test(self._last):\n                if self.options.semicolons or require_semi_colon_chars[ch]:\n                    self.OUTPUT += \";\"\n                    self.current_col += 1\n                    self.current_pos += 1\n                else:\n                    self.OUTPUT += \"\\n\"\n                    self.current_pos += 1\n                    self.current_line += 1\n                    self.current_col = 0\n\n                if not self.options.beautify:\n                    self.might_need_space = False\n\n\n            self.might_need_semicolon = False\n            self.maybe_newline()\n\n        if not self.options.beautify and self.options.preserve_line and self._stack[self._stack.length - 1]:\n            target_line = self._stack[self._stack.length - 1].start.line\n            while self.current_line < target_line:\n                self.OUTPUT += \"\\n\"\n                self.current_pos += 1\n                self.current_line += 1\n                self.current_col = 0\n                self.might_need_space = False\n\n\n        if self.might_need_space:\n            prev = self.last_char()\n            if is_identifier_char(prev) and (is_identifier_char(ch) or ch is \"\\\\\")\n            or /^[\\+\\-\\/]$/.test(ch) and ch is prev:\n                self.OUTPUT += \" \"\n                self.current_col += 1\n                self.current_pos += 1\n\n            self.might_need_space = False\n\n        a = str_.split(/\\r?\\n/)\n        n = a.length - 1\n        self.current_line += n\n        if n is 0:\n            self.current_col += a[n].length\n        else:\n            self.current_col = a[n].length\n\n        self.current_pos += str_.length\n        self._last = str_\n        self.OUTPUT += str_\n\n    def space(self):\n        if self.options.beautify:\n            self.print(' ')\n        else:\n            self.might_need_space = True\n\n    def indent(self, half):\n        if self.options.beautify:\n            self.print(self.make_indent((0.5 if half else 0)))\n\n    def with_indent(self, col, proceed):\n        if self.options.beautify:\n            if col is True:\n                col = self.next_indent()\n\n            save_indentation = self._indentation\n            self._indentation = col\n            ret = proceed()\n            self._indentation = save_indentation\n            return ret\n        else:\n            return proceed()\n\n    def indentation(self):\n        return self._indentation\n\n    def set_indentation(self, val):\n        if self.options.beautify:\n            self._indentation = val\n\n    def newline(self):\n        if self.options.beautify:\n            self.print(\"\\n\")\n\n    def semicolon(self):\n        if self.options.beautify:\n            self.print(\";\")\n        else:\n            self.might_need_semicolon = True\n\n    def force_semicolon(self):\n        self.might_need_semicolon = False\n        self.print(\";\")\n\n    def next_indent(self):\n        return self._indentation + self.options.indent_level\n\n    def spaced(self):\n        for v'var i=0; i < arguments.length; i++':\n            if i > 0:\n                self.space()\n            if jstype(arguments[i].print) is 'function':\n                arguments[i].print(self)\n            else:\n                self.print(arguments[i])\n\n    def end_statement(self):\n        self.semicolon()\n        self.newline()\n\n    def with_block(self, cont):\n        ret = None\n        self.print(\"{\")\n        self.newline()\n        self.with_indent(self.next_indent(), def():\n            nonlocal ret\n            ret = cont()\n        )\n        self.indent()\n        self.print(\"}\")\n        return ret\n\n    def with_parens(self, cont):\n        self.print(\"(\")\n        ret = cont()\n        self.print(\")\")\n        return ret\n\n    def with_square(self, cont):\n        self.print(\"[\")\n        ret = cont()\n        self.print(\"]\")\n        return ret\n\n    def comma(self):\n        self.print(\",\")\n        self.space()\n\n    def colon(self):\n        self.print(\":\")\n        if self.options.space_colon:\n            self.space()\n\n    def dump_yield(self):\n        self.indent()\n        self.spaced('var', 'ρσ_regenerator', '=', '{}')\n        self.end_statement()\n        code = 'ρσ_regenerator.regeneratorRuntime = ' + regenerate(False, self.options.beautify)\n        if self.options.beautify:\n            code = code.replace(/\\/\\/.*$/mg, '\\n').replace(/^\\s*$/gm, '')  # strip comments\n            ci = self.make_indent(0)\n            code = [ci + x for x in code.split('\\n')].join('\\n')\n        self.print(code + '})(ρσ_regenerator)')\n        self.end_statement()\n\n    def get(self):\n        return self.OUTPUT\n    toString = get\n\n    def assign(self, name):\n        # generates: '[name] = '\n        if jstype(name) is \"string\":\n            self.print(name)\n        else:\n            name.print(self)\n        self.space()\n        self.print(\"=\")\n        self.space()\n\n    def current_width(self):\n        return self.current_col - self._indentation\n\n    def should_break(self):\n        return self.options.width and self.current_width() >= self.options.width\n\n    def last(self):\n        return self._last\n\n    def print_string(self, str_):\n        self.print(encode_string(str_))\n\n    def line(self):\n        return self.current_line\n\n    def col(self):\n        return self.current_col\n\n    def pos(self):\n        return self.current_pos\n\n    def push_node(self, node):\n        self._stack.push(node)\n\n    def pop_node(self):\n        return self._stack.pop()\n\n    def stack(self):\n        return self._stack\n\n    def parent(self, n):\n        return self._stack[self._stack.length - 2 - (n or 0)]\n"
  },
  {
    "path": "src/output/utils.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom ast import AST_BlockStatement, is_node_type\n\ndef best_of(a):\n    best = a[0]\n    len_ = best.length\n    for i in range(1, a.length):\n        if a[i].length < len_:\n            best = a[i]\n            len_ = best.length\n    return best\n\ndef make_num(num):\n    str_ = num.toString(10)\n    a = [ str_.replace(/^0\\./, \".\").replace(\"e+\", \"e\") ]\n    m = None\n\n    if Math.floor(num) is num:\n        if num >= 0:\n            a.push(\"0x\" + num.toString(16).toLowerCase(), # probably pointless\n            \"0\" + num.toString(8))\n        else:\n            a.push(\"-0x\" + (-num).toString(16).toLowerCase(), # probably pointless\n            \"-0\" + (-num).toString(8))\n\n        if m = /^(.*?)(0+)$/.exec(num):\n            a.push(m[1] + \"e\" + m[2].length)\n\n    elif m = /^0?\\.(0+)(.*)$/.exec(num):\n        a.push(m[2] + \"e-\" + (m[1].length + m[2].length), str_.substr(str_.indexOf(\".\")))\n\n    return best_of(a)\n\ndef make_block(stmt, output):\n    if is_node_type(stmt, AST_BlockStatement):\n        stmt.print(output)\n        return\n\n    output.with_block(def():\n        output.indent()\n        stmt.print(output)\n        output.newline()\n    )\n\ndef create_doctring(docstrings):\n    ans = v'[]'\n    for ds in docstrings:\n        ds = str.rstrip(ds.value)\n        lines = v'[]'\n        min_leading_whitespace = ''\n        for line in ds.split(/$/gm):\n            r = /^\\s+/.exec(line)\n            leading_whitespace = ''\n            if r:\n                leading_whitespace = r[0].replace(/[\\n\\r]/g, '') if r else ''\n                line = line[r[0].length:]\n            if not str.strip(line):\n                lines.push(v'[\"\", \"\"]')\n            else:\n                leading_whitespace = leading_whitespace.replace(/\\t/g, '    ')\n                if leading_whitespace and (not min_leading_whitespace or leading_whitespace.length < min_leading_whitespace.length):\n                    min_leading_whitespace = leading_whitespace\n                lines.push(v'[leading_whitespace, line]')\n        for lw, l in lines:\n            if min_leading_whitespace:\n                lw = lw[min_leading_whitespace.length:]\n            ans.push(lw + l)\n        ans.push('')\n    return str.rstrip(ans.join('\\n'))\n"
  },
  {
    "path": "src/parse.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: readfile\nfrom __python__ import hash_literals\n\nfrom utils import make_predicate, array_to_hash, defaults, has_prop, cache_file_name\nfrom errors import SyntaxError, ImportError\nfrom ast import (\nAST_Array, AST_Assign, AST_Binary, AST_BlockStatement, AST_Break,\nAST_Call, AST_Catch, AST_Class, AST_ClassCall, AST_Conditional,\nAST_Constant, AST_Continue, AST_DWLoop, AST_Debugger, AST_Decorator,\nAST_Definitions, AST_DictComprehension, AST_Directive, AST_Do, AST_Dot,\nAST_Else, AST_EmptyStatement, AST_Except, AST_ExpressiveObject, AST_False, AST_Finally,\nAST_ForIn, AST_ForJS, AST_Function, AST_GeneratorComprehension, AST_Hole,\nAST_If, AST_Import, AST_ImportedVar, AST_Imports, AST_ListComprehension,\nAST_Method, AST_New, AST_Null, AST_Number, AST_Object, AST_ObjectKeyVal,\nAST_PropAccess, AST_RegExp, AST_Return, AST_Scope, AST_Set,\nAST_SetComprehension, AST_SetItem, AST_Seq, AST_SimpleStatement, AST_Splice,\nAST_String, AST_Sub, AST_ItemAccess, AST_SymbolAlias,\nAST_SymbolCatch, AST_SymbolDefun, AST_SymbolFunarg,\nAST_SymbolLambda, AST_SymbolNonlocal, AST_SymbolRef, AST_SymbolVar, AST_This,\nAST_Throw, AST_Toplevel, AST_True, AST_Try, AST_UnaryPrefix,\nAST_Undefined, AST_Var, AST_VarDef, AST_Verbatim, AST_While, AST_With, AST_WithClause,\nAST_Yield, AST_Assert, AST_Existential, is_node_type\n)\nfrom tokenizer import tokenizer, is_token, RESERVED_WORDS\n\n\nCOMPILER_VERSION = '__COMPILER_VERSION__'\nPYTHON_FLAGS = {'dict_literals':True, 'overload_getitem':True, 'bound_methods':True, 'hash_literals':True}\n\n\ndef get_compiler_version():\n    return COMPILER_VERSION\n\n\ndef static_predicate(names):\n    return {k:True for k in names.split(' ')}\n\nNATIVE_CLASSES = {\n    'Image': {},\n    'FileReader': {},\n    'RegExp': {},\n    'Error': {},\n    'EvalError': {},\n    'InternalError': {},\n    'RangeError': {},\n    'ReferenceError': {},\n    'SyntaxError': {},\n    'TypeError': {},\n    'URIError': {},\n    'Object': {\n        'static': static_predicate(\n            'getOwnPropertyNames getOwnPropertyDescriptor getOwnPropertyDescriptors'\n            ' getOwnPropertySymbols keys entries values create defineProperty'\n            ' defineProperties getPrototypeOf setPrototypeOf assign'\n            ' seal isSealed is preventExtensions isExtensible'\n            ' freeze isFrozen'\n        )\n    },\n    'String': {\n        'static': static_predicate(\"fromCharCode\")\n    },\n    'Array': {\n        'static': static_predicate(\"isArray from of\")\n    },\n    'Function': {},\n    'Date': {\n        'static': static_predicate(\"UTC now parse\")\n    },\n    'ArrayBuffer': {\n        'static': static_predicate('isView transfer')\n    },\n    'DataView': {},\n    'Float32Array': {},\n    'Float64Array': {},\n    'Int16Array': {},\n    'Int32Array': {},\n    'Int8Array': {},\n    'Uint16Array': {},\n    'Uint32Array': {},\n    'Uint8Array': {},\n    'Uint8ClampedArray': {},\n    'Map': {},\n    'WeakMap': {},\n    'Proxy': {},\n    'Set': {},\n    'WeakSet': {},\n    'Promise': {\n        'static': static_predicate('all race reject resolve')\n    },\n    'WebSocket': {},\n    'XMLHttpRequest': {},\n    'TextEncoder': {},\n    'TextDecoder': {},\n    'MouseEvent': {},\n    'Event': {},\n    'CustomEvent': {},\n    'Blob': {},\n}\nERROR_CLASSES = {\n    'Exception': {},\n    'AttributeError': {},\n    'IndexError': {},\n    'KeyError': {},\n    'ValueError': {},\n    'UnicodeDecodeError': {},\n    'AssertionError': {},\n    'ZeroDivisionError': {},\n}\nCOMMON_STATIC = static_predicate('call apply bind toString')\nFORBIDDEN_CLASS_VARS = 'prototype constructor'.split(' ')\n\n# -----[ Parser (constants) ]-----\nUNARY_PREFIX = make_predicate('typeof void delete ~ - + ! @')\n\nASSIGNMENT = make_predicate('= += -= /= //= *= %= >>= <<= >>>= |= ^= &=')\n\nPRECEDENCE = (def(a, ret):\n    for i in range(a.length):\n        b = a[i]\n        for j in range(b.length):\n            ret[b[j]] = i+1\n    return ret\n)([\n    # lowest precedence\n    [ \"||\" ],\n    [ \"&&\" ],\n    [ \"|\" ],\n    [ \"^\" ],\n    [ \"&\" ],\n    [ \"==\", \"===\", \"!=\", \"!==\" ],\n    [ \"<\", \">\", \"<=\", \">=\", \"in\", \"nin\", \"instanceof\" ],\n    [ \">>\", \"<<\", \">>>\" ],\n    [ \"+\", \"-\" ],\n    [ \"*\", \"/\", \"//\", \"%\" ],\n    [ \"**\" ]\n    # highest precedence\n], {})\n\nSTATEMENTS_WITH_LABELS = array_to_hash([ \"for\", \"do\", \"while\", \"switch\" ])\n\nATOMIC_START_TOKEN = array_to_hash([ \"atom\", \"num\", \"string\", \"regexp\", \"name\", \"js\" ])\n\ncompile_time_decorators = ['staticmethod', 'external', 'property']\n\ndef has_simple_decorator(decorators, name):\n    remove = v'[]'\n    for v'var i = 0; i < decorators.length; i++':\n        s = decorators[i]\n        if is_node_type(s, AST_SymbolRef) and not s.parens and s.name is name:\n            remove.push(i)\n    if remove.length:\n        remove.reverse()\n        for v'var i = 0; i < remove.length; i++':\n            decorators.splice(remove[i], 1)\n        return True\n    return False\n\ndef has_setter_decorator(decorators, name):\n    remove = v'[]'\n    for v'var i = 0; i < decorators.length; i++':\n        s = decorators[i]\n        if is_node_type(s, AST_Dot) and is_node_type(s.expression, AST_SymbolRef) and s.expression.name is name and s.property is 'setter':\n            remove.push(i)\n    if remove.length:\n        remove.reverse()\n        for v'var i = 0; i < remove.length; i++':\n            decorators.splice(remove[i], 1)\n        return True\n    return False\n\n# -----[ Parser ]-----\ndef create_parser_ctx(S, import_dirs, module_id, baselib_items, imported_module_ids, imported_modules, importing_modules, options):\n\n    def next():\n        S.prev = S.token\n        if S.peeked.length:\n            S.token = S.peeked.shift()\n        else:\n            S.token = S.input()\n\n        return S.token\n\n    def is_(type, value):\n        return is_token(S.token, type, value)\n\n    def peek():\n        if not S.peeked.length:\n            S.peeked.push(S.input())\n        return S.peeked[0]\n\n    def prev():\n        return S.prev\n\n    def croak(msg, line, col, pos, is_eof):\n        # note: undefined means nothing was passed in, None/null means a null value was passed in\n        ctx = S.input.context()\n        raise new SyntaxError(msg, ctx.filename, (line if line is not undefined else ctx.tokline),\n                 (col if col is not undefined else ctx.tokcol), (pos if pos is not undefined else ctx.tokpos), is_eof)\n\n    def token_error(token, msg):\n        is_eof = token.type is 'eof'\n        croak(msg, token.line, token.col, undefined, is_eof)\n\n    def unexpected(token):\n        if token is undefined:\n            token = S.token\n        token_error(token, \"Unexpected token: \" + token.type + \" «\" + token.value + \"»\")\n\n    def expect_token(type, val):\n        if is_(type, val):\n            return next()\n        token_error(S.token, \"Unexpected token \" + S.token.type + \" «\" + S.token.value + \"»\" +\n                    \", expected \" + type + \" «\" + val + \"»\")\n\n    def expect(punc):\n        return expect_token(\"punc\", punc)\n\n    def semicolon():\n        if is_(\"punc\", \";\"):\n            next()\n            S.token.nlb = True\n\n    def embed_tokens(parser):\n        def with_embedded_tokens():\n            start = S.token\n            expr = parser()\n            if expr is undefined:\n                unexpected()\n            end = prev()\n            expr.start = start\n            expr.end = end\n            return expr\n        return with_embedded_tokens\n\n    def scan_for_top_level_callables(body):\n        ans = v'[]'\n        # Get the named functions and classes\n        if Array.isArray(body):\n            for obj in body:\n                if is_node_type(obj, AST_Function) or is_node_type(obj, AST_Class):\n                    if obj.name:\n                        ans.push(obj.name.name)\n                    else:\n                        token_error(obj.start, \"Top-level functions must have names\")\n                else:\n                    # skip inner scopes\n                    if is_node_type(obj, AST_Scope):\n                        continue\n                    for x in ['body', 'alternative']:\n                        opt = obj[x]\n                        if opt:\n                            ans = ans.concat(scan_for_top_level_callables(opt))\n\n                        if is_node_type(opt, AST_Assign) and not (is_node_type(opt.right, AST_Scope)):\n                            ans = ans.concat(scan_for_top_level_callables(opt.right))\n\n        elif body.body:\n            # recursive descent into wrapper statements that contain body blocks\n            ans = ans.concat(scan_for_top_level_callables(body.body))\n            if body.alternative:\n                ans = ans.concat(scan_for_top_level_callables(body.alternative))\n\n\n        return ans\n\n    def scan_for_classes(body):\n        ans = {}\n        for obj in body:\n            if is_node_type(obj, AST_Class):\n                ans[obj.name.name] = obj\n        return ans\n\n    def scan_for_local_vars(body):\n        \"\"\"\n        Pick out all variables being assigned to from within this scope, we'll mark them as local\n\n        body        body to be scanned\n        \"\"\"\n        localvars = v'[]'\n        seen = {}\n\n        def push(x):\n            if has_prop(seen, x):\n                return\n            seen[x] = True\n            localvars.push(x)\n\n        def extend(arr):\n            for x in arr:\n                push(x)\n\n        def scan_in_array(arr):\n            for x in arr:\n                if is_node_type(x, AST_Seq):\n                    x = x.to_array()\n                elif is_node_type(x, AST_Array):\n                    x = x.elements\n                if Array.isArray(x):\n                    scan_in_array(x)\n                else:\n                    if not is_node_type(x, AST_PropAccess):\n                        push(x.name)\n\n        def add_assign_lhs(lhs):\n            if is_node_type(lhs, AST_Seq):\n                lhs = new AST_Array({'elements':lhs.to_array()})\n            if is_node_type(lhs, AST_Array):\n                # assignment to an implicit tuple\n                push(\"ρσ_unpack\")\n                scan_in_array(lhs.elements)\n            elif lhs.name:\n                # assignment to a single variable\n                push(lhs.name)\n\n        def add_for_in(stmt):\n            if is_node_type(stmt.init, AST_Array):\n                # iteration via implicit tuple\n                push(\"ρσ_unpack\")\n                scan_in_array(stmt.init.elements)\n            else:\n                # iteration via a single variable\n                push(stmt.init.name)\n\n        if Array.isArray(body):\n            # this is a body of statements\n            for stmt in body:\n                # skip inner scopes\n                if is_node_type(stmt, AST_Scope):\n                    continue\n\n                # recursive descent into conditional, loop and exception bodies\n                for option in ('body', 'alternative', 'bcatch', 'condition'):\n                    opt = stmt[option]\n                    if opt:\n                        extend(scan_for_local_vars(opt))\n\n                    if is_node_type(opt, AST_Assign) and not (is_node_type(opt.right, AST_Scope)):\n                        extend(scan_for_local_vars(opt.right))\n\n                # pick up iterators from loops\n                if is_node_type(stmt, AST_ForIn):\n                    add_for_in(stmt)\n                elif is_node_type(stmt, AST_DWLoop):\n                    extend(scan_for_local_vars(stmt))\n                elif is_node_type(stmt, AST_With):\n                    push('ρσ_with_exception'), push('ρσ_with_suppress')\n                    for clause in stmt.clauses:\n                        if clause.alias:\n                            push(clause.alias.name)\n\n        elif body.body:\n            # recursive descent into wrapper statements that contain body blocks\n            extend(scan_for_local_vars(body.body))\n            if body.alternative:\n                extend(scan_for_local_vars(body.alternative))\n\n        elif is_node_type(body, AST_Assign):\n            # this is a single assignment operator\n            if body.is_chained():\n                is_compound_assign = False\n                for lhs in body.traverse_chain()[0]:\n                    add_assign_lhs(lhs)\n                    if is_node_type(lhs, AST_Seq) or is_node_type(lhs, AST_Array):\n                        is_compound_assign = True\n                        break\n                if is_compound_assign:\n                    push('ρσ_chain_assign_temp')\n            else:\n                add_assign_lhs(body.left)\n            if not is_node_type(body.right, AST_Scope):\n                extend(scan_for_local_vars(body.right))\n\n        elif is_node_type(body, AST_ForIn):\n            add_for_in(body)\n\n        return localvars\n\n    def scan_for_nonlocal_defs(body):\n        vars = v'[]'\n        if Array.isArray(body):\n            for stmt in body:\n                if is_node_type(stmt, AST_Scope):\n                    continue\n\n                # don't invade nested scopes\n                if is_node_type(stmt, AST_Definitions):\n                    for vardef in stmt.definitions:\n                        vars.push(vardef.name.name)\n\n                for option in ('body', 'alternative'):\n                    nonlocal vars\n                    opt = stmt[option]\n                    if opt:\n                        vars = vars.concat(scan_for_nonlocal_defs(opt))\n\n\n        elif body.body:\n            vars = vars.concat(scan_for_nonlocal_defs(body.body))\n            if body.alternative:\n                vars = vars.concat(scan_for_nonlocal_defs(body.alternative))\n\n\n        return vars\n\n    def return_():\n        if is_('punc', ';'):\n            semicolon()\n            value = None\n        else:\n            is_end_of_statement = S.token.nlb or is_(\"eof\") or is_(\"punc\", \"}\")\n            if is_end_of_statement:\n                value = None\n            else:\n                value = expression(True)\n                semicolon()\n        return value\n\n    @embed_tokens\n    def statement():\n        # From Kovid: The next three lines were a hack to try to support statements\n        # starting with a regexp literal. However, it did not work, for example:\n        # echo 'f=1\\n/asd/.test()' | rs -> parse error\n        # So we just accept that this cannot be supported in RS, and avoid hacks that mess\n        # with the internal state of S. In any case,\n        # statements starting with a literal are very rare.\n        if S.token.type is 'operator' and S.token.value.substr(0, 1) is '/':\n            token_error(S.token, 'RapydScript does not support statements starting with regexp literals')\n\n        S.statement_starting_token = S.token\n        tmp_ = S.token.type\n        p = prev()\n        if p and not S.token.nlb and ATOMIC_START_TOKEN[p.type] and not is_('punc', ':'):\n            unexpected()\n        if tmp_ is \"string\":\n            return simple_statement()\n        elif tmp_ is \"shebang\":\n            tmp_ = S.token.value\n            next()\n            return new AST_Directive({\n                'value': tmp_\n            })\n        elif tmp_ is \"num\" or tmp_ is \"regexp\" or tmp_ is \"operator\" or tmp_ is \"atom\" or tmp_ is \"js\":\n            return simple_statement()\n        elif tmp_ is \"punc\":\n            tmp_ = S.token.value\n            if tmp_ is \":\":\n                return new AST_BlockStatement({\n                    'start': S.token,\n                    'body': block_(),\n                    'end': prev()\n                })\n            elif tmp_ is \"{\" or tmp_ is \"[\" or tmp_ is \"(\":\n                return simple_statement()\n            elif tmp_ is \";\":\n                next()\n                return new AST_EmptyStatement({'stype':';', 'start':prev(), 'end':prev()})\n            else:\n                unexpected()\n        elif tmp_ is \"name\":\n            if (is_token(peek(), 'punc', ':')) token_error(peek(), 'invalid syntax, colon not allowed here')\n            return simple_statement()\n        elif tmp_ is \"keyword\":\n            tmp_ = S.token.value\n            next()\n            if tmp_ is \"break\":\n                return break_cont(AST_Break)\n            elif tmp_ is \"continue\":\n                return break_cont(AST_Continue)\n            elif tmp_ is \"debugger\":\n                semicolon()\n                return new AST_Debugger()\n            elif tmp_ is \"do\":\n                return new AST_Do({\n                    'body': in_loop(statement),\n                    'condition': (def():\n                        expect(\".\")\n                        expect_token(\"keyword\", \"while\")\n                        tmp = expression(True)\n                        if is_node_type(tmp, AST_Assign):\n                            croak('Assignments in do loop conditions are not allowed')\n                        semicolon()\n                        return tmp\n                    )()\n                })\n            elif tmp_ is \"while\":\n                while_cond = expression(True)\n                if is_node_type(while_cond, AST_Assign):\n                    croak('Assignments in while loop conditions are not allowed')\n                if not is_('punc', ':'):\n                    croak('Expected a colon after the while statement')\n                return new AST_While({\n                    'condition': while_cond,\n                    'body': in_loop(statement)\n                })\n            elif tmp_ is \"for\":\n                if is_('js'):\n                    return for_js()\n                return for_()\n            elif tmp_ is \"from\":\n                return import_(True)\n            elif tmp_ is \"import\":\n                return import_(False)\n            elif tmp_ is \"class\":\n                return class_()\n            elif tmp_ is \"def\":\n                start = prev()\n                func = function_(S.in_class[-1], False)\n                func.start = start\n                func.end = prev()\n                chain = subscripts(func, True)\n                if chain is func:\n                    return func\n                else:\n                    return new AST_SimpleStatement({\n                        'start': start,\n                        'body': chain,\n                        'end': prev()\n                    })\n            elif tmp_ is 'assert':\n                start = prev()\n                cond = expression(False)\n                msg = None\n                if is_('punc', ','):\n                    next()\n                    msg = expression(False)\n                return new AST_Assert({'start': start, 'condition':cond, 'message':msg, 'end':prev()})\n            elif tmp_ is \"if\":\n                return if_()\n            elif tmp_ is \"pass\":\n                semicolon()\n                return new AST_EmptyStatement({'stype':'pass', 'start':prev(), 'end':prev()})\n            elif tmp_ is \"return\":\n                if S.in_function is 0:\n                    croak(\"'return' outside of function\")\n                if S.functions[-1].is_generator:\n                    croak(\"'return' not allowed in a function with yield\")\n                S.functions[-1].is_generator = False\n\n                return new AST_Return({'value':return_()})\n            elif tmp_ is \"yield\":\n                return yield_()\n            elif tmp_ is \"raise\":\n                if S.token.nlb:\n                    return new AST_Throw({\n                        'value': new AST_SymbolCatch({\n                            'name': \"ρσ_Exception\"\n                        })\n                    })\n\n                tmp = expression(True)\n                semicolon()\n                return new AST_Throw({\n                    'value': tmp\n                })\n            elif tmp_ is \"try\":\n                return try_()\n            elif tmp_ is \"nonlocal\":\n                tmp = nonlocal_()\n                semicolon()\n                return tmp\n            elif tmp_ is 'global':\n                tmp = nonlocal_(True)\n                semicolon()\n                return tmp\n            elif tmp_ is \"with\":\n                return with_()\n            else:\n                unexpected()\n\n    def with_():\n        clauses = v'[]'\n        start = S.token\n        while True:\n            if is_('eof'):\n                unexpected()\n            expr = expression()\n            alias = None\n            if is_('keyword', 'as'):\n                next()\n                alias = as_symbol(AST_SymbolAlias)\n            clauses.push(new AST_WithClause({'expression':expr, 'alias':alias}))\n            if is_('punc', ','):\n                next()\n                continue\n            if not is_('punc', ':'):\n                unexpected()\n            break\n\n        if not clauses.length:\n            token_error(start, 'with statement must have at least one clause')\n        body = statement()\n\n        return new AST_With({\n            'clauses': clauses,\n            'body': body\n        })\n\n    def simple_statement(tmp):\n        tmp = expression(True)\n        semicolon()\n        return new AST_SimpleStatement({\n            'body': tmp\n        })\n\n    def break_cont(t):\n        if S.in_loop is 0:\n            croak(t.name.slice(4) + \" not inside a loop or switch\")\n        semicolon()\n        return new t()\n\n    def yield_():\n        if S.in_function is 0:\n            croak(\"'yield' outside of function\")\n        if S.functions[-1].is_generator is False:\n            croak(\"'yield' not allowed in a function with return\")\n        S.functions[-1].is_generator = True\n        is_yield_from = is_('keyword', 'from')\n        if is_yield_from:\n            next()\n        return new AST_Yield({'is_yield_from':is_yield_from, 'value': return_()})\n\n    def for_(list_comp):\n        #        expect(\"(\")\n        init = None\n        if not is_(\"punc\", \";\"):\n            init = expression(True, True)\n            # standardize AST_Seq into array now for consistency\n            if is_node_type(init, AST_Seq):\n                if is_node_type(init.car, AST_SymbolRef) and is_node_type(init.cdr, AST_SymbolRef):\n                    # Optimization to prevent runtime call to ρσ_flatten when init is simply (a, b)\n                    tmp = init.to_array()\n                else:\n                    tmp = [init]\n                init = new AST_Array({\n                    'start': init.start,\n                    'elements': tmp,\n                    'end': init.end\n                })\n\n            if is_(\"operator\", \"in\"):\n                if is_node_type(init, AST_Var) and init.definitions.length > 1:\n                    croak(\"Only one variable declaration allowed in for..in loop\")\n                next()\n                return for_in(init, list_comp)\n\n        unexpected()\n\n    def for_in(init, list_comp):\n        lhs = init.definitions[0].name if is_node_type(init, AST_Var) else None\n        obj = expression(True)\n        #        expect(\")\")\n        if list_comp:\n            return {\n                'init': init,\n                'name': lhs,\n                'object': obj\n            }\n\n        return new AST_ForIn({\n            'init': init,\n            'name': lhs,\n            'object': obj,\n            'body': in_loop(statement)\n        })\n\n    # A native JavaScript for loop - for v\"var i=0; i<5000; i++\":\n    def for_js():\n        condition = as_atom_node()\n        return new AST_ForJS({\n            'condition': condition,\n            'body': in_loop(statement)\n        })\n\n    # scan function/class body for nested class declarations\n    def get_class_in_scope(expr):\n        # TODO: Currently if a local variable shadows a class name defined in\n        # an outerscope, the logic below will identify that variable as a\n        # class. This bug was always present. Fixing it will require the parser\n        # to maintain a list of local variables for every AST_Scope and provide\n        # an easy way to walk the ast tree upwards.\n        if is_node_type(expr, AST_SymbolRef):\n            # check Native JS classes\n            if has_prop(NATIVE_CLASSES, expr.name):\n                return NATIVE_CLASSES[expr.name]\n            if has_prop(ERROR_CLASSES, expr.name):\n                return ERROR_CLASSES[expr.name]\n\n            # traverse in reverse to check local variables first\n            for s in range(S.classes.length-1, -1, -1):\n                if has_prop(S.classes[s], expr.name):\n                    return S.classes[s][expr.name]\n\n        elif is_node_type(expr, AST_Dot):\n            referenced_path = []\n            # this one is for detecting classes inside modules and eventually nested classes\n            while is_node_type(expr, AST_Dot):\n                referenced_path.unshift(expr.property)\n                expr = expr.expression\n            if is_node_type(expr, AST_SymbolRef):\n                referenced_path.unshift(expr.name)\n                # now 'referenced_path' should contain the full path of potential class\n                if len(referenced_path) > 1:\n                    class_name = referenced_path.join('.')\n                    for s in range(S.classes.length-1, -1, -1):\n                        if has_prop(S.classes[s], class_name):\n                            return S.classes[s][class_name]\n        return False\n\n    def import_error(message):\n        ctx = S.input.context()\n        raise new ImportError(message, ctx.filename, ctx.tokline, ctx.tokcol, ctx.tokpos)\n\n    def do_import(key):\n        if has_prop(imported_modules, key):\n            return\n        if has_prop(importing_modules, key) and importing_modules[key]:\n            import_error('Detected a recursive import of: ' + key + ' while importing: ' + module_id)\n\n        # Ensure that the package containing this module is also imported\n        package_module_id = key.split('.')[:-1].join('.')\n        if len(package_module_id) > 0:\n            do_import(package_module_id)\n\n        if options.for_linting:\n            imported_modules[key] = {'is_cached':True, 'classes':{}, 'module_id':key, 'exports':[],\n                                     'nonlocalvars':[], 'baselib':{}, 'outputs':{}, 'discard_asserts':options.discard_asserts}\n            return\n\n        def safe_read(base_path):\n            for i, path in enumerate([base_path + '.pyj', base_path + '/__init__.pyj']):\n                try:\n                    return [readfile(path, \"utf-8\"), path]  # noqa:undef\n                except as e:\n                    if e.code is 'ENOENT' or e.code is 'EPERM' or e.code is 'EACCESS':\n                        if i is 1:\n                            return None, None\n                    if i is 1:\n                        raise\n\n        src_code = filename = None\n        modpath = key.replace(/\\./g, '/')\n\n        for location in import_dirs:\n            if location:\n                data, filename = safe_read(location + '/' + modpath)\n                if data is not None:\n                    src_code = data\n                    break\n        if src_code is None:\n            import_error(\"Failed Import: '\" + key + \"' module doesn't exist in any of the import directories: \" + import_dirs.join(':'))\n\n        try:\n            cached = JSON.parse(readfile(cache_file_name(filename, options.module_cache_dir), 'utf-8'))\n        except:\n            cached = None\n\n        srchash = sha1sum(src_code)  # noqa:undef\n        if cached and cached.version is COMPILER_VERSION and cached.signature is srchash and cached.discard_asserts is v'!!options.discard_asserts':\n            for ikey in cached.imported_module_ids:\n                do_import(ikey)  # Ensure all modules imported by the cached module are also imported\n            imported_modules[key] = {\n                'is_cached':True, 'classes':cached.classes, 'outputs':cached.outputs, 'module_id':key, 'import_order':Object.keys(imported_modules).length,\n                'nonlocalvars':cached.nonlocalvars, 'baselib':cached.baselib, 'exports':cached.exports, 'discard_asserts':options.discard_asserts,\n                'imported_module_ids':cached.imported_module_ids,\n            }\n        else:\n            parse(src_code, {\n                'filename': filename,\n                'toplevel': None,\n                'basedir': options.basedir,\n                'libdir': options.libdir,\n                'import_dirs': options.import_dirs,\n                'module_id': key,\n                'imported_modules': imported_modules,\n                'importing_modules': importing_modules,\n                'discard_asserts': options.discard_asserts,\n                'module_cache_dir': options.module_cache_dir,\n            })  # This function will add the module to imported_modules itself\n\n        imported_modules[key].srchash = srchash\n\n        for bitem in Object.keys(imported_modules[key].baselib):\n            baselib_items[bitem] = True\n\n    def read_python_flags():\n        expect_token(\"keyword\", \"import\")\n        bracketed = is_('punc', '(')\n        if bracketed:\n            next()\n        while True:\n            if not is_('name'):\n                croak('Name expected')\n            name = S.token.value\n            val = False if name.startsWith('no_') else True\n            if not val:\n                name = name.slice(3)\n            if not PYTHON_FLAGS:\n                croak('Unknown __python__ flag: ' + name)\n            S.scoped_flags.set(name, val)\n            next()\n            if is_('punc', ','):\n                next()\n            else:\n                if bracketed:\n                    if is_('punc', ')'):\n                        next()\n                    else:\n                        continue\n                break\n        return new AST_EmptyStatement({'stype':'scoped_flags', 'start':prev(), 'end':prev()})\n\n    def import_(from_import):\n        ans = new AST_Imports({'imports':[]})\n        while True:\n            tok = tmp = name = last_tok = expression(False)\n            key = ''\n            while is_node_type(tmp, AST_Dot):\n                key = \".\" + tmp.property + key\n                tmp = last_tok = tmp.expression\n            key = tmp.name + key\n            if from_import and key is '__python__':\n                return read_python_flags()\n            alias = None\n            if not from_import and is_('keyword', 'as'):\n                next()\n                alias = as_symbol(AST_SymbolAlias)\n            aimp = new AST_Import({\n                'module': name,\n                'key': key,\n                'alias': alias,\n                'argnames':None,\n                'body':def():\n                    return imported_modules[key]\n            })\n            aimp.start, aimp.end = tok.start, last_tok.end\n            ans.imports.push(aimp)\n            if from_import:\n                break\n            if is_('punc', ','):\n                next()\n            else:\n                break\n\n        for imp in ans['imports']:\n            do_import(imp.key)\n            if imported_module_ids.indexOf(imp.key) is -1:\n                imported_module_ids.push(imp.key)\n            classes = imported_modules[key].classes\n            if from_import:\n                expect_token(\"keyword\", \"import\")\n                imp.argnames = argnames = []\n                bracketed = is_('punc', '(')\n                if bracketed:\n                    next()\n                exports = {}\n                for symdef in imported_modules[key].exports:\n                    exports[symdef.name] = True\n                while True:\n                    aname = as_symbol(AST_ImportedVar)\n                    if not options.for_linting and not has_prop(exports, aname.name):\n                        import_error('The symbol \"' + aname.name + '\" is not exported from the module: ' + key)\n                    if is_('keyword', 'as'):\n                        next()\n                        aname.alias = as_symbol(AST_SymbolAlias)\n                    argnames.push(aname)\n                    if is_('punc', ','):\n                        next()\n                    else:\n                        if bracketed:\n                            if is_('punc', ')'):\n                                next()\n                            else:\n                                continue\n                        break\n\n                # Put imported class names in the outermost scope\n                for argvar in argnames:\n                    obj = classes[argvar.name]\n                    if obj:\n                        key = argvar.alias.name if argvar.alias else argvar.name\n                        S.classes[-1][key] = { \"static\": obj.static, 'bound': obj.bound, 'classvars': obj.classvars }\n            else:\n                for cname in Object.keys(classes):\n                    obj = classes[cname]\n                    key = imp.alias.name if imp.alias else imp.key\n                    S.classes[-1][key + '.' + obj.name.name] = { 'static': obj.static, 'bound': obj.bound, 'classvars': obj.classvars }\n\n        return ans\n\n    def class_():\n        name = as_symbol(AST_SymbolDefun)\n        if not name:\n            unexpected()\n\n        # detect external classes\n        externaldecorator = has_simple_decorator(S.decorators, 'external')\n\n        class_details = {\n            \"static\": {},\n            'bound': v'[]',\n            'classvars': {},\n            'processing': name.name,\n            'provisional_classvars': {},\n        }\n        bases = v'[]'\n        class_parent = None\n\n        # read the bases of the class, if any\n        if is_(\"punc\", \"(\"):\n            S.in_parenthesized_expr = True\n            next()\n            while True:\n                if is_('punc', ')'):\n                    S.in_parenthesized_expr = False\n                    next()\n                    break\n                a = expr_atom(False)\n                if class_parent is None:\n                    class_parent = a\n                bases.push(a)\n                if is_('punc', ','):\n                    next()\n                    continue\n\n        docstrings = v'[]'\n        definition = new AST_Class({\n            'name': name,\n            'docstrings': docstrings,\n            'module_id':module_id,\n            'dynamic_properties': Object.create(None),\n            'parent': class_parent,\n            'bases': bases,\n            'localvars': [],\n            'classvars': class_details.classvars,\n            'static': class_details.static,\n            'external': externaldecorator,\n            'bound': class_details.bound,\n            'statements': [],\n            'decorators': (def():\n                d = []\n                for decorator in S.decorators:\n                    d.push(new AST_Decorator({\n                        'expression': decorator\n                    }))\n                S.decorators = v'[]'\n                return d\n            )(),\n            'body': (def(loop, labels):\n                # navigate to correct location in the module tree and append the class\n                S.in_class.push(name.name)\n                S.classes[S.classes.length - 1][name.name] = class_details\n                S.classes.push({})\n                S.scoped_flags.push()\n                S.in_function += 1\n                S.in_loop = 0\n                S.labels = []\n                a = block_(docstrings)\n                S.in_function -= 1\n                S.scoped_flags.pop()\n                S.classes.pop()\n                S.in_class.pop()\n                S.in_loop = loop\n                S.labels = labels\n                return a\n            )(S.in_loop, S.labels)\n        })\n        class_details.processing = False\n        # find the constructor\n        for stmt in definition.body:\n            if is_node_type(stmt, AST_Method):\n                if stmt.is_getter or stmt.is_setter:\n                    descriptor = definition.dynamic_properties[stmt.name.name]\n                    if not descriptor:\n                        descriptor = definition.dynamic_properties[stmt.name.name] = {}\n                    descriptor['getter' if stmt.is_getter else 'setter'] = stmt\n                elif stmt.name.name is \"__init__\":\n                    definition.init = stmt\n        # find the class variables\n        class_var_names = {}\n        # Ensure that if a class variable refers to another class variable in\n        # its initialization, the referenced variables' names is correctly\n        # mangled.\n        def walker():\n            def visit_node(node, descend):\n                if is_node_type(node, AST_Method):\n                    class_var_names[node.name.name] = True\n                    return\n                if is_node_type(node, AST_Function):\n                    return\n                if is_node_type(node, AST_Assign) and is_node_type(node.left, AST_SymbolRef):\n                    varname = node.left.name\n                    if FORBIDDEN_CLASS_VARS.indexOf(varname) is not -1:\n                        token_error(node.left.start, varname + ' is not allowed as a class variable name')\n                    class_var_names[varname] = True\n                    definition.classvars[varname] = True\n                elif is_node_type(node, AST_SymbolRef) and has_prop(class_var_names, node.name):\n                    node.thedef = new AST_SymbolDefun({'name':name.name + '.prototype.' + node.name})\n                if descend:\n                    descend.call(node)\n            this._visit = visit_node\n        visitor = new walker()\n\n        for stmt in definition.body:\n            if not is_node_type(stmt, AST_Class):\n                stmt.walk(visitor)\n                definition.statements.push(stmt)\n        return definition\n\n    def function_(in_class, is_expression):\n        name = as_symbol(AST_SymbolDefun if in_class else AST_SymbolLambda) if is_('name') else None\n        if in_class and not name:\n            croak('Cannot use anonymous function as class methods')\n        is_anonymous = not name\n\n        staticmethod = property_getter = property_setter = False\n        if in_class:\n            staticloc = has_simple_decorator(S.decorators, 'staticmethod')\n            property_getter = has_simple_decorator(S.decorators, 'property')\n            property_setter = has_setter_decorator(S.decorators, name.name)\n            if staticloc:\n                if property_getter or property_setter:\n                    croak('A method cannot be both static and a property getter/setter')\n                S.classes[S.classes.length - 2][in_class].static[name.name] = True\n                staticmethod = True\n            elif name.name is not \"__init__\" and S.scoped_flags.get('bound_methods'):\n                S.classes[S.classes.length - 2][in_class].bound.push(name.name)\n\n        expect(\"(\")\n        S.in_parenthesized_expr = True\n        ctor = AST_Method if in_class else AST_Function\n        return_annotation = None\n        is_generator = v'[]'\n        docstrings = v'[]'\n        definition = new ctor({\n            'name': name,\n            'is_expression': is_expression,\n            'is_anonymous': is_anonymous,\n            'argnames': (def(a):\n                defaults = {}\n                first = True\n                seen_names = {}\n                def_line = S.input.context().tokline\n                current_arg_name = None\n                name_token = None\n\n                def get_arg():\n                    nonlocal current_arg_name, name_token\n                    current_arg_name = S.token.value\n                    if has_prop(seen_names, current_arg_name):\n                        token_error(prev(), \"Can't repeat parameter names\")\n                    if current_arg_name is 'arguments':\n                        token_error(prev(), \"Can't use the name arguments as a parameter name, it is reserved by JavaScript\")\n                    seen_names[current_arg_name] = True\n                    # save these in order to move back if we have an annotation\n                    name_token = S.token\n                    name_ctx = S.input.context()\n                    # check if we have an argument annotation\n                    ntok = peek()\n                    if ntok.type is 'punc' and ntok.value is ':':\n                        next()\n                        expect(':')\n                        annotation = maybe_conditional()\n\n                        # and now, do as_symbol without the next() at the end\n                        # since we are already at the next comma (or end bracket)\n                        if not is_token(name_token, \"name\"):\n                            # assuming the previous context in case\n                            # the annotation was over the line\n                            croak(\"Name expected\", name_ctx.tokline)\n                            return None\n\n                        sym = new AST_SymbolFunarg({\n                            'name': name_token.value,\n                            'start': S.token,\n                            'end': S.token,\n                            'annotation': annotation\n                        })\n                        return sym\n                    else:\n                        if not is_(\"name\"):\n                            # there is no name, which is an error we should report on the\n                            # same line as the definition, so move to that is we're not already there.\n                            if S.input.context().tokline is not def_line:\n                                croak(\"Name expected\", def_line)\n                            else:\n                                croak(\"Name expected\")\n                            return None\n\n                        sym = new AST_SymbolFunarg({\n                            'name': current_arg_name,\n                            'start': S.token,\n                            'end': S.token,\n                            'annotation': None\n                        })\n                        next()\n                        return sym\n\n                while not is_(\"punc\", \")\"):\n                    if first:\n                        first = False\n                    else:\n                        expect(\",\")\n                        if is_('punc', ')'):\n                            break\n                    if is_('operator', '**'):\n                        # **kwargs\n                        next()\n                        if a.kwargs:\n                            token_error(name_token, \"Can't define multiple **kwargs in function definition\")\n                        a.kwargs = get_arg()\n                    elif is_('operator', '*'):\n                        # *args\n                        next()\n                        if a.starargs:\n                            token_error(name_token, \"Can't define multiple *args in function definition\")\n                        if a.kwargs:\n                            token_error(name_token, \"Can't define *args after **kwargs in function definition\")\n                        a.starargs = get_arg()\n                    else:\n                        if a.starargs or a.kwargs:\n                            token_error(name_token, \"Can't define a formal parameter after *args or **kwargs\")\n                        a.push(get_arg())\n                        if is_(\"operator\", \"=\"):\n                            if a.kwargs:\n                                token_error(name_token, \"Can't define an optional formal parameter after **kwargs\")\n                            next()\n                            defaults[current_arg_name] = expression(False)\n                            a.has_defaults = True\n                        else:\n                            if a.has_defaults:\n                                token_error(name_token, \"Can't define required formal parameters after optional formal parameters\")\n\n                next()\n                # check if we have a return type annotation\n                if is_(\"punc\", \"->\"):\n                    next()\n                    nonlocal return_annotation\n                    return_annotation = maybe_conditional()\n                S.in_parenthesized_expr = False\n                a.defaults = defaults\n                a.is_simple_func = not a.starargs and not a.kwargs and not a.has_defaults\n                return a\n            )(v'[]'),\n            'localvars': [],\n            'decorators': (def():\n                d = v'[]'\n                for decorator in S.decorators:\n                    d.push(new AST_Decorator({\n                        'expression': decorator\n                    }))\n                S.decorators = v'[]'\n                return d\n            )(),\n            'docstrings': docstrings,\n            'body': (def(loop, labels):\n                S.in_class.push(False)\n                S.classes.push({})\n                S.scoped_flags.push()\n                S.in_function += 1\n                S.functions.push({})\n                S.in_loop = 0\n                S.labels = []\n                a = block_(docstrings)\n                S.in_function -= 1\n                S.scoped_flags.pop()\n                is_generator.push(bool(S.functions.pop().is_generator))\n                S.classes.pop()\n                S.in_class.pop()\n                S.in_loop = loop\n                S.labels = labels\n                return a\n            )(S.in_loop, S.labels)\n        })\n        definition.return_annotation = return_annotation\n        definition.is_generator = is_generator[0]\n        if is_node_type(definition, AST_Method):\n            definition.static = staticmethod\n            definition.is_getter = property_getter\n            definition.is_setter = property_setter\n            if definition.argnames.length < 1 and not definition.static:\n                croak('Methods of a class must have at least one argument, traditionally named self')\n            if definition.name and definition.name.name is '__init__':\n                if definition.is_generator:\n                    croak('The __init__ method of a class cannot be a generator (yield not allowed)')\n                if property_getter or property_setter:\n                    croak('The __init__ method of a class cannot be a property getter/setter')\n        if definition.is_generator:\n            baselib_items['yield'] = True\n\n        # detect local variables, strip function arguments\n        assignments = scan_for_local_vars(definition.body)\n        for i in range(assignments.length):\n            for j in range(definition.argnames.length+1):\n                if j is definition.argnames.length:\n                    definition.localvars.push(new_symbol(AST_SymbolVar, assignments[i]))\n                elif j < definition.argnames.length and assignments[i] is definition.argnames[j].name:\n                    break\n\n        nonlocals = scan_for_nonlocal_defs(definition.body)\n        nonlocals = {name for name in nonlocals}\n        definition.localvars = definition.localvars.filter(def(v): return not nonlocals.has(v.name);)\n        return definition\n\n    def if_():\n        cond = expression(True)\n        body = statement()\n        belse = None\n        if is_(\"keyword\", \"elif\") or is_(\"keyword\", \"else\"):\n            if is_(\"keyword\", \"else\"):\n                next()\n            else:\n                S.token.value = \"if\"\n            # effectively converts 'elif' to 'else if'\n            belse = statement()\n\n        return new AST_If({\n            'condition': cond,\n            'body': body,\n            'alternative': belse\n        })\n\n    def is_docstring(stmt):\n        if is_node_type(stmt, AST_SimpleStatement):\n            if is_node_type(stmt.body, AST_String):\n                return stmt.body\n        return False\n\n    def block_(docstrings):\n        prev_whitespace = S.token.leading_whitespace\n        expect(\":\")\n        a = v'[]'\n        if not S.token.nlb:\n            while not S.token.nlb:\n                if is_(\"eof\"):\n                    unexpected()\n                stmt = statement()\n                if docstrings:\n                    ds = is_docstring(stmt)\n                    if ds:\n                        docstrings.push(ds)\n                        continue\n                a.push(stmt)\n        else:\n            current_whitespace = S.token.leading_whitespace\n            if current_whitespace.length is 0 or prev_whitespace is current_whitespace:\n                croak('Expected an indented block')\n            while not is_(\"punc\", \"}\"):\n                if is_(\"eof\"):\n                    # end of file, terminate block automatically\n                    return a\n                stmt = statement()\n                if docstrings:\n                    ds = is_docstring(stmt)\n                    if ds:\n                        docstrings.push(ds)\n                        continue\n                a.push(stmt)\n            next()\n        return a\n\n    def try_():\n        body = block_()\n        bcatch = v'[]'\n        bfinally = None\n        belse = None\n        while is_(\"keyword\", \"except\"):\n            start = S.token\n            next()\n            exceptions = []\n            if not is_(\"punc\", \":\") and not is_(\"keyword\", \"as\"):\n                exceptions.push(as_symbol(AST_SymbolVar))\n                while is_(\"punc\", \",\"):\n                    next()\n                    exceptions.push(as_symbol(AST_SymbolVar))\n\n            name = None\n            if is_(\"keyword\", \"as\"):\n                next()\n                name = as_symbol(AST_SymbolCatch)\n\n            bcatch.push(new AST_Except({\n                'start': start,\n                'argname': name,\n                'errors': exceptions,\n                'body': block_(),\n                'end': prev()\n            }))\n\n        if is_(\"keyword\", \"else\"):\n            start = S.token\n            next()\n            belse = new AST_Else({\n                'start': start,\n                'body': block_(),\n                'end': prev()\n            })\n\n        if is_(\"keyword\", \"finally\"):\n            start = S.token\n            next()\n            bfinally = new AST_Finally({\n                'start': start,\n                'body': block_(),\n                'end': prev()\n            })\n\n        if not bcatch.length and not bfinally:\n            croak(\"Missing except/finally blocks\")\n\n        return new AST_Try({\n            'body': body,\n            'bcatch': (new AST_Catch({ 'body': bcatch }) if bcatch.length else None),\n            'bfinally': bfinally,\n            'belse': belse\n        })\n\n    def vardefs(symbol_class):\n        a = []\n        while True:\n            a.push(new AST_VarDef({\n                'start': S.token,\n                'name': as_symbol(symbol_class),\n                'value': (next(), expression(False)) if is_('operator', '=') else None,\n                'end': prev()\n            }))\n            if not is_(\"punc\", \",\"):\n                break\n            next()\n\n        return a\n\n    def nonlocal_(is_global):\n        defs = vardefs(AST_SymbolNonlocal)\n        if is_global:\n            for vardef in defs:\n                S.globals.push(vardef.name.name)\n        return new AST_Var({\n            'start': prev(),\n            'definitions': defs,\n            'end': prev()\n        })\n\n    def new_():\n        start = S.token\n        expect_token(\"operator\", \"new\")\n        newexp = expr_atom(False)\n\n        if is_(\"punc\", \"(\"):\n            S.in_parenthesized_expr = True\n            next()\n            args = func_call_list()\n            S.in_parenthesized_expr = False\n        else:\n            args = func_call_list(True)\n        return subscripts(new AST_New({\n            'start': start,\n            'expression': newexp,\n            'args': args,\n            'end': prev()\n        }), True)\n\n    def string_():\n        strings = v'[]'\n        start = S.token\n        while True:\n            strings.push(S.token.value)\n            if peek().type is not 'string':\n                break\n            next()\n        return new AST_String({\n            'start': start,\n            'end': S.token,\n            'value': strings.join('')\n        })\n\n    def token_as_atom_node():\n        tok = S.token\n        tmp_ = tok.type\n        if tmp_ is \"name\":\n            return token_as_symbol(tok, AST_SymbolRef)\n        elif tmp_ is \"num\":\n            return new AST_Number({\n                'start': tok,\n                'end': tok,\n                'value': tok.value\n            })\n        elif tmp_ is \"string\":\n            return string_()\n        elif tmp_ is \"regexp\":\n            return new AST_RegExp({\n                'start': tok,\n                'end': tok,\n                'value': tok.value\n            })\n        elif tmp_ is \"atom\":\n            tmp__ = tok.value\n            if tmp__ is \"False\":\n                return new AST_False({\n                    'start': tok,\n                    'end': tok\n                })\n            elif tmp__ is \"True\":\n                return new AST_True({\n                    'start': tok,\n                    'end': tok\n                })\n            elif tmp__ is \"None\":\n                return new AST_Null({\n                    'start': tok,\n                    'end': tok\n                })\n        elif tmp_ is \"js\":\n            return new AST_Verbatim({\n                'start': tok,\n                'end': tok,\n                'value': tok.value,\n            })\n        token_error(tok, 'Expecting an atomic token (number/string/bool/regexp/js/None)')\n\n    def as_atom_node():\n        ret = token_as_atom_node()\n        next()\n        return ret\n\n    def expr_atom(allow_calls):\n        if is_(\"operator\", \"new\"):\n            return new_()\n\n        start = S.token\n        if is_(\"punc\"):\n            tmp_ = start.value\n            if tmp_ is \"(\":\n                S.in_parenthesized_expr = True\n                next()\n                if is_('punc', ')'):\n                    next()\n                    return new AST_Array({'elements':[]})\n                ex = expression(True)\n                if is_('keyword', 'for'):\n                    ret = read_comprehension(new AST_GeneratorComprehension({'statement': ex}), ')')\n                    S.in_parenthesized_expr = False\n                    return ret\n                ex.start = start\n                ex.end = S.token\n                if is_node_type(ex, AST_SymbolRef):\n                    ex.parens = True\n                if not is_node_type(ex, AST_GeneratorComprehension):\n                    expect(\")\")\n                if is_node_type(ex, AST_UnaryPrefix):\n                    ex.parenthesized = True\n                S.in_parenthesized_expr = False\n                return subscripts(ex, allow_calls)\n            elif tmp_ is \"[\":\n                return subscripts(array_(), allow_calls)\n            elif tmp_ is \"{\":\n                return subscripts(object_(), allow_calls)\n\n            unexpected()\n\n        if is_(\"keyword\", \"class\"):\n            next()\n            cls = class_()\n            cls.start = start\n            cls.end = prev()\n            return subscripts(cls, allow_calls)\n\n        if is_(\"keyword\", \"def\"):\n            next()\n            func = function_(False, True)\n            func.start = start\n            func.end = prev()\n            return subscripts(func, allow_calls)\n\n        if is_('keyword', 'yield'):\n            next()\n            return yield_()\n\n        if ATOMIC_START_TOKEN[S.token.type]:\n            return subscripts(as_atom_node(), allow_calls)\n\n        unexpected()\n\n    def expr_list(closing, allow_trailing_comma, allow_empty, func_call):\n        first = True\n        a = []\n        saw_starargs = False\n        while not is_(\"punc\", closing):\n            if saw_starargs:\n                token_error(prev(), \"*args must be the last argument in a function call\")\n\n            if first:\n                first = False\n            else:\n                expect(\",\")\n            if allow_trailing_comma and is_(\"punc\", closing):\n                break\n\n            if is_(\"operator\", \"*\") and func_call:\n                saw_starargs = True\n                next()\n\n            if is_(\"punc\", \",\") and allow_empty:\n                a.push(new AST_Hole({\n                    'start': S.token,\n                    'end': S.token\n                }))\n            else:\n                a.push(expression(False))\n\n        if func_call:\n            tmp = []\n            tmp.kwargs = []\n            for arg in a:\n                if is_node_type(arg, AST_Assign):\n                    tmp.kwargs.push([arg.left, arg.right])\n                else:\n                    tmp.push(arg)\n            a = tmp\n\n        next()\n        if saw_starargs:\n            a.starargs = True\n        return a\n\n    def func_call_list(empty):\n        a = v'[]'\n        first = True\n        a.kwargs = v'[]'\n        a.kwarg_items = v'[]'\n        a.starargs = False\n        if empty:\n            return a\n        single_comprehension = False\n        while not is_(\"punc\", ')') and not is_('eof'):\n            if not first:\n                expect(\",\")\n                if is_('punc', ')'):\n                    break\n            if is_('operator', '*'):\n                next()\n                arg = expression(False)\n                arg.is_array = True\n                a.push(arg)\n                a.starargs = True\n            elif is_('operator', '**'):\n                next()\n                a.kwarg_items.push(as_symbol(AST_SymbolRef, False))\n                a.starargs = True\n            else:\n                arg = expression(False)\n                if is_node_type(arg, AST_Assign):\n                    a.kwargs.push([arg.left, arg.right])\n                else:\n                    if is_('keyword', 'for'):\n                        if not first:\n                            croak('Generator expression must be parenthesized if not sole argument')\n                        a.push(read_comprehension(new AST_GeneratorComprehension({'statement': arg}), ')'))\n                        single_comprehension = True\n                        break\n                    a.push(arg)\n            first = False\n        if not single_comprehension:\n            next()\n        return a\n\n    @embed_tokens\n    def array_():\n        expect(\"[\")\n        expr = []\n        if not is_(\"punc\", \"]\"):\n            expr.push(expression(False))\n            if is_(\"keyword\", \"for\"):\n                # list comprehension\n                return read_comprehension(new AST_ListComprehension({'statement': expr[0]}), ']')\n\n            if not is_(\"punc\", \"]\"):\n                expect(\",\")\n\n        return new AST_Array({\n            'elements': expr.concat(expr_list(\"]\", True, True))\n        })\n\n    @embed_tokens\n    def object_():\n        expect(\"{\")\n        first = True\n        has_non_const_keys = False\n        is_pydict = S.scoped_flags.get('dict_literals', False)\n        is_jshash = S.scoped_flags.get('hash_literals', False)\n        a = []\n        while not is_(\"punc\", \"}\"):\n            if not first:\n                expect(\",\")\n            if is_(\"punc\", \"}\"):\n                # allow trailing comma\n                break\n            first = False\n\n            start = S.token\n            ctx = S.input.context()\n            orig = ctx.expecting_object_literal_key\n            ctx.expecting_object_literal_key = True\n            try:\n                left = expression(False)\n            finally:\n                ctx.expecting_object_literal_key = orig\n            if is_('keyword', 'for'):\n                # is_pydict is irrelevant here\n                return read_comprehension(new AST_SetComprehension({'statement':left}), '}')\n            if a.length is 0 and (is_('punc', ',') or is_('punc', '}')):\n                end = prev()\n                return set_(start, end, left)\n            if not is_node_type(left, AST_Constant):\n                has_non_const_keys = True\n            expect(\":\")\n            a.push(new AST_ObjectKeyVal({\n                'start': start,\n                'key': left,\n                'value': expression(False),\n                'end': prev()\n            }))\n            if a.length is 1 and is_('keyword', 'for'):\n                return dict_comprehension(a, is_pydict, is_jshash)\n\n        next()\n        return new (AST_ExpressiveObject if has_non_const_keys else AST_Object)({\n            'properties': a,\n            'is_pydict': is_pydict,\n            'is_jshash': is_jshash,\n        })\n\n    def set_(start, end, expr):\n        ostart = start\n        a = [new AST_SetItem({'start':start, 'end':end, 'value':expr})]\n        while not is_(\"punc\", \"}\"):\n            expect(\",\")\n            start = S.token\n            if is_(\"punc\", \"}\"):\n                # allow trailing comma\n                break\n            a.push(new AST_SetItem({'start':start, 'value':expression(False), 'end':prev()}))\n        next()\n        return new AST_Set({'items':a, 'start':ostart, 'end':prev()})\n\n    def read_comprehension(obj, terminator):\n        if is_node_type(obj, AST_GeneratorComprehension):\n            baselib_items['yield'] = True\n        S.in_comprehension = True\n        S.in_parenthesized_expr = False  # in case we are already in a parenthesized expression\n        expect_token('keyword', 'for')\n        forloop = for_(True)\n        obj.init = forloop.init\n        obj.name = forloop.name\n        obj.object = forloop.object\n        obj.condition = None if is_('punc', terminator) else (expect_token(\"keyword\", \"if\"), expression(True))\n        expect(terminator)\n        S.in_comprehension = False\n        return obj\n\n    def dict_comprehension(a, is_pydict, is_jshash):\n        if a.length:\n            left, right = a[0].key, a[0].value\n        else:\n            left = expression(False)\n            if not is_('punc', ':'):\n                return read_comprehension(new AST_SetComprehension({'statement':left}), '}')\n            expect(':')\n            right = expression(False)\n        return read_comprehension(new AST_DictComprehension({'statement':left, 'value_statement':right, 'is_pydict':is_pydict, 'is_jshash':is_jshash}), '}')\n\n    def as_name():\n        tmp = S.token\n        next()\n        tmp_ = tmp.type\n        if tmp_ is \"name\" or tmp_ is \"operator\" or tmp_ is \"keyword\" or tmp_ is \"atom\":\n            return tmp.value\n        else:\n            unexpected()\n\n    def token_as_symbol(tok, ttype):\n        name = tok.value\n        if RESERVED_WORDS[name] and name is not 'this':\n            croak(name + ' is a reserved word')\n        return new (AST_This if name is 'this' else ttype)({\n            'name': v\"String(tok.value)\",\n            'start': tok,\n            'end': tok\n        })\n\n    def as_symbol(ttype, noerror):\n        if not is_(\"name\"):\n            if not noerror:\n                croak(\"Name expected\")\n            return None\n\n        sym = token_as_symbol(S.token, ttype)\n        next()\n        return sym\n\n    # for generating/inserting a new symbol\n    def new_symbol(type, name):\n        sym = new (AST_This if name is 'this' else type)({\n            'name': v\"String(name)\",\n            'start': None,\n            'end': None\n        })\n        return sym\n\n    def is_static_method(cls, method):\n        if has_prop(COMMON_STATIC, method) or (cls.static and has_prop(cls.static, method)):\n            return True\n        else:\n            return False\n\n    def getitem(expr, allow_calls):\n        start = expr.start\n        next()\n        is_py_sub = S.scoped_flags.get('overload_getitem', False)\n        slice_bounds = v'[]'\n        is_slice = False\n        if is_(\"punc\", \":\"):\n            # slice [:n]\n            slice_bounds.push(None)\n        else:\n            slice_bounds.push(expression(False))\n\n        if is_(\"punc\", \":\"):\n            # slice [n:m?]\n            is_slice = True\n            next()\n            if is_(\"punc\", \":\"):\n                slice_bounds.push(None)\n            elif not is_(\"punc\", \"]\"):\n                slice_bounds.push(expression(False))\n\n        if is_(\"punc\", \":\"):\n            # slice [n:m:o?]\n            next()\n            if is_(\"punc\", \"]\"):\n                unexpected()\n            else:\n                slice_bounds.push(expression(False))\n\n        expect(\"]\")\n\n        if is_slice:\n            if is_(\"operator\", '='):\n                # splice-assignment (arr[start:end] = ...)\n                next()  # swallow the assignment\n                return subscripts(new AST_Splice({\n                    'start': start,\n                    'expression': expr,\n                    'property': slice_bounds[0] or new AST_Number({\n                        'value': 0\n                    }),\n                    'property2': slice_bounds[1],\n                    'assignment': expression(True),\n                    'end': prev()\n                }), allow_calls)\n            elif slice_bounds.length is 3:\n                # extended slice (arr[start:end:step])\n                slice_bounds.unshift(slice_bounds.pop())\n                if not slice_bounds[-1]:\n                    slice_bounds.pop()\n                    if not slice_bounds[-1]:\n                        slice_bounds.pop()\n                elif not slice_bounds[-2]:\n                    slice_bounds[-2] = new AST_Undefined()\n                return subscripts(new AST_Call({\n                    'start': start,\n                    'expression': new AST_SymbolRef({\n                        'name': 'ρσ_delslice' if S.in_delete else \"ρσ_eslice\"\n                    }),\n                    'args': [expr].concat(slice_bounds),\n                    'end': prev()\n                }), allow_calls)\n            else:\n                # regular slice (arr[start:end])\n                slice_bounds = [new AST_Number({'value':0}) if i is None else i for i in slice_bounds]\n                if S.in_delete:\n                    return subscripts(new AST_Call({\n                        'start': start,\n                        'expression': new AST_SymbolRef({'name': 'ρσ_delslice'}),\n                        'args': [expr, new AST_Number({'value':1})].concat(slice_bounds),\n                        'end': prev()\n                    }), allow_calls)\n\n                return subscripts(new AST_Call({\n                    'start': start,\n                    'expression': new AST_Dot({\n                        'start': start,\n                        'expression': expr,\n                        'property': \"slice\",\n                        'end': prev()\n                    }),\n                    'args': slice_bounds,\n                    'end': prev()\n                }), allow_calls)\n        else:\n            # regular index (arr[index])\n            if is_py_sub:\n                assignment = None\n                assign_operator = ''\n                if is_(\"operator\") and ASSIGNMENT[S.token.value]:\n                    assign_operator = S.token.value[:-1]\n                    next()\n                    assignment = expression(True)\n                return subscripts(new AST_ItemAccess({\n                    'start': start,\n                    'expression': expr,\n                    'property': slice_bounds[0] or new AST_Number({\n                        'value': 0\n                    }),\n                    'assignment':assignment,\n                    'assign_operator': assign_operator,\n                    'end': prev()\n                }), allow_calls)\n\n            return subscripts(new AST_Sub({\n                'start': start,\n                'expression': expr,\n                'property': slice_bounds[0] or new AST_Number({\n                    'value': 0\n                }),\n                'end': prev()\n            }), allow_calls)\n\n    def call_(expr):\n        start = expr.start\n        S.in_parenthesized_expr = True\n        next()\n        if not expr.parens and get_class_in_scope(expr):\n            # this is an object being created using a class\n            ret = subscripts(new AST_New({\n                'start': start,\n                'expression': expr,\n                'args': func_call_list(),\n                'end': prev()\n            }), True)\n            S.in_parenthesized_expr = False\n            return ret\n        else:\n            if is_node_type(expr, AST_Dot):\n                c = get_class_in_scope(expr.expression)\n\n            if c:\n                # generate class call\n                funcname = expr\n\n                ret = subscripts(new AST_ClassCall({\n                    'start': start,\n                    \"class\": expr.expression,\n                    'method': funcname.property,\n                    \"static\": is_static_method(c, funcname.property),\n                    'args': func_call_list(),\n                    'end': prev()\n                }), True)\n                S.in_parenthesized_expr = False\n                return ret\n            elif is_node_type(expr, AST_SymbolRef):\n                tmp_ = expr.name\n                if tmp_ is \"jstype\":\n                    ret = new AST_UnaryPrefix({\n                        'start': start,\n                        'operator': \"typeof\",\n                        'expression': func_call_list()[0],\n                        'end': prev()\n                    })\n                    S.in_parenthesized_expr = False\n                    return ret\n                elif tmp_ is \"isinstance\":\n                    args = func_call_list()\n                    if args.length is not 2:\n                        croak('isinstance() must be called with exactly two arguments')\n                    ret = new AST_Binary({\n                        'start': start,\n                        'left': args[0],\n                        'operator': 'instanceof',\n                        'right': args[1],\n                        'end': prev()\n                    })\n                    S.in_parenthesized_expr = False\n                    return ret\n\n            # fall-through to basic function call\n            ret = subscripts(new AST_Call({\n                'start': start,\n                'expression': expr,\n                'args': func_call_list(),\n                'end': prev()\n            }), True)\n            S.in_parenthesized_expr = False\n            return ret\n\n    def get_attr(expr, allow_calls):\n        next()\n        prop = as_name()\n        c = get_class_in_scope(expr)\n        if c:\n            classvars = c.provisional_classvars if c.processing else c.classvars\n            if classvars and v'classvars[prop]':\n                prop = 'prototype.' + prop\n\n        return subscripts(new AST_Dot({\n            'start': expr.start,\n            'expression': expr,\n            'property': prop,\n            'end': prev()\n        }), allow_calls)\n\n    def existential(expr, allow_calls):\n        ans = new AST_Existential({'start':expr.start, 'end':S.token, 'expression':expr})\n        next()\n        ttype = S.token.type\n        val = S.token.value\n        if S.token.nlb or ttype is 'keyword' or ttype is 'operator' or ttype is 'eof':\n            ans.after = None\n            return ans\n        if ttype is 'punc':\n            if val is '.':\n                ans.after = '.'\n            elif val is '[':\n                is_py_sub = S.scoped_flags.get('overload_getitem', False)\n                ans.after = 'g' if is_py_sub else '['\n            elif val is '(':\n                if not allow_calls:\n                    unexpected()\n                ans.after = '('\n            else:\n                ans.after = None\n                return ans\n            return subscripts(ans, allow_calls)\n\n        ans.after = expression()\n        return ans\n\n    def subscripts(expr, allow_calls):\n        if is_(\"punc\", \".\"):\n            return get_attr(expr, allow_calls)\n\n        if is_(\"punc\", \"[\") and not S.token.nlb:\n            return getitem(expr, allow_calls)\n\n        if allow_calls and is_(\"punc\", \"(\") and not S.token.nlb:\n            return call_(expr)\n\n        if is_('punc', '?'):\n            return existential(expr, allow_calls)\n\n        return expr\n\n    def maybe_unary(allow_calls):\n        start = S.token\n        if is_('operator', '@'):\n            if S.parsing_decorator:\n                croak('Nested decorators are not allowed')\n            next()\n            S.parsing_decorator = True\n            expr = expression()\n            S.parsing_decorator = False\n            S.decorators.push(expr)\n            return new AST_EmptyStatement({'stype':'@', 'start':prev(), 'end':prev()})\n        if is_(\"operator\") and UNARY_PREFIX[start.value]:\n            next()\n            is_parenthesized = is_('punc', '(')\n            S.in_delete = start.value is 'delete'\n            expr = maybe_unary(allow_calls)\n            S.in_delete = False\n            ex = make_unary(AST_UnaryPrefix, start.value, expr, is_parenthesized)\n            ex.start = start\n            ex.end = prev()\n            return ex\n\n        val = expr_atom(allow_calls)\n        return val\n\n    def make_unary(ctor, op, expr, is_parenthesized):\n        return new ctor({\n            'operator': op,\n            'expression': expr,\n            'parenthesized': is_parenthesized\n        })\n\n    def expr_op(left, min_prec, no_in):\n        op = S.token.value if is_('operator') else None\n        if op is \"!\" and peek().type is \"operator\" and peek().value is \"in\":\n            next()\n            S.token.value = op = 'nin'\n\n        if no_in and (op is \"in\" or op is 'nin'):\n            op = None\n\n        prec = PRECEDENCE[op] if op is not None else None\n        if prec is not None and prec > min_prec:\n            next()\n            right = expr_op(maybe_unary(True), prec, no_in)\n            ret = new AST_Binary({\n                'start': left.start,\n                'left': left,\n                'operator': op,\n                'right': right,\n                'end': right.end\n            })\n            return expr_op(ret, min_prec, no_in)\n        return left\n\n    def expr_ops(no_in):\n        return expr_op(maybe_unary(True), 0, no_in)\n\n    def maybe_conditional(no_in):\n        start = S.token\n        expr = expr_ops(no_in)\n        if (is_('keyword', 'if') and (S.in_parenthesized_expr or (S.statement_starting_token is not S.token and not S.in_comprehension and not S.token.nlb))):\n            next()\n            ne = expression(False)\n            expect_token('keyword', 'else')\n            conditional = new AST_Conditional({\n                'start': start,\n                'condition': ne,\n                'consequent': expr,\n                'alternative': expression(False, no_in),\n                'end': peek()\n            })\n            return conditional\n        return expr\n\n    def create_assign(data):\n        if data.right and is_node_type(data.right, AST_Seq) and (\n                is_node_type(data.right.car, AST_Assign) or\n                is_node_type(data.right.cdr, AST_Assign)) and data.operator is not '=':\n            token_error(data.start, 'Invalid assignment operator for chained assignment: ' + data.operator)\n        ans = AST_Assign(data)\n        if S.in_class.length and S.in_class[-1]:\n            class_name = S.in_class[-1]\n            if is_node_type(ans.left, AST_SymbolRef) and S.classes.length > 1:\n                c = S.classes[-2][class_name]\n                if c:\n                    if ans.is_chained():\n                        for lhs in ans.traverse_chain()[0]:\n                            c.provisional_classvars[lhs.name] = True\n                    else:\n                        c.provisional_classvars[ans.left.name] = True\n        return ans\n\n    def maybe_assign(no_in, only_plain_assignment):\n        start = S.token\n        left = maybe_conditional(no_in)\n        val = S.token.value\n        if is_(\"operator\") and ASSIGNMENT[val]:\n            if only_plain_assignment and val is not '=':\n                croak('Invalid assignment operator for chained assignment: ' + val)\n            next()\n            return create_assign({\n                'start': start,\n                'left': left,\n                'operator': val,\n                'right': maybe_assign(no_in, True),\n                'end': prev()\n            })\n        return left\n\n    def expression(commas, no_in):\n        # if there is an assignment, we want the sequences to pivot\n        # around it to allow for tuple packing/unpacking\n        start = S.token\n        expr = maybe_assign(no_in)\n        def build_seq(a):\n            if a.length is 1:\n                return a[0]\n\n            return new AST_Seq({\n                'start': start,\n                'car': a.shift(),\n                'cdr': build_seq(a),\n                'end': peek()\n            })\n        if commas:\n            left = v'[ expr ]'\n            while is_(\"punc\", \",\") and not peek().nlb:\n                next()\n                if is_node_type(expr, AST_Assign):\n                    left[-1] = left[-1].left\n                    return create_assign({\n                        'start': start,\n                        'left': (left[0] if left.length is 1 else new AST_Array({\n                            'elements': left\n                        })),\n                        'operator': expr.operator,\n                        'right': new AST_Seq({\n                            'car': expr.right,\n                            'cdr': expression(True, no_in)\n                        }),\n                        'end': peek()\n                    })\n\n                expr = maybe_assign(no_in)\n                left.push(expr)\n\n            # if last one was an assignment, fix it\n            if left.length > 1 and is_node_type(left[-1], AST_Assign):\n                left[-1] = left[-1].left\n                return create_assign({\n                    'start': start,\n                    'left': new AST_Array({\n                        'elements': left\n                    }),\n                    'operator': expr.operator,\n                    'right': expr.right,\n                    'end': peek()\n                })\n\n            return build_seq(left)\n        return expr\n\n    def in_loop(cont):\n        S.in_loop += 1\n        ret = cont()\n        S.in_loop -= 1\n        return ret\n\n    def run_parser():\n        start = S.token = next()\n        body = v'[]'\n        docstrings = v'[]'\n        first_token = True\n        toplevel = options.toplevel\n        while not is_(\"eof\"):\n            element = statement()\n            if first_token and is_node_type(element, AST_Directive) and element.value.indexOf('#!') is 0:\n                shebang = element.value\n            else:\n                ds = not toplevel and is_docstring(element)  # do not process strings as docstrings if we are concatenating toplevels\n                if ds:\n                    docstrings.push(ds)\n                else:\n                    body.push(element)\n            first_token = False\n\n        end = prev()\n        if toplevel:\n            toplevel.body = toplevel.body.concat(body)\n            toplevel.end = end\n            toplevel.docstrings\n        else:\n            toplevel = new AST_Toplevel({\n                'start': start,\n                'body': body,\n                'shebang': shebang,\n                'end': end,\n                'docstrings': docstrings,\n            })\n\n        toplevel.nonlocalvars = scan_for_nonlocal_defs(toplevel.body).concat(S.globals)\n        toplevel.localvars = []\n        toplevel.exports = []\n        seen_exports = {}\n\n        def add_item(item, isvar):\n            if (toplevel.nonlocalvars.indexOf(item) < 0):\n                symbol = new_symbol(AST_SymbolVar, item)\n                if isvar:\n                    toplevel.localvars.push(symbol)\n                if not has_prop(seen_exports, item):\n                    toplevel.exports.push(symbol)\n                    seen_exports[item] = True\n\n        for item in scan_for_local_vars(toplevel.body):\n            add_item(item, True)\n        for item in scan_for_top_level_callables(toplevel.body):\n            add_item(item, False)\n\n        toplevel.filename = options.filename\n        toplevel.imported_module_ids = imported_module_ids\n        toplevel.classes = scan_for_classes(toplevel.body)\n        toplevel.import_order = Object.keys(imported_modules).length\n        toplevel.module_id = module_id\n        imported_modules[module_id] = toplevel\n        toplevel.imports = imported_modules\n        toplevel.baselib = baselib_items\n        toplevel.scoped_flags = S.scoped_flags.stack[0]\n        importing_modules[module_id] = False\n        toplevel.comments_after = S.token.comments_before or v'[]'\n        return toplevel\n\n    return run_parser\n\ndef parse(text, options):\n    options = defaults(options, {\n        'filename': None,     # name of the file being parsed\n        'module_id':'__main__', # The id of the module being parsed\n        'toplevel': None,\n        'for_linting': False, # If True certain actions are not performed, such as importing modules\n        'import_dirs': v'[]',\n        'classes': undefined, # Map of class names to AST_Class that are available in the global namespace (used by the REPL)\n        'scoped_flags': {},   # Global scoped flags (used by the REPL)\n        'discard_asserts': False,\n        'module_cache_dir': '',\n    })\n    import_dirs = [x for x in options.import_dirs]\n    for location in v'[options.libdir, options.basedir]':\n        if location:\n            import_dirs.push(location)\n    module_id = options.module_id\n    baselib_items = {}\n    imported_module_ids = []\n    imported_modules = options.imported_modules or {}\n    importing_modules = options.importing_modules or {}\n    importing_modules[module_id] = True\n\n    # The internal state of the parser\n    S = {\n        'input': tokenizer(text, options.filename) if jstype(text) is 'string' else text,\n        'token': None,\n        'prev': None,\n        'peeked': [],\n        'in_function': 0,\n        'statement_starting_token': None,\n        'in_comprehension': False,\n        'in_parenthesized_expr': False,\n        'in_delete': False,\n        'in_loop': 0,\n        'in_class': [ False ],\n        'classes': [ {} ],\n        'functions': [ {} ],\n        'labels': [],\n        'decorators': v'[]',\n        'parsing_decorator': False,\n        'globals': v'[]',\n        'scoped_flags': {\n            'stack': v'[options.scoped_flags || Object.create(null)]',\n            'push': def (): this.stack.push(Object.create(None));,\n            'pop': def (): this.stack.pop();,\n            'get': def (name, defval):\n                for v'var i = this.stack.length - 1; i >= 0; i--':\n                    d = this.stack[i]\n                    q = d[name]\n                    if q:\n                        return q\n                return defval\n            ,\n            'set': def (name, val): this.stack[-1][name] = val;,\n        },\n    }\n\n    if options.classes:\n        for cname in options.classes:\n            obj = options.classes[cname]\n            S.classes[0][cname] = { 'static':obj.static, 'bound':obj.bound, 'classvars': obj.classvars }\n\n    return create_parser_ctx(S, import_dirs, module_id, baselib_items, imported_module_ids, imported_modules, importing_modules, options)()\n"
  },
  {
    "path": "src/string_interpolation.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\ndef quoted_string(x):\n    return '\"' + x.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, r'\\\"').replace(/\\n/g, '\\\\n') + '\"'\n\ndef render_markup(markup):\n    pos, key = 0, ''\n    while pos < markup.length:\n        ch = markup[pos]\n        if ch is '!' or ch is ':':\n            break\n        key += ch\n        pos += 1\n    fmtspec = markup[pos:]\n    prefix = ''\n    if key.endsWith('='):\n        prefix=key\n        key = key[:-1]\n    return 'ρσ_str.format(\"' + prefix + '{' + fmtspec + '}\", ' + key + ')'\n\n\ndef interpolate(template, raise_error):\n    pos = in_brace = 0\n    markup = ''\n    ans = v'[\"\"]'\n    while pos < template.length:\n        ch = template[pos]\n        if in_brace:\n            if ch is '{':\n                in_brace += 1\n                markup += '{'\n            elif ch is '}':\n                in_brace -= 1\n                if in_brace > 0:\n                    markup += '}'\n                else:\n                    ans.push(v'[markup]')\n                    ans.push('')\n            else:\n                markup += ch\n        else:\n            if ch is '{':\n                if template[pos+1] is '{':\n                    pos += 1\n                    ans[-1] += '{'\n                else:\n                    in_brace = 1\n                    markup = ''\n            elif ch is '}':\n                if template[pos+1] is '}':\n                    pos += 1\n                    ans[-1] += '}'\n                else:\n                    raise_error(\"f-string: single '}' is not allowed\")\n            else:\n                ans[-1] += ch\n\n        pos += 1\n\n    if in_brace:\n        raise_error(\"expected '}' before end of string\")\n\n    if ans[-1] is '+':\n        ans[-1] = ''\n    for v'var i = 0; i < ans.length; i++':\n        if jstype(ans[i]) is 'string':\n            ans[i] = quoted_string(ans[i])\n        else:\n            ans[i] = '+' + render_markup.apply(this, ans[i]) + '+'\n    return ans.join('')\n"
  },
  {
    "path": "src/tokenizer.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nfrom unicode_aliases import ALIAS_MAP\nfrom utils import make_predicate, characters\nfrom ast import AST_Token\nfrom errors import SyntaxError\nfrom string_interpolation import interpolate, quoted_string\n\nRE_HEX_NUMBER = /^0x[0-9a-f]+$/i\nRE_OCT_NUMBER = /^0[0-7]+$/\nRE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i\n\nOPERATOR_CHARS = make_predicate(characters(\"+-*&%=<>!?|~^@\"))\n\nASCII_CONTROL_CHARS = {'a':7, 'b':8, 'f': 12, 'n': 10, 'r': 13, 't': 9, 'v': 11}\nHEX_PAT = /[a-fA-F0-9]/\nNAME_PAT = /[a-zA-Z ]/\n\nOPERATORS = make_predicate([\n    \"in\",\n    \"instanceof\",\n    \"typeof\",\n    \"new\",\n    \"void\",\n    \"del\",\n    \"+\",\n    \"-\",\n    \"not\",\n    \"~\",\n    \"&\",\n    \"|\",\n    \"^\",\n    \"**\",\n    \"*\",\n    \"//\",\n    \"/\",\n    \"%\",\n    \">>\",\n    \"<<\",\n    \">>>\",\n    \"<\",\n    \">\",\n    \"<=\",\n    \">=\",\n    \"==\",\n    \"is\",\n    \"!=\",\n    \"=\",\n    \"+=\",\n    \"-=\",\n    \"//=\",\n    \"/=\",\n    \"*=\",\n    \"%=\",\n    \">>=\",\n    \"<<=\",\n    \">>>=\",\n    \"|=\",\n    \"^=\",\n    \"&=\",\n    \"and\",\n    \"or\",\n    \"@\",\n    \"->\"\n])\n\nOP_MAP = {\n    'or': \"||\",\n    'and': \"&&\",\n    'not': \"!\",\n    'del': \"delete\",\n    'None': \"null\",\n    'is': \"===\",\n}\n\nWHITESPACE_CHARS = make_predicate(characters(\" \\u00a0\\n\\r\\t\\f\\u000b\\u200b\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\"))\n\nPUNC_BEFORE_EXPRESSION = make_predicate(characters(\"[{(,.;:\"))\n\nPUNC_CHARS = make_predicate(characters(\"[]{}(),;:?\"))\n\nKEYWORDS = \"as assert break class continue def del do elif else except finally for from global if import in is new nonlocal pass raise return yield try while with or and not\"\n\nKEYWORDS_ATOM = \"False None True\"\n\n# see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar\nRESERVED_WORDS = (\"break case class catch const continue debugger default delete do else export extends\"\n\" finally for function if import in instanceof new return super switch this throw try typeof var void\"\n\" while with yield enum implements static private package let public protected interface await null true false\" )\n\nKEYWORDS_BEFORE_EXPRESSION = \"return yield new del raise elif else if\"\n\nALL_KEYWORDS = KEYWORDS + \" \" + KEYWORDS_ATOM\n\nKEYWORDS = make_predicate(KEYWORDS)\nRESERVED_WORDS = make_predicate(RESERVED_WORDS)\nKEYWORDS_BEFORE_EXPRESSION = make_predicate(KEYWORDS_BEFORE_EXPRESSION)\nKEYWORDS_ATOM = make_predicate(KEYWORDS_ATOM)\nIDENTIFIER_PAT = /^[a-z_$][_a-z0-9$]*$/i\n\ndef is_string_modifier(val):\n    for ch in val:\n        if 'vrufVRUF'.indexOf(ch) is -1:\n            return False\n    return True\n\ndef is_letter(code):\n    return code >= 97 and code <= 122 or code >= 65 and code <= 90 or code >= 170 and UNICODE.letter.test(String.fromCharCode(code))\n\ndef is_digit(code):\n    return code >= 48 and code <= 57\n\ndef is_alphanumeric_char(code):\n    return is_digit(code) or is_letter(code)\n\ndef is_unicode_combining_mark(ch):\n    return UNICODE.non_spacing_mark.test(ch) or UNICODE.space_combining_mark.test(ch)\n\ndef is_unicode_connector_punctuation(ch):\n    return UNICODE.connector_punctuation.test(ch)\n\ndef is_identifier(name):\n    return not RESERVED_WORDS[name] and not KEYWORDS[name] and not KEYWORDS_ATOM[name] and IDENTIFIER_PAT.test(name)\n\ndef is_identifier_start(code):\n    return code is 36 or code is 95 or is_letter(code)\n\ndef is_identifier_char(ch):\n    code = ch.charCodeAt(0)\n    return is_identifier_start(code) or is_digit(code) or code is 8204 or code is 8205 or is_unicode_combining_mark(ch) or is_unicode_connector_punctuation(ch)\n\ndef parse_js_number(num):\n    if RE_HEX_NUMBER.test(num):\n        return parseInt(num.substr(2), 16)\n    elif RE_OCT_NUMBER.test(num):\n        return parseInt(num.substr(1), 8)\n    elif RE_DEC_NUMBER.test(num):\n        return parseFloat(num)\n\n# regexps adapted from http://xregexp.com/plugins/#unicode\nUNICODE = {  # {{{\n    'letter': RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\u097F\\\\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\\\\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-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\u0D60\\\\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\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\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-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\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-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\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]\"),\n    'non_spacing_mark': RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\"),\n    'space_combining_mark': RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\"),\n    'connector_punctuation': RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\")\n}  # }}}\n\n\ndef is_token(token, type, val):\n    return token.type is type and (val is None or val is undefined or token.value is val)\n\nEX_EOF = {}\n\ndef tokenizer(raw_text, filename):\n    S = {\n        'text': raw_text.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, \"\\n\").replace(/\\uFEFF/g, \"\"),\n        'filename': filename,\n        'pos': 0,\n        'tokpos': 0,\n        'line': 1,\n        'tokline': 0,\n        'col': 0,\n        'tokcol': 0,\n        'newline_before': False,\n        'regex_allowed': False,\n        'comments_before': v'[]',\n        'whitespace_before': v'[]',\n        'newblock': False,\n        'endblock': False,\n        'indentation_matters': v'[ true ]',\n        'cached_whitespace': \"\",\n        'prev': undefined,\n        'index_or_slice': v'[ false ]',\n        'expecting_object_literal_key': False,  # This is set by the parser when it is expecting an object literal key\n    }\n    def peek():\n        return S.text.charAt(S.pos)\n\n    def prevChar():\n        return S.text.charAt(S.tokpos - 1)\n\n    def next(signal_eof, in_string):\n        ch = S.text.charAt(S.pos)\n        S.pos += 1\n        if signal_eof and not ch:\n            raise EX_EOF\n\n        if ch is \"\\n\":\n            S.newline_before = S.newline_before or not in_string\n            S.line += 1\n            S.col = 0\n        else:\n            S.col += 1\n        return ch\n\n    def find(what, signal_eof):\n        pos = S.text.indexOf(what, S.pos)\n        if signal_eof and pos is -1:\n            raise EX_EOF\n        return pos\n\n    def start_token():\n        S.tokline = S.line\n        S.tokcol = S.col\n        S.tokpos = S.pos\n\n    def token(type, value, is_comment, keep_newline):\n        S.regex_allowed = (type is \"operator\"\n            or type is \"keyword\" and KEYWORDS_BEFORE_EXPRESSION[value]\n            or type is \"punc\" and PUNC_BEFORE_EXPRESSION[value])\n\n        if type is \"operator\" and value is \"is\" and S.text.substr(S.pos).trimLeft().substr(0, 4).trimRight() is \"not\":\n            next_token()\n            value = \"!==\"\n\n        if type is \"operator\" and OP_MAP[value]:\n            value = OP_MAP[value]\n\n        ret = {\n            'type': type,\n            'value': value,\n            'line': S.tokline,\n            'col': S.tokcol,\n            'pos': S.tokpos,\n            'endpos': S.pos,\n            'nlb': S.newline_before,\n            'file': filename,\n            'leading_whitespace': S.whitespace_before[-1] or '',\n        }\n        if not is_comment:\n            ret.comments_before = S.comments_before\n            S.comments_before = v'[]'  # Use a plain JS array for speed\n            # make note of any newlines in the comments that came before\n            for i in range(ret.comments_before.length):\n                ret.nlb = ret.nlb or ret.comments_before[i].nlb\n\n        if not keep_newline:\n            S.newline_before = False\n\n        if type is \"punc\":\n            #            if (value is \":\" && peek() is \"\\n\") {\n            if value is \":\" and not S.index_or_slice[-1]\n            and not S.expecting_object_literal_key\n            and (not S.text.substring(S.pos + 1, find(\"\\n\")).trim() or not S.text.substring(S.pos + 1, find(\"#\")).trim()):\n                S.newblock = True\n                S.indentation_matters.push(True)\n\n            if value is \"[\":\n                if S.prev and (\n                    S.prev.type is \"name\" or\n                    (S.prev.type is 'punc' and ')]'.indexOf(S.prev.value) is not -1)\n                ):\n                    S.index_or_slice.push(True)\n                else:\n                    S.index_or_slice.push(False)\n                S.indentation_matters.push(False)\n            elif value is \"{\" or value is \"(\":\n                S.indentation_matters.push(False)\n            elif value is \"]\":\n                S.index_or_slice.pop()\n                S.indentation_matters.pop()\n            elif value is \"}\" or value is \")\":\n                S.indentation_matters.pop()\n        S.prev = AST_Token(ret)\n        return S.prev\n\n    # this will transform leading whitespace to block tokens unless\n    # part of array/hash, and skip non-leading whitespace\n    def parse_whitespace():\n        leading_whitespace = \"\"\n        whitespace_exists = False\n        while WHITESPACE_CHARS[peek()]:\n            whitespace_exists = True\n            ch = next()\n            if ch is \"\\n\":\n                leading_whitespace = \"\"\n            else:\n                leading_whitespace += ch\n        if peek() is not \"#\":\n            if not whitespace_exists:\n                leading_whitespace = S.cached_whitespace\n            else:\n                S.cached_whitespace = leading_whitespace\n            if S.newline_before or S.endblock:\n                return test_indent_token(leading_whitespace)\n\n    def test_indent_token(leading_whitespace):\n        most_recent = S.whitespace_before[-1] or \"\"\n        S.endblock = False\n        if S.indentation_matters[-1] and leading_whitespace is not most_recent:\n            if S.newblock and leading_whitespace and leading_whitespace.indexOf(most_recent) is 0:\n                # positive indent, new block\n                S.newblock = False\n                S.whitespace_before.push(leading_whitespace)\n                return 1\n            elif most_recent and most_recent.indexOf(leading_whitespace) is 0:\n                # negative indent, block is ending\n                S.endblock = True\n                S.whitespace_before.pop()\n                return -1\n            else:\n                # indent mismatch, inconsistent indentation\n                parse_error(\"Inconsistent indentation\")\n        return 0\n\n    def read_while(pred):\n        ret = \"\"\n        i = 0\n        ch = ''\n        while (ch = peek()) and pred(ch, i):\n            i += 1\n            ret += next()\n        return ret\n\n    def parse_error(err, is_eof):\n        raise new SyntaxError(err, filename, S.tokline, S.tokcol, S.tokpos, is_eof)\n\n    def read_num(prefix):\n        has_e = False\n        has_x = False\n        has_dot = prefix is \".\"\n        if not prefix and peek() is '0' and S.text.charAt(S.pos + 1) is 'b':\n            next(), next()\n            num = read_while(def(ch): return ch is '0' or ch is '1';)\n            valid = parseInt(num, 2)\n            if isNaN(valid):\n                parse_error('Invalid syntax for a binary number')\n            return token('num', valid)\n        seen = v'[]'\n        num = read_while(def(ch, i):\n            nonlocal has_dot, has_e, has_x\n            seen.push(ch)\n            if ch is 'x' or ch is 'X':\n                if has_x or seen.length is not 2 or seen[0] is not '0':\n                    return False\n                has_x = True\n                return True\n            elif ch is 'e' or ch is 'E':\n                if has_x:\n                    return True\n                if has_e or i == 0:\n                    return False\n                has_e = True\n                return True\n            elif ch is '-':\n                if i is 0 and not prefix:\n                    return True\n                if has_e and seen[i-1].toLowerCase() is 'e':\n                    return True\n                return False\n            elif ch is '+':\n                if has_e and seen[i-1].toLowerCase() is 'e':\n                    return True\n                return False\n            elif ch is '.':\n                return (has_dot = True) if not has_dot and not has_x and not has_e else False\n            return is_alphanumeric_char(ch.charCodeAt(0))\n        )\n        if prefix:\n            num = prefix + num\n\n        valid = parse_js_number(num)\n        if not isNaN(valid):\n            return token(\"num\", valid)\n        else:\n            parse_error(\"Invalid syntax: \" + num)\n\n    def read_hex_digits(count):\n        ans = ''\n        while count > 0:\n            count -= 1\n            if not HEX_PAT.test(peek()):\n                return ans\n            ans += next()\n        nval = parseInt(ans, 16)\n        if nval > 0x10FFFF:\n            return ans\n        return nval\n\n    def read_escape_sequence():\n        q = next(True)\n        if q is '\\n':\n            return ''\n        if q is '\\\\':\n            return q\n        if '\"\\''.indexOf(q) is not -1:\n            return q\n        if ASCII_CONTROL_CHARS[q]:\n            return String.fromCharCode(ASCII_CONTROL_CHARS[q])\n        if '0' <= q <= '7':\n            octal = q\n            if '0' <= peek() <= '7':\n                octal += next()\n            if '0' <= peek() <= '7':\n                octal += next()\n            code = parseInt(octal, 8)\n            if isNaN(code):\n                return '\\\\' + octal\n            return String.fromCharCode(code)\n        if q is 'x':\n            code = read_hex_digits(2)\n            if jstype(code) is 'number':\n                return String.fromCharCode(code)\n            return '\\\\x' + code\n        if q is 'u':\n            code = read_hex_digits(4)\n            if jstype(code) is 'number':\n                return String.fromCharCode(code)\n            return '\\\\u' + code\n        if q is 'U':\n            code = read_hex_digits(8)\n            if jstype(code) is 'number':\n                if code <= 0xFFFF:\n                    return String.fromCharCode(code)\n                code -= 0x10000\n                return String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n            return '\\\\U' + code\n        if q is 'N' and peek() is '{':\n            next()\n            name = read_while(def (ch): return NAME_PAT.test(ch);)\n            if peek() is not '}':\n                return '\\\\N{' + name\n            next()\n            key = (name or '').toLowerCase()\n            if not name or not Object.prototype.hasOwnProperty.call(ALIAS_MAP, key):\n                return '\\\\N{' + name + '}'\n            code = ALIAS_MAP[key]\n            if code <= 0xFFFF:\n                return String.fromCharCode(code)\n            code -= 0x10000\n            return String.fromCharCode(0xD800+(code>>10), 0xDC00+(code&0x3FF))\n        return '\\\\' + q\n\n    def with_eof_error(eof_error, cont):\n        return def():\n            try:\n                return cont.apply(None, arguments)\n            except as ex:\n                if ex is EX_EOF:\n                    parse_error(eof_error, True)\n                else:\n                    raise\n\n    read_string = with_eof_error(\"Unterminated string constant\", def(is_raw_literal, is_js_literal):\n        quote = next()\n        tok_type = 'js' if is_js_literal else 'string'\n        ret = \"\"\n        is_multiline = False\n        if peek() is quote:\n            # two quotes in a row\n            next(True)\n            if peek() is quote:\n                # multiline string (3 quotes in a row)\n                next(True)\n                is_multiline = True\n            else:\n                return token(tok_type, '')\n\n        while True:\n            ch = next(True, True)\n            if not ch:\n                break\n            if ch is \"\\n\" and not is_multiline:\n                parse_error(\"End of line while scanning string literal\")\n\n            if ch is \"\\\\\":\n                ret += ('\\\\' + next(True)) if is_raw_literal else read_escape_sequence()\n                continue\n\n            if ch is quote:\n                if not is_multiline:\n                    break\n                if peek() is quote:\n                    next()\n                    if peek() is quote:\n                        next()\n                        break\n                    else:\n                        ch += quote\n            ret += ch\n        return token(tok_type, ret)\n    )\n\n    def handle_interpolated_string(string, start_tok):\n        def raise_error(err):\n            raise new SyntaxError(err, filename, start_tok.line, start_tok.col, start_tok.pos, False)\n        parts = v'[interpolate(string, raise_error)]'\n        # Look ahead for consecutive string literals to concatenate (e.g. f'a'f'b' or f'a''b')\n        while True:\n            # Skip horizontal whitespace (spaces and tabs, not newlines)\n            while S.pos < S.text.length and (S.text.charAt(S.pos) is ' ' or S.text.charAt(S.pos) is '\\t'):\n                next()\n            ch = S.text.charAt(S.pos)\n            if not ch:\n                break\n            if ch is \"'\" or ch is '\"':\n                # A plain string literal follows; read it and append its quoted value\n                stok = read_string(False, False)\n                parts.push(quoted_string(stok.value))\n            elif is_identifier_start(ch.charCodeAt(0)):\n                # Peek ahead (without consuming) to check if it is a string modifier followed by a quote\n                j = S.pos\n                while j < S.text.length and is_identifier_char(S.text.charAt(j)):\n                    j += 1\n                potential_mod = S.text.substring(S.pos, j)\n                if not is_string_modifier(potential_mod):\n                    break\n                if j >= S.text.length or '\\'\"'.indexOf(S.text.charAt(j)) is -1:\n                    break\n                mods = potential_mod.toLowerCase()\n                if mods.indexOf('v') is not -1:\n                    break  # Do not concatenate with verbatim JS literals\n                # Consume the modifier characters via next() to keep position tracking correct\n                while S.pos < j:\n                    next()\n                is_raw = mods.indexOf('r') is not -1\n                stok = read_string(is_raw, False)\n                if mods.indexOf('f') is not -1:\n                    parts.push(interpolate(stok.value, raise_error))\n                else:\n                    parts.push(quoted_string(stok.value))\n            else:\n                break\n        combined = parts.join('+')\n        S.text = S.text[:S.pos] + '(' + combined + ')' + S.text[S.pos:]\n        return token('punc', next())\n\n    def read_line_comment(shebang):\n        if not shebang:\n            next()\n        i = find(\"\\n\")\n\n        if i is -1:\n            ret = S.text.substr(S.pos)\n            S.pos = S.text.length\n        else:\n            ret = S.text.substring(S.pos, i)\n            S.pos = i\n\n        return token(\"shebang\" if shebang else \"comment1\", ret, True)\n\n    def read_name():\n        name = ch = \"\"\n        while (ch = peek()) is not None:\n            if ch is \"\\\\\":\n                if S.text.charAt(S.pos + 1) is \"\\n\":\n                    S.pos += 2\n                    continue\n                break\n            elif is_identifier_char(ch):\n                name += next()\n            else:\n                break\n        return name\n\n    read_regexp = with_eof_error(\"Unterminated regular expression\", def():\n        prev_backslash = False\n        regexp = ch = ''\n        in_class = False\n        verbose_regexp = False\n        in_comment = False\n\n        if peek() is '/':\n            next(True)\n            if peek() is '/':\n                verbose_regexp  = True\n                next(True)\n            else: # empty regexp (//)\n                mods = read_name()\n                return token(\"regexp\", RegExp(regexp, mods))\n        while True:\n            ch = next(True)\n            if not ch:\n                break\n            if in_comment:\n                if ch is '\\n':\n                    in_comment = False\n                continue\n            if prev_backslash:\n                regexp += \"\\\\\" + ch\n                prev_backslash = False\n            elif ch is \"[\":\n                in_class = True\n                regexp += ch\n            elif ch is \"]\" and in_class:\n                in_class = False\n                regexp += ch\n            elif ch is \"/\" and not in_class:\n                if verbose_regexp:\n                    if peek() is not '/':\n                        regexp += '\\\\/'\n                        continue\n                    next(True)\n                    if peek() is not '/':\n                        regexp += '\\\\/\\\\/'\n                        continue\n                    next(True)\n                break\n            elif ch is \"\\\\\":\n                prev_backslash = True\n            elif verbose_regexp and not in_class and ' \\n\\r\\t'.indexOf(ch) is not -1:\n                pass\n            elif verbose_regexp and not in_class and ch is '#':\n                in_comment = True\n            else:\n                regexp += ch\n\n        mods = read_name()\n        return token(\"regexp\", RegExp(regexp, mods))\n    )\n\n    def read_operator(prefix):\n        def grow(op):\n            if not peek():\n                return op\n\n            bigger = op + peek()\n            if OPERATORS[bigger]:\n                next()\n                return grow(bigger)\n            else:\n                return op\n        op = grow(prefix or next())\n        if op is '->':\n            # pretend that this is an operator as the tokenizer only allows\n            # one character punctuation.\n            return token('punc', op)\n        return token(\"operator\", op)\n\n    def handle_slash():\n        next()\n        return read_regexp(\"\") if S.regex_allowed else read_operator(\"/\")\n\n    def handle_dot():\n        next()\n        return read_num(\".\") if is_digit(peek().charCodeAt(0)) else token(\"punc\", \".\")\n\n    def read_word():\n        word = read_name()\n        return token(\"atom\", word) if KEYWORDS_ATOM[word] else (token(\"name\", word) if not KEYWORDS[word] else (token(\"operator\", word) if OPERATORS[word] and prevChar() is not \".\" else token(\"keyword\", word)))\n\n    def next_token():\n\n        indent = parse_whitespace()\n        # if indent is 1:\n        #     return token(\"punc\", \"{\")\n        if indent is -1:\n            return token(\"punc\", \"}\", False, True)\n\n        start_token()\n        ch = peek()\n        if not ch:\n            return token(\"eof\")\n\n        code = ch.charCodeAt(0)\n        tmp_ = code\n        if tmp_ is 34 or tmp_ is 39:    # double-quote (\") or single quote (')\n            return read_string(False)\n        elif tmp_ is 35:                # pound-sign (#)\n            if S.pos is 0 and S.text.charAt(1) is '!':\n                #shebang\n                return read_line_comment(True)\n            regex_allowed = S.regex_allowed\n            S.comments_before.push(read_line_comment())\n            S.regex_allowed = regex_allowed\n            return next_token()\n        elif tmp_ is 46:                # dot (.)\n            return handle_dot()\n        elif tmp_ is 47:                # slash (/)\n            return handle_slash()\n\n        if is_digit(code):\n            return read_num()\n\n        if PUNC_CHARS[ch]:\n            return token(\"punc\", next())\n\n        if OPERATOR_CHARS[ch]:\n            return read_operator()\n\n        if code is 92 and S.text.charAt(S.pos + 1) is \"\\n\":\n            # backslash will consume the newline character that follows\n            next()\n            # backslash\n            next()\n            # newline\n            S.newline_before = False\n            return next_token()\n\n        if is_identifier_start(code):\n            tok = read_word()\n            if '\\'\"'.indexOf(peek()) is not -1 and is_string_modifier(tok.value):\n                mods = tok.value.toLowerCase()\n                start_pos_for_string = S.tokpos\n                stok = read_string(mods.indexOf('r') is not -1, mods.indexOf('v') is not -1)\n                tok.endpos = stok.endpos\n                if stok.type is not 'js' and mods.indexOf('f') is not -1:\n                    tok.col += start_pos_for_string - tok.pos\n                    return handle_interpolated_string(stok.value, tok)\n                tok.value = stok.value\n                tok.type = stok.type\n            return tok\n\n        parse_error(\"Unexpected character «\" + ch + \"»\")\n\n    next_token.context = def(nc):\n        nonlocal S\n        if nc:\n            S = nc\n        return S\n\n    return next_token\n"
  },
  {
    "path": "src/unicode_aliases.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# Alias DB from http://www.unicode.org/Public/8.0.0/ucd/NameAliases.txt {{{\nDB = '''\n# NameAliases-8.0.0.txt\n# Date: 2014-11-19, 01:30:00 GMT [KW, LI]\n#\n# This file is a normative contributory data file in the\n# Unicode Character Database.\n#\n# Copyright (c) 2005-2014 Unicode, Inc.\n# For terms of use, see http://www.unicode.org/terms_of_use.html\n#\n# This file defines the formal name aliases for Unicode characters.\n#\n# For informative aliases, see NamesList.txt\n#\n# The formal name aliases are divided into five types, each with a distinct label.\n#\n# Type Labels:\n#\n# 1. correction\n#      Corrections for serious problems in the character names\n# 2. control\n#      ISO 6429 names for C0 and C1 control functions, and other\n#      commonly occurring names for control codes\n# 3. alternate\n#      A few widely used alternate names for format characters\n# 4. figment\n#      Several documented labels for C1 control code points which\n#      were never actually approved in any standard\n# 5. abbreviation\n#      Commonly occurring abbreviations (or acronyms) for control codes,\n#      format characters, spaces, and variation selectors\n#\n# The formal name aliases are part of the Unicode character namespace, which\n# includes the character names and the names of named character sequences.\n# The inclusion of ISO 6429 names and other commonly occurring names and\n# abbreviations for control codes and format characters as formal name aliases\n# is to help avoid name collisions between Unicode character names and the\n# labels which commonly appear in text and/or in implementations such as regex, for\n# control codes (which for historical reasons have no Unicode character name)\n# or for format characters.\n#\n# For documentation, see NamesList.html and http://www.unicode.org/reports/tr44/\n#\n# FORMAT\n#\n# Each line has three fields, as described here:\n#\n# First field:  Code point\n# Second field: Alias\n# Third field:  Type\n#\n# The type labels used are defined above. As for property values, comparisons\n# of type labels should ignore case.\n#\n# The type labels can be mapped to other strings for display, if desired.\n#\n# In case multiple aliases are assigned, additional aliases\n# are provided on separate lines. Parsers of this data file should\n# take note that the same code point can (and does) occur more than once.\n#\n# Note that currently the only instances of multiple aliases of the same\n# type for a single code point are either of type \"control\" or \"abbreviation\".\n# An alias of type \"abbreviation\" can, in principle, be added for any code\n# point, although currently aliases of type \"correction\" do not have\n# any additional aliases of type \"abbreviation\". Such relationships\n# are not enforced by stability policies.\n#\n#-----------------------------------------------------------------\n\n0000;NULL;control\n0000;NUL;abbreviation\n0001;START OF HEADING;control\n0001;SOH;abbreviation\n0002;START OF TEXT;control\n0002;STX;abbreviation\n0003;END OF TEXT;control\n0003;ETX;abbreviation\n0004;END OF TRANSMISSION;control\n0004;EOT;abbreviation\n0005;ENQUIRY;control\n0005;ENQ;abbreviation\n0006;ACKNOWLEDGE;control\n0006;ACK;abbreviation\n\n# Note that no formal name alias for the ISO 6429 \"BELL\" is\n# provided for U+0007, because of the existing name collision\n# with U+1F514 BELL.\n\n0007;ALERT;control\n0007;BEL;abbreviation\n\n0008;BACKSPACE;control\n0008;BS;abbreviation\n0009;CHARACTER TABULATION;control\n0009;HORIZONTAL TABULATION;control\n0009;HT;abbreviation\n0009;TAB;abbreviation\n000A;LINE FEED;control\n000A;NEW LINE;control\n000A;END OF LINE;control\n000A;LF;abbreviation\n000A;NL;abbreviation\n000A;EOL;abbreviation\n000B;LINE TABULATION;control\n000B;VERTICAL TABULATION;control\n000B;VT;abbreviation\n000C;FORM FEED;control\n000C;FF;abbreviation\n000D;CARRIAGE RETURN;control\n000D;CR;abbreviation\n000E;SHIFT OUT;control\n000E;LOCKING-SHIFT ONE;control\n000E;SO;abbreviation\n000F;SHIFT IN;control\n000F;LOCKING-SHIFT ZERO;control\n000F;SI;abbreviation\n0010;DATA LINK ESCAPE;control\n0010;DLE;abbreviation\n0011;DEVICE CONTROL ONE;control\n0011;DC1;abbreviation\n0012;DEVICE CONTROL TWO;control\n0012;DC2;abbreviation\n0013;DEVICE CONTROL THREE;control\n0013;DC3;abbreviation\n0014;DEVICE CONTROL FOUR;control\n0014;DC4;abbreviation\n0015;NEGATIVE ACKNOWLEDGE;control\n0015;NAK;abbreviation\n0016;SYNCHRONOUS IDLE;control\n0016;SYN;abbreviation\n0017;END OF TRANSMISSION BLOCK;control\n0017;ETB;abbreviation\n0018;CANCEL;control\n0018;CAN;abbreviation\n0019;END OF MEDIUM;control\n0019;EOM;abbreviation\n001A;SUBSTITUTE;control\n001A;SUB;abbreviation\n001B;ESCAPE;control\n001B;ESC;abbreviation\n001C;INFORMATION SEPARATOR FOUR;control\n001C;FILE SEPARATOR;control\n001C;FS;abbreviation\n001D;INFORMATION SEPARATOR THREE;control\n001D;GROUP SEPARATOR;control\n001D;GS;abbreviation\n001E;INFORMATION SEPARATOR TWO;control\n001E;RECORD SEPARATOR;control\n001E;RS;abbreviation\n001F;INFORMATION SEPARATOR ONE;control\n001F;UNIT SEPARATOR;control\n001F;US;abbreviation\n0020;SP;abbreviation\n007F;DELETE;control\n007F;DEL;abbreviation\n\n# PADDING CHARACTER and HIGH OCTET PRESET represent\n# architectural concepts initially proposed for early\n# drafts of ISO/IEC 10646-1. They were never actually\n# approved or standardized: hence their designation\n# here as the \"figment\" type. Formal name aliases\n# (and corresponding abbreviations) for these code\n# points are included here because these names leaked\n# out from the draft documents and were published in\n# at least one RFC whose names for code points was\n# implemented in Perl regex expressions.\n\n0080;PADDING CHARACTER;figment\n0080;PAD;abbreviation\n0081;HIGH OCTET PRESET;figment\n0081;HOP;abbreviation\n\n0082;BREAK PERMITTED HERE;control\n0082;BPH;abbreviation\n0083;NO BREAK HERE;control\n0083;NBH;abbreviation\n0084;INDEX;control\n0084;IND;abbreviation\n0085;NEXT LINE;control\n0085;NEL;abbreviation\n0086;START OF SELECTED AREA;control\n0086;SSA;abbreviation\n0087;END OF SELECTED AREA;control\n0087;ESA;abbreviation\n0088;CHARACTER TABULATION SET;control\n0088;HORIZONTAL TABULATION SET;control\n0088;HTS;abbreviation\n0089;CHARACTER TABULATION WITH JUSTIFICATION;control\n0089;HORIZONTAL TABULATION WITH JUSTIFICATION;control\n0089;HTJ;abbreviation\n008A;LINE TABULATION SET;control\n008A;VERTICAL TABULATION SET;control\n008A;VTS;abbreviation\n008B;PARTIAL LINE FORWARD;control\n008B;PARTIAL LINE DOWN;control\n008B;PLD;abbreviation\n008C;PARTIAL LINE BACKWARD;control\n008C;PARTIAL LINE UP;control\n008C;PLU;abbreviation\n008D;REVERSE LINE FEED;control\n008D;REVERSE INDEX;control\n008D;RI;abbreviation\n008E;SINGLE SHIFT TWO;control\n008E;SINGLE-SHIFT-2;control\n008E;SS2;abbreviation\n008F;SINGLE SHIFT THREE;control\n008F;SINGLE-SHIFT-3;control\n008F;SS3;abbreviation\n0090;DEVICE CONTROL STRING;control\n0090;DCS;abbreviation\n0091;PRIVATE USE ONE;control\n0091;PRIVATE USE-1;control\n0091;PU1;abbreviation\n0092;PRIVATE USE TWO;control\n0092;PRIVATE USE-2;control\n0092;PU2;abbreviation\n0093;SET TRANSMIT STATE;control\n0093;STS;abbreviation\n0094;CANCEL CHARACTER;control\n0094;CCH;abbreviation\n0095;MESSAGE WAITING;control\n0095;MW;abbreviation\n0096;START OF GUARDED AREA;control\n0096;START OF PROTECTED AREA;control\n0096;SPA;abbreviation\n0097;END OF GUARDED AREA;control\n0097;END OF PROTECTED AREA;control\n0097;EPA;abbreviation\n0098;START OF STRING;control\n0098;SOS;abbreviation\n\n# SINGLE GRAPHIC CHARACTER INTRODUCER is another\n# architectural concept from early drafts of ISO/IEC 10646-1\n# which was never approved and standardized.\n\n0099;SINGLE GRAPHIC CHARACTER INTRODUCER;figment\n0099;SGC;abbreviation\n\n009A;SINGLE CHARACTER INTRODUCER;control\n009A;SCI;abbreviation\n009B;CONTROL SEQUENCE INTRODUCER;control\n009B;CSI;abbreviation\n009C;STRING TERMINATOR;control\n009C;ST;abbreviation\n009D;OPERATING SYSTEM COMMAND;control\n009D;OSC;abbreviation\n009E;PRIVACY MESSAGE;control\n009E;PM;abbreviation\n009F;APPLICATION PROGRAM COMMAND;control\n009F;APC;abbreviation\n00A0;NBSP;abbreviation\n00AD;SHY;abbreviation\n01A2;LATIN CAPITAL LETTER GHA;correction\n01A3;LATIN SMALL LETTER GHA;correction\n034F;CGJ;abbreviation\n061C;ALM;abbreviation\n0709;SYRIAC SUBLINEAR COLON SKEWED LEFT;correction\n0CDE;KANNADA LETTER LLLA;correction\n0E9D;LAO LETTER FO FON;correction\n0E9F;LAO LETTER FO FAY;correction\n0EA3;LAO LETTER RO;correction\n0EA5;LAO LETTER LO;correction\n0FD0;TIBETAN MARK BKA- SHOG GI MGO RGYAN;correction\n180B;FVS1;abbreviation\n180C;FVS2;abbreviation\n180D;FVS3;abbreviation\n180E;MVS;abbreviation\n200B;ZWSP;abbreviation\n200C;ZWNJ;abbreviation\n200D;ZWJ;abbreviation\n200E;LRM;abbreviation\n200F;RLM;abbreviation\n202A;LRE;abbreviation\n202B;RLE;abbreviation\n202C;PDF;abbreviation\n202D;LRO;abbreviation\n202E;RLO;abbreviation\n202F;NNBSP;abbreviation\n205F;MMSP;abbreviation\n2060;WJ;abbreviation\n2066;LRI;abbreviation\n2067;RLI;abbreviation\n2068;FSI;abbreviation\n2069;PDI;abbreviation\n2118;WEIERSTRASS ELLIPTIC FUNCTION;correction\n2448;MICR ON US SYMBOL;correction\n2449;MICR DASH SYMBOL;correction\n2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction\n2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE;correction\nA015;YI SYLLABLE ITERATION MARK;correction\nFE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET;correction\nFE00;VS1;abbreviation\nFE01;VS2;abbreviation\nFE02;VS3;abbreviation\nFE03;VS4;abbreviation\nFE04;VS5;abbreviation\nFE05;VS6;abbreviation\nFE06;VS7;abbreviation\nFE07;VS8;abbreviation\nFE08;VS9;abbreviation\nFE09;VS10;abbreviation\nFE0A;VS11;abbreviation\nFE0B;VS12;abbreviation\nFE0C;VS13;abbreviation\nFE0D;VS14;abbreviation\nFE0E;VS15;abbreviation\nFE0F;VS16;abbreviation\nFEFF;BYTE ORDER MARK;alternate\nFEFF;BOM;abbreviation\nFEFF;ZWNBSP;abbreviation\n122D4;CUNEIFORM SIGN NU11 TENU;correction\n122D5;CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR;correction\n1D0C5;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS;correction\nE0100;VS17;abbreviation\nE0101;VS18;abbreviation\nE0102;VS19;abbreviation\nE0103;VS20;abbreviation\nE0104;VS21;abbreviation\nE0105;VS22;abbreviation\nE0106;VS23;abbreviation\nE0107;VS24;abbreviation\nE0108;VS25;abbreviation\nE0109;VS26;abbreviation\nE010A;VS27;abbreviation\nE010B;VS28;abbreviation\nE010C;VS29;abbreviation\nE010D;VS30;abbreviation\nE010E;VS31;abbreviation\nE010F;VS32;abbreviation\nE0110;VS33;abbreviation\nE0111;VS34;abbreviation\nE0112;VS35;abbreviation\nE0113;VS36;abbreviation\nE0114;VS37;abbreviation\nE0115;VS38;abbreviation\nE0116;VS39;abbreviation\nE0117;VS40;abbreviation\nE0118;VS41;abbreviation\nE0119;VS42;abbreviation\nE011A;VS43;abbreviation\nE011B;VS44;abbreviation\nE011C;VS45;abbreviation\nE011D;VS46;abbreviation\nE011E;VS47;abbreviation\nE011F;VS48;abbreviation\nE0120;VS49;abbreviation\nE0121;VS50;abbreviation\nE0122;VS51;abbreviation\nE0123;VS52;abbreviation\nE0124;VS53;abbreviation\nE0125;VS54;abbreviation\nE0126;VS55;abbreviation\nE0127;VS56;abbreviation\nE0128;VS57;abbreviation\nE0129;VS58;abbreviation\nE012A;VS59;abbreviation\nE012B;VS60;abbreviation\nE012C;VS61;abbreviation\nE012D;VS62;abbreviation\nE012E;VS63;abbreviation\nE012F;VS64;abbreviation\nE0130;VS65;abbreviation\nE0131;VS66;abbreviation\nE0132;VS67;abbreviation\nE0133;VS68;abbreviation\nE0134;VS69;abbreviation\nE0135;VS70;abbreviation\nE0136;VS71;abbreviation\nE0137;VS72;abbreviation\nE0138;VS73;abbreviation\nE0139;VS74;abbreviation\nE013A;VS75;abbreviation\nE013B;VS76;abbreviation\nE013C;VS77;abbreviation\nE013D;VS78;abbreviation\nE013E;VS79;abbreviation\nE013F;VS80;abbreviation\nE0140;VS81;abbreviation\nE0141;VS82;abbreviation\nE0142;VS83;abbreviation\nE0143;VS84;abbreviation\nE0144;VS85;abbreviation\nE0145;VS86;abbreviation\nE0146;VS87;abbreviation\nE0147;VS88;abbreviation\nE0148;VS89;abbreviation\nE0149;VS90;abbreviation\nE014A;VS91;abbreviation\nE014B;VS92;abbreviation\nE014C;VS93;abbreviation\nE014D;VS94;abbreviation\nE014E;VS95;abbreviation\nE014F;VS96;abbreviation\nE0150;VS97;abbreviation\nE0151;VS98;abbreviation\nE0152;VS99;abbreviation\nE0153;VS100;abbreviation\nE0154;VS101;abbreviation\nE0155;VS102;abbreviation\nE0156;VS103;abbreviation\nE0157;VS104;abbreviation\nE0158;VS105;abbreviation\nE0159;VS106;abbreviation\nE015A;VS107;abbreviation\nE015B;VS108;abbreviation\nE015C;VS109;abbreviation\nE015D;VS110;abbreviation\nE015E;VS111;abbreviation\nE015F;VS112;abbreviation\nE0160;VS113;abbreviation\nE0161;VS114;abbreviation\nE0162;VS115;abbreviation\nE0163;VS116;abbreviation\nE0164;VS117;abbreviation\nE0165;VS118;abbreviation\nE0166;VS119;abbreviation\nE0167;VS120;abbreviation\nE0168;VS121;abbreviation\nE0169;VS122;abbreviation\nE016A;VS123;abbreviation\nE016B;VS124;abbreviation\nE016C;VS125;abbreviation\nE016D;VS126;abbreviation\nE016E;VS127;abbreviation\nE016F;VS128;abbreviation\nE0170;VS129;abbreviation\nE0171;VS130;abbreviation\nE0172;VS131;abbreviation\nE0173;VS132;abbreviation\nE0174;VS133;abbreviation\nE0175;VS134;abbreviation\nE0176;VS135;abbreviation\nE0177;VS136;abbreviation\nE0178;VS137;abbreviation\nE0179;VS138;abbreviation\nE017A;VS139;abbreviation\nE017B;VS140;abbreviation\nE017C;VS141;abbreviation\nE017D;VS142;abbreviation\nE017E;VS143;abbreviation\nE017F;VS144;abbreviation\nE0180;VS145;abbreviation\nE0181;VS146;abbreviation\nE0182;VS147;abbreviation\nE0183;VS148;abbreviation\nE0184;VS149;abbreviation\nE0185;VS150;abbreviation\nE0186;VS151;abbreviation\nE0187;VS152;abbreviation\nE0188;VS153;abbreviation\nE0189;VS154;abbreviation\nE018A;VS155;abbreviation\nE018B;VS156;abbreviation\nE018C;VS157;abbreviation\nE018D;VS158;abbreviation\nE018E;VS159;abbreviation\nE018F;VS160;abbreviation\nE0190;VS161;abbreviation\nE0191;VS162;abbreviation\nE0192;VS163;abbreviation\nE0193;VS164;abbreviation\nE0194;VS165;abbreviation\nE0195;VS166;abbreviation\nE0196;VS167;abbreviation\nE0197;VS168;abbreviation\nE0198;VS169;abbreviation\nE0199;VS170;abbreviation\nE019A;VS171;abbreviation\nE019B;VS172;abbreviation\nE019C;VS173;abbreviation\nE019D;VS174;abbreviation\nE019E;VS175;abbreviation\nE019F;VS176;abbreviation\nE01A0;VS177;abbreviation\nE01A1;VS178;abbreviation\nE01A2;VS179;abbreviation\nE01A3;VS180;abbreviation\nE01A4;VS181;abbreviation\nE01A5;VS182;abbreviation\nE01A6;VS183;abbreviation\nE01A7;VS184;abbreviation\nE01A8;VS185;abbreviation\nE01A9;VS186;abbreviation\nE01AA;VS187;abbreviation\nE01AB;VS188;abbreviation\nE01AC;VS189;abbreviation\nE01AD;VS190;abbreviation\nE01AE;VS191;abbreviation\nE01AF;VS192;abbreviation\nE01B0;VS193;abbreviation\nE01B1;VS194;abbreviation\nE01B2;VS195;abbreviation\nE01B3;VS196;abbreviation\nE01B4;VS197;abbreviation\nE01B5;VS198;abbreviation\nE01B6;VS199;abbreviation\nE01B7;VS200;abbreviation\nE01B8;VS201;abbreviation\nE01B9;VS202;abbreviation\nE01BA;VS203;abbreviation\nE01BB;VS204;abbreviation\nE01BC;VS205;abbreviation\nE01BD;VS206;abbreviation\nE01BE;VS207;abbreviation\nE01BF;VS208;abbreviation\nE01C0;VS209;abbreviation\nE01C1;VS210;abbreviation\nE01C2;VS211;abbreviation\nE01C3;VS212;abbreviation\nE01C4;VS213;abbreviation\nE01C5;VS214;abbreviation\nE01C6;VS215;abbreviation\nE01C7;VS216;abbreviation\nE01C8;VS217;abbreviation\nE01C9;VS218;abbreviation\nE01CA;VS219;abbreviation\nE01CB;VS220;abbreviation\nE01CC;VS221;abbreviation\nE01CD;VS222;abbreviation\nE01CE;VS223;abbreviation\nE01CF;VS224;abbreviation\nE01D0;VS225;abbreviation\nE01D1;VS226;abbreviation\nE01D2;VS227;abbreviation\nE01D3;VS228;abbreviation\nE01D4;VS229;abbreviation\nE01D5;VS230;abbreviation\nE01D6;VS231;abbreviation\nE01D7;VS232;abbreviation\nE01D8;VS233;abbreviation\nE01D9;VS234;abbreviation\nE01DA;VS235;abbreviation\nE01DB;VS236;abbreviation\nE01DC;VS237;abbreviation\nE01DD;VS238;abbreviation\nE01DE;VS239;abbreviation\nE01DF;VS240;abbreviation\nE01E0;VS241;abbreviation\nE01E1;VS242;abbreviation\nE01E2;VS243;abbreviation\nE01E3;VS244;abbreviation\nE01E4;VS245;abbreviation\nE01E5;VS246;abbreviation\nE01E6;VS247;abbreviation\nE01E7;VS248;abbreviation\nE01E8;VS249;abbreviation\nE01E9;VS250;abbreviation\nE01EA;VS251;abbreviation\nE01EB;VS252;abbreviation\nE01EC;VS253;abbreviation\nE01ED;VS254;abbreviation\nE01EE;VS255;abbreviation\nE01EF;VS256;abbreviation\n\n# EOF\n'''\n# }}}\n\nALIAS_MAP = (def ():\n    ans = {}\n    for line in DB.split('\\n'):\n        line = line.trim()\n        if not line or line[0] is '#':\n            continue\n        parts = line.split(';')\n        if parts.length >= 2:\n            code_point = parseInt(parts[0], 16)\n            if code_point is not undefined and parts[1]:\n                ans[parts[1].toLowerCase()] = code_point\n    return ans\n)()\n"
  },
  {
    "path": "src/utils.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __python__ import hash_literals\n\nhas_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty)\n\ndef array_to_hash(a):\n    ret = Object.create(None)\n    for i in range(len(a)):\n        ret[a[i]] = True\n    return ret\n\ndef slice(a, start):\n    return Array.prototype.slice.call(a, start or 0)\n\ndef characters(str_):\n    return str_.split(\"\")\n\ndef member(name, array):\n    for i in range(array.length-1, -1, -1):\n        if array[i] is name:\n            return True\n    return False\n\ndef repeat_string(str_, i):\n    if i <= 0:\n        return \"\"\n    if i is 1:\n        return str_\n    d = repeat_string(str_, i >> 1)\n    d += d\n    if i & 1:\n        d += str_\n    return d\n\nclass DefaultsError(ValueError):\n\n    def __init__(self, name, defs):\n        ValueError.__init__(self, name + ' is not a supported option. Supported options are: ' + str(Object.keys(defs)))\n\ndef defaults(args, defs, croak):\n    if args is True:\n        args = {}\n    ret = args or {}\n    if croak:\n        for i in ret:\n            if not has_prop(defs, i):\n                raise DefaultsError(i, defs)\n\n    for i in defs:\n        ret[i] = args[i] if args and has_prop(args, i) else defs[i]\n    return ret\n\ndef merge(obj, ext):\n    for i in ext:\n        obj[i] = ext[i]\n    return obj\n\ndef noop():\n    pass\n\nMAP = def():\n    def MAP(a, f, backwards):\n        ret = []\n        top = []\n\n        def doit():\n            val = f(a[i], i)\n            is_last = isinstance(val, Last)\n            if is_last:\n                val = val.v\n            if isinstance(val, AtTop):\n                val = val.v\n                if isinstance(val, Splice):\n                    top.push.apply(top, (val.v.slice().reverse() if backwards else val.v))\n                else:\n                    top.push(val)\n            elif val is not skip:\n                if isinstance(val, Splice):\n                    ret.push.apply(ret, (val.v.slice().reverse() if backwards else val.v))\n                else:\n                    ret.push(val)\n            return is_last\n\n        if Array.isArray(a):\n            if backwards:\n                for i in range(a.length-1, -1, -1):\n                    if doit():\n                        break\n                ret.reverse()\n                top.reverse()\n            else:\n                for i in range(len(a)):\n                    if doit():\n                        break\n        else:\n            for i in a:\n                if doit():\n                    break\n        return top.concat(ret)\n\n    MAP.at_top = def(val):\n        return new AtTop(val)\n    MAP.splice = def(val):\n        return new Splice(val)\n    MAP.last = def(val):\n        return new Last(val)\n\n    skip = MAP.skip = {}\n    def AtTop(val):\n        this.v = val\n\n    def Splice(val):\n        this.v = val\n\n    def Last(val):\n        this.v = val\n\n    return MAP\n.call(this)\n\ndef push_uniq(array, el):\n    if array.indexOf(el) < 0:\n        array.push(el)\n\ndef string_template(text, props):\n    return text.replace(/\\{(.+?)\\}/g, def(str_, p):\n        return props[p]\n    )\n\ndef remove(array, el):\n    for i in range(array.length-1, -1, -1):\n        if array[i] is el:\n            array.splice(i, 1)\n\ndef mergeSort(array, cmp):\n    if array.length < 2:\n        return array.slice()\n\n    def merge(a, b):\n        r = []\n        ai = 0\n        bi = 0\n        i = 0\n        while ai < a.length and bi < b.length:\n            if cmp(a[ai], b[bi]) <= 0:\n                r[i] = a[ai]\n                ai += 1\n            else:\n                r[i] = b[bi]\n                bi += 1\n            i += 1\n        if ai < a.length:\n            r.push.apply(r, a.slice(ai))\n        if bi < b.length:\n            r.push.apply(r, b.slice(bi))\n        return r\n\n    def _ms(a):\n        if a.length <= 1:\n            return a\n        m = Math.floor(a.length / 2)\n        left = a.slice(0, m)\n        right = a.slice(m)\n        left = _ms(left)\n        right = _ms(right)\n        return merge(left, right)\n    return _ms(array)\n\ndef set_difference(a, b):\n    return a.filter(def(el):\n        return b.indexOf(el) < 0\n    )\n\ndef set_intersection(a, b):\n    return a.filter(def(el):\n        return b.indexOf(el) >= 0\n    )\n\ndef make_predicate(words):\n    if jstype(words) is 'string':\n        words = words.split(\" \")\n    a = Object.create(None)\n    for k in words:\n        a[k] = True\n    return a\n\ndef cache_file_name(src, cache_dir):\n    if cache_dir:\n        src = str.replace(src, '\\\\', '/')\n        return cache_dir + '/' + str.lstrip(str.replace(src, '/', '-') + '.json', '-')\n    return src + '-cached'\n"
  },
  {
    "path": "test/_import_one.pyj",
    "content": "# vim:fileencoding=utf-8\nnonlocal GLOBAL_SYMBOL\n\n'Module level ds1'\n\ndef toplevel_func(a):\n    return a + 'toplevel'\n\n'''\nModule level ds2\nline2\n'''\n\nclass TopLevel:\n\n    def __init__(self, a):\n        self.a = a\n\n'Module level ds 3'\n\nclass AClass(TopLevel):\n\n    def __init__(self, a):\n        self.a = a\n\ntoplevel_var = 'foo'\n\nif True:\n    true_var = 'true'\nelse:\n    false_var = 'false'\n\nGLOBAL_SYMBOL = 'i am global'\n\nfrom _import_two.other import other\n\ntest_other = other\n"
  },
  {
    "path": "test/_import_two/__init__.pyj",
    "content": "# vim:fileencoding=utf-8\n\ndef toplevel_func2(a):\n    return a + 'toplevel2'\n\nclass TopLevel2:\n\n    def __init__(self, a):\n        self.a = a\n\ntoplevel_var2 = 'foo2'\n"
  },
  {
    "path": "test/_import_two/level2/__init__.pyj",
    "content": ""
  },
  {
    "path": "test/_import_two/level2/deep.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\ndeep_var = 'deep'\n"
  },
  {
    "path": "test/_import_two/other.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\nother = 'other'\n\n"
  },
  {
    "path": "test/_import_two/sub.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\nsub_var = 'sub'\n\ndef sub_func():\n    return sub_var\n\nclass Sub:\n\n    def __init__(self, a):\n        self.a = a\n"
  },
  {
    "path": "test/aes_vectors.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\nfrom aes import CBC, CTR, GCM, generate_tag, as_hex, AES, string_to_bytes, random_bytes\n\ndef from_hex(text):\n    text = str.replace(text, ' ', '')\n    ans = Uint8Array(text.length // 2)\n    for i in range(ans.length):\n        ans[i] = int(text[2*i:2*i+2], 16)\n    return ans\n\ndef from32(ints):\n    ans = Uint8Array(ints.length * 4)\n    for i, num in enumerate(ints):\n        off = i*4\n        ans[off] = (num & 0xff000000) >> 24\n        ans[off+1] = (num & 0x00ff0000) >> 16\n        ans[off+2] = (num & 0x0000ff00) >> 8\n        ans[off+3] = num & 0x000000ff\n    return ans\n\ndef rungcm(keys, ivs, inputs, adatas, outputs, tags):\n    for i in range(keys.length):\n        iv = from_hex(ivs[i])\n        gcm = GCM(from_hex(keys[i]))\n        inputbytes = from_hex(inputs[i])\n        outputbytes = from_hex(outputs[i])\n        adata = from_hex(adatas[i])\n        ans = gcm._crypt(iv, inputbytes, adata, False)\n        assrt.equal(as_hex(ans.cipherbytes), outputs[i])\n        assrt.equal(as_hex(ans.tag), tags[i])\n        ans = gcm._crypt(iv, outputbytes, adata, True)\n        assrt.equal(as_hex(ans.cipherbytes), inputs[i])\n        assrt.equal(as_hex(ans.tag), tags[i])\n\ndef run_tests():\n    # Test basic AES {{{\n    k1 = '000102030405060708090a0b0c0d0e0f'\n    k2 = k1 + '1011121314151617'\n    k3 = k2 + '18191a1b1c1d1e1f'\n    b = [0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff]\n\n    for data in [\n        (b, k1, '69c4e0d86a7b0430d8cdb78070b4c55a', False),\n        ([0x69c4e0d8, 0x6a7b0430, 0xd8cdb780, 0x70b4c55a], k1, '00112233445566778899aabbccddeeff', True),\n        (b, k2, 'dda97ca4864cdfe06eaf70a0ec0d7191', False),\n        ([0xdda97ca4, 0x864cdfe0, 0x6eaf70a0, 0xec0d7191], k2, '00112233445566778899aabbccddeeff', True),\n        (b, k3, '8ea2b7ca516745bfeafc49904b496089', False),\n        ([0x8ea2b7ca, 0x516745bf, 0xeafc4990, 0x4b496089], k3, '00112233445566778899aabbccddeeff', True),\n    ]:\n        block, key, expected, decrypt = data\n        aes = AES(from_hex(key))\n        output = Uint8Array(block.length * 4)\n        aes.decrypt32(block, output, 0) if decrypt else aes.encrypt32(block, output, 0)\n        assrt.equal(expected, as_hex(output))\n\n    # Test AES-CBC\n    keys = [\n         '06a9214036b8a15b512e03d534120006',\n         'c286696d887c9aa0611bbb3e2025a45a',\n         '6c3ea0477630ce21a2ce334aa746c2cd',\n         '56e47a38c5598974bc46903dba290349'\n      ]\n\n    ivs = [\n         '3dafba429d9eb430b422da802c9fac41',\n         '562e17996d093d28ddb3ba695a2e6f58',\n         'c782dc4c098c66cbd9cd27d825682c81',\n         '8ce82eefbea0da3c44699ed7db51b7d9'\n      ]\n\n    inputs = [\n        'Single block msg',\n        '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',\n        'This is a 48-byte message (exactly 3 AES blocks)',\n        'a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf'\n    ]\n\n    outputs = [\n        'e353779c1079aeb82708942dbe77181a',\n        'd296cd94c2cccf8a3a863028b5e1dc0a7586602d253cfff91b8266bea6d61ab1',\n        'd0a02b3836451753d493665d33f0e8862dea54cdb293abc7506939276772f8d5021c19216bad525c8579695d83ba2684',\n        'c30e32ffedc0774e6aff6af0869f71aa0f3af07a9a31a9c684db207eb0ef8e4e35907aa632c3ffdf868bb7b29d3d46ad83ce9f9a102ee99d49a53e87f4c3da55'\n    ]\n    for i in range(keys.length):\n        cbc = CBC(from_hex(keys[i]))\n        x = inputs[i]\n        inputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)\n        x = outputs[i]\n        outputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)\n        iv = from_hex(ivs[i])\n        ans = cbc.encrypt_bytes(inputbytes, [], iv)\n        assrt.equal(as_hex(ans.cipherbytes), outputs[i])\n        ans = cbc.decrypt_bytes(outputbytes, [], iv)\n        assrt.equal(as_hex(ans), as_hex(inputbytes))\n    # }}}\n\n    # Test AES-CTR {{{\n    keys = [\n         '00000000000000000000000000000000',\n         '2b7e151628aed2a6abf7158809cf4f3c'\n    ]\n\n    ivs = [\n         '650cdb80ff9fc758342d2bd99ee2abcf',\n         'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'\n    ]\n\n    inputs = [\n         'This is a 48-byte message (exactly 3 AES blocks)',\n         '6bc1bee22e409f96e93d7e117393172a' 'ae2d8a571e03ac9c9eb76fac45af8e51' '30c81c46a35ce411e5fbc1191a0a52ef' 'f69f2445df4f9b17ad2b417be66c3710'\n    ]\n\n    outputs = [\n         '5ede11d00e9a76ec1d5e7e811ea3dd1c' 'e09ee941210f825d35718d3282796f1c' '07c3f1cb424f2b365766ab5229f5b5a4',\n         '874d6191b620e3261bef6864990db6ce' '9806f66b7970fdff8617187bb9fffdff' '5ae4df3edbd5d35e5b4f09020db03eab' '1e031dda2fbe03d1792170a0f3009cee'\n    ]\n\n    for i in range(keys.length):\n        iv = from_hex(ivs[i])\n        ctr = CTR(from_hex(keys[i]), iv)\n        x = inputs[i]\n        inputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)\n        x = outputs[i]\n        outputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)\n        temp = Uint8Array(inputbytes)\n        ctr._crypt(temp)\n        assrt.equal(as_hex(temp), outputs[i])\n    # }}}\n\n    # Test AES-GCM {{{\n    keys = [\n        '00000000000000000000000000000000',\n        '00000000000000000000000000000000',\n        'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308',\n        '00000000000000000000000000000000'\n      ]\n\n    ivs = [\n        '000000000000000000000000',\n        '000000000000000000000000',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbad',\n        '9313225df88406e555909c5aff5269aa' + '6a7a9538534f7da1e4c303d2a318a728' + 'c3c0c95156809539fcf0e2429a6b5254' + '16aedbf5a0de6a57a637b39b',\n        '000000000000000000000000'\n      ]\n\n    adatas = [\n        '',\n        '',\n        '',\n        'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',\n        ''\n      ]\n\n    inputs = [\n        '',\n        '00000000000000000000000000000000',\n        'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b391aafd255',\n        'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',\n        '0000'\n      ]\n\n    outputs = [\n        '',\n        '0388dace60b6a392f328c2b971b2fe78',\n        '42831ec2217774244b7221b784d0d49c' + 'e3aa212f2c02a4e035c17e2329aca12e' + '21d514b25466931c7d8f6a5aac84aa05' + '1ba30b396a0aac973d58e091473f5985',\n        '42831ec2217774244b7221b784d0d49c' + 'e3aa212f2c02a4e035c17e2329aca12e' + '21d514b25466931c7d8f6a5aac84aa05' + '1ba30b396a0aac973d58e091',\n        '61353b4c2806934a777ff51fa22a4755' + '699b2a714fcdc6f83766e5f97b6c7423' + '73806900e49f24b22b097544d4896b42' + '4989b5e1ebac0f07c23f4598',\n        '8ce24998625615b603a033aca13fb894' + 'be9112a5c3a211a8ba262a3cca7e2ca7' + '01e4a9a4fba43c90ccdcb281d48c7c6f' + 'd62875d2aca417034c34aee5',\n        '0388'\n      ]\n\n    tags = [\n        '58e2fccefa7e3061367f1d57a4e7455a',\n        'ab6e47d42cec13bdf53a67b21257bddf',\n        '4d5c2af327cd64a62cf35abd2ba6fab4',\n        '5bc94fbc3221a5db94fae95ae7121a47',\n        '3612d2e79e3b0785561be14aaca2fccb',\n        '619cc5aefffe0bfa462af43c1699d050',\n        '93dcdd26f79ec1dd9bff57204d9b33f5'\n    ]\n    rungcm(keys, ivs, inputs, adatas, outputs, tags)\n\n    keys = [\n        '00000000000000000000000000000000' +\n          '0000000000000000',\n        '00000000000000000000000000000000' +\n          '0000000000000000',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c'\n    ]\n\n    ivs = [\n        '000000000000000000000000',\n        '000000000000000000000000',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbad',\n        '9313225df88406e555909c5aff5269aa' +\n          '6a7a9538534f7da1e4c303d2a318a728' +\n          'c3c0c95156809539fcf0e2429a6b5254' +\n          '16aedbf5a0de6a57a637b39b'\n    ]\n\n    adatas = [\n        '',\n        '',\n        '',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2'\n    ]\n\n    inputs = [\n        '',\n        '00000000000000000000000000000000',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b391aafd255',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39'\n    ]\n\n    outputs = [\n        '',\n        '98e7247c07f0fe411c267e4384b0f600',\n        '3980ca0b3c00e841eb06fac4872a2757' +\n          '859e1ceaa6efd984628593b40ca1e19c' +\n          '7d773d00c144c525ac619d18c84a3f47' +\n          '18e2448b2fe324d9ccda2710acade256',\n        '3980ca0b3c00e841eb06fac4872a2757' +\n          '859e1ceaa6efd984628593b40ca1e19c' +\n          '7d773d00c144c525ac619d18c84a3f47' +\n          '18e2448b2fe324d9ccda2710',\n        '0f10f599ae14a154ed24b36e25324db8' +\n          'c566632ef2bbb34f8347280fc4507057' +\n          'fddc29df9a471f75c66541d4d4dad1c9' +\n          'e93a19a58e8b473fa0f062f7',\n        'd27e88681ce3243c4830165a8fdcf9ff' +\n          '1de9a1d8e6b447ef6ef7b79828666e45' +\n          '81e79012af34ddd9e2f037589b292db3' +\n          'e67c036745fa22e7e9b7373b'\n    ]\n\n    tags = [\n        'cd33b28ac773f74ba00ed1f312572435',\n        '2ff58d80033927ab8ef4d4587514f0fb',\n        '9924a7c8587336bfb118024db8674a14',\n        '2519498e80f1478f37ba55bd6d27618c',\n        '65dcc57fcf623a24094fcca40d3533f8',\n        'dcf566ff291c25bbb8568fc3d376a6d9'\n    ]\n    rungcm(keys, ivs, inputs, adatas, outputs, tags)\n\n    keys = [\n        '00000000000000000000000000000000' +\n          '00000000000000000000000000000000',\n        '00000000000000000000000000000000' +\n          '00000000000000000000000000000000',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c6d6a8f9467308308',\n        'feffe9928665731c6d6a8f9467308308' +\n          'feffe9928665731c6d6a8f9467308308'\n    ]\n\n    ivs = [\n        '000000000000000000000000',\n        '000000000000000000000000',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbaddecaf888',\n        'cafebabefacedbad',\n        '9313225df88406e555909c5aff5269aa' +\n          '6a7a9538534f7da1e4c303d2a318a728' +\n          'c3c0c95156809539fcf0e2429a6b5254' +\n          '16aedbf5a0de6a57a637b39b'\n    ]\n\n    adatas = [\n        '',\n        '',\n        '',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2',\n        'feedfacedeadbeeffeedfacedeadbeef' +\n          'abaddad2'\n    ]\n\n    inputs = [\n        '',\n        '00000000000000000000000000000000',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b391aafd255',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39',\n        'd9313225f88406e5a55909c5aff5269a' +\n          '86a7a9531534f7da2e4c303d8a318a72' +\n          '1c3c0c95956809532fcf0e2449a6b525' +\n          'b16aedf5aa0de657ba637b39'\n    ]\n\n    outputs = [\n        '',\n        'cea7403d4d606b6e074ec5d3baf39d18',\n        '522dc1f099567d07f47f37a32a84427d' +\n          '643a8cdcbfe5c0c97598a2bd2555d1aa' +\n          '8cb08e48590dbb3da7b08b1056828838' +\n          'c5f61e6393ba7a0abcc9f662898015ad',\n        '522dc1f099567d07f47f37a32a84427d' +\n          '643a8cdcbfe5c0c97598a2bd2555d1aa' +\n          '8cb08e48590dbb3da7b08b1056828838' +\n          'c5f61e6393ba7a0abcc9f662',\n        'c3762df1ca787d32ae47c13bf19844cb' +\n          'af1ae14d0b976afac52ff7d79bba9de0' +\n          'feb582d33934a4f0954cc2363bc73f78' +\n          '62ac430e64abe499f47c9b1f',\n        '5a8def2f0c9e53f1f75d7853659e2a20' +\n          'eeb2b22aafde6419a058ab4f6f746bf4' +\n          '0fc0c3b780f244452da3ebf1c5d82cde' +\n          'a2418997200ef82e44ae7e3f'\n    ]\n\n    tags = [\n        '530f8afbc74536b9a963b4f1c4cb738b',\n        'd0d1c8a799996bf0265b98b5d48ab919',\n        'b094dac5d93471bdec1a502270e3cc6c',\n        '76fc6ece0f4e1768cddf8853bb2d551b',\n        '3a337dbf46a792c45e454913fe2ea8f2',\n        'a44a8266ee1c8eb0c8b5d4cf5ae9f19a'\n    ]\n    rungcm(keys, ivs, inputs, adatas, outputs, tags)\n\n    # Test that IVs do not repeat (they are incrementing)\n    gcm = GCM(random_bytes(16))\n    for i in range(5):\n        iv = gcm.encrypt(str(i)).iv\n        assrt.equal(iv[11], i+1)\n        for j in range(10):\n            assrt.equal(iv[j], 0)\n    # Test that iv rollover is not allowed\n    gcm.current_iv.fill(255)\n    assrt.throws(def(): gcm.encrypt('iv over');)\n\n    # }}}\n\n    # Test roundtripping {{{\n\n    text = 'testing a basic roundtrip ø̄ū'\n\n    cbc = CBC()\n    crypted = cbc.encrypt(text)\n    decrypted = cbc.decrypt(crypted)\n    assrt.equal(text, decrypted)\n    secret_tag = generate_tag()\n    crypted = cbc.encrypt(text, secret_tag)\n    decrypted = cbc.decrypt(crypted, secret_tag)\n    assrt.equal(text, decrypted)\n\n    ctr = CTR()\n    crypted = ctr.encrypt(text)\n    decrypted = ctr.decrypt(crypted)\n    assrt.equal(text, decrypted)\n    crypted = ctr.encrypt(text, secret_tag)\n    decrypted = ctr.decrypt(crypted, secret_tag)\n    assrt.equal(text, decrypted)\n\n    gcm = GCM()\n    crypted = gcm.encrypt(text)\n    decrypted = gcm.decrypt(crypted)\n    assrt.equal(text, decrypted)\n    crypted = gcm.encrypt(text, secret_tag)\n    decrypted = gcm.decrypt(crypted, secret_tag)\n    assrt.equal(text, decrypted)\n\n    assrt.ok(equals(from_hex('69c4e0d86a7b0430d8cdb78070b4c55a'), from32([0x69c4e0d8, 0x6a7b0430, 0xd8cdb780, 0x70b4c55a])))\n    # }}}\n\nrun_tests()\n"
  },
  {
    "path": "test/annotations.pyj",
    "content": "def add(a: int, b: float):\n    return a + b\n\nassrt.ok(add.__annotations__)\nassrt.equal(add.__annotations__['a'], int)\nassrt.equal(add.__annotations__['b'], float)\nassrt.equal(add.__annotations__['return'], undefined)\n\ndef sum(ls: list) -> int:\n    pass\n\nassrt.ok(not (sum.__annotations__ == undefined))\nassrt.deepEqual(sum.__annotations__, {\n    'ls': list,\n    'return': int\n})\n\ndef optional(a:int=10):\n    return a\n\nassrt.ok(not (optional.__annotations__ == undefined))\nassrt.equal(optional.__annotations__.a, int)\nassrt.equal(optional.__defaults__.a, 10)\n\ndef otherexpr(a:3+4) -> [1, 2]:\n    pass\n\nassrt.ok(not (otherexpr.__annotations__ == undefined))\nassrt.equal(otherexpr.__annotations__['a'], 7)\nassrt.deepEqual(otherexpr.__annotations__['return'], [1, 2])\n\ndef basic(x:float):\n    pass\n\nassrt.deepEqual(basic.__annotations__, {\n    'x': float\n})\n\ndef kwstarargs(*args:list, **kwargs:dict) -> int:\n    pass\n\nassrt.equal(kwstarargs.__annotations__['return'], int)\n\ndef nothing():\n    pass\n\nassrt.ok(nothing.__annotations__ == undefined)\nassrt.throws(def():\n    nothing.__annotations__['return']\n)\n\ntest = def(x: int):\n    pass\n\nassrt.deepEqual(test.__annotations__, {\n    'x': int\n})\n\nanonreturn = def() -> 'test':\n    pass\n\nassrt.equal(anonreturn.__annotations__['return'], 'test')\n\nassrt.equal(def asexpr(a: int):\n    a\n.__annotations__['a'], int)\n\nassrt.deepEqual(def(a: int) -> float:\n    a + 10.0\n.__annotations__, {\n    'a': int,\n    'return': float\n})\n\nclass A:\n\n    def f(self, a : int, b: 'x') -> float:\n        pass\n\nassrt.deepEqual(A.prototype.f.__annotations__, {'a':int, 'b':'x', 'return': float})\n"
  },
  {
    "path": "test/baselib.pyj",
    "content": "# vim:fileencoding=utf-8\n# globals: ρσ_iterator_symbol, ρσ_set_polyfill, ρσ_dict_polyfill, assrt\nnonlocal ρσ_set_implementation, ρσ_dict_implementation\n\nclass CustomIterable:\n\n    def __init__(self, items):\n        self.items = items\n\n    def __iter__(self):\n        return iter(self.items)\n\nt = []\nq = [1,2,3]\nfor x in CustomIterable(q):\n    t.push(x)\nassrt.deepEqual(q, t)\n\nassrt.deepEqual(['a', 'b'], list('ab'))\nassrt.ok(q is not list(q))\nassrt.deepEqual(q, list(q))\nassrt.ok(isinstance([], (String, list)))\nassrt.ok(isinstance(1, int))\nassrt.ok(not isinstance(v'new Number(1)', int))\nassrt.ok(not isinstance(1.1, int))\nassrt.ok(isinstance(1.1, float))\nassrt.ok(not isinstance(v'new Number(1.1)', float))\nm = Map()\nm.set('a', 1)\nassrt.equal(len(m), 1)\ns = set()\ns.add(1)\ns.add(2)\nassrt.equal(len(s), 2)\nassrt.deepEqual(list(s), [1, 2])\nassrt.deepEqual(s, {1, 2})\n\nassrt.equal(chr(ord('a')), 'a')\nassrt.equal(chr(ord('🐱')), '🐱')\nassrt.equal(bin(3), '0b11')\nassrt.equal(bin(-3), '-0b11')\nassrt.equal(hex(10), '0xa')\nassrt.equal(hex(-10), '-0xa')\nt = []\nfor i in s:\n    t.push(i)\nassrt.deepEqual(t, [1, 2])\n\nt = []\nfor i in m:\n    t.push(i)\nassrt.deepEqual(t, ['a'])\nt = []\nfor c, i in enumerate(m):\n    t.push([c, i])\nassrt.deepEqual(t, [[0, 'a']])\nassrt.deepEqual(['y', 'x'], [x for x in reversed('xy')])\n\n# Test that the iterator created by iter() is itself iterable\nassrt.deepEqual(s, set(iter(s)))\n\n# Test list index/remove/in use the same notion of equality\na = [1, 2]\nb = [list(a), 3, 4]\nassrt.ok(a in b)\nassrt.equal(b.index(a), 0)\nb.remove(a)\nassrt.equal(len(b), 2)\n\nassrt.ok('a' in m)\nassrt.ok(1 in s)\nassrt.ok('1' not in s)\n\n# getattr()\na = {'x':2}\nassrt.equal(getattr(a, 'x'), 2)\nassrt.equal(getattr(a, 'x', 1), 2)\nassrt.equal(getattr(a, 'y', 1), 1)\nassrt.throws(def():getattr(a, 'y');, AttributeError)\n\n# int()/float()\nassrt.equal(int('a', 16), 10)\nassrt.throws(def ():int('a');, ValueError)\nassrt.equal(float('10.3'), 10.3)\nassrt.throws(def ():float('a');, ValueError)\nassrt.equal(int(2*1e-7), 0)\nassrt.equal(int(10*1e-7), 0)\nassrt.equal(float(3*1e-7), 3e-7)\n\n# sum()\nassrt.equal(6, sum([1, 2, 3]))\nassrt.equal(6, sum(iter([1, 2, 3])))\nassrt.equal(5, sum([1, 2, 3], -1))\nassrt.equal(5, sum(iter([1, 2, 3]), -1))\n\n# map()/filter()/zip()\nassrt.deepEqual(list(map(def(a):return a*2;, [1, 2])), [2, 4])\nassrt.deepEqual(list(map(def(a):return a*2;, iter([1, 2]))), [2, 4])\nassrt.deepEqual(list(filter(def(a):return a > 1;, [1, 2])), [2])\nassrt.deepEqual(list(filter(def(a):return a > 1;, iter([1, 2]))), [2])\nassrt.deepEqual(list(zip([1,2], [3,4])), [[1,3], [2, 4]])\n\n# lists\na = [1, 2]\na.extend([3, 4])\nassrt.deepEqual(a, [1,2,3,4])\nassrt.ok(a == [1,2,3,4])\ns = set([5, 6])\na.extend(s)\nassrt.deepEqual(a, [1,2,3,4,5,6])\na.extend('12')\nassrt.deepEqual(a, [1,2,3,4,5,6,'1','2'])\na = [1,2,3,4]\nfor index, val in [[0, 1], [1, 2], [3, 4]]:\n    assrt.equal(a.index(val), index)\nassrt.throws(def():a.index(8);, ValueError)\nassrt.throws(def():a.index(1, 1);, ValueError)\nassrt.throws(def():a.index(4, 1, 2);, ValueError)\nassrt.equal(1, a.index(2, 1, 2))\nassrt.throws(def():a.pypop(10);, IndexError)\nassrt.equal(a.pypop(-1), 4)\nassrt.deepEqual(a, [1,2,3])\nassrt.equal(a.remove(2), None)\nassrt.deepEqual(a, [1, 3])\nassrt.throws(def():a.remove(2);, ValueError)\na = [1,2]\na.insert(0, 0)\nassrt.deepEqual(a, [0, 1, 2])\na.insert(-1, 3)\nassrt.deepEqual(a, [0, 1, 3, 2])\na.insert(a.length, 6)\nassrt.deepEqual(a, [0, 1, 3, 2, 6])\nassrt.deepEqual(a.copy(), a)\nassrt.ok(a is not a.copy())\nassrt.ok(a.copy().extend is not undefined)\na.clear()\nassrt.equal(a.length, 0)\nassrt.deepEqual(a.as_array(), a)\nassrt.ok(a is not a.as_array())\nassrt.ok(a.as_array().extend == undefined)\na = [1, 2, 1]\nassrt.equal(a.count(1), 2)\na = [3, 2, 4, 1]\na.pysort()\nassrt.deepEqual(a, [1,2,3,4])\na.pysort(reverse=True)\nassrt.deepEqual(a, [4,3,2,1])\nassrt.deepEqual(a, a.slice())\nassrt.ok(a is not a.slice())\nassrt.ok(a.slice().extend is not undefined)\nassrt.deepEqual(a, a.concat())\nassrt.ok(a is not a.concat())\nassrt.ok(a.concat().extend is not undefined)\nassrt.deepEqual(list(a[ρσ_iterator_symbol]()), a)\nassrt.equal(a.length, a.__len__())\nassrt.equal(a.length, len(a))\nassrt.ok(a.__contains__(a[0]))\nassrt.ok([x for x in [1]].extend is not undefined)\n\nclass C:\n    def __contains__(self, x):\n        return x == 1\nassrt.ok(1 in C())\nassrt.ok(2 not in C())\n\n# sets\ndef test_sets():\n    a = set([1, 2, 3])\n    assrt.ok(isinstance(a, set))\n    assrt.ok(a.has(1))\n    assrt.ok(not a.has(9))\n    assrt.deepEqual(a, {1,2,3})\n    assrt.ok(len(a) == 3)\n    assrt.ok(a.length == 3)\n    assrt.ok(a.size == 3)\n    assrt.ok(not a.has('1'))\n    x = a.copy()\n    assrt.deepEqual(a, x)\n    assrt.ok(a is not x)\n    b, c = {}, {}\n    a.add(b)\n    assrt.ok(b in a)\n    assrt.ok(c not in a)\n    assrt.ok(None not in a)\n    a.add(None)\n    assrt.ok(None in a)\n    a.discard(None)\n    assrt.ok(None not in a)\n    a.clear()\n    assrt.ok(a.length == 0)\n    assrt.deepEqual({1,2,3}.difference({2}, {3}), {1})\n    a = {1, 2, 3}\n    a.difference_update({2}, {3})\n    assrt.deepEqual(a, {1})\n    assrt.deepEqual({1,2,3}.intersection({2, 3}, {3}), {3})\n    a = {1, 2, 3}\n    a.intersection_update({2, 3}, {3})\n    assrt.deepEqual(a, {3})\n    assrt.ok({1}.isdisjoint({2}))\n    assrt.ok(not {1}.isdisjoint({1}))\n    assrt.ok({1}.issubset({1, 2}))\n    assrt.ok({1}.issubset({1}))\n    assrt.ok(not {1}.issubset({2}))\n    assrt.ok({1, 2}.issuperset({1, 2}))\n    assrt.ok({1, 2}.issuperset({1}))\n    assrt.ok(not {1}.issuperset({2}))\n    a = set()\n    assrt.throws(def():a.pop();, KeyError)\n    assrt.equal({1}.pop(), 1)\n    assrt.throws(def ():a.remove(1);, KeyError)\n    a = {1}\n    a.remove(1)\n    assrt.equal(a.length, 0)\n    assrt.deepEqual({1,2,3}.symmetric_difference({2, 3, 4}), {1, 4})\n    a = {1, 2, 3}\n    a.symmetric_difference_update({2, 3, 4})\n    assrt.deepEqual(a, {1, 4})\n    assrt.deepEqual({1,2}.union({3, 4}, {1, 5}), {1, 2, 3, 4, 5})\n    a = {1}\n    a.update({1, 2})\n    assrt.deepEqual(a, {1, 2})\n\ntest_sets()\nρσ_set_implementation = ρσ_set_polyfill  # noqa:undef\ntest_sets()\nρσ_set_implementation = Set\n\ndef test_dicts():\n    from __python__ import dict_literals, overload_getitem\n    assrt.deepEqual({1:1, 2:2}, {1:1, 2:2})\n    a = {1:1, 2:2}\n    assrt.ok(isinstance(a, dict))\n    assrt.ok(1 in a), assrt.ok(3 not in a), assrt.ok('1' not in a)\n    assrt.deepEqual(set(a), {1, 2})\n    assrt.ok(set(a) == {1, 2})\n    assrt.equal({1:2}[1], 2)\n    assrt.throws(def():a['1'];, KeyError)\n    assrt.equal(a.length, 2), assrt.equal(len(a), 2)\n    assrt.equal(a[1], 1)\n    a[1] = 3\n    assrt.equal(a[1], 3)\n    assrt.ok(a is not a.copy()), assrt.deepEqual(a, a.copy())\n    a.clear()\n    assrt.equal(a.length, 0), assrt.deepEqual(list(a), [])\n    a[1] = a[2] = 19\n    assrt.deepEqual(a, {1:19, 2:19})\n    assrt.deepEqual(set({1:9, 2:8}.keys()), {1, 2})\n    assrt.deepEqual(set({1:9, 2:8}.values()), {8, 9})\n    items = [list_wrap(x) for x in {1:9, 2:8}.items()]\n    items.sort()\n    assrt.deepEqual(items, [[1,9], [2, 8]])\n    a = {1:1, 2:2}\n    assrt.equal(a.get(1), 1), assrt.equal(a.get(3), None)\n    assrt.equal(a.setdefault(2, 2), 2)\n    assrt.equal(a.setdefault(3, 3), 3), assrt.equal(a[3], 3)\n    assrt.deepEqual(dict.fromkeys([1, 2], 3), {1:3, 2:3})\n    a = {1:3, 2:3}\n    assrt.equal(a.pop(2, 2), 3), assrt.equal(a.pop(2, 2), 2)\n    assrt.throws(def(): a.pop(2);, KeyError)\n    assrt.deepEqual(a.popitem(), v'[1, 3]')\n    assrt.throws(def():a.popitem();, KeyError)\n    a = {1:1}\n    a.update({2:2, 1:3})\n    assrt.deepEqual(a, {1:3, 2:2})\n\ntest_dicts()\nρσ_dict_implementation = ρσ_dict_polyfill  # noqa:undef\ntest_dicts()\nρσ_dict_implementation = Map\n\n\na = {1:1}\nb = None\nassrt.equal(a == b, False)\nassrt.equal(b == a, False)\n\na, b = range(1111111111)\nassrt.equal(a, 0)\nassrt.equal(b, 1)\nassrt.equal(len(range(10)), 10)\nassrt.equal(str(range(10)), 'range(0, 10, 1)')\n\nassrt.deepEqual(divmod(7, 3), [2, 1])\nassrt.deepEqual(divmod(-7, 3), [-3, 2])\nassrt.deepEqual(divmod(-7, -3), [2, -1])\nassrt.deepEqual(divmod(7, -3), [-3, -2])\nassrt.throws(def():divmod(1, 0);, ZeroDivisionError)\n\n\nassrt.equal(1, min(1, 2))\nassrt.equal(2, max(1, 2))\nassrt.equal(2, max(range(3)))\nassrt.equal(0, min(range(3)))\nassrt.equal(0, min([0, 1, 2]))\nassrt.equal(2, max([0, 1, 2]))\nassrt.throws(def(): min();, TypeError)\nassrt.throws(def(): max([]);, TypeError)\nassrt.equal(9, max(defval=9))\nassrt.equal(9, max([], defval=9))\nassrt.equal(1, max([{'k':0}, {'k':1}], key=def(x): return x.k;))\n"
  },
  {
    "path": "test/classes.pyj",
    "content": "# globals: assrt\n\n# empty classes are allowed\nclass Blank:\n    pass\nblank = Blank()\nassrt.ok(isinstance(blank, Blank))\n\n# basic class\nclass Human:\n\n    HAIRS = 23\n\n    def __init__(self, name):\n        self.name = name\n\n    def greet(self):\n        return \"Hello, I'm \" + self.name\n\n    @staticmethod\n    def getTypicalWeight():\n        return \"150\"\n\n    @staticmethod\n    def with_arg(x):\n        return x\n\n\n# don't have to declare __init__, it either gets inherited or stays empty\n# isinstance correctly sees inheritance\nclass Friend(Human):\n    def greet(self):\n        return \"Yo, it's me, \" + self.name\n\n    def nickname(self, name):\n        self.name = name\n\n# __init__ doesn't have to come first\n# can call methods of other classes\nclass OldFriend(Friend):\n    def how_long(self):\n        return \"I've known you for \" + self.duration + \" years\"\n    def get_bound_method(self):\n        return self.how_long.bind(self)\n    def __init__(self, name, duration):\n        self.duration = duration\n        Friend.__init__(self, name)\n\nbob = Human(\"Bob\")\nassrt.equal(bob.greet(), \"Hello, I'm Bob\")\nassrt.equal(Human.greet(bob), \"Hello, I'm Bob\")\nassrt.equal(Human.getTypicalWeight(), \"150\") # static method recognition\nassrt.equal(Human.with_arg(3), 3) # static method with arg\nassrt.equal(Human.HAIRS, 23)\n\njoe = Friend(\"Joe\")\nassrt.equal(joe.greet(), \"Yo, it's me, Joe\")\nassrt.ok(isinstance(joe, Friend))\nassrt.ok(isinstance(joe, Human))\n\nangela = OldFriend(\"Angela\", 8)\nassrt.equal(angela.greet(), \"Yo, it's me, Angela\")\nassrt.equal(angela.how_long(), \"I've known you for 8 years\")\n\n# test that function stays bound\nbound = angela.get_bound_method()\nassrt.equal(bound(), angela.how_long())\n\n# function methods\nassrt.deepEqual(dir(angela).sort(), [\n    'HAIRS',\n    \"__init__\",\n    '__repr__',\n    '__str__',\n    \"constructor\",\n    \"duration\",\n    \"get_bound_method\",\n    \"greet\",\n    \"how_long\",\n    \"name\",\n    \"nickname\",\n])\n\n# test that binding works in relation to the actual class, not the parent\nangela.nickname(\"Angie\")\nassrt.equal(angela.greet(), \"Yo, it's me, Angie\")\n\ndude = None\n(def fake_module():\n    # test that we can declare classes inside other blocks\n    # test that we can call methods of classes we didn't inherit from\n    nonlocal dude\n    class Stranger(Human):\n        def greet(self):\n            return Friend.greet(self)\n    dude = Stranger(\"some guy\")\n)()\nassrt.equal(dude.greet(), \"Yo, it's me, some guy\")\n# also test that classes declared this way are not globally scoped (while normal ones are)\nassrt.throws(\n    def():\n        Friend(\"another friend\")\n        Stranger(\"another guy\")  # noqa:undef\n    ,\n    /Stranger is not defined/\n)\n\n# attributes\nassrt.ok(hasattr(dude, \"greet\"))\nassrt.equal(getattr(dude, \"greet\").bind(dude)(), \"Yo, it's me, some guy\") # function stays bound after binding\nassrt.equal(hasattr(dude, \"stuff\"), False)\nsetattr(dude, \"stuff\", True)\nassrt.ok(hasattr(dude, \"stuff\"))\n\n# native classes and methods\nst = String(\"test\")\nassrt.equal(st, \"test\")\nassrt.equal(st.toUpperCase(), \"TEST\")\nassrt.equal(String.toUpperCase(st), \"TEST\")\nassrt.equal(String.fromCharCode(65), \"A\") # static method recognition\n\n# now we test RapydScript's ability to insert 'new' operator correctly\nassrt.ok(String('a') != 'a')   # string literal vs string object\nassrt.ok((String)('a') == 'a') # string literal vs string literal\nassrt.ok(String.call(this, 'a') == 'a') # string literal via static method on string\n\n# self consistency\nclass Counter:\n    def __init__(s, n=0):\n        s.count = n # first arg becomes 'self'\n    def getIncrementer(self):\n        return def():\n            self.count += 1\nc = Counter(5)\ninc = c.getIncrementer()\ninc()\nassrt.equal(c.count, 6)\n\n# nested classes\n# not yet fully implemented\n#class Molecule:\n#   class Atom:\n#       def __init__(self, element):\n#           self.element = element\n#\n#   def __init__(self, elements):\n#       self.structure = []\n#       for e in elements:\n#           self.structure.push(Molecule.Atom(e))\n#\n#water = Molecule(['H', \"H\", 'O'])\n#assrt.equal(len(water.structure), 3)\n#assrt.equal(water.structure[0].element, 'H')\n#for atom in water.structure:\n#   assrt.ok(isinstance(atom, Molecule.Atom))\n\n# starargs and method decorators\ndef negate(fn):\n    def wrapped(*args):\n        return -fn(*args)\n    return wrapped\n\ndef add_pi(cls):\n    cls.prototype.pi = 3.14\n    return cls\n\n@add_pi\nclass Math:\n    def sum(s, *args):\n        # fakearg simply tests that offsets work correctly\n        ttl = 0\n        for i in args:\n            ttl += i\n        return ttl\n    def concatSum(s, string, *nums):\n        return string + s.sum(*nums)\n    @negate\n    def plus(s, a, b):\n        return a+b\n\nm = Math()\nassrt.equal(m.sum(1,2,3), 6)\nassrt.equal(m.sum(1,*[2,3]), 6)\nassrt.equal(m.concatSum(\"foo\", 1, 2, 5), \"foo8\")\nassrt.equal(m.plus(2, 5), -7)\nassrt.equal(m.pi, 3.14)\n\n\nclass CV():\n\n    a = b = 1\n    c = a + b\n    if True:\n        d = 1\n    else:\n        d = 2\n\n    def one(self):\n        return 1\n    two = one\n\nc = CV()\nassrt.deepEqual([c.a, c.b, c.c, c.d], [1, 1, 2, 1])\nassrt.equal(c.one(), c.two())\n\n\nclass Properties:\n\n    def __init__(self):\n        self._a = 19\n        assrt.equal(self.a, 19)\n\n    @property\n    def a(self):\n        return self._a\n\n    @a.setter\n    def a(self, val):\n        self._a = val\n\n    @property\n    def b(self):\n        return 1\n\n    def c(self):\n        return self.a\n\nclass A:\n    @property\n    def val(self):\n        return 'a'\n\n    @property\n    def parent(self):\n        return 'parent'\n\nclass B(A):\n    @property\n    def val(self):\n        return 'b'\n\n\np = Properties()\nassrt.equal(p._a, p.a)\np.a = 11\nassrt.equal(11, p.a)\nassrt.equal(p.c(), p.a)\nassrt.equal(p.b, 1)\nassrt.throws(\n    def():\n        p.b = 2\n)\np = B()\nassrt.equal(p.val, 'b')\nassrt.equal(p.parent, 'parent')\nassrt.equal(id(p), id(p))\nassrt.notEqual(id(p), id(B()))\n\nclass Context:\n\n    val = 1\n\n    def __enter__(self):\n        self.val = 2\n        return self\n\n    def __exit__(self):\n        self.val = 3\n        return True\n\nwith Context() as c:\n    assrt.eq(c.val, 2)\nassrt.equal(c.val, 3)\n\nwith Context() as d:\n    assrt.equal(d.val, 2)\n    raise Exception('error')\nassrt.equal(d.val, 3)\n\nclass Throws:\n\n    def __enter__(self):\n        pass\n\n    def __exit__(self):\n        pass\n\nassrt.throws(\n    def ():\n        with Throws():\n            raise Exception('error')\n    , Exception\n)\n\nclass X:\n\n    def __init__(self):\n        self.a = 3\n\nclass Y(X):\n    pass\n\nclass Z(Y):\n    pass\n\nassrt.equal(Z().a, X().a)\nassrt.ok(repr(Z()).indexOf('<__main__.Z') == 0)\nassrt.ok(str(Z()).indexOf('<__main__.Z') == 0)\n\nfrom __python__ import bound_methods\n\nclass U:\n\n    def __init__(self, a):\n        self.a = a\n\n    def val(self):\n        return self.a\n\nu = U(3)\nf = u.val\nassrt.equal(f(), u.val())\n\nclass U2(U):\n\n    def val(self):\n        return self.a * 2\n\nu = U2(3)\nf = u.val\nassrt.equal(f(), 6)\n\nclass M1:\n\n    def f1(self):\n        return 'M1-f1'\n\n    def f3(self):\n        return 'M1-f3'\n\nclass M0:\n\n    def f0(self):\n        return 'M0-f0'\n\nclass M2(M0):\n\n    @property\n    def prop(self):\n        return self._p or 'prop'\n\n    @prop.setter\n    def prop(self, val):\n        self._p = val\n\n    def f1(self):\n        return 'M2-f1'\n\n    def f2(self):\n        return 'M2-f2'\n\n    def f3(self):\n        return 'M2-f3'\n\nclass Child(M1, M2):\n\n    def f3(self):\n        return 'Child-f3'\n\nc = Child()\nassrt.equal(c.f0(), 'M0-f0')\nassrt.equal(c.f1(), 'M1-f1')\nassrt.equal(c.f2(), 'M2-f2')\nassrt.equal(c.f3(), 'Child-f3')\nassrt.equal(c.prop, 'prop')\nc.prop = 1\nassrt.equal(c.prop, 1)\nassrt.ok(isinstance(c, Child))\nassrt.ok(isinstance(c, M1))\nassrt.ok(isinstance(c, M2))\nassrt.ok(isinstance(c, M0))\n\n\nclass B1:\n\n    def __init__(self):\n        self.b1 = 1\n\n    def one(self):\n        return self.two()\n\n    def two(self):\n        return self.b1\n\nclass B2(B1):\n\n    def __init__(self):\n        self.b2 = 2\n        B1.__init__(self)\n\n    def two(self):\n        return self.b2\nassrt.equal(B2().two(), 2)\nassrt.equal(B2().b1, 1)\n\n\nclass Cvar:\n    a = b = 0\n    def __init__(self):\n        Cvar.a += 1\n\n    def inc(self):\n        Cvar.a += 1\n\n    def val(self):\n        return Cvar.a\n\n    def incb(self):\n        Cvar.b += 1\n        return Cvar.b\n\nassrt.equal(Cvar.a, 0)\nc = Cvar()\nassrt.equal(Cvar.a, 1)\nc.inc()\nassrt.equal(Cvar.a, 2)\nassrt.equal(Cvar().val(), 3)\nassrt.equal(Cvar().incb(), 1)\nassrt.equal(Cvar().incb(), 2)\n\nclass anon_func_in_class:\n\n    f = def():\n        func_var = 1\n        return func_var\n\n    def func_var(self):\n        pass\n\nassrt.equal(jstype(anon_func_in_class.prototype.func_var), 'function')\nanon_func_in_class.prototype.f()\nassrt.equal(jstype(anon_func_in_class.prototype.func_var), 'function')\n\n\ndef decorate(cls):\n    assrt.equal(cls.prototype.somevar, 1)\n    return cls\n\n\n@decorate\nclass decorated:\n    somevar = 1\n"
  },
  {
    "path": "test/collections.pyj",
    "content": "# globals: assrt\n# ARRAYS\n\n# immutables\na = [4,5,6,7]\n\n# mutables\nclass Item:\n    pass\ni0 = Item()\ni1 = Item()\ni2 = Item()\nb = [i0, i1]\nassrt.ok(i0 != i1)\n\n# access and slicing\ni = -1\nassrt.equal(len(a), 4)\nassrt.equal(a[-1], 7)\nassrt.equal(a[i], a[-1])\nassrt.equal(a[-2], 6)\nassrt.deepEqual(a[1:3], [5,6])\nassrt.deepEqual(a[:3], [4,5,6])\nassrt.deepEqual(a[2:], [6,7])\nassrt.ok(7 in a)\nassrt.ok(i1 in b)\nassrt.ok(i2 not in b)\nassrt.ok(b == b.copy())\nassrt.ok([1] in [[1], [2]])\nassrt.ok([3] not in [[1], [2]])\n\nif jstype(Symbol) is 'function':\n    ss = Symbol('s')\n    sym = {ss:1}\n    assrt.equal(sym[ss], 1)\ndef keyf():\n    return 1\nassrt.equal({keyf():2}[keyf()], 2)\n\n# assignment\na[-1] = 9\nassrt.equal(a[-1], 9)\ns = [0,1,2,3,4]\ns[:2] = [8, 9]\nassrt.deepEqual(s, [8,9,2,3,4])\ns[1:2] = [5]\nassrt.deepEqual(s, [8,5,2,3,4])\ns[-2:] = [1,2]\nassrt.deepEqual(s, [8,5,2,1,2])\n\n# extended slices\nb = list(range(11))\ns = 'abcde'\nassrt.deepEqual(b[::2], [0, 2, 4, 6, 8, 10])\nassrt.deepEqual(b[::-1], list(range(10,-1,-1)))\nassrt.deepEqual(b[7:0:-1], [7, 6, 5, 4, 3, 2, 1])\nassrt.deepEqual(b[7:1:-2], [7, 5, 3])\nassrt.equal(s[::2], 'ace')\nassrt.equal(s[::-1], 'edcba')\nassrt.equal(s[4:0:-1], 'edcb')\nassrt.equal(s[4:1:-2], 'ec')\n\n# sorting\na = [2,1,3]\na.pysort(key=def(x):return 0;)\nassrt.deepEqual(a, [2,1,3])  # stable sort\na.pysort(reverse=True)\nassrt.deepEqual(a, [3,2,1])\na.pysort()\nassrt.deepEqual(a, [1,2,3])\n\n# misc interface\na = [1,2,3]\nassrt.equal(a.pypop(), 3)\nassrt.deepEqual(a, [1,2])\nassrt.equal(a.pypop(0), 1)\nassrt.deepEqual(a, [2])\n\n# strings\nassrt.ok(\"tes\" in \"this is a test\")\n\none = \"one\"\ntwo = \"two\"\none, two = two, one\n[x, y, z] = 'x', 'y', 'z'\nassrt.equal(one, \"two\")\nassrt.equal(two, \"one\")\nassrt.equal(x, 'x')\nassrt.equal(y, 'y')\nassrt.equal(z, 'z')\n\n\n# DICTIONARIES\nd0 = {'a':'b','c':2, 'd':\t\t'd',}\nd1 = {\n\t'foo': 1,\n\t\"bar\": \"baz\",\n\t\"fun1\": def():\n\t\treturn 5\n\t,\n\t'fun2': def(c):\n\t\treturn c+1\n}\nd2 = dict([[1,2], [2,3]], a='b')\n\n# access\nassrt.ok('foo' in d1)\nassrt.equal(d0.a, d0['a'])\nassrt.equal(d1['fun1'](), 5)\nassrt.equal(d1.fun2(3), 4)\nassrt.equal(len(d0), 3)\nassrt.equal(d2.get(1), 2)\nassrt.equal(d2.get('a'), 'b')\nassrt.deepEqual(d2.popitem(), ['a', 'b'])\n\n# assignment\nd1[\"bar\"] += \"!\"\nassrt.equal(d1.bar, \"baz!\")\n\n# nested comparisons\nx = 3\nassrt.ok(1 < x <= 3)\nassrt.ok(1 < x*x > 3)\nassrt.ok(1 < (x+=1) < 5) # check that only one increment occurs\nassrt.equal(x, 4)\n\n# list comprehensions\ne0 = [i*i for i in [0,1,2,3]]\ne1 = [x+y for x, y in enumerate(range(5,0,-1))]\ne2 = [e0+1 for e0 in range(6) if e0%3]\nassrt.deepEqual(e0, [0,1,4,9])\nassrt.deepEqual(e1, [5,5,5,5,5])\nassrt.deepEqual(e2, [2,3,5,6])\nhash = {\n    \"foo\": 1,\n    \"bar\": 1,\n    \"baz\": 1,\n}\nassrt.deepEqual(Object.keys(hash), [k for k in hash])\n\na = {1:2}\nb = {2:1}\nassrt.ok(a != b)\nb = a\nassrt.ok(a == b)\nb = {1:2}\nassrt.ok(a == b)\nassrt.ok(v'{1:2}' == v'{1:2}')\n\n# iterating over TypedArrays\nassrt.deepEqual(list(Uint8Array(2)), [0, 0])\nassrt.deepEqual(list(Int32Array([1,-1])), [1,-1])\n"
  },
  {
    "path": "test/decorators.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\ndef double(f):\n    return def (x):\n        return 2 * f(x)\n\ndef triple(f):\n    return def(x):\n        return 3 * f(x)\n\n@double\ndef half(x):\n    return x // 2\n\n@double\ndef f1(x):\n    return x\n\n@double\n@triple\ndef f2(x):\n    return x\n\ndef append_one(f):\n    return def(x):\n        ans = f(x)\n        ans.push(1)\n        return ans\n\ndef append_two(f):\n    return def(x):\n        ans = f(x)\n        ans.push(2)\n        return ans\n\n@append_two\n@append_one\ndef f3():\n    return []\n\no = {'double':double}\n\n@o.double\ndef f4():\n    return 1\n\nassrt.equal(2, half(2))\nassrt.equal(4, f1(2))\nassrt.equal(12, f2(2))\nassrt.equal(2, f4())\nassrt.deepEqual([1, 2], f3())\n\ndef multiply(amt):\n\n    def wrapper(f):\n        return def ():\n            return amt * f()\n\n    return wrapper\n\n@multiply(2)\ndef two():\n    return 1\n\n@multiply(3)\ndef three():\n    return 1\n\n@multiply(2)\n@multiply(2)\ndef four():\n    return 1\n\nassrt.equal(2, two())\nassrt.equal(3, three())\nassrt.equal(4, four())\n"
  },
  {
    "path": "test/docstrings.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: ρσ_module_doc__\n\nimport _import_one\n\ndef f():\n    \" A basic docstring \"\n    pass\n\nassrt.equal(f.__doc__, 'A basic docstring')\nassrt.equal(_import_one.__doc__, 'Module level ds1\\n\\nModule level ds2\\nline2\\n\\nModule level ds 3')\n\ndef g():\n    '''\n    A more complex docstring:\n        xxx\n            yyyy\n\n    the end\n    '''\n    pass\n\nassrt.equal(g.__doc__, 'A more complex docstring:\\n    xxx\\n        yyyy\\n\\nthe end')\n\nclass D:\n    ' Docstring for a class '\n\n    def method(self):\n        'ds for a method'\n        pass\n\nassrt.equal(D().__doc__, 'Docstring for a class')\nassrt.equal(D().method.__doc__, 'ds for a method')\n\nx = def():\n    'xxx'\n\nassrt.equal(x.__doc__, 'xxx')\n"
  },
  {
    "path": "test/elementmaker_test.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: assrt\n\nfrom elementmaker import E\n\neq = assrt.equal\n\ndef dummy_elem_eq(a, b):\n    eq(jstype(a), jstype(b))\n    if (jstype(a) == 'string'):\n        eq(a, b)\n        return\n    eq(a.attributes.length, b.attributes.length)\n    eq(a.children.length, b.children.length)\n    eq(a.name, b.name)\n    for attr in a.attributes:\n        eq(a[attr], b[attr])\n    for i, child in enumerate(a.children):\n        dummy_elem_eq(child, b.children[i])\n\nq = E.div('text', id='1', class_='c', data_x='x')\ndummy_elem_eq(q, {'name':'div', 'children':['text'], 'attributes':{'id':'1', 'class':'c', 'data-x': 'x'}})\n\nq = E.div(\n        E.span('a'),\n        E.span('b'),\n        E.a(),\n        id='1',\n        boolean_attr=True,\n    )\ndummy_elem_eq(q, {'name':'div', 'children':[\n    {\n        'name':'span',\n        'children':['a'], 'attributes': {}\n    },\n    {\n        'name':'span',\n        'children':['b'], 'attributes': {}\n    },\n    {\n        'name':'a',\n        'children':[], 'attributes': {}\n    },\n], 'attributes':{'id':'1', 'boolean-attr':'boolean-attr'}})\n"
  },
  {
    "path": "test/functions.pyj",
    "content": "# globals: assrt\n\ndef nothing():\n    pass\nassrt.equal(nothing(), undefined)\n\nadd = def(a, b):\n    return a+b\ndef sub(a, b):\n    return a-b\n\nmul = None\n(def():\n    nonlocal mul\n    mul = def(a, b):\n        return a*b\n\n    div = def(a, b):  # noqa:unused-local\n        return a/b\n)()\n\nassrt.equal(add(1,2), 3)\nassrt.equal(sub(1,2), -1)\nassrt.equal(mul(2,2), 4)\n# for some reason input to throws must be of type block, hence the 'def' wrapper\nassrt.throws(\n    def():\n        div(6,3)  # noqa: undef\n    ,\n    /div is not defined/\n)\n\narr = [8,4]\nassrt.equal(add(*arr), 12)\nassrt.ok(Array.isArray(arr))\n\ndef sum(*args):\n    ttl = 0\n    for i in args:\n        ttl += i\n    return ttl\nassrt.equal(sum(1,2,3), 6)\nassrt.equal(sum(1,*[2,3]), 6)\n\nnum = 4\ndef():\n    nonlocal num\n    num = 5\n.call(this)\n\nassrt.equal(num, 5)\n\nx = \"foo\"\ny = 5\ndef swap(x, y):\n    return y, x\nx, y = swap(x, y)\nassrt.equal(x, 5)\nassrt.equal(y, \"foo\")\n\ncount = 0\nf, r = (def():\n    def fake_increment():\n        count += 1\n    def real_increment():\n        nonlocal count\n        count += 1\n    return fake_increment, real_increment\n).call(this)\n\nf()\nassrt.equal(count, 0)\nr()\nassrt.equal(count, 1)\n\nst = \"this is a string\"\nassrt.equal(jstype(st), v\"typeof st\")\n\n# testing inlined functions\ninlined = [\n    def(x): return x+1;, def(x): return x+2;,\n    def(x): return x+3\n    ,\n    def(x): return x+4\n]\nassrt.equal(inlined[0](1), 2)\nassrt.equal(inlined[1](1), 3)\nassrt.equal(inlined[2](1), 4)\nassrt.equal(inlined[3](1), 5)\n\n# decorators\ndef makebold(fn):\n    def wrapped(arg):\n        return \"<b>\" + fn(arg) + \"</b>\"\n    return wrapped\n\ndef makeitalic(fn):\n    def wrapped(arg):\n        return \"<i>\" + fn(arg) + \"</i>\"\n    return wrapped\n\n@makebold\n@makeitalic\ndef hello(something):\n    return \"hello \" + something\n\nassrt.equal(hello(\"world\"), \"<b><i>hello world</i></b>\")\nassrt.equal(hello.__module__, '__main__')\nassrt.equal(hello.__argnames__.length, 1)\nassrt.equal(hello.__argnames__[0], 'arg')\n\n\ndef simple_wrapper(f):\n    f.test_attr = 'test'\n    return f\n\n\n@simple_wrapper\ndef fw(x):\n    pass\n\nassrt.equal(fw.__module__, '__main__')\nassrt.equal(fw.__argnames__.length, 1)\nassrt.equal(fw.__argnames__[0], 'x')\n# just because something is a reserved keyword in RapydScript, doesn't mean other libraries won't attempt to use it\n# let's make sure we parse that correctly\nfive = {}\nv\"five.is = function(n) { return 5 == n };\"\nassrt.ok(five.is(5))\n\n# function assignment via conditional\nfoo = (def(): return 5;) if 0 else (def(): return 6;)\nbar = (def(): return 5;) if 0 < 1 else (def(): return 6;)\nbaz = (def():\n    return 5\n) if 1 else (def():\n    return 6\n)\nassrt.equal(foo(), 6)\nassrt.equal(bar(), 5)\nassrt.equal(baz(), 5)\n\ndef trailing_comma(a, b,):\n    return a + b\nassrt.equal(trailing_comma(1, 2), 3)\nassrt.equal(trailing_comma(1, 2,), 3)\n\ndef return_string_with_newline():\n    return '''a\nb'''\nassrt.equal(return_string_with_newline(), 'a\\nb')\n"
  },
  {
    "path": "test/generators.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\ndef g1():\n    yield 1\n    yield 2\n\ndef g2():\n    for i in range(2):\n        yield from g1()\n\ndef g3():\n    data = yield 1\n    yield data\n\nclass A:\n\n    def __init__(self):\n        self.items = [1, 2, 3]\n\n    def __iter__(self):\n        for x in self.items:\n            yield x\n\nassrt.deepEqual([x for x in g1()], [1, 2])\nassrt.deepEqual([x for x in g2()], [1, 2, 1, 2])\nassrt.deepEqual([x for x in A()], [1, 2, 3])\n\ng = g3()\nassrt.equal(g.next().value, 1)\nassrt.equal(g.next('a').value, 'a')\n\na = (x for x in range(3))\nassrt.deepEqual(list(a), [0, 1, 2])\na = ([x, x**2] for x in range(3))\nassrt.deepEqual(list(a), [[0, 0], [1, 1], [2, 4]])\nassrt.deepEqual(list(x for x in range(3)), [0, 1, 2])\ndef t(a, b):\n    assrt.deepEqual(list(a), list(b))\nt((x for x in range(1)), (y for y in range(1)))\n"
  },
  {
    "path": "test/generic.pyj",
    "content": "# globals: assrt, ρσ_last_exception\n\nimport traceback\n\ndef throw_test(code):\n    assrt.throws(def():\n        RapydScript.parse(code, {'filename':code}).body[0]\n    , RapydScript.SyntaxError)\n\n# unary operators\nassrt.equal(-(1), -1)\nassrt.equal(-(-1), 1)\nassrt.equal(+(+1), 1)\n\n# arithmetic\nassrt.equal(3**4, Math.pow(3, 4))\nassrt.equal(100**-2, Math.pow(100, -2))\nassrt.equal(2*5**2*3, 150)\nassrt.equal(-2**2, -4)\nassrt.equal((-2)**2, 4)\nassrt.equal(pow(2, 2, 2), 0)\nassrt.equal(100 // 3, 33)\nassrt.equal(-100 // 3, -34)\na = 100\na //= 3\nassrt.equal(a, 33)\nassrt.equal(0b11, 3)\nassrt.ok(42 / \"x\" is NaN)\nassrt.ok(42 is not NaN)\nassrt.ok(NaN is parseInt('asd', 10))\nassrt.ok('NaN' is not 42 / 'x')\n\n# comparisons\nassrt.ok(3<5<7)\nassrt.equal(-1 < 0 == 1 < 0, False)\n\n# Empty tuple\nassrt.deepEqual((), [])\n\n# Conditional operators\nassrt.equal(1 if True else 2, 1)\nassrt.equal(1\n             if True else 2, 1)\nassrt.deepEqual([x for x in (\"asd\" if True else \"xyz\") if x], 'asd'.split(''))\nassrt.deepEqual((1, [x for x in [2] if x]), [1, [2]])\n\n# Comprehensions\nassrt.deepEqual([a+1 for a in [1,2,3] if a > 1], [3, 4])\nassrt.deepEqual({a+1:a+2 for a in [1,2,3] if a > 1}, {3:4, 4:5})\nassrt.deepEqual({a+1 for a in [1,2,3] if a > 1}, set([3, 4]))\nassrt.deepEqual([(a+1, 1) for a in [1,2,3] if a > 1], [[3, 1], [4, 1]])\n\n# Destructuring assignment\na, (b, (c, d)), e = [1, [2, [3, 4]], 5]\nassrt.deepEqual([a, b, c, d, e], [1, 2, 3, 4, 5])\nfor x, (y, z) in [ [1, [2, 3]] ]:\n    assrt.deepEqual([x, y, z], [1, 2, 3])\nassrt.deepEqual([ [x, y, z, w] for ((x, y), (z, w)) in [ [[1, 2], [3, 4]] ] ],\n                 [[1, 2, 3, 4]])\nassrt.deepEqual([ [x, y, z] for x, (y, z) in [ [1, [2, 3] ] ]],\n                 [[1, 2, 3]])\n(a, b) = [1, 2]\nassrt.deepEqual([a, b], [1, 2])\n(a, (b, c)) = [1, [2, 3]]\nassrt.deepEqual([a, b, c], [1, 2, 3])\n\n# Chained assignment\na = b = 11\nassrt.deepEqual([a, b], [11, 11])\ndef inc():\n    nonlocal a\n    a += 1\n    return a\na = b = inc()\nassrt.deepEqual([a, b], [12, 12])\na, b = c, d = 1, 2\nassrt.deepEqual([a, b, c, d], [1, 2, 1, 2])\n(a, b) = [c, d] = 1, 2\nassrt.deepEqual([a, b, c, d], [1, 2, 1, 2])\na, (x, b) = c, d = [1, [2, 3]]\nassrt.deepEqual([a, x, b, c, d], [1, 2, 3, 1, [2, 3]])\na, b = [c, d] = [e, f] = [1, 2]\nassrt.deepEqual([a, b, c, d, e, f], [1, 2, 1, 2, 1, 2])\na = b, c = 1, 2\nassrt.deepEqual([a, b, c], [[1,2], 1, 2])\n\nthrow_test('a += b += 1')\nthrow_test('a += 1, 2 += b')\nthrow_test('a += [1, 2] += b')\nthrow_test('function = 1')\nthrow_test('def function():\\n pass')\nthrow_test('class function:\\n pass')\nthrow_test('while 1:\\npass')\nthrow_test('def f():\\n while 1:\\n pass')\nthrow_test('1 1')\nthrow_test('z = x y')\nthrow_test('while a = 1: pass')\nthrow_test('while 1\\n   pass')\nthrow_test('for a in [1]\\n   pass')\n\n# object literals\n{1:\n 1\n   }  # Check that arbitrary indentation is allowed after : for an object literal key\n\n# strict equality\nassrt(1 == 1)                  # number vs number: ok\nassrt(True == True)            # boolean vs boolean: ok\nassrt(not (1 == True))         # number vs boolean: NEVER equal\nassrt(1 != True)               # number vs boolean: NEVER equal\nassrt(not (\"\" == False))       # string vs boolean: NEVER equal\nassrt(not (\"0\" == 0))          # string vs integer: NEVER equal\nassrt(not (\"\" == 0))           # string vs integer: NEVER equal\nassrt(bool(1) == True)         # boolean conversion\nassrt(bool(\"\") == False)       # boolean conversion\nassrt(v'1 == true')         # javascript override\nassrt(not v'(1 != true)')   # javascript override\nassrt(v'String(\"test\")' == \"test\")  # this should do string conversion rather than creating a string object\nassrt(String(\"test\") != \"test\")        # this should create a string object\n\n\n# raw JavaScript\nv'var def = {}'                # ability to bypass reserved keywords in declaration\nv'def'.item = 3            # ability to use reserved keywords\nassrt(v'def.item' == 3)\n\nn = 5\nassrt.equal(v\"\"\"\n(function() {\n    var s = 0\n    for (var i=0; i<=n; i++) {\n        s += i\n    }\n    return s\n})()\n\"\"\", (def():\n    s = 0\n    for i in range(n+1):\n        s += i\n    return s\n)())                        # shared scoping and equivalent capability\na = []\nfor v'var i = 0; i < 1; i++':\n    a[i] = 1  # noqa: undef\nassrt.deepEqual(a, [1])\n\n# String literals\na = '\\u00ad'\nassrt.equal(a.charCodeAt(0), 0xad)\n# String literal concatenation\n\nassrt.equal('1' '2', '12')\nassrt.equal('1'\n             '2' '3', '123')\nassrt.equal(u'a', 'a')\nassrt.equal('a' * 5, 'aaaaa')\nassrt.ok(isinstance('a', str))\n\n# Various bits of miscellaneous code that caused parser infinite loops and other breakage\nthrow_test('for a in b:\\\\n 1+1')\n\ndef localvars_in_comprehension():\n    return {k:i for i, k in enumerate([1,2])}\nassrt.deepEqual(localvars_in_comprehension(), {'1':0, '2':1})\n\n# Numbers\nassrt.equal(1e2, 100)\nassrt.equal(-1e2, -100)\nassrt.equal(1e+2, 100)\nassrt.equal(1E-1, 0.1)\n\n# Equality operators\n\nclass D:\n\n    def __init__(self, data):\n        self.data = data\n\n    def __eq__(self, other):\n        return self.data == other.data\n\nassrt.ok(D(1) == D(1))\nassrt.ok(D(2) != D(1))\nassrt.ok(D(1) == {'data':1})\nassrt.ok({'data':1} == D(1))\n\narr = []\n{} == arr.append(2)\nassrt.ok(arr.length is 1)\n\ncall_count = 0\ndef cc():\n    nonlocal call_count\n    call_count += 1\n    return [1]\ncc()[-1]\nassrt.equal(call_count, 1)\n\n# Test the del operator\n\n# JS object\ndeleteme = {1:1}\nassrt.ok(Object.keys(deleteme).indexOf('1') is not -1)\ndel deleteme[1]\nassrt.ok(Object.keys(deleteme).indexOf('1') is -1)\n\n# list\ndeleteme = [1, 2]\ndel deleteme[0]\nassrt.equal(deleteme.length, 1)\nassrt.deepEqual(deleteme, [2])\ndeleteme = [1, 2, 3]\ndel deleteme[::2]\nassrt.deepEqual(deleteme, [2])\ndeleteme = [1, 2, 3]\ndel deleteme[::1]\nassrt.equal(deleteme.length, 0)\ndeleteme = [1, 2, 3]\ndel deleteme[1:2]\nassrt.deepEqual(deleteme, [1, 3])\n\n# global\ndel deleteme\n\n# python dict\nfrom __python__ import dict_literals, overload_getitem\ndeleteme = {1:1, 2:2}\nassrt.ok(1 in deleteme)\ndel deleteme[1]\nassrt.ok(1 not in deleteme)\nassrt.equal(len(deleteme), 1)\n\n# Asserts\n\nassrt.throws(def():\n    assert 0\n, AssertionError\n)\nassrt.throws(def():\n    assert 0, 'xdx'\n, /xdx/\n)\n\n# Exceptions\n\nclass MyException(Exception):\n\n    def __init__(self, message, val):\n        Exception.__init__(self, message)\n        self.val = val\n\ntry:\n    raise MyException('xxx', 3)\nexcept MyException as e:\n    assrt.equal(e.name, 'MyException')\n    assrt.equal(e.message, 'xxx')\n    assrt.equal(e.val, 3)\n    assrt.equal(e.toString(), 'MyException: xxx')\n    assrt.ok(v'e instanceof MyException')\n    assrt.ok(v'e instanceof Error')\n\ntry:\n    raise Error('eee')\nexcept Exception:\n    # Test that we can catch JS errors and that local variables in the except block are declared\n    xxlocalvar = 1\n    assrt.equal(xxlocalvar, 1)\n\ndef errf():\n    raise MyException()\n\ntry:\n    errf()\nexcept MyException as e:\n    fe = traceback.format_exception()\n    assrt.ok(str.strip(fe[-2]).startsWith('at errf'))\n\n\ndef stackf():\n    return traceback.format_stack()\nassrt.ok(str.strip(stackf()[-1]).startsWith('at stackf'))\n\n\ndef else_without_finally(fail):\n    ans = []\n    try:\n        if fail:\n            raise Exception('a')\n        ans.push('ok')\n    except:\n        ans.append('ex')\n    else:\n        ans.append('el')\n    return ans\n\ndef else_with_finally(fail):\n    ans = []\n    try:\n        if fail:\n            raise Exception('a')\n        ans.push('ok')\n    except:\n        ans.push('ex')\n    else:\n        ans.push('el')\n    finally:\n        ans.push('fi')\n    return ans\n\ndef exc_in_else():\n    ans = []\n    try:\n        try:\n            ans.push('ok')\n        except:\n            pass\n        else:\n            raise Exception('1')\n        finally:\n            ans.push('fi')\n    except:\n        ans.push('ex')\n    return ans\n\nassrt.deepEqual(else_without_finally(), ['ok', 'el'])\nassrt.deepEqual(else_without_finally(True), ['ex'])\nassrt.deepEqual(else_with_finally(), ['ok', 'el', 'fi'])\nassrt.deepEqual(else_with_finally(True), ['ex', 'fi'])\nassrt.deepEqual(exc_in_else(), ['ok', 'fi', 'ex'])\n\n# Existential operator\n\nassrt.ok(not gfsgs?)\nassrt.equal(gfsgs ? 1, 1)\nassrt.equal(gfsgs?.b, undefined)\nassrt.equal(gfsgs?(), undefined)  # noqa: undef\nundef = undefined\nassrt.ok(not undef?)\nundef = None\nassrt.ok(not undef?)\nundef = 0\nassrt.ok(undef?)\nassrt.equal(undef?(), undefined)\nassrt.equal(undef?.xxx?(), undefined)\nassrt.equal(undef.a, undefined)\nassrt.equal(undef[1], undefined)\nassrt.equal(undef ? 1, 0)\nml = 1, '''\n'''\nassrt.deepEqual(ml, [1, '\\n'])\n\n\n# localvars in conditions\n\ngv = 1\n(def ():\n    if (gv = 2):\n        pass\n    assrt.equal(gv, 2)\n)()\nassrt.equal(gv, 1)\n\nassrt.ok(1 not in [2, 3])\nassrt.ok(1 in [1, 2])\nassrt.ok(\"1\" + \"2\" in [\"12\", \"x\"])\nassrt.ok(\"1\" + \"2\" not in [\"1\", \"2\"])\nif \"1\" + \"2\" not in [\"1\", \"2\"]:\n    assrt.ok(1)\nelse:\n    assrt.ok(0)\n"
  },
  {
    "path": "test/imports.pyj",
    "content": "# globals:test_path, GLOBAL_SYMBOL, assrt\nfrom _import_one import toplevel_var, toplevel_func as tf, TopLevel, true_var, false_var, test_other\nfrom _import_two import (toplevel_var2,\n                 toplevel_func2, TopLevel2 as TL2)\n\ndef AClass(x):\n    return this\n\neq = assrt.equal\n# Test import of top-level variables and callables\neq(toplevel_var, 'foo')\neq(tf('x'), 'xtoplevel')\neq(toplevel_var2, 'foo2')\neq(toplevel_func2('x'), 'xtoplevel2')\neq(false_var, undefined)\neq(test_other, 'other')\n\n# Test import of top-level vars in a conditional\neq('true', true_var)\n\n# Test plain imports\nimport _import_one\neq(_import_one.toplevel_var, toplevel_var)\neq(_import_one.toplevel_func('x'), tf('x'))\n\n# Test recognition of imported classes\ntl = TopLevel('1')\neq(tl.a, '1')\ntl2 = TL2('x')\neq(tl2.a, 'x')\n\n# Test access to submodules via plain imports\nimport _import_two.sub, _import_two.sub as ts\neq('sub', _import_two.sub.sub_var)\neq('sub', ts.sub_var)\neq('sub', _import_two.sub.sub_func())\n\n# Test deep import\nfrom _import_two.level2.deep import deep_var\neq('deep', deep_var)\n\n# Test that class accessed via plain import is\n# recognized\ns = _import_two.sub.Sub(1)\neq(s.a, 1)\ns2 = ts.Sub(1)\neq(s2.a, 1)\n\n\n# Test that a class imported into an inner scope is not recognized as a class\n# outside that scope\ndef inner():\n    from _import_one import AClass\n    a = AClass(1)\n    eq(a.a, 1)\n\ninner()\nb = AClass(1)\neq(b, this)\n\n# Test global symbol declared in other module\neq(GLOBAL_SYMBOL, 'i am global')\n\n# Import errors happen during parsing, so we cannot test them directly as they would\n# prevent this file from being parsed.\n\nassrt.throws(def():\n    RapydScript.parse('from _import_one import not_exported', {'basedir':test_path}).body[0]\n, /not exported/)\nassrt.throws(def():\n    RapydScript.parse('import xxxx', {'basedir':test_path}).body[0]\n, /doesn't exist/)\n"
  },
  {
    "path": "test/internationalization.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\nfrom gettext import gettext as _, ngettext, install\n\ng = require('../tools/gettext.js')\n\ndef gettext(code):\n    ans = {}\n    g.gettext(ans, code, '<test>')\n    return ans\n\ndef test_string(code, *args):\n    catalog = gettext(code)\n    assrt.equal(len(catalog), len(args))\n    for msgid, q in zip(Object.keys(catalog), args):\n        assrt.equal(g.entry_to_string(msgid, catalog[msgid]), q)\n\ntest_string('a = _(\"one\")', '#: <test>:1\\nmsgid \"one\"\\nmsgstr \"\"')\ntest_string('a = _(\"one\")\\nb = gettext(\"one\")', '#: <test>:1\\n#: <test>:2\\nmsgid \"one\"\\nmsgstr \"\"')\ntest_string('''a = _(\"\"\"one\ntwo\"\"\")''', '#: <test>:1\\nmsgid \"one\\\\ntwo\"\\nmsgstr \"\"')\ntest_string('a = _(\"{}one\")', '#: <test>:1\\n#, python-brace-format\\nmsgid \"{}one\"\\nmsgstr \"\"')\ntest_string('a = _(\"{one}\")', '#: <test>:1\\n#, python-brace-format\\nmsgid \"{one}\"\\nmsgstr \"\"')\ntest_string('ngettext(\"one\", \"two\", 1)', '#: <test>:1\\nmsgid \"one\"\\nmsgid_plural \"two\"\\nmsgstr[0] \"\"\\nmsgstr[1] \"\"')\ntest_string('''_('o\"ne')''', '#: <test>:1\\nmsgid \"o\\\\\"ne\"\\nmsgstr \"\"')\n\nm = require('../tools/msgfmt.js')\ncatalog = m.parse(r'''\nmsgid \"\"\nmsgstr \"\"\n\"Language: en\\n\"\n\"Plural-Forms: nplurals=2; \\n\"\n\n#, fuzzy\nmsgid \"one\\n\"\n\"continued\"\nmsgstr \"ON\"\n\"E\"\n\nmsgid \"two\"\nmsgid_plural \"three\"\nmsgstr[0] \"a\"\n\"bc\"\nmsgstr[1] \"def\"\n\nmsgid \"test \\\"quote\\\" escape\"\nmsgstr \"good\"\n''')\n\nassrt.equal(2, catalog['nplurals'])\nassrt.equal('en', catalog['language'])\nassrt.equal(catalog['entries'].length, 3)\nitem = catalog['entries'][0]\nassrt.equal(item['msgid'], 'one\\ncontinued')\nassrt.deepEqual(item['msgstr'], v\"['ONE']\")\nassrt.ok(item['fuzzy'], 'item not fuzzy')\nitem = catalog['entries'][1]\nassrt.equal(item['msgid'], 'two')\nassrt.deepEqual(item['msgstr'], v\"['abc', 'def']\")\nassrt.ok(not item['fuzzy'], 'item not fuzzy')\nitem = catalog['entries'][2]\nassrt.equal(item['msgid'], 'test \"quote\" escape')\nassrt.deepEqual(item['msgstr'], v\"['good']\")\n\ninstall({'entries': {\n    'one':['ONE'],\n    'two':['1', '2'],\n}})\n\nassrt.equal(_('one'), 'ONE')\nassrt.equal(ngettext('two', 'xxx', 1), '1')\nassrt.equal(ngettext('two', 'xxx', 100), '2')\n"
  },
  {
    "path": "test/lint.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\nlinter = require('../tools/lint.js')\n\ndef lint(code):\n    return linter.lint_code(code, {'filename':'<test>', 'report':def():\n                                   pass\n})\n\ndef err_test(code, ident, line, name, other_line):\n    msgs = lint(code)\n    assrt.ok(len(msgs) > 0, 'failed to find error in: ' + code)\n    assrt.equal(len(msgs), 1, 'found ' + (len(msgs) - 1) + ' extra errors in: ' + code)\n    assrt.equal(msgs[0].ident, ident, 'incorrect ident: ' + msgs[0].ident + ' for: ' + code)\n    if line != undefined:\n        assrt.equal(msgs[0].start_line, line, 'incorrect line: ' + msgs[0].start_line + ' for: ' + code)\n    if name != undefined:\n        assrt.equal(msgs[0].name, name, 'incorrect name: ' + msgs[0].name + ' for: ' + code)\n    if other_line != undefined:\n        assrt.equal(msgs[0].other_line, other_line, 'incorrect other_line: ' + msgs[0].other_line + ' for: ' + code)\n\ndef ok_test(code):\n    msgs = lint(code)\n    assrt.equal(msgs.length, 0, 'Got unexpected msg: ' + (msgs[0] or {}).message + ' for code: ' + code)\n\n# Imports\nerr_test('import foo', 'unused-import', 1, 'foo')\nerr_test('import foo.boo', 'unused-import', 1, 'foo')\nerr_test('import foo as boo', 'unused-import', 1, 'boo')\nerr_test('from x import foo', 'unused-import', 1, 'foo')\nerr_test('from x import foo as boo', 'unused-import', 1, 'boo')\nok_test('import foo\\nfoo')\n\n# Function arguments\nok_test('def f(a):\\n return a')\nok_test('def f(a=1):\\n return a')\nok_test('def f(*a):\\n return a')\nok_test('def f(**a):\\n return a')\nok_test('def f(a):\\n return 1')\n\n# Extended slices\nok_test('a = []; a[::2], a[1:-1]')\n\n# Top level unused ignored\nok_test('a=1\\ndef f():\\n pass')\n\n# Destructuring assignment\nok_test('def f():\\n a, b = 1, 2; a, b')\nok_test('def f():\\n a = 1; b, c = a, 2; return b, c')\nok_test('for x, (y, z) in [ [1, [2, 3]] ]:\\n x + y + z')\nerr_test('def f():\\n a, b = 1, 1; return a', 'unused-local', 2, 'b')\n\n# Compound assignment\nerr_test('a += 1', 'undef', 1, 'a')\nok_test('def f():\\n a = 1; a += 1')\n\n# Unused bindings\nerr_test('def f():\\n a=1', 'unused-local', 2, 'a')\nerr_test('def f():\\n def a():\\n  pass', 'unused-local', 2, 'a')\n\n# Undefined references\nerr_test('f()', 'undef', 1, 'f')\nerr_test('a', 'undef', 1, 'a')\nerr_test('def f():\\n a=1; return a\\na', 'undef', 3, 'a')\n\n# Comprehensions\nok_test('[x for x in [1,2]]')\nok_test('[1 for x in [1,2] if x]')\nok_test('[1 for x in [1,2]]')\nok_test('def f():\\n l=[1,2];[x for x in l]')\nok_test('def f():\\n l=[1,2];{x:True for x in l}')\nerr_test('def f():\\n [x for x in [1,2]]; return x', 'undef', 2, 'x')\n\n# Loops\nok_test('def f():\\n for x in \"\":\\n  pass\\n return x')\nok_test('def f():\\n for x in \"\":\\n  x += 1\\n')\nok_test('def f():\\n for x, y in \"\":\\n  pass\\n return x, y')\nok_test('for v\"var i = 0; i < 1; i++\":\\n print(i)')\nerr_test('def f():\\n a = 1\\n for a in \"\":\\n  a', 'loop-shadowed', 3, 'a', 2)\n\n# Semi-colons\nerr_test('a=1;;a', 'extra-semicolon', 1, ';')\nerr_test('a=1;', 'eol-semicolon', 1, ';')\n\n# Builtins\nfor k in 'String Symbol this self window Map arguments print len range dir undefined'.split(' '):\n    ok_test(k)\n\n# noqa\nok_test('f() # noqa')\nok_test('f() # noqa:undef')\nerr_test('f() # noqa:xxx', 'undef')\n\n# Named func in branch\nerr_test('if 1:\\n def f():\\n  pass', 'func-in-branch', 2, 'f')\nerr_test('if 1:\\n pass\\nelse:\\n def f():\\n  pass', 'func-in-branch', 4, 'f')\nerr_test('try:\\n def f():\\n  pass\\nexcept:\\n pass', 'func-in-branch', 2, 'f')\nok_test('if 1:\\n a = def():\\n  pass')\n\n# Syntax errors\nerr_test('def f(:\\n pass', 'syntax-err', 1)\n\n# Functions\nok_test('def f():\\n pass\\nf()')\n\n# Non-locals\nerr_test('def a():\\n x = 1\\n def b():\\n  nonlocal x\\n b()', 'unused-local', 2, 'x')\nok_test('def a():\\n x = 1\\n def b():\\n  nonlocal x\\n  x\\n b()')\nok_test('def a():\\n x = 1\\n def b():\\n  nonlocal x\\n  x\\n  x = 2\\n b()')\nok_test('def a():\\n x = 1\\n def ():\\n  nonlocal x\\n  x = 1\\n  x')\nok_test('nonlocal a\\na()')\n\n# Define after use\nerr_test('def g():\\n f()\\n f()\\n def f():\\n  pass', 'def-after-use', 3, 'f')\n\n# Decorators\nok_test('from x import y\\n@y\\ndef f():\\n pass')\n\n# try/except\nok_test('try:\\n 1\\nexcept Error as e:\\n e')\n\n# Classes\nok_test('''\nclass A:\n\n    h = j = 1\n    x = h + j\n    if True:\n        k = 1\n    else:\n        k = 2\n\n    def __init__(self, a):\n        self.a = a\n\n    def unused(self):\n        pass\n    other = unused\n\nclass B(A):\n\n    def __init__(self):\n        A.__init__(self, 'b')\n''')\nerr_test('class A:\\n def a(self):\\n  a()', 'undef', 3, 'a')\nerr_test('class A:\\n def a(self):\\n  pass\\n def a(self):\\n  pass', 'dup-method', 4, 'a')\n\n# Object literals\nerr_test('{\"a\":1, \"a\":2}', 'dup-key', 1, 'a')\n\n# keyword arg values\nok_test('def f():\\n a=1\\n f(b=a)')\nok_test('def f():\\n a={}\\n f(**a)')\n\n# with statement\nok_test('''\ndef f():\n    a = 1\n    with a as b:\n        b()\n''')\nerr_test('with a:\\n pass', 'undef', '1', 'a')\n"
  },
  {
    "path": "test/loops.pyj",
    "content": "# globals: assrt\n# loop through values, not indices\na = ['foo', 'bar', 'baz']\nfor val in a:\n\tassrt.ok(val in a)\n\nfor i in range(len(a)):\n\tassrt.ok(a[i] in a)\n\nfor i, val in enumerate(a): # testing that comments are allowed here\n\tassrt.equal(a[i], val)\n\n# nesting\nfinal = []\nfor i in [1,2]:\n\tfor j in [4,5,6]:\n\t\tfinal.push((i,j))\nassrt.deepEqual(final, [[1,4], [1,5], [1,6], [2,4], [2,5], [2,6]])\n\ni = 0\nwhile i < len(a):\n\tassrt.ok(a[i] in a)\n\ti += 1\n\ncounter = 5\nfactorial = 1\ndo:\n\tfactorial *= counter\n\tcounter -= 1\n.while counter > 0\nassrt.equal(factorial, 120)\n\n# for-in\nhash = {\n    \"foo\": 1,\n    \"bar\": 1,\n    \"baz\": 1,\n}\ni = 0\nfor key in hash:\n    assrt.equal(key, a[i])\n    i += 1\n\nword = \"test\"\ni = 0\nfor letter in word:\n    assrt.equal(letter, word[i])\n    i += 1\n\nfor b in (1, 1):\n    assrt.equal(b, 1)\n\nfor q in range(3):\n    u = q\nassrt.equal(u, q)\nfor q in range(3):\n    u = q\n    q = 10\nassrt.equal(u, 2)\na = [1,2]\nfor li in range(len(a)):\n    a.pop()\nassrt.equal(len(a), 0)\nr = range(3)\nassrt.deepEqual(list(r), list(r))\nitems = []\nfor outer in r:\n    items.push(outer)\n    for b in r:\n        items.push(b)\nassrt.deepEqual(items, [0, 0, 1, 2, 1, 0, 1, 2, 2, 0, 1, 2])\nr = range(3)\nif jstype(Proxy) is 'function':\n    assrt.equal(r[1], 1)\n    assrt.equal(r[1], 1)\n    assrt.equal(r[2], 2)\nassrt.equal(r.count(0), 1)\nassrt.equal(r.count(4), 0)\nassrt.equal(r.index(1), 1)\nassrt.throws(def(): r.index(4);, ValueError)\n\ndest = []\nfor al in 'a', 'b', 'c':\n    dest.push(al)\nassrt.equal(dest.join(''), 'abc')\n"
  },
  {
    "path": "test/regexp.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n\n# Test the re module\nimport re\ns = \"Isaac Newton, physicist\"\nc = re.search(\"(\\\\w+) (\\\\w+)\", s)\nassrt.equal(c.group(1), 'Isaac')\nassrt.equal(c.group(2), 'Newton')\nc = re.match(\"(\\\\w+) (\\\\w+)\", s)\nassrt.equal(c.group(1), 'Isaac')\nassrt.equal(c.start(1), 0)\nassrt.equal(c.end(1), c.group(1).length)\nassrt.equal(c.start(2), c.group(1).length + 1)\nassrt.equal(c.group(2), 'Newton')\nm = re.search('a(b)cd', 'abc abcd')\nassrt.equal(m.group(1), 'b')\nassrt.equal(m.start(1), m.string.lastIndexOf('b'))\nassrt.deepEqual(re.split('\\\\s', s), ['Isaac', 'Newton,', 'physicist'])\nassrt.deepEqual(re.findall('s[a-z]', s), ['sa', 'si', 'st'])\nassrt.deepEqual([m.group() for m in re.finditer('s[a-z]', s)], ['sa', 'si', 'st'])\nassrt.deepEqual(re.findall(/s[a-z]/, s), ['sa', 'si', 'st'])\nassrt.equal(re.sub('[A-Z]', '_', s), '_saac _ewton, physicist')\nassrt.equal(re.sub('[A-Z]', '_', s, count=1), '_saac Newton, physicist')\nassrt.equal(re.search('a[.]b', 'axb'), None)\nassrt.equal(re.search(r'a\\.b', 'axb'), None)\nassrt.equal(re.search('a[.]b', 'axb', flags=re.D), None)\nassrt.equal(re.search('.+', 'a\\nb').group(), 'a')\nassrt.equal(re.search('.+', 'a\\nb', flags=re.D).group(), 'a\\nb')\nassrt.equal(re.search('(?s).+', 'a\\nb').group(), 'a\\nb')\nassrt.equal(re.sub('a(b)', r'xx', 'ab'), r'xx')\nassrt.equal(re.sub('a(b)', r'\\\\1', 'ab'), r'\\1')\nassrt.equal(re.sub('a(b)', r'\\\\\\1', 'ab'), r'\\b')\nassrt.equal(re.sub('a(b)', r'\\g<1>', 'ab'), r'b')\nassrt.equal(re.sub('a(b)', def(m):return m.group(1);, 'ab'), r'b')\nassrt.equal(']', re.match('[]]', ']').group())\n\nassrt.throws(def():re.search(r'(?(1)a|b)b', 'ab');, re.error)\n\n# Test lookbehind assertions\nassrt.equal('acdb', re.sub(r'(?<=a)b', 'c', 'abdb'))\n\n# Test named groups\nassrt.equal('aa', re.sub(r'(?P<a>a)b', r'\\g<a>\\1', 'ab'))\nassrt.equal('bb', re.sub(r'(?P<a>a)(?P=a)', r'bb', 'aa'))\nassrt.equal('ab', re.sub(r'(.)(?P<a>a)', r'\\g<a>\\1', 'ba'))\nassrt.deepEqual({'a':'a', 'b':'b'}, re.search(r'(?P<a>a)(?P<b>b)', 'ab').groupdict())\n\n# Test verbose mode literals\nassrt.equal(re.search(///\n    a\n    .  # anything\n    b\n    ///, ' axb').group(), 'axb')\n"
  },
  {
    "path": "test/repl.pyj",
    "content": "# globals: compiler_dir\nstdout = []\ndef clear():\n    stdout.length = 0\n\nclass FakeConsole:\n\n    def log(self):\n        Array.prototype.slice.call(arguments).forEach(def (arg):\n            stdout.push((arg or '').toString())\n        )\n        stdout.push('\\n')\n\n    def error(self):\n        Array.prototype.slice.call(arguments).forEach(def (arg):\n            stdout.push((arg or '').toString())\n        )\n        stdout.push('\\n')\n\nclass FakeReadline:\n\n    def __init__(self):\n        self.listeners = {}\n        self._prompt = ''\n\n    def setPrompt(self, prompt):\n        self._prompt = prompt\n\n    def write(self, data):\n        stdout.push(data)\n\n    def clearLine(self):\n        pass\n\n    def on(self, event, callback):\n        self.listeners[event] = callback\n        return self\n\n    def prompt(self):\n        stdout.push(self._prompt)\n\n    def send_line(self, text):\n        self.listeners['line'](text)\n\nrepl = require('./repl')\nrl = FakeReadline()\n\nsend_line = rl.send_line.bind(rl)\n\ndef send_text(text):\n    for line in text.split('\\n'):\n        send_line(line)\n\ndef check(text, output):\n    send_text(text)\n    eq(output, stdout[0])\n    clear()\n\ndef check_in(text, output):\n    send_text(text)\n    assrt.ok(output in stdout, output + ' not in ' + stdout)\n    clear()\n\ndef check_not_in(text, output):\n    send_text(text)\n    assrt.ok(output not in stdout)\n    clear()\n\nreadline = {\n    'createInterface': def(options):\n        rl.completer = options.completer\n        return rl\n}\nrepl({'lib_path':compiler_dir, 'console':FakeConsole(), 'readline':readline, 'terminal':False, 'show_js':False, 'histfile':False})\neq = assrt.equal\neq('>>> ', stdout[-1])\nclear()\ncheck('1', '1')\ncheck_in('if 1:\\n  2\\n  \\n  ', '2')\ncheck_not_in('if 1:\\n  2\\n ', '2')\ncheck_in('1 +\\n1\\n\\n', '2')\ncheck('max(1, 2)', '2')\nsend_text(\n'''\nclass A:\n\n    def __init__(self, a):\n        self. a = a\n\n\n''')\nclear()\ncheck_in('b = A(1)\\nb.a', '1')\ncheck_in('c = A(2)\\nc.a', '2')\nsend_text('from __python__ import dict_literals\\nd={1:1}')\ncheck_in('isinstance(d, dict)', 'true')\nsend_text('from __python__ import no_dict_literals\\nd={1:1}')\ncheck_in('isinstance(d, dict)', 'false')\n# Test completions\ndef completions(line):\n    return rl.completer(line)[0]\n\ndef check_completions():\n    items = completions(arguments[0])\n    for x in Array.prototype.slice.call(arguments, 1):\n        assrt.ok(items and x in items, x + ' not in completions for: ' + arguments[0])\n\ncheck_completions('', 'return', 'A')\ncheck_completions('Array.', 'isArray', 'apply')\nsend_text('x = \"\"\\ny = []'), clear()\ncheck_completions('x.', 'substr', 'trim')\ncheck_completions('y.', 'concat', 'push')\ncheck_completions('x.sl', 'slice')\nsend_text('y = {\"x\":1}'), clear()\ncheck_completions('y.', 'x')\n\n# Test docstrings\nclear()\nsend_text('def ds():\\n \"xxx\"\\n\\n')\nclear()\ncheck('ds.__doc__', \"'xxx'\")\n"
  },
  {
    "path": "test/scoped_flags.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>\n\na = {1:1}\nassrt.ok(not isinstance(a, dict))\n\nfrom __python__ import dict_literals, overload_getitem\na = {1:1}\nassrt.ok(isinstance(a, dict))\nassrt.equal(a[1], 1)\na[2] = 2\nassrt.equal(a[2], 2)\na[2] += 4\nassrt.equal(a[2], 6)\nassrt.deepEqual(list(a.keys()), [1, 2])\nfrom __python__ import no_dict_literals, no_overload_getitem\n\n\na = {1:1}\nassrt.ok(not isinstance(a, dict))\n\ndef f():\n    from __python__ import dict_literals\n    a = {1:1}\n    assrt.ok(isinstance(a, dict))\n\na = {1:1}\nassrt.ok(not isinstance(a, dict))\n\nclass S:\n    from __python__ import bound_methods\n\n    def __init__(self):\n        self.a = 3\n\n    def val(self):\n        return self.a if self else None\n\nf = S().val\nassrt.equal(f(), S().val())\n\nclass U:\n\n    def __init__(self):\n        self.a = 3\n\n    def val(self):\n        return self.a if self else None\n\nf = U().val\nassrt.equal(f(), None)\n\nclass C:\n\n    def __init__(self):\n        self.a = 3\n\n    def uval1(self):\n        return self.a if self else None\n\n    from __python__ import bound_methods\n\n    def bval(self):\n        return self.a\n\n    from __python__ import no_bound_methods\n\n    def uval2(self):\n        return self.a if self else None\n\nc = C()\nu1, u2 = c.uval1, c.uval2\nf = c.bval\nassrt.equal(u1(), None)\nassrt.equal(u2(), None)\nassrt.equal(f(), 3)\n"
  },
  {
    "path": "test/starargs.pyj",
    "content": "# vim:fileencoding=utf-8\n# globals: assrt\n\neq = assrt.equal\nde = assrt.deepEqual\n\ndef get(obj, name):\n    return obj[name] if obj else undefined\n\n# Test the parsing of function definitions {{{\n\ndef basic_test(code, arglen, starargs, kwargs, defaults):\n    func = RapydScript.parse('def func(' + code + '): pass\\n', {'filename':code}).body[0]\n    eq(func.argnames.length, arglen)\n    eq(get(func.argnames.starargs, 'name'), starargs)\n    eq(get(func.argnames.kwargs, 'name'), kwargs)\n    eq(func.argnames.is_simple_func, bool(not starargs and not kwargs and not defaults))\n    if defaults:\n        fd = {}\n        for key in Object.keys(func.argnames.defaults):\n            fd[key] = func.argnames.defaults[key].value\n        de(fd, defaults)\n    return func\n\ndef throw_test(code):\n    assrt.throws(def():\n        RapydScript.parse('def func(' + code + '): pass\\n', {'filename':code}).body[0]\n    , RapydScript.SyntaxError)\n\nbasic_test('a, b, c', 3)\nbasic_test('*args', 0, 'args')\nbasic_test('a, b, *args', 2, 'args')\nthrow_test('*args, a')\nthrow_test('*args, *a')\nbasic_test('**kwargs', 0, undefined, 'kwargs')\nbasic_test('*args, **kwargs', 0, 'args', 'kwargs')\nbasic_test('a, b, *args, **kwargs', 2, 'args', 'kwargs')\nthrow_test('**kw, *a')\nthrow_test('**kw, **a')\nbasic_test('a=1, b=\"2\"', 2, None, None, {'a':1, 'b':\"2\"})\nbasic_test('x, a=1, b=\"2\", *args, **kw', 3, 'args', 'kw', {'a':1, 'b':\"2\"})\nthrow_test('a=1, b')\nthrow_test('**k, a=1')\nthrow_test('a, a')\nthrow_test('a, a=1')\nthrow_test('*a, **a')\n# }}}\n\n# Test parsing of function calls {{{\n\ndef parse_call_test(code, arglen, opts):\n    func = RapydScript.parse('f(' + code + ')', {'filename':code}).body[0].body\n    opts = opts or {}\n    eq(func.args.length, arglen, 'Incorrect len for: ' + code)\n    if (opts.starargs != undefined):\n        si = [[i, x.name] for i, x in enumerate(func.args) if x.is_array]\n        de(opts.starargs, si, 'starargs wrong for: ' + code + ': ' + si + ' != ' + opts.starargs)\n    if (opts.kwargs != undefined):\n        de(opts.kwargs, [x[0].name for x in func.args.kwargs])\n\n\nparse_call_test('a, b, c', 3)\nparse_call_test('*args', 1, {'starargs':[[0, 'args']]})\nparse_call_test('a, b, *args', 3, {'starargs':[[2, 'args']]})\nparse_call_test('a, *args, b, *a2', 4, {'starargs':[[1, 'args'], [3, 'a2']]})\nparse_call_test('a=1', 0, {'kwargs':['a']})\nparse_call_test('a=1, b', 1, {'kwargs':['a']})\nparse_call_test('a=1, b, **kwargs, *args, **k2', 2, {'kwargs':['a'], 'kw':['kwargs', 'k2'], 'starargs':[[1,'args']]})\n# }}}\n\n# Test calling {{{\n\ndef f():\n    return Array.prototype.slice.call(arguments)\n\n\nde(f(1, 2, 3), [1, 2, 3])\nargs1, args2 = [4, 5, 6], [7, 8, 9]\nkw1, kw2 = {'a':4, 'b':5, 'c':6}, {'a':7, 'x':8, 'y':9}\n\nde(f(*args1), [4, 5, 6])\nde(f(1, *args1), [1, 4, 5, 6])\nde(f(*args1, 2), [4, 5, 6, 2])\nde(f(1, *args1, 2), [1, 4, 5, 6, 2])\nde(f(*args1, *args2), args1.concat(args2))\nde(f(*args1, 1, 2, *args2, 3), [4, 5, 6, 1, 2, 7, 8, 9, 3])\n\nde(f(1, a=2), [1, {'a':2}])\nde(f(1, a=2, 3), [1, 3, {'a':2}])\nde(f(**kw1), [kw1])\nde(f(1, a=2, 3, **kw1), [1, 3, {'a':2, 'b':5, 'c':6}])\nde(f(**kw2, 1, 3, **kw1, 2), [1, 3, 2, {'a':4, 'b':5, 'c':6, 'x':8, 'y':9}])\n\n# }}}\n\n# Test calling with definitions {{{\n\ndef f1(a, b, c):\n    return a, b, c\nde(f1(1, 2, 3), [1, 2, 3])\nde(f1(), [undefined, undefined, undefined])\n\ndef f2(a, b=1):\n    return a, b\n\nde(f2(), [undefined, 1])\nde(f2(1), [1, 1])\nde(f2(1, 2), [1, 2])\nde(f2(b=2), [undefined, 2])\nde(f2(1, b=2), [1, 2])\nde(f2({'b':3}), [{'b':3}, 1], 'a normal object is being treated as an options object')\n\ndef f3(*args):\n    return args\n\nde(f3(), [])\nde(f3(1, 2), [1, 2])\n\ndef f4(**kwargs):\n    return kwargs\n\nde(f4(), {})\nde(f4(a=1, b=2), {'a':1, 'b':2})\n\ndef f5(*args, **kwargs):\n    return [args, kwargs]\n\nde(f5(), [[], {}])\nde(f5(1, 2, a=1, b=2), [[1,2], {'a':1, 'b':2}])\n\ndef f6(a, *args):\n    return [a, args]\n\nde(f6(), [undefined, []])\nde(f6(1), [1, []])\nde(f6(1, 2, 3), [1, [2, 3]])\n\ndef f7(a=1, **kw):\n    return [a, kw]\n\nde(f7(), [1, {}])\nde(f7(a=3, b=4), [3, {'b':4}])\n\ndef f8(a, b=2, *args, **kwargs):\n    return [a, b, args, kwargs]\n\nde(f8(), [undefined, 2, [], {}])\nde(f8(1), [1, 2, [], {}])\nde(f8(1, 3, 4, 5, b=8, c=9), [1, 8, [4, 5], {'c':9}])\n\ndef f9(*args, **kwargs):\n    return [args, kwargs]\n\nde(f9(), [[], {}])\nde(f9(1, 2, a=1, b=2), [[1,2], {'a':1, 'b':2}])\n\ndef f10(a, b=2, c=3):\n    return [a, b, c]\n\nde(f10(1, c=6), [1, 2, 6])\n\ndef f11(a, b, x=1):\n    return [a, b, x]\n\nde(f11(x=3), [undefined, undefined, 3])\n# }}}\n\nacc = []\ndef mutable_defaults(a=acc):\n    a.append(1)\n\nmutable_defaults(), mutable_defaults()\nde([1, 1], acc)\n\ndef identity(f):\n    return def():\n        return f()\n\n@identity\ndef wrapped(x=1):\n    return x\n\neq(wrapped(), 1)\n\nclass W:\n    @identity\n    def wrapped(self, x=1):\n        return x\neq(W().wrapped(), 1)\neq(1, (def(x=1): return x;)())\n\nclass Simple:\n\n    def __init__(self, a, b):\n        self.q = [a, b]\nde(Simple(b=2, a=1).q, [1, 2])\n\nclass Other:\n    def func(self, **kw):\n        if self:\n            return kw\n\nclass Test:\n\n    def __init__(self, a, b=2, *args, **kwargs):\n        self.q = [a, b, args, kwargs]\n        self.other = Other()\n\n    def forwarded(self, **kw):\n        return self.other.func(**kw)\n\n    def simple(self, a, b):\n        return [a, b]\n\nde(Test().q, [undefined, 2, [], {}])\nde(Test(a=1).q, [1, 2, [], {}])\nde(Test(1, 3, 4, 5, b=8, c=9).q, [1, 8, [4, 5], {'c':9}])\nargs = [1, 2]\nde(Test(*args).q, [1, 2, [], {}])\nt = Test()\nde(t.simple(b=2, a=1), [1, 2])\n\n@options_object\ndef callback(a, b=1, c=2):\n    return [a, b, c]\n\nde(callback(0, {'c':4}), [0, 1, 4])\n\ndef afunc(a=1):\n    return a\n\ndef a2func(*args):\n    return args[0]\n\neq(afunc(None), None)\neq(a2func(None), None)\nde(Test().forwarded(a=1), {'a':1})\n\ndef norm(a, b):\n    return [a, b]\n\nde(norm(b=2, a=1), [1, 2])\n\ncall_counter = 0\n\ndef cc():\n    nonlocal call_counter\n    call_counter += 1\n    return def():\n        pass\n\ncc()(a=1)\neq(call_counter, 1)\ncc(o=1)(a=1)\neq(call_counter, 2)\ncall_counter = 0\n\ndef cc2():\n    nonlocal call_counter\n    call_counter += 1\n    return {'val':3, 'x':def():return this.val;}\neq(3, cc2().x(a=1))\neq(call_counter, 1)\ncall_counter = 0\n\ndef cc3():\n    nonlocal call_counter\n    call_counter += 1\n    this.num = call_counter\n    this.c = def():\n        return call_counter\neq(new cc3(a=1).num, 1)\neq(new cc3(a=1).c(b=9), 2)\n\nclass Pr:\n    def __init__(self, a=1):\n        self.a = a\n\n    def add(self, val=0):\n        self.a += val\n\nclass Pr2(Pr):\n\n    def __init__(self):\n        Pr.__init__(self, a=2)\n\n    def add(self):\n        Pr.add(self, val=1)\n\np = Pr(a=2)\np.add(val=3)\neq(p.a, 5)\np = Pr2()\np.add()\neq(p.a, 3)\np1, p2 = Pr(), Pr(a=1)\neq(p1.prototype, p2.prototype)\nde(dir(p1), dir(p2))\n\nclass Prn:\n\n    def __init__(self, x):\n        self.x = x\n\nclass Prn1(Prn):\n\n    def __init__(self, x, *a):\n        Prn.__init__(self, [x, a])\n\nclass Prn2(Prn):\n\n    def __init__(self, *a):\n        Prn.__init__(self, a)\n\n\nclass Prn3(Prn):\n\n    def __init__(self, *a):\n        Prn.__init__(self, *a)\n\np = Prn1(1, 2, 3)\neq(p.x[0], 1)\nde(p.x[1], [2, 3])\np = Prn2(1, 2)\nde(p.x, [1, 2])\np = Prn3(1, 2)\neq(p.x, 1)\n\n\nclass Prnb:\n\n    def __init__(self, a, k):\n        self.a, self.k = a, k\n\nclass Prnb1(Prnb):\n\n    def __init__(self, *a, **kw):\n        Prnb.__init__(self, a, kw)\n\np = Prnb1(1, 2, x=1, y=2)\nde(p.a, [1, 2])\nde(p.k, {'x': 1, 'y':2})\n"
  },
  {
    "path": "test/str.pyj",
    "content": "# vim:fileencoding=utf-8\n# License: BSD\n# Copyright: 2015, Kovid Goyal <kovid at kovidgoyal.net>\n# globals: assrt\n\nimport encodings\nae = assrt.equal\n\n# Test literals\n\nae(r'\\n', '\\\\n')\nae('\\n'.charCodeAt(0), 10)\nae('\\'', \"'\")\nae('\\76'.charCodeAt(0), 62)  # octal escapes\nae('\\x2a'.charCodeAt(0), 0x2a)  # hex escapes\nae('\\u2028'.charCodeAt(0), 0x2028)\nae(\"\\U0001F431\", '🐱')\nae(\"\\U0001F431\", '🐱')\nae(\"\\N{nbsp}\", '\\u00a0')\nae(\"\\N{NBSp}\", '\\u00a0')\nfor qs, aval in [['a', True], ['A', False]]:\n    ae(str.islower(qs), aval)\n    ae(str.islower(new String(qs)), aval)\n    ae(str.isupper(qs), aval ^ True)\n    ae(str.isupper(new String(qs)), aval ^ True)\n\n# Test format()\n\ndef test():\n    args = Array.prototype.slice.call(arguments, 1)\n    ae(arguments[0], str.format.apply(None, args))\n\ndef test_throws():\n    args = Array.prototype.slice.call(arguments)\n    def f():\n        return str.format.apply(None, args[1:])\n    assrt.throws(f, args[0])\n\ndef test_interpolation():\n    a, b, c = 1, ['x'], 30000\n    ae(f'{a}', '1')\n    ae(f'0{a}', '01')\n    ae(f'0{a}2', '012')\n    ae(f'{a}{b[-1]}', '1x')\n    ae(f'{c:,d}', (30000).toLocaleString())\n    ae(f'\\n', '\\n')\n    ae(f'{a}\\\\{b[0]}', '1\\\\x')\n    ae(f'x\\n\\ny', 'x\\n\\ny')\n    ae(f'{a=}', 'a=1')\n    somevar = {'x': 1}\n    ae(f'{somevar.x=}', 'somevar.x=1')\n    # Test consecutive f-string concatenation\n    ae(f'a'f'b', 'ab')\n    ae(f'a' f'b', 'ab')\n    ae(f'a'f'{a}', 'a1')\n    ae(f'{a}'   f'b', '1b')\n    ae(f'{a}'f'{a}', '11')\n    ae(f'a''b', 'ab')\n    ae(f'{a}''b', '1b')\n\nsomevar = 33\ntest('somevar=33', '{somevar=}', somevar=somevar)\nsomevar = {'v': 'x'}\ntest('somevar.v=x', '{somevar.v=}', somevar=somevar)\ntest(' 1 2', ' {} {}', 1, 2)\ntest('{ a ', '{{ {0} ', 'a')\ntest('11', '{0}{0}', 1)\ntest('12', '{a}{b}', a=1, b=2)\ntest('12', '{a}{0}', 2, a=1)\ntest('1', '{0[0]}', [1])\ntest('1', '{0.a.b}', {'a':{'b':1}})\ntest('1', '{0[a][b]}', {'a':{'b':1}})\ntest('x', '{}', def (): return 'x';)\ntest('11', '{:b}', 3)\ntest('0b11', '{:#b}', 3)\ntest((30000).toLocaleString(), '{:,d}', 30000)\n# in e.g. the indian number system, this is 3,00,000\ntest((300000).toLocaleString(), '{:,d}', 300000)\ntest('1.234568e+8', '{:e}', 123456789)\ntest('1.23E+8', '{:.2E}', 123456789)\ntest('12.35%', '{:.2%}', .123456789)\ntest((1234).toLocaleString(), '{:,}', 1234)\ntest('1_234', '{:_d}', 1234)\n# 6 is the default: 1234.000000% or 1234,000000%\ntest((1234).toLocaleString(undefined, {'minimumFractionDigits': 6}), '{:,f}', 1234)\n# 1234.0% or 1234,0%\ntest((1234).toLocaleString(undefined, {'minimumFractionDigits': 1}) + '%', '{:,.1%}', 12.34)\ntest((1234.57).toLocaleString(), '{:,g}', 1234.567)\ntest((1234).toLocaleString(), '{:,g}', 1234)\nfnum = 1234\nae(f'{fnum:,}', (1234).toLocaleString())\ntest('left aligned                  ', '{:<30}', 'left aligned')\ntest('                 right aligned', '{:>30}', 'right aligned')\ntest('           centered           ', '{:^30}', 'centered')\ntest('***********centered***********', '{:*^30}', 'centered')\ntest('+3.140000; -3.140000', '{:+f}; {:+f}', 3.14, -3.14)\ntest('3.140000; -3.140000', '{:-f}; {:-f}', 3.14, -3.14)\ntest(' 3.140000; -3.140000', '{: f}; {: f}', 3.14, -3.14)\ntest('int: 42;  hex: 2a;  oct: 52;  bin: 101010', \"int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}\", 42)\ntest('int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010', \"int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}\", 42)\ntest('100', '{:{fill}{align}3}', 1, fill=0, align='<')\ntest_throws(AttributeError, '{0.a}', {})\ntest_throws(KeyError, '{a}', b=1)\ntest_throws(IndexError, '{} {}', 1)\ntest_throws(IndexError, '{1} {2}', 1)\ntest_throws(ValueError, '{1')\ntest_interpolation()\n\n# Test miscellaneous services\nae('Abc', str.capitalize('aBC'))\nae(' 1 ', str.center('1', 3))\nae(2, str.count('xyx', 'x'))\nae(1, str.count('xyx', 'x', 2))\nae(True, str.endswith('a', ''))\nae(True, str.endswith('', ''))\nae(False, str.endswith('a', 'ab'))\nae(True, str.endswith('e', ['f', 'e']))\nae(True, str.startswith('a', ''))\nae(True, str.startswith('', ''))\nae(False, str.startswith('a', 'ab'))\nae(True, str.startswith('e', ['f', 'e']))\nae(1, str.find('ab', 'b'))\nae(2, str.rfind('abbc', 'b'))\nae(1, str.index('ab', 'b'))\nae(-1, str.find('abcd', 'b', 2))\nae(-1, str.find('abcd', 'b', 0, 1))\nae(-1, str.find('abcd', 'bcd', 0, 2))\nae(-1, str.rfind('abcd', 'b', 2))\nae(-1, str.rfind('abcd', 'b', 0, 1))\nae(3, str.rfind('abcd', 'd'))\nae('1,2', str.join(',', [1, 2]))\nae('1,2', str.join(',', iter([1, 2])))\nae('a  ', str.ljust('a', 3))\nae('  a', str.rjust('a', 3))\nae('A', str.upper('a'))\nae('a', str.lower('A'))\nae('a', str.lstrip('  a'))\nae('a', str.lstrip('a'))\nae('a', str.rstrip('a   '))\nae('a', str.rstrip('a'))\nae('a', str.strip('  a   '))\nae('', str.strip(' '))\nae('', str.lstrip(' '))\nae('', str.rstrip(' '))\nassrt.deepEqual(['1', ',', '2,3'], str.partition('1,2,3', ','))\nassrt.deepEqual(['1,2,3', '', ''], str.partition('1,2,3', ' '))\nassrt.deepEqual(['1,2', ',', '3'], str.rpartition('1,2,3', ','))\nassrt.deepEqual(['', '', '1,2,3'], str.rpartition('1,2,3', ' '))\nassrt.deepEqual(['1', ',2'], str.split('1,,2', ',', 1))\nassrt.deepEqual(['1', '2', '3'], str.split('1  2 3'))\nassrt.deepEqual(['1', '2 3'], str.split('1  2 3', None, 1))\nassrt.deepEqual(['1', '2 \\t3'], str.split('1 2 \\t3', None, 1))\nassrt.deepEqual(['-a--b-c', ''], str.rsplit('-a--b-c-', '-', 1))\nassrt.deepEqual(['', 'a', 'b'], str.rsplit(',a,b', ','))\nassrt.deepEqual([',a', 'b'], str.rsplit(',a,b', ',', 1))\nassrt.deepEqual(['x,a', 'b'], str.rsplit('x,a,b', ',', 1))\nassrt.deepEqual([' a b', 'c'], str.rsplit(' a b c ', None, 1))\nassrt.deepEqual([' a bx', 'c'], str.rsplit(' a bx c ', None, 1))\nfor x in ['a\\nb', 'a\\r\\nb', 'a\\rb']:\n    assrt.deepEqual(['a', 'b'], str.splitlines(x))\nassrt.deepEqual(['a', '', 'b'], str.splitlines('a\\n\\rb'))\nassrt.deepEqual(['a\\n', 'b'], str.splitlines('a\\nb', True))\nassrt.deepEqual(['a\\r\\n', 'b'], str.splitlines('a\\r\\nb', True))\nassrt.deepEqual(['s', \"🐱\", 'a', '\\u2028'], list(str.uchrs('s🐱a\\u2028')))\nassrt.deepEqual([[0, 's'], [1, \"🐱\"], [3, 'a'], [4, '\\u2028']], list(str.uchrs('s🐱a\\u2028', True)))\nae('bbb', str.replace('aaa', 'a', 'b'))\nae('baa', str.replace('aaa', 'a', 'b', 1))\nae('bba', str.replace('aaa', 'a', 'b', 2))\nae('aaa', str.replace('aaa', 'a', 'a'))\nae('', str.replace('aaa', 'a', ''))\nae('a1B', str.swapcase('A1b'))\nae('001', str.zfill('1', 3))\nae('111', str.zfill('111', 2))\nae('a\\u2028', str.uslice('s🐱a\\u2028', 2))\nae(4, str.ulen('s🐱a\\u2028', 2))\n\nfor f in (str, repr):\n    ae(f(True), 'True')\n    ae(f(False), 'False')\n    ae(f(None), 'None')\n    ae(f(1), '1')\n    ae(f([1,'2']), '[1, \"2\"]')\n    ae(f({1:[1, '2']}), '{\"1\":[1, \"2\"]}')\n    ae(f({1:'a', 2:'b'}), '{\"1\":\"a\", \"2\":\"b\"}')\nae(str('a'), 'a')\nae(repr('a'), '\"a\"')\n\nbytes = list(range(256))\nassrt.deepEqual(bytes, list(encodings.base64decode(encodings.base64encode(bytes))))\nassrt.deepEqual(bytes, list(encodings.unhexlify(encodings.hexlify(bytes))))\nfor k in ['abc', \"mūs\", '', 's🐱a\\u2028']:\n    bytes = encodings.utf8_encode(k)\n    ae(encodings.utf8_decode(bytes), k)\n    ae(encodings.utf8_decode(encodings.utf8_encode_js(k)), k)\n    assrt.deepEqual(list(bytes), list(encodings.base64decode(encodings.base64encode(bytes))))\n\nfrom pythonize import strings\nstrings()\nae('{0} {a}'.format(1, a=2), str.format('{0} {a}', 1, a=2))\nae(' x '.strip(), str.strip(' x '))\nae(','.join([1,2,3]), str.join(',', [1,2,3]))\nae('11111'.count('1', start=1, end=1), str.count('11111', '1', start=1, end=1))\nae('{{}}'.format(), '{}')\nae('{x}}}'.format(x=1), '1}')\na = 1\nae(f'{{ {a} }}', '{ 1 }')\n"
  },
  {
    "path": "tools/cli.js",
    "content": "/*\n * cli.js\n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license.\n */\n\"use strict\";  /*jshint node:true */\n\nvar path = require('path');\nvar utils = require('./utils');\nvar colored = utils.safe_colored;\nvar has_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);\n\nfunction OptionGroup(name) {\n    this.name = name;\n    this.description = undefined;\n    this.extra = undefined;\n    this.options = {\n        'string': {},\n        'boolean': {},\n        'alias': {},\n        'default': {},\n        'choices': {},\n    };\n\n    this.help = {};\n    this.seen = {};\n}\n\nvar groups = {}, group;\n\nfunction create_group(name, usage, description, extra) {\n    group = new OptionGroup(name);\n    var match = utils.comment_contents.exec(description.toString());\n    if (!match) {\n        throw new TypeError('Multiline comment missing for: ' + name);\n    }\n    group.description = match[1];\n    group.usage = name + ' [options] ' + usage;\n    groups[name] = group;\n\n    if (extra) {\n        match = utils.comment_contents.exec(extra.toString());\n        if (match) group.extra = match[1];\n    }\n\nopt('help', 'h', 'bool', false, function(){/*\nshow this help message and exit\n*/});\n\nopt('version', 'V', 'bool', false, function(){/*\nshow the version and exit\n*/});\n\n\n}\n\nvar COL1 = 'yellow', COL2 = 'green';\n\nfunction print_usage(group) {  // {{{\n\tvar COL_WIDTH = 79;\n\tvar OPT_WIDTH = 23;\n\n    var usage = (group) ? group.usage :  \"[sub-command] ...\";\n\tconsole.log(colored('Usage:', COL1), colored(path.basename(process.argv[1]), COL2), usage, '\\n');\n    if (!group) {\n        // Overall usage\n        help = ('RapydScript can perform many actions, depending on which' + \n                '\\nsub-command is invoked. With no arguments, it will start a REPL,' +\n                '\\nunless STDIN is a pipe, in which case it will compile whatever' + \n                '\\nyou pass on STDIN and write the output to STDOUT. See the full' +\n                '\\nlist of sub-commands below.');\n        console.log(help, '\\n');\n        console.log(colored('Sub-commands:', COL1));\n        Object.keys(groups).forEach(function (name) {\n            console.log();\n            var dt = utils.wrap(groups[name].description.split('\\n'), COL_WIDTH - OPT_WIDTH);\n            console.log(colored((name + utils.repeat(' ', OPT_WIDTH)).slice(0, OPT_WIDTH), COL2), dt[0]);\n            dt.slice(1).forEach(function (line) {\n                console.log(utils.repeat(' ', OPT_WIDTH), line);\n            });\n        });\n        return;\n    }\n\n    // Group specific usage\n\n    console.log(group.description);\n    if (group.extra) console.log('\\n' + group.extra);\n\tconsole.log(colored('\\nOptions:', COL1));\n    var options = group.options;\n    var help = group.help;\n\n\tObject.getOwnPropertyNames(options.alias).forEach(function (name) {\n\t\tvar optstr = '  --' + name.replace(/_/g, '-');\n\t\toptions.alias[name].forEach(function (alias) {\n\t\t\toptstr += ', ' + ((alias.length > 1) ? '--' : '-') + alias.replace(/_/g, '-');\n\t\t});\n\t\tvar ht = utils.wrap(help[name].split('\\n'), COL_WIDTH - OPT_WIDTH);\n\n\t\tif (optstr.length > OPT_WIDTH) console.log(colored(optstr, COL2));\n\t\telse {\n\t\t\tconsole.log(colored((optstr + utils.repeat(' ', OPT_WIDTH)).slice(0, OPT_WIDTH), COL2), ht[0]);\n\t\t\tht = ht.splice(1);\n\t\t}\n\t\tht.forEach(function (line) {\n\t\t\tconsole.log(utils.repeat(' ', OPT_WIDTH), line);\n\t\t});\n\t\tconsole.log();\n\t});\n\n}  // }}}\n\n// Process options {{{\n\nfunction opt(name, aliases, type, default_val, help_text, choices) {\n\tvar match = utils.comment_contents.exec(help_text.toString());\n    var options = group.options;\n    var seen = group.seen;\n    var help = group.help;\n\n\tif (!match) {\n\t\tthrow new TypeError('Multiline comment missing for: ' + name);\n\t}\n\thelp_text = match[1];\n\n\tif (!type || type == 'bool') options.boolean[name] = true;\n\telse if (type == 'string') {\n        options.string[name] = true;\n        if (choices) options.choices[name] = choices;\n    }\n\t\n\tif (default_val !== undefined) options.default[name] = default_val;\n\n\tif (aliases && aliases.length) {\n\t\taliases.split(',').forEach(function(alias) {\n\t\t\tif (has_prop(seen, alias)) throw \"The option name:\" + alias + \" has already been used.\";\n\t\t\tseen[alias] = true;\n\t\t});\n\t\toptions.alias[name] = aliases.split(',');\n\t} else options.alias[name] = [];\n\n\tif (has_prop(seen, name)) throw \"The option name:\" + name + \" has already been used.\";\n\tseen[name] = true;\n\n\thelp[name] = help_text;\n}\n// }}}\n\nfunction parse_args() {  // {{{\n\tvar ans = {'files':[]};\n\tvar name_map = {};\n\tvar state, options, group;\n\n\tfunction plain_arg(arg) {\n\t\tif (state !== undefined) ans[state] = arg;\n\t\telse ans.files.push(arg);\n\t\tstate = undefined;\n\t}\n\n\tfunction handle_opt(arg) {\n\t\tvar oarg = arg;\n        var is_long_opt = (arg[0] === '-') ? true : false;\n\t\tif (is_long_opt) arg = arg.substr(1);\n\t\tif (state !== undefined) ans[state] = '';\n\t\tstate = undefined;\n        if (!is_long_opt && arg.length > 1) {\n            arg.split('').forEach(handle_opt);\n            return;\n        }\n\t\tvar val = arg.indexOf('=');\n\t\tif (val > -1) {\n\t\t\tvar t = arg.substr(val + 1);\n\t\t\targ = arg.substr(0, val);\n\t\t\tval = t;\n\t\t} else val = undefined;\n\n\t\tvar name = name_map[arg.replace(/-/g, '_')];\n\t\tif (!name) {\n\t\t\tprint_usage(group);\n\t\t\tconsole.error('\\nThe option:', colored('-' + oarg, 'red'), 'is not recognized');\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (has_prop(options.boolean, name)) {\n\t\t\tif (!val) val = 'true';\n\t\t\tif (val === 'true' || val === '1') val = true;\n\t\t\telse if (val === 'false' || val === '0') val = false;\n\t\t\telse { console.error('The value:', colored(val, 'red'), 'is invalid for the boolean option:', colored(name, 'red')); process.exit(1); }\n\t\t\tans[name] = val;\n\t\t} else {\n\t\t\tif (val !== undefined) ans[name] = val;\n\t\t\telse state = name;\n\t\t}\n\t}\n\n    var all_args = process.argv.slice(2);\n    ans.auto_mode = false;\n    if (has_prop(groups, all_args[0])) {\n        ans.mode = all_args[0];\n        all_args = all_args.slice(1);\n    } else {\n        // this check is not robust, but, it will only fail if the repl mode takes any non-boolean options\n        var has_files = all_args.filter(function (a) { return a[0] !== '-'; }).length > 0;\n        ans.mode = (!has_files && process.stdin.isTTY) ? 'repl' : 'compile';\n        ans.auto_mode = true;\n    }\n    options = groups[ans.mode].options;\n\n\tObject.getOwnPropertyNames(options.default).forEach(function(name) { ans[name] = options['default'][name]; });\n\n\tObject.getOwnPropertyNames(options.alias).forEach(function(name) { \n\t\tname_map[name] = name;\n\t\toptions.alias[name].forEach(function (alias) { name_map[alias] = name; });\n\t});\n\n    var options_ended = false;\n\n\tall_args.forEach(function(arg) {\n        if (options_ended) plain_arg(arg);\n        else if (arg === '--') options_ended = true;\n\t\telse if (arg === '-') plain_arg(arg);\n\n\t\telse if (arg[0] === '-') handle_opt(arg.substr(1));\n\n\t\telse plain_arg(arg);\n\t});\n\tif (state !== undefined) plain_arg('');\n    Object.keys(options.choices).forEach(function(name) {\n        var allowed = options.choices[name];\n        if (allowed.indexOf(ans[name]) < 0) {\n            print_usage(groups[ans.mode]);\n            console.error('The value \"' + colored(ans[name], 'red') + '\" is not allowed for ' + colored(name, 'red') + '. Allowed values: ' + options.choices[name].join(', '));\n            process.exit(1);\n        }\n    });\n\treturn ans;\n} // }}}\n\ncreate_group('compile', \"[input1.pyj input2.pyj ...]\", function(){/*\nCompile RapydScript source code into JavaScript\noutput. You can also pipe the source code into \nstdin.\n*/});\n\nopt(\"output\", 'o', 'string', '', function(){/*\nOutput file (default STDOUT)\n*/});\n\nopt(\"bare\", 'b', 'bool', false, function(){/*\nRemove the module wrapper that prevents RapydScript \nscope from bleeding into other JavaScript logic \n*/});\n\nopt(\"keep_docstrings\", 'd', 'bool', false, function(){/*\nKeep the docstrings in the generated JavaScript as __doc__\nattributes on functions, classes and modules. Normally,\nthe docstring are deleted to reduce download size.\n*/});\n\nopt(\"discard_asserts\", 'a', 'bool', false, function(){/*\nDiscard any assert statements. If you use assert statements\nfor debugging, then use this option to generate an optimized build\nwithout the assert statements.\n*/});\n\nopt(\"uglify\", 'u', 'bool', false, function(){/*\nMinify the output instead of pretty printing it.\n*/});\n\nopt(\"omit_baselib\", 'm', 'bool', false, function(){/*\nOmit baselib functions. Use this if you have a \ndifferent way of ensuring they're imported. For example,\nyou could import one of the baselib-plain-*.js files directly\ninto the global namespace.\n*/});\n\nopt(\"js_version\", 'js,j', 'string', '5', function(){/*\nThe JavaScript version to output. By default, ES 5 \ncompatible JavaScript is output. You can specify 6 \nto output ES 6 compatible JavaScript instead. The ES 6\nversion of the code will be smaller and faster by making\nuse of some ES 6 only features, such as iterators and\ngenerators.\n*/}, ['5', '6']);\n\nopt(\"import_path\", \"p\", 'string', '', function(){/*\nA list of paths in which to look for imported modules.\nMultiple paths must be separated by the path separator \n(: on Unix and ; on Windows). You can also use the\nenvironment variable RAPYDSCRIPT_IMPORT_PATH for this,\nwith identical syntax. Note that these directories\nare searched before the builtin paths, which means you\ncan use them to replace builtin modules.\n*/});\n\nopt(\"filename_for_stdin\", \"P\", 'string', '', function(){/*\nfilename to use for data piped into STDIN. Imports will\nbe resolved relative to the directory this filename is in.\nNote, that you can also use the --import-path option to\nadd directories to the import path.\n*/});\n\nopt(\"cache_dir\", \"C\", 'string', '', function(){/*\ndirectory to use to store the cached files generated\nby the compiler. Normally, these are stored right next to\nevery compiled pyj file, with the extension pyj-cached. This\noption allows them to be consolidated in a single directory.\n*/});\n\nopt(\"comments\", undefined, 'string', '', function(){/*\nPreserve copyright comments in the output.\nBy default this works like Google Closure, keeping \nJSDoc-style comments that contain \"@license\" or \n\"@preserve\". You can optionally pass one of the \nfollowing arguments to this flag:\n- \"all\" to keep all comments\n- a valid JS regexp (needs to start with a slash) to \nkeep only comments that match.\n\nNote that currently not *all* comments can be kept \nwhen compression is on, because of dead code removal \nor cascading statements into sequences.\n*/});\n\nopt(\"stats\", undefined, 'bool', false, function(){/*\nDisplay operations run time on STDERR.\n*/});\n\nopt(\"execute\", 'x,exec', 'bool', false, function(){/*\nCompile and execute the RapydScript code, all in\none invocation. Useful if you wish to use RapydScript for\nscripting. Note that you can also use the -o option to\nhave the compiled JavaScript written out to a file\nbefore being executed. If you specify this option you\nshould not specify the -m option to omit the baselib, or \nexecution will fail.\n*/});\n\ncreate_group('repl', '', function(){/*\nRun a Read-Eval-Print-Loop (REPL). This allows\nyou to type and run RapydScript at a live\ncommand prompt.\n*/});\n\nopt(\"no_js\", '', 'bool', false, function(){/*\nDo not display the compiled JavaScript before executing\nit.\n*/});\n\ncreate_group('lint', \"[input1.pyj input2.pyj ...]\", function(){/*\nRun the RapydScript linter. This will find various \npossible problems in the .pyj files you specify and \nwrite messages about them to stdout. Use - to read from STDIN.\nThe main check it performs is for unused/undefined \nsymbols, like pyflakes does for python.\n*/}, function() {/*\nIn addition to the command line options listed below,\nyou can also control the linter in a couple of other ways.\n\nIn the actual source files, you can turn off specific checks\non a line by line basis by adding: # noqa:check1,check2...\nto the end of the line. For example:\n\n  f()  # noqa: undef\n\nwill prevent the linter from showing undefined symbol\nerrors for this line. You can also turn off individual checks\nat the file level, by putting the noqa directive on a\nline by itself near the top of the file, for example:\n\n# noqa: undef\n\nSimilarly, you can tell the linter\nabout global (builtin) symbols with a comment near the top\nof the file, for example:\n\n# globals:assert,myglobalvar\n\nThis will prevent the linter form treating these names as \nundefined symbols.\n\nFinally, the linter looks for a setup.cfg file in the\ndirectory containing the file being linted or any of its \nparent directories. You can both turn off individual checks\nand define project specific global symbols in the setup.cfg\nfile, like this:\n\n[rapydscript]\nglobals=myglobalvar,otherglobalvar\nnoqa=undef,eol-semicolon\n\n*/\n});\n\nopt(\"globals\", 'g,b,builtins', 'string', '', function(){/*\nComma separated list of additional names that the linter will\ntreat as global symbols. It ignores undefined errors for\nglobal symbols.\n*/});\n\nopt(\"noqa\", 'e,ignore,exclude', 'string', '', function(){/*\nComma separated list of linter checks to skip. The linter\nwill not report errors corresponding to these checks.\nThe check names are output in the linter's normal output, you\ncan also list all check names with --noqa-list.\n*/});\n\nopt(\"errorformat\", 'f,s,style', 'string', 'human', function(){/*\nOutput the results in the specified format. Valid formats are:\nhuman - output is suited for reading by humans (the default)\njson  - output is in JSON format\nvim   - output can be consumed easily by vim's errorformat \n        directive. Format is:\n        filename:line:col:errortype:token:message [identifier]\nundef - output only the names of undefined symbols in a form that\n        can be easily copy/pasted\n*/}, ['human', 'json', 'vim', 'undef']);\n\nopt(\"noqa_list\", '', 'bool', false, function(){/*\nList all available linter checks, with a brief\ndescription, and exit.\n*/});\n\nopt('stdin_filename', '', 'string', 'STDIN', function(){/*\nThe filename for data read from STDIN. If not specified\nSTDIN is used. \n*/});\n\ncreate_group('test', '[test1 test2...]', function(){/*\nRun RapydScript tests. You can specify the name of \nindividual test files to only run tests from those \nfiles. For example:\ntest baselib functions\n*/});\n\ncreate_group('self', '', function(){/*\nCompile the compiler itself. It will only actually \ncompile if something has changed since the last time \nit was called. To force a recompilation, simply \ndelete lib/signatures.json\n*/});\n\nopt(\"complete\", 'c,f,full', 'bool', false, function(){/*\nRun the compilation repeatedly, as many times as neccessary,\nso that the compiler is built with the most upto date version\nof itself.\n*/});\n\nopt(\"test\", 't', 'bool', false, function(){/*\nRun the test suite after building completes.\n*/});\n\nopt(\"profile\", 'p', 'bool', false, function(){/*\nRun a CPU profiler which will output its data to\nself.cpuprofile. The data can then be analysed with \nnode-inspector.\n*/});\n\ncreate_group('gettext', \"[input1.pyj input_dir ...]\", function(){/*\nExtract strings marked for translation from the specified\nsource files and directories. \n*/}, function() {/*\nDirectories are scanned recursively for .pyj files. If no \narguments are specified, the source code is read from stdin.\n\nTranslatable string are output on stdout in the .po format.\nTranslatable strings are detected in the input as literal \nstring arguments to the functions _(), gettext() and ngettext().\n*/\n});\n\nopt(\"omit_header\", 'm', 'bool', false, function(){/*\nDo not write header with 'msgid \"\"' entry.\n*/});\n\nopt(\"package_name\", '', 'string', 'XXX', function(){/*\nSet the package name in the header\n*/});\n\nopt(\"package_version\", '', 'string', 'XXX', function(){/*\nSet the package version in the header\n*/});\n\nopt(\"bugs_address\", 'bug_address', 'string', 'bugs@example.com', function(){/*\nSet the email address for bug reports in the header\n*/});\n\ncreate_group('msgfmt', \"\", function(){/*\nCompile a .po file into a .json file that can\nbe used to load translations in a browser.\n*/}, function() {/*\nThe .po file is read from\nstdin and the .json file written to stdout. Note\nthat it is assumed the .po file is encoded in UTF-8.\nIf you .po file is in some other encoding, you will need to \nconvert it to UTF-8 first.\n*/\n});\n\nopt(\"use_fuzzy\", 'f', 'bool', false, function(){/*\nUse fuzzy translations, they are ignored by default.\n*/});\n\n\nvar argv = module.exports.argv = parse_args();\nif (typeof argv.js_version === 'string') {\n    argv.js_version = parseInt(argv.js_version);\n    if (isNaN(argv.js_version)) {\n        console.log('--js-version must be a number');\n        process.exit(1);\n    }\n}\n\nif (argv.help) {\n\tprint_usage((!argv.auto_mode) ? groups[argv.mode]: undefined);\n\tprocess.exit(0);\n}\n\nif (argv.version) {\n    var json = require(\"../package.json\");\n    console.log(json.name + ' ' + json.version);\n    process.exit(0);\n}\n"
  },
  {
    "path": "tools/compile.js",
    "content": "/*\n * compile.js\n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license.\n */\n\"use strict\";  /*jshint node:true */\n\nvar fs = require('fs');\nvar path = require('path');\nvar vm = require('vm');\nvar RapydScript = require(\"./compiler\").create_compiler();\nvar utils = require('./utils');\n\nfunction read_whole_file(filename, cb) {\n    if (!filename) {\n        var chunks = [];\n        process.stdin.setEncoding('utf-8');\n        process.stdin.on('data', function (chunk) {\n            chunks.push(chunk);\n        }).on('end', function () {\n            cb(null, chunks.join(\"\"));\n        });\n        process.openStdin();\n    } else {\n        fs.readFile(filename, \"utf-8\", cb);\n    }\n}\n\nfunction makedirs(dir) {\n    try {\n        fs.mkdirSync(dir);\n    } catch(e) {\n        if (e.code == 'EEXIST') return;\n        if (e.code == 'ENOENT') { makedirs(path.dirname(dir)); fs.mkdirSync(dir); }\n        throw e;\n    }\n}\n\nfunction process_cache_dir(dir) {\n    dir = path.resolve(path.normalize(dir));\n    makedirs(dir);\n    return dir;\n}\n\nmodule.exports = function(start_time, argv, base_path, src_path, lib_path) {\n    // configure settings for the output\n    var cache_dir = argv.cache_dir ? process_cache_dir(argv.cache_dir) : '';\n    var OUTPUT_OPTIONS = {\n        beautify: !argv.uglify,\n        private_scope: !argv.bare,\n        omit_baselib: argv.omit_baselib,\n        js_version: parseInt(argv.js_version),\n        keep_docstrings: argv.keep_docstrings,\n        discard_asserts: argv.discard_asserts,\n        module_cache_dir: cache_dir,\n    };\n\n    var files = argv.files.slice();\n    var STATS = {}, TOPLEVEL;\n    var num_of_files = files.length || 1;\n\n    function parse_file(code, file, toplevel) {\n        return RapydScript.parse(code, {\n            filename: file,\n            toplevel: toplevel,\n            basedir: (file !== '<stdin>') ? path.dirname(file) : undefined,\n            libdir: path.join(src_path, 'lib'),\n            import_dirs: utils.get_import_dirs(argv.import_path),\n            discard_asserts: argv.discard_asserts,\n            module_cache_dir: cache_dir,\n        });\n    }\n\n    function write_output(output) {\n        if (argv.output) {\n            // Node's filesystem module cannot write directly to /dev/stdout\n            if (argv.output == '/dev/stdout') console.log(output);\n            else if (argv.output == '/dev/stderr') console.error(output);\n            else fs.writeFileSync(argv.output, output, \"utf8\");\n        } else if (!argv.execute){\n            console.log(output);\n        }\n        if (argv.execute) {\n            vm.runInNewContext(output, {'console':console, 'require':require}, {'filename':files[0]});\n        }\n    }\n\n    function time_it(name, cont) {\n        var t1 = new Date().getTime();\n        var ret = cont();\n        if (argv.stats) {\n            var spent = new Date().getTime() - t1;\n            if (STATS[name]) STATS[name] += spent;\n            else STATS[name] = spent;\n        }\n        return ret;\n    }\n\n    function compile_single_file(err, code) {\n        var output;\n        if (err) {\n            console.error(\"ERROR: can't read file: \" + files[0]);\n            process.exit(1);\n        }\n        time_it(\"parse\", function(){\n            var file = files[0] || argv.filename_for_stdin || '<stdin>';\n            try {\n                TOPLEVEL = parse_file(code, file, TOPLEVEL);\n            } catch (e) {\n                if (!(e instanceof RapydScript.SyntaxError)) throw e;\n                console.error(e.toString());\n                process.exit(1);\n            }\n        });\n\n        try {\n            output = new RapydScript.OutputStream(OUTPUT_OPTIONS);\n        } catch(ex) {\n            if (ex instanceof RapydScript.DefaultsError) {\n                console.error(ex.message);\n                process.exit(1);\n            }\n            throw ex;\n        }\n\n        time_it(\"generate\", function(){\n            TOPLEVEL.print(output);\n        });\n\n        output = output.get();\n\n        write_output(output);\n\n        files = files.slice(1);\n        if (files.length) {\n            setImmediate(read_whole_file, files[0], compile_single_file);\n            return;\n        }\n        if (argv.stats) {\n            console.error(RapydScript.string_template(\"Timing information (compressed {count} files):\", {\n                count: num_of_files\n            }));\n            for (var i in STATS) if (Object.prototype.hasOwnProperty.call(STATS, i)) {\n                console.error(RapydScript.string_template(\"- {name}: {time}s\", {\n                    name: i,\n                    time: (STATS[i] / 1000).toFixed(3)\n                }));\n            }\n        }\n    }\n\n\n    if (argv.comments) {\n        if (/^\\//.test(argv.comments)) {\n            OUTPUT_OPTIONS.comments = new Function(\"return(\" + argv.comments + \")\")();  // jshint ignore:line\n        } else if (argv.comments == \"all\") {\n            OUTPUT_OPTIONS.comments = true;\n        } else {\n            OUTPUT_OPTIONS.comments = function(node, comment) {\n                var text = comment.value;\n                var type = comment.type;\n                if (type == \"comment2\") {\n                    // multiline comment\n                    return /@preserve|@license|@cc_on/i.test(text);\n                }\n            };\n        }\n    }\n\n    if (!argv.omit_baselib) {\n        var which = (OUTPUT_OPTIONS.beautify) ? 'pretty' : 'ugly';\n        OUTPUT_OPTIONS.baselib_plain = fs.readFileSync(path.join(lib_path, 'baselib-plain-' + which + '.js'), 'utf-8');\n    }\n\n    if (files.filter(function(el){ return el == \"-\"; }).length > 1) {\n        console.error(\"ERROR: Can read a single file from STDIN (two or more dashes specified)\");\n        process.exit(1);\n    }\n\n    setImmediate(read_whole_file, files[0], compile_single_file);\n\n};\n\n"
  },
  {
    "path": "tools/compiler.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\n// Thin wrapper around (release|dev)/compiler.js to setup some global facilities and\n// export the compiler's symbols safely.\n\nvar path = require(\"path\");\nvar fs = require(\"fs\");\nvar crypto = require('crypto');\nvar vm = require(\"vm\");\nvar regenerator = require('regenerator');\nvar UglifyJS = require(\"uglify-js\");\n\nfunction sha1sum(data) { \n    var h = crypto.createHash('sha1');\n    h.update(data);\n    return h.digest('hex');\n}\n\nfunction path_exists(path) {\n    try {\n        fs.statSync(path);\n        return true;\n    } catch(e) {\n        if (e.code != 'ENOENT') throw e;\n    }\n}\n\nfunction uglify(code) {\n    var ans = UglifyJS.minify(code);\n    if (ans.error) throw ans.error;\n    return ans.code;\n}\n\n\nfunction regenerate(code, beautify) {\n    var ans, start, end;\n    if (code) {\n        ans = regenerator.compile(code).code;\n        if (!beautify) {\n            ans = uglify(ans);\n        }\n    } else {\n        // Return the runtime\n        ans = regenerator.compile('', {includeRuntime:true}).code;\n        start = ans.indexOf('=') + 1;\n        end = ans.lastIndexOf('typeof');\n        end = ans.lastIndexOf('}(', end);\n        ans = ans.slice(start + 1, end);\n        if (!beautify) {\n            var extra = '})()';\n            ans = uglify(ans + extra).slice(0, extra.length);\n        }\n    }\n    return ans;\n}\n\nfunction create_compiler() {\n    var compiler_exports = {};\n    var compiler_context = vm.createContext({\n        console       : console,\n        readfile      : fs.readFileSync,\n        writefile     : fs.writeFileSync,\n        sha1sum       : sha1sum,\n        require       : require,\n        regenerate    : regenerate,\n        exports       : compiler_exports,\n    });\n\n    var base = path.dirname(path.dirname(module.filename));\n    var compiler_dir = path.join(base, 'dev');\n    if (!path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base, 'release');\n    var compiler_file = path.join(compiler_dir, 'compiler.js');\n    var compilerjs = fs.readFileSync(compiler_file, 'utf-8');\n    vm.runInContext(compilerjs, compiler_context, path.relative(base, compiler_file));\n    return compiler_exports;\n}\n\nexports.create_compiler = create_compiler;\n"
  },
  {
    "path": "tools/completer.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2016 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\n\nmodule.exports = function(compiler, options) {\n    \"use strict\";\n    var all_keywords = compiler.ALL_KEYWORDS.split(' ');\n    var vm = require('vm');\n    options = options || {};\n    if (!options.enum_global) options.enum_global = \"var global = Function('return this')(); Object.getOwnPropertyNames(global);\";\n\n    function global_names(ctx) {\n        try {\n            var ans = vm.runInContext(options.enum_global, ctx);\n            ans = ans.concat(all_keywords);\n            ans.sort();\n            var seen = {};\n            ans.filter(function (item) { \n                if (Object.prototype.hasOwnProperty.call(seen, item)) return false;\n                seen[item] = true;\n                return true;\n            });\n            return ans;\n        } catch(e) {\n            console.log(e.stack || e.toString());\n        }\n        return [];\n    }\n\n    function object_names(obj, prefix) {\n        if (obj === null || obj === undefined) return [];\n        var groups = [], prefix_len = prefix.length, p;\n\n        function prefix_filter(name) { return (prefix_len) ? (name.substr(0, prefix_len) === prefix) : true; }\n\n        function add(o) {\n            var items = Object.getOwnPropertyNames(o).filter(prefix_filter);\n            if (items.length) groups.push(items);\n        }\n\n        if (typeof obj === 'object' || typeof obj === 'function') {\n            add(obj);\n            p = Object.getPrototypeOf(obj);\n        } else p = obj.constructor ? obj.constructor.prototype : null; \n\n        // Walk the prototype chain\n        try {\n            var sentinel = 5;\n            while (p !== null && sentinel > 0) {\n                add(p);\n                p = Object.getPrototypeOf(p);\n                // Circular refs possible? Let's guard against that.\n                sentinel--;\n            }\n        } catch (e) {\n            // console.error(\"completion error walking prototype chain:\" + e);\n        }\n        if (!groups.length) return [];\n        var seen = {}, ans = [];\n        function uniq(name) {\n            if (Object.prototype.hasOwnProperty.call(seen, name)) return false;\n            seen[name] = true;\n            return true;\n        }\n        for (var i = 0; i < groups.length; i++) {\n            var group = groups[i];\n            group.sort();\n            ans = ans.concat(group.filter(uniq));\n            ans.push('');  // group separator\n\n        }\n        while (ans.length && ans[ans.length - 1] === '') ans.pop();\n        return ans;\n    }\n\n    function prefix_matches(prefix, items) {\n        var len = prefix.length;\n        var ans = items.filter(function(item) { return item.substr(0, len) === prefix; });\n        ans.sort();\n        return ans;\n    }\n\n    function find_completions(line, ctx) {\n        var t;\n        try {\n            t = compiler.tokenizer(line, '<repl>');\n        } catch(e) { return []; }\n        var tokens = [], token;\n        while (true) {\n            try {\n                token = t();\n            } catch (e) { return []; }\n            if (token.type === 'eof') break;\n            if (token.type === 'punc' && '(){},;:'.indexOf(token.value) > -1)\n                tokens = [];\n            tokens.push(token);\n        }\n        if (!tokens.length) {\n            // New line or trailing space\n            return [global_names(ctx), ''];\n        }\n        var last_tok = tokens[tokens.length - 1];\n        if (last_tok.value === '.' || (last_tok.type === 'name' && compiler.IDENTIFIER_PAT.test(last_tok.value))) {\n            last_tok = last_tok.value;\n            if (last_tok === '.') {\n                tokens.push({'value':''});\n                last_tok = '';\n            }\n            if (tokens.length > 1 && tokens[tokens.length - 2].value === '.') {\n                // A compound expression\n                var prefix = '', result;\n                tokens.slice(0, tokens.length - 2).forEach(function (tok) { prefix += tok.value; });\n                if (prefix) {\n                    try {\n                        result = vm.runInContext(prefix, ctx, {'displayErrors':false});\n                    } catch(e) { return []; }\n                    return [object_names(result, last_tok), last_tok];\n                }\n            } else {\n                return [prefix_matches(last_tok, global_names(ctx)), last_tok];\n            }\n        }\n        return [];\n    }\n\n    return find_completions;\n};\n"
  },
  {
    "path": "tools/embedded_compiler.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2016 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nvar has_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);\n\nmodule.exports = function(compiler, baselib, runjs, name) {\n    var LINE_CONTINUATION_CHARS = ':\\\\';\n    runjs = runjs || eval;\n    runjs(print_ast(compiler.parse(''), true));\n    runjs('var __name__ = \"' + (name || '__embedded__') + '\";');\n\n    function print_ast(ast, keep_baselib, keep_docstrings, js_version, private_scope, write_name) {\n        var output_options = {omit_baselib:!keep_baselib, write_name:!!write_name, private_scope:!!private_scope, beautify:true, js_version: (js_version || 6), keep_docstrings:keep_docstrings};\n        if (keep_baselib) output_options.baselib_plain = baselib;\n        var output = new compiler.OutputStream(output_options);\n        ast.print(output);\n        return output.get();\n    }\n\n    return {\n        'toplevel': null,\n\n        'compile': function streaming_compile(code, opts) {\n            opts = opts || {};\n            var classes = (this.toplevel) ? this.toplevel.classes : undefined;\n            var scoped_flags = (this.toplevel) ? this.toplevel.scoped_flags: undefined;\n            this.toplevel = compiler.parse(code, {\n                'filename': opts.filename || '<embedded>',\n                'basedir': '__stdlib__',\n                'classes': classes,\n                'scoped_flags': scoped_flags,\n                'discard_asserts': opts.discard_asserts,\n            });\n            var ans = print_ast(this.toplevel, opts.keep_baselib, opts.keep_docstrings, opts.js_version, opts.private_scope, opts.write_name);\n            if (classes) {\n                var exports = {};\n                var self = this;\n                this.toplevel.exports.forEach(function (name) { exports[name] = true; });\n                Object.getOwnPropertyNames(classes).forEach(function (name) {\n                    if (!has_prop(exports, name) && !has_prop(self.toplevel.classes, name))\n                        self.toplevel.classes[name] = classes[name];\n                });\n            }\n            scoped_flags = this.toplevel.scoped_flags;\n    \n            return ans;\n        },\n\n    };\n};\n\n"
  },
  {
    "path": "tools/export.js",
    "content": "/* \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\nvar vm = require('vm');\nvar native_require = require;\n\nfunction normalize_array(parts, allowAboveRoot) {\n  var res = [];\n  for (var i = 0; i < parts.length; i++) {\n    var p = parts[i];\n\n    // ignore empty parts\n    if (!p || p === '.')\n      continue;\n\n    if (p === '..') {\n      if (res.length && res[res.length - 1] !== '..') {\n        res.pop();\n      } else if (allowAboveRoot) {\n        res.push('..');\n      }\n    } else {\n      res.push(p);\n    }\n  }\n\n  return res;\n}\n\nfunction normalize(path) {\n    var is_abs = path && path[0] === '/';\n    var trailing_slash = path && path[path.length - 1] === '/';\n    path = normalize_array(path.split('/'), !is_abs).join('/');\n\n    if (!path && !is_abs) {\n        path = '.';\n    }\n    if (path && trailing_slash) {\n        path += '/';\n    }\n\n    return (is_abs ? '/' : '') + path;\n}\n\nfunction dirname(path) {\n    var idx = path.lastIndexOf('/');\n    if (idx != -1) path = path.slice(0, idx);\n    else path = '';\n    return path;\n}\n\nfunction basename(path) {\n    var idx = path.lastIndexOf('/');\n    if (idx != -1) path = path.slice(idx + 1);\n    return path;\n}\n\nvar cache = {};\n\nfunction load(filepath) {\n    var cached = cache[filepath];\n    if (cached) return cached.exports;\n    var module = {'id':filepath, 'exports':{}};\n    cache[filepath] = module;\n\n    var content = data[filepath];\n    if (Array.isArray(content)) content = data[content[0]];\n    if (!content) throw 'Failed to load: ' + JSON.stringify(filepath);\n\n    if (filepath.slice(-5) == '.json') { module.exports = JSON.parse(content); return module.exports; }\n\n    var base = dirname(filepath);\n    function mrequire(x) {\n        return vrequire(x, base);\n    }\n    content = content.replace(/^\\#\\!.*/, '');\n    var wrapped = '(function(exports, require, module, __filename, __dirname, create_rapydscript_compiler) { ';\n    wrapped += content + '\\n;})';\n    try {\n        vm.runInThisContext(wrapped, {'filename': filepath})(module.exports, mrequire, module, filepath, dirname(filepath), create_compiler);\n    } catch (e) {\n        console.error(e);\n        delete cache[filepath];\n        throw e;\n    }\n    return module.exports;\n}\n\nfunction has(x, y) { return Object.prototype.hasOwnProperty.call(x, y); }\n\nfunction try_files(candidate) {\n    if (has(data, candidate)) return candidate;\n    if (has(data, candidate + '.js')) return candidate + '.js';\n    if (has(data, candidate + '.json')) return candidate + '.json';\n    return null;\n}\n\nfunction find_in_modules_dir(name, base) {\n    var candidate = normalize(base + (base ? '/':'') + 'node_modules/' + name);\n    var q = try_files(candidate);\n    if (q) return q;\n\n    var pj = candidate + '/package.json';\n    if (has(data, pj)) {\n        var ans = normalize(candidate + '/' + JSON.parse(data[pj]).main);\n        if (has(data, ans)) return ans;\n    }\n    var index = candidate + '/index.js';\n    if (has(data, index)) return index;\n\n    var p = dirname(base);\n    if (p) return find_in_modules_dir(name, p);\n    return null;\n}\n\nfunction find_module(name, base) {\n    if (name[0] == '/') throw 'Cannot find absolute module: ' + name;\n    if (name.slice(0, 2) == './' || name.slice(0, 3) == '../') {\n        var candidate = normalize((base ? base + '/' : base) + name);\n        return try_files(candidate);\n    }\n    var q = try_files(name);\n    if (q) return q;\n    return find_in_modules_dir(name, base);\n}\n\nfunction vrequire(name, base) {\n    var exports = {};\n    var modpath = '';\n    base = base || '';\n    // console.log('vrequire', name, base);\n    if (!name) throw new Error('Cannot load a module from an empty name');\n\n    modpath = find_module(name, base);\n    if (!modpath && name && './'.indexOf(name[0]) === -1) {\n            try {\n                return native_require(name);\n            } catch (e) {}\n        }\n\n    if (!modpath) throw new Error(\"Failed to find module: \" + JSON.stringify(name) + \" with base: \" + JSON.stringify(base));\n    return load(modpath);\n}\n\nvar UglifyJS = null, regenerator = null;\nvar crypto = null, fs = require('fs');\n\nfunction uglify(x) {\n    if (!UglifyJS) UglifyJS = vrequire(\"uglify-js\");\n    ans = UglifyJS.minify(x);\n    if (ans.error) throw ans.error;\n    return ans.code;\n}\n\nfunction regenerate(code, beautify) {\n    var orig = fs.readFileSync;\n    fs.readFileSync = function(name) { \n        if (!has(data, name)) {\n            throw {message: \"Failed to readfile from data: \" + name};\n        }\n        return data[name]; \n    };\n    if (!regenerator) regenerator = vrequire('regenerator');\n    var ans;\n    if (code) {\n        try {\n            ans = regenerator.compile(code).code;\n        } catch (e) {\n            console.error('regenerator failed for code: ' + code + 'with error stack:\\n' + e.stack);\n            throw e;\n        }\n        if (!beautify) ans = uglify(ans);\n    } else {\n        // Return the runtime\n        ans = regenerator.compile('', {includeRuntime:true}).code;\n        start = ans.indexOf('=') + 1;\n        end = ans.lastIndexOf('typeof');\n        end = ans.lastIndexOf('}(', end);\n        ans = ans.slice(start + 1, end);\n        if (!beautify) {\n            var extra = '})()';\n            ans = uglify(ans + extra).slice(0, extra.length);\n        }\n    }\n    fs.readFileSync = orig;\n    return ans;\n}\n\nif (typeof this != 'object' || typeof this.sha1sum !== 'function') {\n    var sha1sum = function (data) { \n        if (!crypto) crypto = require('crypto');\n        var h = crypto.createHash('sha1');\n        h.update(data);\n        return h.digest('hex');\n    };\n} else var sha1sum = this.sha1sum;\n\nfunction create_compiler() {\n    var compilerjs = data['compiler.js'];\n    var module = {'id':'compiler', 'exports':{}};\n    var wrapped = '(function(module, exports, readfile, writefile, sha1sum, regenerate) {' + data['compiler.js'] + ';\\n})';\n    vm.runInThisContext(wrapped, {'filename': 'compiler.js'})(module, module.exports, fs.readFileSync, fs.writeFileSync, sha1sum, regenerate);\n    return module.exports;\n}\n\nvar RapydScript = null;\n\nfunction compile(code, filename, options) {\n    if (!RapydScript) RapydScript = create_compiler();\n    options = options || {};\n    var ast = RapydScript.parse(code, {\n        filename: filename || '<eval>',\n        basedir: options.basedir || dirname(filename || ''),\n        libdir: options.libdir,\n    });\n    var out_ops = {\n        beautify: (options.beautify === undefined ? true : options.beautify),\n        private_scope: !options.bare,\n        omit_baselib: !!options.omit_baselib,\n        js_version: options.js_version || 5,\n    };\n    if (!out_ops.omit_baselib) out_ops.baselib_plain = data['baselib-plain-' + (out_ops.beautify ? 'pretty' : 'ugly') + '.js'];\n    var out = new RapydScript.OutputStream(out_ops);\n    ast.print(out);\n    return out.get();\n}\n\nfunction create_embedded_compiler(runjs) {\n    var c = vrequire('tools/embedded_compiler.js');\n    return c(create_compiler(), data['baselib-plain-pretty.js'], runjs);\n}\n\nfunction web_repl() {\n    var repl = vrequire('tools/web_repl.js');\n    return repl(create_compiler(), data['baselib-plain-pretty.js']);\n}\n\nfunction init_repl(options) {\n    var repl = vrequire('tools/repl.js');\n    options.baselib = data['baselib-plain-pretty.js'];\n    return repl(options);\n}\n\nfunction gettext_parse(catalog, code, filename) {\n    g = vrequire('tools/gettext.js');\n    g.gettext(catalog, code, filename);\n}\n\nfunction gettext_output(catalog, options, write) {\n    g = vrequire('tools/gettext.js');\n    g.write_output(catalog, options, write);\n}\n\nfunction msgfmt(data, options) {\n    m = vrequire('tools/msgfmt.js');\n    return m.build(data, options);\n}\n\nfunction completer(compiler, options) {\n    m = vrequire('tools/completer.js');\n    return m(compiler, options);\n}\n\nif (typeof exports === 'object') {\n    exports.compile = compile;\n    exports.create_embedded_compiler = create_embedded_compiler;\n    exports.web_repl = web_repl;\n    exports.init_repl = init_repl;\n    exports.gettext_parse = gettext_parse;\n    exports.gettext_output = gettext_output;\n    exports.msgfmt = msgfmt;\n    exports.rs_version = rs_version;\n    exports.file_data = data;\n    exports.completer = completer;\n    if (typeof rs_commit_sha === 'string') exports.rs_commit_sha = rs_commit_sha;\n}\n"
  },
  {
    "path": "tools/gettext.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nvar fs = require('fs');\nvar RapydScript = (typeof create_rapydscript_compiler === 'function') ? create_rapydscript_compiler() : require('./compiler').create_compiler();\nvar path = require('path');\n\nfunction parse_file(code, filename) {\n    return RapydScript.parse(code, {\n        filename: filename,\n        basedir: path.dirname(filename),\n        libdir: path.dirname(filename),\n        for_linting: true,\n    });\n}\n\nfunction detect_format(msgid) {\n    var q = msgid.replace('{{', '');\n    if (/\\{[0-9a-zA-Z_}]+/.test(q)) return 'python-brace-format';\n    return null;\n}\n\nfunction Gettext(catalog, filename) {\n    this._visit = function (node, cont) {\n        if (node instanceof RapydScript.AST_Call && node.args && node.args.length && node.expression instanceof RapydScript.AST_Symbol) {\n            var name = node.expression.name;\n            if (name === '_' || name === 'gettext' || name === 'ngettext') {\n                var nargs = (name === 'ngettext') ? 2 : 1;\n                var line = node.start.line;\n                for (var i = 0; i < nargs; i++) {\n                    if (!(node.args[i] instanceof RapydScript.AST_String)) {\n                        console.error('Translation function: ' + name + ' does not have a string literal argument at line: ' + line + ' of ' + filename);\n                        process.exit(1);\n                    }\n                }\n                var msgid = node.args[0].value;\n                if (!Object.prototype.hasOwnProperty.call(catalog, msgid)) {\n                    catalog[msgid] = {\n                        'locations': [],\n                        'plural': null,\n                        'format': detect_format(msgid),\n                    };\n                }\n                if (name === 'ngettext') catalog[msgid].plural = node.args[1].value;\n                if (filename) catalog[msgid].locations.push(filename + ':' + line);\n            }\n            \n        }\n        if (cont !== undefined) cont();\n    };\n}\n\nfunction gettext(catalog, code, filename) {\n    var toplevel;\n\n    try {\n        toplevel = parse_file(code, filename);\n    } catch(e) {\n        if (e instanceof RapydScript.SyntaxError) {\n            console.error('Failed to parse: ' + filename + ' with error: ' + e.line + ':' + e.col + ':' + e.message);\n            process.exit(1);\n        } else throw e;\n    }\n\n    if (toplevel) {\n        var gt = new Gettext(catalog, filename);\n        toplevel.walk(gt);\n    }\n}\n\nfunction esc(string) {\n    return (string || '').replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\t/g, '\\\\t').replace(/\\r/g, '');\n}\n\nfunction entry_to_string(msgid, data) {\n    var ans = [];\n    data.locations.forEach(function (loc) { ans.push('#: ' + loc); });\n    if (data.format) ans.push('#, ' + data.format);\n    ans.push('msgid \"' + esc(msgid) + '\"');\n    if (data.plural) {\n        ans.push('msgid_plural \"' + esc(data.plural) + '\"');\n        ans.push('msgstr[0] \"\"');\n        ans.push('msgstr[1] \"\"');\n    } else ans.push('msgstr \"\"');\n    return ans.join('\\n');\n}\n\nfunction write_output(catalog, options, write) {\n    write = write || (function(x) { process.stdout.write(new Buffer(x, 'utf-8')); });\n    function print() {\n        var val = Array.prototype.slice.call(arguments).join(' ') + '\\n';\n        write(val);\n    }\n    function header_line() {\n        var val = '\"' + Array.prototype.slice.call(arguments).join(' ') + '\\\\n\"\\n';\n        write(val);\n    }\n    if (!options.omit_header) {\n        var now = (new Date()).toISOString();\n        print('msgid', '\"\"');\n        print('msgstr', '\"\"');\n        header_line('Project-Id-Version:', esc(options.package_name), esc(options.package_version));\n        header_line('POT-Creation-Date:', now);\n        header_line(\"PO-Revision-Date:\", now);\n        header_line(\"Report-Msgid-Bugs-To:\", esc(options.bugs_address));\n        header_line(\"Last-Translator: Automatically generated\");\n        header_line(\"Language-Team: LANGUAGE\");\n        header_line(\"MIME-Version: 1.0\");\n        header_line(\"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\");\n        header_line(\"Content-Type: text/plain; charset=UTF-8\");\n        header_line(\"Content-Transfer-Encoding: 8bit\");\n        print();\n    }\n    Object.keys(catalog).forEach(function(msgid) {\n        var data = catalog[msgid];\n        print(entry_to_string(msgid, data));\n        print();\n    });\n}\n\n// CLI {{{\n\nfunction read_whole_file(filename, cb) {\n    if (!filename) {\n        var chunks = [];\n        process.stdin.setEncoding('utf-8');\n        process.stdin.on('data', function (chunk) {\n            chunks.push(chunk);\n        }).on('end', function () {\n            cb(null, chunks.join(\"\"));\n        });\n        process.openStdin();\n    } else {\n        fs.readFile(filename, \"utf-8\", cb);\n    }\n}\n\nmodule.exports.cli = function(argv, base_path, src_path, lib_path) {\n    var files = [];\n    var num_of_files = files.length || 1;\n    var catalog = {};\n\n    function read_files(src) {\n        src.forEach(function(f) {\n            if (fs.lstatSync(f).isDirectory()) {\n                var children = [];\n                fs.readdirSync(f).forEach(function(x) { children.push(path.join(f, x)); });\n                read_files(children);\n            }\n            else files.push(f);\n        });\n    }\n    read_files(argv.files);\n\n    function process_single_file(err, code) {\n        if (err) {\n            console.error(\"ERROR: can't read file: \" + files[0]);\n            process.exit(1);\n        }\n\n        gettext(catalog, code, files[0]);\n\n        files = files.slice(1);\n        if (files.length) {\n            setImmediate(read_whole_file, files[0], process_single_file);\n            return;\n        } else {\n            write_output(catalog, argv);\n            process.exit(0);\n        }\n    }\n \n    setImmediate(read_whole_file, files[0], process_single_file);\n\n};\n\nmodule.exports.gettext = gettext;\nmodule.exports.entry_to_string = entry_to_string;\nmodule.exports.write_output = write_output;\n// }}}\n"
  },
  {
    "path": "tools/ini.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nvar fs = require('fs');\nvar path = require('path');\n\nfunction parse_ini_data(data) {\n    // Based on MIT licensed code from: \n    // https://github.com/shockie/node-iniparser/blob/master/lib/node-iniparser.js\n    var ans = {}, match;\n\tvar lines = data.split(/\\r\\n|\\r|\\n/);\n\tvar section = null;\n    var section_pat = /^\\s*\\[\\s*([^\\]]*)\\s*\\]\\s*$/;\n    var param_pat = /^\\s*([\\w\\.\\-\\_]+)\\s*=\\s*(.*?)\\s*$/;\n    var comment_pat = /^\\s*;.*$/;\n\n\tlines.forEach(function(line) {\n\t\tif(comment_pat.test(line)) {\n\t\t\treturn;\n\t\t} else if(param_pat.test(line)) {\n\t\t\tmatch = line.match(param_pat);\n\t\t\tif(section) {\n\t\t\t\tans[section][match[1]] = match[2];\n\t\t\t} else {\n\t\t\t\tans[match[1]] = match[2];\n\t\t\t}\n\t\t} else if(section_pat.test(line)) {\n\t\t\tmatch = line.match(section_pat);\n\t\t\tans[match[1]] = {};\n\t\t\tsection = match[1];\n\t\t} else if(line.length === 0 && section) {\n\t\t\tsection = null;\n\t\t}\n\t});\n\treturn ans;\n}\n\nfunction find_cfg_file(toplevel_dir) {\n    var current_dir = toplevel_dir, previous_dir = toplevel_dir;\n    do {\n        try {\n            return fs.readFileSync(path.join(current_dir, 'setup.cfg'), 'utf-8');\n        } catch (e) {\n            if (e.code !== 'ENOENT') throw e;\n        }\n        previous_dir = current_dir;\n        current_dir = path.dirname(current_dir);\n    } while(current_dir != previous_dir && current_dir);\n\n    return null;\n}\n\nfunction read_config(toplevel_dir) {\n    var data = find_cfg_file(toplevel_dir);\n    if (!data) return {};\n    return parse_ini_data(data);\n}\n\n\nexports.read_config = read_config;\n"
  },
  {
    "path": "tools/lint.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nvar fs = require('fs');\nvar RapydScript = require(\"./compiler\").create_compiler();\nvar path = require('path');\nvar utils = require('./utils');\nvar colored = utils.safe_colored;\n\nvar WARN = 1, ERROR = 2;\nvar MESSAGES = {\n    'undef': 'undefined symbol: \"{name}\"',\n    'unused-import': '\"{name}\" is imported but not used',\n    'unused-local' : '\"{name}\" is defined but not used',\n    'loop-shadowed': 'The loop variable \"{name}\" was previously used in this scope at line: {line}',\n    'extra-semicolon': 'This semi-colon is not needed',\n    'eol-semicolon': 'Semi-colons at the end of the line are unnecessary',\n    'func-in-branch': 'JavaScript in strict mode does not allow the definition of named functions/classes inside a branch such as an if/try/switch',\n    'syntax-err': 'A syntax error caused compilation to abort',\n    'import-err': 'An import error caused compilation to abort',\n    'def-after-use': 'The symbol \"{name}\" is defined (at line {line}) after it is used',\n    'dup-key': 'JavaScript in strict mode does not allow for duplicate keys (\"{name}\" is duplicated) in object mode',\n    'dup-method': 'The method {name} was defined previously at line: {line}',\n};\n\nvar BUILTINS = Object.create(null);\n('this self window document chr ord iterator_symbol print len range dir' + \n ' eval undefined arguments abs max min enumerate pow callable reversed sum' + \n ' getattr isFinite setattr hasattr parseInt parseFloat options_object' +\n ' isNaN JSON Math list set list_wrap ρσ_modules require bool int bin' +\n ' float iter Error EvalError set_wrap RangeError ReferenceError SyntaxError' +\n ' str TypeError URIError Exception AssertionError IndexError AttributeError KeyError' +\n ' ValueError ZeroDivisionError map hex filter zip dict dict_wrap UnicodeDecodeError HTMLCollection' +\n ' NodeList alert console Node Symbol NamedNodeMap ρσ_eslice ρσ_delslice Number' +\n ' Boolean encodeURIComponent decodeURIComponent setTimeout setInterval' +\n ' setImmediate clearTimeout clearInterval clearImmediate requestAnimationFrame' +\n ' id repr sorted __name__ equals get_module ρσ_str jstype divmod NaN'\n ).split(' ').forEach(function(x) { BUILTINS[x] = true; });\n\nObject.keys(RapydScript.NATIVE_CLASSES).forEach(function (name) { BUILTINS[name] = true; });\nvar has_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);\n\nif (!String.prototype.startsWith) {\n  String.prototype.startsWith = function(searchString, position) {\n    position = position || 0;\n    return this.indexOf(searchString, position) === position;\n  };\n}\n\nfunction cmp(a, b) {\n    return (a < b) ? -1 : ((a > b) ? 1 : 0);\n}\n\nfunction parse_file(code, filename) {\n    return RapydScript.parse(code, {\n        filename: filename,\n        basedir: path.dirname(filename),\n        libdir: path.dirname(filename),\n        for_linting: true,\n    });\n}\n\nfunction msg_from_node(filename, ident, name, node, level, line) {\n    name = name || ((node.name) ? ((node.name.name) ? node.name.name : node.name) : '');\n    if (node instanceof RapydScript.AST_Lambda && node.name) name = node.name.name;\n    var msg = MESSAGES[ident].replace('{name}', name || '').replace('{line}', line || '');\n    return {\n        filename: filename, \n        start_line: (node.start) ? node.start.line : undefined,\n        start_col: (node.start) ? node.start.col : undefined,\n        end_line: (node.end) ? node.end.line : undefined,\n        end_col: (node.end) ? node.end.col: undefined,\n        ident: ident,\n        message: msg,\n        level: level || ERROR,\n        name:name,\n        other_line: line,\n    };\n}\n\nfunction Binding(name, node, options) {\n    options = options || {};\n    this.node = node;\n    this.name = name;\n    this.is_import = !!options.is_import;\n    this.is_function = !!options.is_function;\n    this.is_func_arg = !!options.is_func_arg;\n    this.is_method = !!options.is_method;\n\n    this.is_loop = false;\n    this.used = false;\n}\n\nvar merge = utils.merge;\n\nfunction Scope(is_toplevel, parent_scope, filename, is_class) {\n    this.parent_scope = parent_scope;\n    this.is_toplevel = !!is_toplevel;\n    this.is_class = !!is_class;\n    this.bindings = {};\n    this.children = [];\n    this.shadowed = [];\n    this.undefined_references = {};\n    this.unused_bindings = {};\n    this.nonlocals = {};\n    this.defined_after_use = {};\n    this.seen_method_names = {};\n    this.methods = {};\n\n    this.add_binding = function(name, node, options) {\n        var already_bound = has_prop(this.bindings, name);\n        var b = new Binding(name, node, options);\n        if (already_bound) {\n            if (this.bindings[name].used) b.used = true;\n            this.shadowed.push([name, this.bindings[name], b]);\n        }\n        this.bindings[name] = b;\n        return b;\n    };\n\n    this.add_nonlocal = function(name) {\n        this.nonlocals[name] = true;\n    };\n\n    this.register_use = function(name, node) {\n        if (has_prop(this.bindings, name)) {\n            this.bindings[name].used = true;\n        } else {\n            this.undefined_references[name] = node;\n        }\n    };\n\n    this.finalize = function() {\n        // Find defined after use\n        Object.keys(this.undefined_references).forEach(function (name) {\n            if (has_prop(this.bindings, name) && !has_prop(this.nonlocals, name)) {\n                var b = this.bindings[name];\n                b.used = true;\n                if (!has_prop(this.defined_after_use, name)) {\n                    this.defined_after_use[name] = [this.undefined_references[name], b];\n                }\n                delete this.undefined_references[name];\n            }\n            if (has_prop(this.methods, name)) delete this.undefined_references[name];\n        }, this);\n\n        // Find unused bindings\n        Object.keys(this.bindings).forEach(function(name) {\n            var b = this.bindings[name];\n            // Check if it is used in a descendant scope\n            var found = false;\n            this.for_descendants(function (scope) {\n                if (has_prop(scope.undefined_references, name)) {\n                    found = true;\n                    // Remove from childs' undefined references \n                    delete scope.undefined_references[name];\n                } else if (has_prop(scope.nonlocals, name) && has_prop(scope.bindings, name)) found = true;\n            });\n            if (!found && !b.used && !b.is_loop)\n                // We deliberately ignore unused loop variables so as not to complain for the\n                // common idiom of using a for loop to repeat an action, without referring to the\n                // loop variable\n                this.unused_bindings[name] = b;\n        }, this);\n    };\n\n    this.for_descendants = function(func) {\n        this.children.forEach(function (child) {\n            func(child);\n            child.for_descendants(func);\n        });\n    };\n\n    this.messages = function() {\n        var ans = [];\n\n        Object.keys(this.undefined_references).forEach(function (name) {\n            if (!(this.is_toplevel && has_prop(this.nonlocals, name))) {\n                var node = this.undefined_references[name];\n                ans.push(msg_from_node(filename, 'undef', name, node));\n            }\n        }, this);\n\n        Object.keys(this.unused_bindings).forEach(function (name) {\n            var b = this.unused_bindings[name];\n            if (b.is_import) {\n                ans.push(msg_from_node(filename, 'unused-import', name, b.node));\n            } else if (!this.is_toplevel && !this.is_class && !b.is_func_arg && !b.is_method && !has_prop(this.nonlocals, name)) {\n                ans.push(msg_from_node(filename, 'unused-local', name, b.node));\n            }\n        }, this);\n\n        this.shadowed.forEach(function(x) {\n            var name = x[0], first = x[1], second = x[2];\n            if (second.is_loop && !first.is_loop) {\n                var line = (first.node.start) ? first.node.start.line : undefined;\n                ans.push(msg_from_node(filename, 'loop-shadowed', name, second.node, ERROR, line));\n            }\n        });\n\n        Object.keys(this.defined_after_use).forEach(function (name) {\n            var use = this.defined_after_use[name][0], binding = this.defined_after_use[name][1];\n            ans.push(msg_from_node(filename, 'def-after-use', name, use, ERROR, binding.node.start.line));\n        }, this);\n\n        return ans;\n    };\n\n}\n\nfunction Linter(toplevel, filename, code, options) {\n\n    this.scopes = [];\n    this.walked_scopes = [];\n    this.current_node = null;\n    this.in_assign = false;\n    this.branches = [];\n    this.messages = [];\n    this.builtins = utils.merge(BUILTINS, options.builtins || {});\n\n    this.add_binding = function(name, binding_node) {\n        var scope = this.scopes[this.scopes.length - 1];\n        var node = this.current_node;\n        var options = {\n            is_import: (node instanceof RapydScript.AST_Import || node instanceof RapydScript.AST_ImportedVar),\n            is_function: (node instanceof RapydScript.AST_Lambda),\n            is_method: (node instanceof RapydScript.AST_Method),\n            is_func_arg: (node instanceof RapydScript.AST_SymbolFunarg),\n        };\n        return scope.add_binding(name, (binding_node || node), options);\n    };\n\n    this.add_nonlocal = function(name) {\n        var scope = this.scopes[this.scopes.length - 1];\n        return scope.add_nonlocal(name);\n    };\n\n    this.register_use = function(name) {\n        var scope = this.scopes[this.scopes.length - 1];\n        var node = this.current_node;\n        return scope.register_use(name, node);\n    };\n\n    this.handle_import = function() {\n        var node = this.current_node;\n        if (!node.argnames) {\n            var name = (node.alias) ? node.alias.name : node.key.split('.', 1)[0];\n            this.add_binding(name, (node.alias || node));\n        }\n    };\n\n    this.handle_imported_var = function() {\n        var node = this.current_node;\n        var name = (node.alias) ? node.alias.name : node.name;\n        this.add_binding(name);\n    };\n\n    this.handle_lambda = function() {\n        var node = this.current_node;\n        var name = (node.name) ? node.name.name : undefined;\n        var scope = this.scopes[this.scopes.length - 1];\n        if (this.branches.length && name) {\n            this.messages.push(msg_from_node(filename, 'func-in-branch', node.name, node));\n        }\n        if (name) {\n            if (node instanceof RapydScript.AST_Method) {\n                scope.methods[name] = true;\n                if (has_prop(scope.seen_method_names, name)) {\n                    if (!node.is_setter) this.messages.push(msg_from_node(filename, 'dup-method', node.name, node, WARN, scope.seen_method_names[name]));\n                } else scope.seen_method_names[name] = node.start.line;\n            } else this.add_binding(name);\n        }\n    };\n\n    this.handle_assign = function() {\n        var node = this.current_node;\n\n        var handle_destructured = function(self, flat) {\n            for (var i = 0; i < flat.length; i++) {\n                var cnode = flat[i];\n                if (cnode instanceof RapydScript.AST_SymbolRef) {\n                    self.current_node = cnode;\n                    cnode.lint_visited = true;\n                    self.add_binding(cnode.name);\n                    self.current_node = node;\n                }\n            }\n        };\n\n        if (node.left instanceof RapydScript.AST_SymbolRef) {\n            node.left.lint_visited = node.operator === '=';  // Could be compound assignment like: +=\n            if (node.operator === '=') {\n                // Only create a binding if the operator is not \n                // a compound assignment operator\n                this.current_node = node.left;\n                this.add_binding(node.left.name);\n                this.current_node = node;\n            }\n        } else if (node.left instanceof RapydScript.AST_Array) {\n            // destructuring assignment: a, b = 1, 2\n            var flat = node.left.flatten();\n            handle_destructured(this, node.left.flatten());\n\n        } else if (node.left instanceof RapydScript.AST_Seq && node.left.car instanceof RapydScript.AST_SymbolRef) {\n            handle_destructured(this, node.left.to_array());\n        }\n\n    };\n\n    this.handle_vardef = function() {\n        var node = this.current_node;\n        if (node.value) this.current_node = node.value;\n        if (node.name instanceof RapydScript.AST_SymbolNonlocal) {\n            this.add_nonlocal(node.name.name);\n        } else {\n            this.add_binding(node.name.name, node.name);\n        }\n        this.current_node = node;\n    };\n\n    this.handle_symbol_ref = function() {\n        var node = this.current_node;\n        this.register_use(node.name);\n    };\n\n    this.handle_decorator = function() {\n        var node = this.current_node.expression;\n        if (node instanceof RapydScript.AST_SymbolRef && RapydScript.compile_time_decorators.indexOf(node.name) != -1) node.link_visited = true;\n    };\n\n    this.handle_scope = function() {\n        var node = this.current_node;\n        var nscope = new Scope(node instanceof RapydScript.AST_Toplevel, this.scopes[this.scopes.length - 1], filename, node instanceof RapydScript.AST_Class);\n        if (this.scopes.length) this.scopes[this.scopes.length - 1].children.push(nscope);\n        this.scopes.push(nscope);\n    };\n\n    this.handle_symbol_funarg = function() {\n        // Arguments in a function definition\n        var node = this.current_node;\n        this.add_binding(node.name);\n    };\n\n    this.handle_comprehension = function() {\n        this.handle_scope();  // Comprehensions create their own scope\n        this.handle_for_in();\n    };\n\n    this.handle_for_in = function() {\n        var node = this.current_node;\n        if (node.init instanceof RapydScript.AST_SymbolRef) {\n            this.add_binding(node.init.name).is_loop = true;\n            node.init.lint_visited = true;\n        } else if (node.init instanceof RapydScript.AST_Array) {\n            // destructuring assignment: for a, b in []\n            for (var i = 0; i < node.init.elements.length; i++) {\n                var cnode = node.init.elements[i];\n                if (cnode instanceof RapydScript.AST_Seq) cnode = cnode.to_array();\n                if (cnode instanceof RapydScript.AST_SymbolRef) cnode = [cnode];\n                if (Array.isArray(cnode)) {\n                    for (var j = 0; j < cnode.length; j++) {\n                        var elem = cnode[j];\n                        if (elem instanceof RapydScript.AST_SymbolRef) {\n                            this.current_node = elem;\n                            elem.lint_visited = true;\n                            this.add_binding(elem.name).is_loop = true;\n                            this.current_node = node;\n                        }\n                    }\n                }\n            }\n \n        }\n    };\n\n    this.handle_for_js = function() {\n        var node = this.current_node;\n        var js = node.condition.value;\n        var statements = js.split(';');\n        var decl = statements[0].trim();\n        if (decl.startsWith('var ')) decl = decl.slice(4);\n        var self = this;\n        decl.split(',').forEach(function (part) {\n            var name = /^[a-zA-Z0-9_]+/.exec(part.trimLeft())[0];\n            self.add_binding(name);\n        });\n    };\n\n    this.handle_except = function() {\n        var node = this.current_node;\n        if (node.argname) {\n            this.add_binding(node.argname.name, node.argname);\n        }\n    };\n\n    this.handle_empty_statement = function() {\n        var node = this.current_node;\n        if (node.stype == ';') {\n            this.messages.push(msg_from_node(filename, 'extra-semicolon', ';', node, WARN));\n        }\n    };\n\n    this.handle_class = function() {\n        var node = this.current_node;\n        if (node.name) {\n            node.name.lint_visited = true;\n            this.add_binding(node.name.name, node.name);\n        }\n    };\n\n    this.handle_object_literal = function() {\n        var node = this.current_node;\n        var seen = {};\n        (node.properties || []).forEach(function (prop) {\n            if (prop.key instanceof RapydScript.AST_Constant) {\n                var val = prop.key.value;\n                if (has_prop(seen, val)) \n                    this.messages.push(msg_from_node(filename, 'dup-key', val, prop));\n                seen[val] = true;\n            }\n        }, this);\n    };\n\n    this.handle_call = function() {\n        var node = this.current_node;\n        if (node.args.kwargs) node.args.kwargs.forEach(function(kw) { kw[0].lint_visited = true; });\n    };\n\n    this.handle_with_clause = function() {\n        var node = this.current_node;\n        if (node.alias) this.add_binding(node.alias.name);\n    };\n\n    this._visit = function (node, cont) {\n        if (node.lint_visited) return;\n        this.current_node = node;\n        var scope_count = this.scopes.length;\n        var branch_count = this.branches.length;\n        if (node instanceof RapydScript.AST_If || node instanceof RapydScript.AST_Try || node instanceof RapydScript.AST_Catch || node instanceof RapydScript.AST_Except || node instanceof RapydScript.AST_Else) {\n            this.branches.push(1);\n        }\n\n        if (node instanceof RapydScript.AST_Lambda) {\n            this.handle_lambda();\n        } else if (node instanceof RapydScript.AST_Import) {\n            this.handle_import();\n        } else if (node instanceof RapydScript.AST_ImportedVar) {\n            this.handle_imported_var();\n        } else if (node instanceof RapydScript.AST_Class) {\n            this.handle_class();\n        } else if (node instanceof RapydScript.AST_BaseCall) {\n            this.handle_call();\n        } else if (node instanceof RapydScript.AST_Assign) {\n            this.handle_assign();\n        } else if (node instanceof RapydScript.AST_VarDef) {\n            this.handle_vardef();\n        } else if (node instanceof RapydScript.AST_SymbolRef) {\n            this.handle_symbol_ref();\n        } else if (node instanceof RapydScript.AST_Decorator) {\n            this.handle_decorator();\n        } else if (node instanceof RapydScript.AST_SymbolFunarg) {\n            this.handle_symbol_funarg();\n        } else if (node instanceof RapydScript.AST_ListComprehension) {\n            this.handle_comprehension();\n        } else if (node instanceof RapydScript.AST_ForIn) {\n            this.handle_for_in();\n        } else if (node instanceof RapydScript.AST_ForJS) {\n            this.handle_for_js();\n        } else if (node instanceof RapydScript.AST_Except) {\n            this.handle_except();\n        } else if (node instanceof RapydScript.AST_EmptyStatement) {\n            this.handle_empty_statement();\n        } else if (node instanceof RapydScript.AST_WithClause) {\n            this.handle_with_clause();\n        } else if (node instanceof RapydScript.AST_Object) {\n            this.handle_object_literal();\n        }\n\n        if (node instanceof RapydScript.AST_Scope) {\n            this.handle_scope();\n        } \n\n        if (cont !== undefined) cont();\n\n        if (this.scopes.length > scope_count) {\n            this.scopes[this.scopes.length - 1].finalize();\n            this.walked_scopes.push(this.scopes.pop());\n        }\n\n        if (this.branches.length > branch_count) this.branches.pop();\n    };\n\n    this.resolve = function() {\n        var messages = this.messages;\n        var line_filters = {};\n\n        code.split('\\n').forEach(function(line, num) {\n            line = line.trimRight();\n            num++;\n            if (line[line.length - 1] === ';') {\n                var ident = 'eol-semicolon';\n                messages.push({filename:filename, ident:ident, message:MESSAGES[ident],\n                    level:WARN, name:';', start_line:num, start_col:line.lastIndexOf(';')});\n            }\n            var parts = line.split('#');\n            var last = parts[parts.length - 1], filters;\n            if (last && last.trimLeft().substr(0, 4).toLowerCase() === 'noqa') {\n                parts = last.split(':').slice(1);\n                if (parts.length) {\n                    filters = {};\n                    parts = parts[0].split(',');\n                    for (var i = 0; i < parts.length; i++) filters[parts[i].trim()] = true;\n                } else filters = MESSAGES;\n            }\n            if (filters) line_filters[num] = filters;\n        });\n\n        this.walked_scopes.forEach(function (scope) {\n            messages = messages.concat(scope.messages());\n        });\n        var noqa = options.noqa || {};\n        messages = messages.filter(function(msg) {\n            var ignore = (msg.start_line !== undefined && has_prop(line_filters, msg.start_line) && has_prop(line_filters[msg.start_line], msg.ident));\n            var filter = has_prop(noqa, msg.ident);\n            return !ignore && !filter && (msg.ident != 'undef' || !has_prop(this.builtins, msg.name));\n        }, this);\n        messages.sort(function (a, b) { return cmp(a.start_line, b.start_line) || cmp(a.start_col, b.start_col_); });\n        return messages;\n    };\n\n}\n\nfunction lint_code(code, options) {\n    options = options || {};\n    var reportcb = {'json':cli_json_report, 'vim': cli_vim_report, 'undef': cli_undef_report}[options.errorformat] || (options.report || cli_report);\n    var filename = options.filename || '<eval>';\n    var toplevel, messages;\n    var lines = code.split('\\n');  // Can be used (in the future) to display extract from code corresponding to error location\n\n    try {\n        toplevel = parse_file(code, filename);\n    } catch(e) {\n        if (e instanceof RapydScript.ImportError) {\n            messages = [{filename:filename, start_line:e.line, start_col:e.col, level:ERROR, ident:'import-err', message:e.message}];\n        } else if (e instanceof RapydScript.SyntaxError) {\n            messages = [{filename:filename, start_line:e.line, start_col:e.col, level:ERROR, ident:'syntax-err', message:e.message}];\n        } else throw e;\n    }\n\n    if (toplevel) {\n        var linter = new Linter(toplevel, filename, code, options);\n        toplevel.walk(linter);\n        messages = linter.resolve();\n    }\n    messages.forEach(function(msg, i) { msg.code_lines = lines; reportcb(msg, i, messages); });\n    return messages;\n}\n\n// CLI {{{\n\nfunction read_whole_file(filename, cb) {\n    if (!filename || filename === '-') {\n        var chunks = [];\n        process.stdin.setEncoding('utf-8');\n        process.stdin.on('data', function (chunk) {\n            chunks.push(chunk);\n        }).on('end', function () {\n            cb(null, chunks.join(\"\"));\n        });\n        process.openStdin();\n    } else {\n        fs.readFile(filename, \"utf-8\", cb);\n    }\n}\n\nfunction cli_report(r, i, messages) {\n    var parts = [];\n    function push(x, color) {\n        parts.push((x === undefined) ? '' : colored(x.toString(), color));\n    }\n    push(r.filename); push((r.level === WARN) ? 'WARN' : 'ERR', (r.level === WARN) ? 'yellow' : 'red');\n    push(r.start_line, 'green'); push((r.start_col === undefined) ? '' : r.start_col + 1);\n    console.log(parts.join(':') + ':' + r.message + colored(' [' + r.ident + ']', 'green'));\n    if (i < messages.length - 1) console.log();\n}\n\nvar undef_buf = {};\n\nfunction cli_undef_report(r, i, messages) {\n    if (r.ident == 'undef' && r.name) undef_buf[r.name] = true;\n    if (i == messages.length - 1) console.log(Object.keys(undef_buf).sort().join(', '));\n}\n\nfunction cli_json_report(r, i, messages) {\n    var j = {};\n    Object.keys(r).forEach(function(key) {\n        var val = r[key];\n        if (val !== undefined && key != 'code_lines') {\n            if (key === 'level') val = (val === WARN) ? 'WARN' : 'ERR';\n            j[key] = val;\n        }\n    });\n    if (i === 0) console.log('[');\n    console.log(JSON.stringify(j, null, 2));\n    console.log((i < messages.length - 1) ? ',' : ']');\n}\n\nfunction cli_vim_report(r) {\n    var parts = [];\n    parts.push(r.filename); parts.push(r.start_line || 0); parts.push((r.start_col === undefined) ? 0 : r.start_col + 1);\n    parts.push((r.level === WARN) ? 'W' : 'E'); parts.push(r.name || ''); parts.push(r.message + ' [' + r.ident + ']');\n    console.log(parts.join(':'));\n}\n\nvar ini_cache = {};\n\nfunction get_ini(toplevel_dir) {\n    if (has_prop(ini_cache, toplevel_dir)) return ini_cache[toplevel_dir];\n    var rl = require('./ini').read_config(toplevel_dir).rapydscript || {};\n    ini_cache[toplevel_dir] = rl;\n    return rl;\n}\n\nmodule.exports.cli = function(argv, base_path, src_path, lib_path) {\n    var files = argv.files.slice();\n    var num_of_files = files.length || 1;\n    var read_config = require('./ini');\n\n    if (argv.noqa_list) {\n        Object.keys(MESSAGES).forEach(function(ident) {\n            var i = (ident + utils.repeat(' ', 20)).slice(0, 20);\n            var h = utils.wrap(MESSAGES[ident].split('\\n'), 59);\n            console.log(i + h[0]);\n            h.slice(1).forEach(function(t) { console.log(utils.repeat(' ', 20) + t); });\n            console.log();\n        });\n        process.exit(0);\n    }\n\n    if (files.filter(function(el){ return el === \"-\"; }).length > 1) {\n        console.error(\"ERROR: Can read a single file from STDIN (two or more dashes specified)\");\n        process.exit(1);\n    }\n\n    var all_ok = true;\n    var builtins = {};\n    var noqa = {};\n    if (argv.globals) argv.globals.split(',').forEach(function(sym) { builtins[sym] = true; });\n    if (argv.noqa) argv.noqa.split(',').forEach(function(sym) { noqa[sym] = true; });\n\n    function path_for_filename(x) {\n        return x === '-' ? argv.stdin_filename : x;\n    }\n\n    function lint_single_file(err, code) {\n        var output, final_builtins = merge(builtins), final_noqa = merge(noqa), rl;\n        if (err) {\n            console.error(\"ERROR: can't read file: \" + files[0]);\n            process.exit(1);\n        }\n\n        // Read setup.cfg\n        rl = get_ini(path.dirname(path_for_filename(files[0])));\n        var g = {};\n        (rl.globals || rl.builtins || '').split(',').forEach(function (x) { g[x.trim()] = true; });\n        final_builtins = merge(final_builtins, g);\n        g = {};\n        (rl.noqa || '').split(',').forEach(function (x) { g[x.trim()] = true; });\n        final_noqa = merge(final_noqa, g);\n\n        // Look for # globals: or # noqa: in the first few lines of the file\n        code.split('\\n', 20).forEach(function (line) {\n            var lq = line.replace(/\\s+/g, '');\n            if (lq.startsWith('#globals:')) {\n                (lq.split(':', 2)[1] || '').split(',').forEach(function (item) { final_builtins[item] = true; });\n            }\n            else if (lq.startsWith('#noqa:')) {\n                (lq.split(':', 2)[1] || '').split(',').forEach(function (item) { final_noqa[item] = true; });\n            }\n        });\n\n        // Lint!\n        if (lint_code(code, {filename:path_for_filename(files[0]), builtins:final_builtins, noqa:final_noqa, errorformat:argv.errorformat || false}).length) all_ok = false;\n\n        files = files.slice(1);\n        if (files.length) {\n            setImmediate(read_whole_file, files[0], lint_single_file);\n            return;\n        } else process.exit((all_ok) ? 0 : 1);\n    }\n \n    setImmediate(read_whole_file, files[0], lint_single_file);\n\n};\n\nmodule.exports.lint_code = lint_code;\nmodule.exports.WARN = WARN;\nmodule.exports.ERROR = ERROR;\nmodule.exports.MESSAGES = MESSAGES;\n// }}}\n"
  },
  {
    "path": "tools/msgfmt.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nfunction unesc(string) {\n    return string.replace(/\\\\\"/g, '\"').replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t').replace(/\\\\\\\\/g, '\\\\');\n}\n\nfunction parse(data, on_error) {\n    // Parse a PO file using a state machine (does not work for POT files). Also only extracts data useful\n    // for JSON output.\n    var plural_forms = null;\n    var lines = data.split('\\n');\n    var entries = [];\n    var current_entry = create_entry();\n    var lnum = 0;\n    var nplurals = null;\n    var language = null;\n\n    function fatal() {\n        var msg = Array.prototype.slice.call(arguments).join(' ');\n        if (on_error) { on_error(msg); return; }\n        console.error(msg);\n        process.exit(1);\n    }\n\n    function create_entry() {\n        return {msgid: null, fuzzy: false, msgstr:[], msgid_plural:null, lnum:null};\n    }\n\n    function parse_header() {\n        var raw = current_entry.msgstr[0];\n        if (raw === undefined) fatal('Header has no msgstr');\n        raw.split('\\n').forEach(function(line) {\n            if (line.startsWith('Plural-Forms:')) {\n                plural_forms = line.slice('Plural-Forms:'.length).trim();\n                var match = /^nplurals\\s*=\\s*(\\d+)\\s*;/.exec(plural_forms);\n                if (!match || match[1] === undefined) fatal('Invalid Plural-Forms header:', plural_forms);\n                nplurals = parseInt(match[1]);\n            } \n            else if (line.startsWith('Language:')) {\n                language = line.slice('Language:'.length).trim();\n            }\n        });\n    }\n\n    function commit_entry() {\n        if (current_entry.msgid) {\n            if (current_entry.msgid_plural !== null) {\n                if (nplurals === null) fatal('Plural-Forms header missing');\n                for (var i = 0; i < nplurals; i++) {\n                    if (current_entry.msgstr[i] === undefined) fatal('Missing plural form for entry at line number:', lnum);\n                }\n            }\n            entries.push(current_entry);\n        } else if (current_entry.msgid === '') parse_header();\n        current_entry = create_entry();\n    }\n\n    function read_string(line) {\n        line = line.trim();\n        if (!line || line[0] !== '\"' || line[line.length - 1] !== '\"') {\n            fatal('Expecting a string at line number:', lnum);\n        }\n        return unesc(line.slice(1, -1));\n    }\n\n    function continuation(line, lines, append, after) {\n        if (line[0] === '\"') append(read_string(line));\n        else {\n            state = after;\n            after(line, lines);\n        }\n    }\n\n    function start(line, lines) {\n        if (line[0] === '#') {\n            if (line[1] === ',') {\n                line.slice(2).trimLeft().split(',').forEach(function(flag) {\n                    if (flag.trim().toLowerCase() === 'fuzzy') current_entry.fuzzy = true;\n                });\n            }\n        } else if (line.startsWith('msgid ')) {\n            current_entry.msgid = read_string(line.slice('msgid '.length));\n            current_entry.lnum = lnum;\n            state = function(line, lines) { \n                continuation(line, lines, function(x) { current_entry.msgid += x; }, after_msgid);\n            };\n        } else {\n            fatal('Expecting msgid at line number:', lnum);\n        }\n    }\n\n    function after_msgid(line, lines) {\n        if (line.startsWith('msgid_plural ')) {\n            current_entry.msgid_plural = read_string(line.slice('msgid_plural '.length));\n            state = function(line, lines) { \n                continuation(line, lines, function(x) { current_entry.msgid_plural += x; }, msgstr);\n            };\n        } \n        \n        else if (line.startsWith('msgstr ') || line.startsWith('msgstr[')) {\n            state = msgstr;\n            msgstr(line, lines);\n        } \n        \n        else fatal('Expecting either msgstr or msgid_plural at line number:', lnum);\n\n    }\n\n    function msgstr(line, lines) {\n        if (line.startsWith('msgstr ')) {\n            if (current_entry.msgid_plural !== null) fatal('Expecting msgstr[0] at line number:', lnum);\n            current_entry.msgstr.push(read_string(line.slice('msgstr '.length)));\n            state = function(line, lines) { \n                continuation(line, lines, function(x) { current_entry.msgstr[current_entry.msgstr.length - 1] += x; }, msgstr);\n            };\n        } \n\n        else if (line[0] === '#' || line.startsWith('msgid ')) {\n            if (!current_entry.msgstr.length) fatal('Expecting msgstr at line number:', lnum);\n            commit_entry();\n            state = start;\n            start(line, lines);\n        }\n\n        else if (line.startsWith('msgstr[')) {\n            if (current_entry.msgid_plural === null) fatal('Expecting non-plural msgstr at line number:', lnum);\n            var pnum = /^msgstr\\[(\\d+)\\] /.exec(line);\n            if (!pnum || pnum[1] === undefined) fatal('Malformed msgstr at line number:', lnum);\n            var idx = parseInt(pnum[1]);\n            current_entry.msgstr[idx] = read_string(line.slice(pnum[0].length));\n            state = function(line, lines) { \n                continuation(line, lines, function(x) { current_entry.msgstr[idx] += x; }, msgstr);\n            };\n        }\n\n        else fatal('Expecting msgstr or msgid at line number:', lnum);\n    }\n\n    var state = start;\n\n    while (lines.length) {\n        var line = lines.shift().trim();\n        lnum += 1;\n        if (!line) continue;\n        state(line, lines);\n    }\n    commit_entry();\n    if (language === null) fatal('No language specified in the header of this po file');\n    return {entries:entries, plural_forms:plural_forms, nplurals:nplurals, language:language};\n}\n\nfunction read_stdin(cont) {\n    var chunks = [];\n    process.stdin.setEncoding('utf8');\n\n    process.stdin.on('readable', function () { \n        var chunk = process.stdin.read();\n        if (chunk) chunks.push(chunk); \n    });\n\n    process.stdin.on('end', function() { cont(chunks.join('')); });\n}\n\nfunction serialize_catalog(catalog, options) {\n    if (!options.use_fuzzy) catalog.entries = catalog.entries.filter(function(e) { return !e.fuzzy; });\n    var entries = {};\n    catalog.entries.forEach(function (entry) {\n        entries[entry.msgid] = entry.msgstr;\n    });\n    return JSON.stringify({'plural_forms':catalog.plural_forms, 'entries':entries, 'language':catalog.language});\n}\n\nmodule.exports.cli = function(argv, base_path, src_path, lib_path) {\n    read_stdin(function process(data) {\n        var catalog = parse(data);\n        console.log(serialize_catalog(catalog, argv));\n    });\n};\n\nmodule.exports.parse = parse;\nmodule.exports.build = function(data, options) { return serialize_catalog(parse(data), options); };\n"
  },
  {
    "path": "tools/repl.js",
    "content": "/*\n * repl.js\n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license.\n */\n\"use strict\";  /*jshint node:true */\n\nvar fs = require('fs');\nvar path = require('path');\nvar vm = require('vm');\nvar util = require('util');\nvar utils = require('./utils');\nvar completelib = require('./completer');\nvar colored = utils.safe_colored;\nvar RapydScript = (typeof create_rapydscript_compiler === 'function') ? create_rapydscript_compiler() : require('./compiler').create_compiler();\nvar has_prop = Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);\n\nfunction create_ctx(baselib, show_js, console) {\n    var ctx = vm.createContext({'console':console, 'show_js': !!show_js, 'RapydScript':RapydScript, 'require':require});\n\tvm.runInContext(baselib, ctx, {'filename':'baselib-plain-pretty.js'});\n    vm.runInContext('var __name__ = \"__repl__\";', ctx);\n    return ctx;\n}\n\n\nvar homedir = process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];\nvar cachedir = expanduser(process.env.XDG_CACHE_HOME || '~/.cache');\n\nfunction expanduser(x) {\n  if (!x) return x;\n  if (x === '~') return homedir;\n  if (x.slice(0, 2) != '~/') return x;\n  return path.join(homedir, x.slice(2));\n}\n\nfunction repl_defaults(options) {\n    options = options || {};\n    if (!options.input) options.input = process.stdin;\n    if (!options.output) options.output = process.stdout;\n    if (options.show_js === undefined) options.show_js = true;\n    if (!options.ps1) options.ps1 = '>>> ';\n    if (!options.ps2) options.ps2 = '... ';\n    if (!options.console) options.console = console;\n    if (!options.readline) options.readline = require('readline');\n    if (options.terminal === undefined) options.terminal = options.output.isTTY;\n    if (options.histfile === undefined) options.histfile = path.join(cachedir, 'rapydscript-repl.history');\n        \n    options.colored = (options.terminal) ? colored : (function (string) { return string; });\n    options.historySize = options.history_size || 1000;\n    return options;\n}\n\nfunction read_history(options) {\n    if (options.histfile) {\n        try {\n            return fs.readFileSync(options.histfile, 'utf-8').split('\\n');\n        } catch (e) { return []; }\n    }\n}\n\nfunction write_history(options, history) {\n    if (options.histfile) {\n        history = history.join('\\n');\n        try {\n            return fs.writeFileSync(options.histfile, history, 'utf-8');\n        } catch (e) {}\n    }\n}\n\n\nmodule.exports = function(options) {\n    options = repl_defaults(options);\n    options.completer = completer;\n    var rl = options.readline.createInterface(options);\n\tvar ps1 = options.colored(options.ps1, 'green');\n\tvar ps2 = options.colored(options.ps2, 'yellow');\n\tvar ctx = create_ctx(print_ast(RapydScript.parse('(def ():\\n yield 1\\n)'), true), options.show_js, options.console);\n    var buffer = [];\n    var more = false;\n    var LINE_CONTINUATION_CHARS = ':\\\\';\n    var toplevel;\n    var import_dirs = utils.get_import_dirs();\n    var find_completions = completelib(RapydScript, options);\n\n    options.console.log(options.colored('Welcome to the RapydScript REPL! Press Ctrl+C then Ctrl+D to quit.', 'green', true));\n    if (options.show_js)\n        options.console.log(options.colored('Use show_js=False to stop the REPL from showing the compiled JavaScript.', 'green', true));\n    else\n        options.console.log(options.colored('Use show_js=True to have the REPL show the compiled JavaScript before executing it.', 'green', true));\n    options.console.log();\n\n    function print_ast(ast, keep_baselib) {\n        var output_options = {omit_baselib:!keep_baselib, write_name:false, private_scope:false, beautify:true, keep_docstrings:true};\n        if (keep_baselib) output_options.baselib_plain = fs.readFileSync(path.join(options.lib_path, 'baselib-plain-pretty.js'), 'utf-8');\n        var output = new RapydScript.OutputStream(output_options);\n        ast.print(output);\n        return output.get();\n    }\n\n\n    function resetbuffer() { buffer = []; }\n\n    function completer(line) {\n        return find_completions(line, ctx);\n    }\n\n    function prompt() {\n        var lw = '';\n        if (more && buffer.length) {\n            var prev_line = buffer[buffer.length - 1];\n            if (prev_line.trimRight().substr(prev_line.length - 1) == ':') lw = '    ';\n            prev_line = prev_line.match(/^\\s+/);\n            if (prev_line) lw += prev_line;\n        }\n        rl.setPrompt((more) ? ps2 : ps1);\n        if (rl.sync_prompt) rl.prompt(lw);\n        else {\n            rl.prompt();\n            if (lw) rl.write(lw);\n        }\n    }\n\n    function runjs(js) {\n        var result;\n        if (vm.runInContext('show_js', ctx)) {\n            options.console.log(options.colored('---------- Compiled JavaScript ---------', 'green', true));\n            options.console.log(js);\n            options.console.log(options.colored('---------- Running JavaScript ---------', 'green', true));\n        }\n        try {\n            // Despite what the docs say node does not actually output any errors by itself\n            // so, in case this bug is fixed later, we turn it off explicitly.\n            result = vm.runInContext(js, ctx, {'filename':'<repl>', 'displayErrors':false});\n        } catch(e) {\n            if (e.stack) options.console.error(e.stack);\n            else options.console.error(e.toString());\n        }\n\n        if (result !== undefined) {\n            options.console.log(util.inspect(result, {'colors':options.terminal}));\n        }\n    }\n\n    function compile_source(source) {\n        var classes = (toplevel) ? toplevel.classes : undefined;\n        var scoped_flags = (toplevel) ? toplevel.scoped_flags: undefined;\n        try {\n            toplevel = RapydScript.parse(source, {\n                'filename':'<repl>',\n                'basedir': process.cwd(),\n                'libdir': options.imp_path,\n                'import_dirs': import_dirs,\n                'classes': classes,\n                'scoped_flags': scoped_flags,\n            });\n        } catch(e) {\n            if (e.is_eof && e.line == buffer.length && e.col > 0) return true;\n            if (e.message && e.line !== undefined) options.console.log(e.line + ':' + e.col + ':' + e.message);\n            else options.console.log(e.stack || e.toString());\n            return false;\n        }\n        var output = print_ast(toplevel);\n        if (classes) {\n            var exports = {};\n            toplevel.exports.forEach(function (name) { exports[name] = true; });\n            Object.getOwnPropertyNames(classes).forEach(function (name) {\n                if (!has_prop(exports, name) && !has_prop(toplevel.classes, name))\n                    toplevel.classes[name] = classes[name];\n            });\n        }\n        scoped_flags = toplevel.scoped_flags;\n        runjs(output);\n        return false;\n    }\n\n    function push(line) {\n        buffer.push(line);\n        var ll = line.trimRight();\n        if (ll && LINE_CONTINUATION_CHARS.indexOf(ll.substr(ll.length - 1)) > -1)\n            return true;\n        var source = buffer.join('\\n');\n        if (!source.trim()) { resetbuffer(); return false; }\n        var incomplete = compile_source(source);\n        if (!incomplete) resetbuffer();\n        return incomplete;\n    }\n\n\trl.on('line', function(line) {\n        if (more) {\n            // We are in a block \n            var line_is_empty = !line.trimLeft();\n            if (line_is_empty && buffer.length && !buffer[buffer.length - 1].trimLeft()) {\n                // We have two empty lines, evaluate the block\n                more = push(line.trimLeft());\n            } else buffer.push(line);\n        } else more = push(line);  // Not in a block, evaluate line\n\t\tprompt();\n\t})\n\t\n\t.on('close', function() {\n\t\toptions.console.log('Bye!');\n        if (rl.history) write_history(options, rl.history);\n\t\tprocess.exit(0);\n\t})\n\n\t.on('SIGINT', function() {\n        rl.clearLine();\n\t\toptions.console.log('Keyboard Interrupt');\n        resetbuffer();\n        more = false;\n\t\tprompt();\n\t})\n\n\t.on('SIGCONT', function() {\n\t\tprompt();\n\t});\n\n    rl.history = read_history(options);\n\tprompt();\n};\n"
  },
  {
    "path": "tools/self.js",
    "content": "/*\n * self.js\n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license.\n */\n\"use strict\";  /*jshint node:true */\n\nvar path = require('path');\nvar crypto = require('crypto');\nvar fs = require('fs');\nvar vm = require('vm');\nvar zlib = require('zlib');\n\nfunction compile_baselib(RapydScript, src_path) {\n    var items = fs.readdirSync(src_path).filter(function(name) {\n        return name.slice(0, 'baselib-'.length) === 'baselib-' && name.slice(-4) == '.pyj';\n    });\n    var ans = {'pretty': '', 'ugly': ''};\n\n    items.sort().forEach(function(fname) {\n        var name = fname.slice('baselib-'.length, -4), ast;\n        var raw = fs.readFileSync(path.join(src_path, fname), 'utf-8');\n        try {\n            ast = RapydScript.parse(raw, {filename:fname, basedir:src_path});\n        } catch (e) {\n            if (!(e instanceof RapydScript.SyntaxError)) throw e;\n            console.error(e.toString());\n            process.exit(1);\n        }\n        [true, false].forEach(function (beautify) {\n            var output = new RapydScript.OutputStream({\n                beautify: beautify, write_name: false, private_scope:false, omit_baselib: true,  \n            });\n            ast.print(output);\n            ans[(beautify) ? 'pretty' : 'ugly'] += output.get();\n        });\n    });\n    return ans;\n}\n\nfunction check_for_changes(base_path, src_path, signatures) {\n    // Check if any of the files involved in the build process have changed,\n    // as compared to the saved sha1 hashes from the last build\n    var saved_hashes = {}, hashes = {}, sources = {};\n    var compiler_changed = false, compiler_hash, source_hash;\n    try {\n        saved_hashes = JSON.parse(fs.readFileSync(signatures, 'utf-8'));\n    } catch (e) {\n        if (e.code != 'ENOENT') throw (e);\n    }\n\n    var src_file_names = [];\n\n    function process_dir(p) {\n        fs.readdirSync(p).forEach(function(name) {\n            var fp = path.join(p, name);\n            if (name.substr(-4) === '.pyj') src_file_names.push(path.relative(src_path, fp));\n            else if (name != 'lib' && fs.statSync(fp).isDirectory()) process_dir(fp);\n        });\n    }\n    process_dir(src_path);\n\n    compiler_hash = crypto.createHash('sha1');\n    source_hash = crypto.createHash('sha1');\n    src_file_names.forEach(function(fname) {\n        var src = path.join(src_path, fname);\n        sources[src] = fs.readFileSync(src, 'utf-8');\n        compiler_hash.update(sources[src]);\n        source_hash.update(sources[src]);\n        var h = crypto.createHash('sha1');\n        h.update(sources[src]);\n        hashes[fname.split('.')[0]] = h.digest('hex');\n    });\n    var compiler_files = [module.filename, path.join(base_path, 'tools', 'compiler.js')];\n    compiler_files.forEach(function(fpath) { \n        compiler_hash.update(fs.readFileSync(fpath, 'utf-8'));\n    });\n    hashes['#compiler#'] = compiler_hash.digest('hex');\n    hashes['#compiled_with#'] = saved_hashes['#compiler#'] || 'unknown';\n    source_hash = source_hash.digest('hex');\n    if (hashes['#compiler#'] != saved_hashes['#compiler#']) {\n        console.log('There are changes to the source files of the compiler, rebuiliding');\n        compiler_changed = true;\n    } else if (hashes['#compiled_with#'] != saved_hashes['#compiled_with#']) {\n        console.log('Re-building compiler with updated version of itself');\n        compiler_changed = true;\n    }\n\n    return [source_hash, compiler_changed, sources, hashes];\n}\n\n\nfunction compile(src_path, lib_path, sources, source_hash, profile) {\n    var file = path.join(src_path, 'compiler.pyj');\n    var t1 = new Date().getTime();\n    var RapydScript = require('./compiler').create_compiler();\n    var output_options, profiler, cpu_profile;\n    var compiled_baselib = compile_baselib(RapydScript, src_path);\n    var out_path = path.join(path.dirname(lib_path), 'dev');\n    try {\n        fs.mkdirSync(out_path);\n    } catch (e) {\n        if (e.code != 'EEXIST') throw e;\n    }\n    output_options = {'beautify': true, 'baselib_plain': compiled_baselib.pretty};\n\n    var raw = sources[file], toplevel;\n\n\tfunction parse_file(code, file) {\n\t\treturn RapydScript.parse(code, {\n\t\t\tfilename: file,\n\t\t\tbasedir: path.dirname(file),\n\t\t\tlibdir: path.join(src_path, 'lib'),\n\t\t});\n\t}\n\n    try {\n        if (profile) {\n            profiler = require('v8-profiler');\n            profiler.startProfiling();\n        }\n        toplevel = parse_file(raw, file);\n        if (profile) {\n            cpu_profile = profiler.stopProfiling();\n            fs.writeFileSync('self.cpuprofile', JSON.stringify(cpu_profile), 'utf-8');\n        }\n    } catch (e) {\n        if (!(e instanceof RapydScript.SyntaxError)) throw e;\n        console.error(e.toString());\n        process.exit(1);\n    }\n    var output = new RapydScript.OutputStream(output_options);\n    toplevel.print(output);\n    output = output.get().replace('__COMPILER_VERSION__', source_hash);\n    fs.writeFileSync(path.join(out_path, 'compiler.js'), output, \"utf8\");\n    fs.writeFileSync(path.join(out_path, 'baselib-plain-pretty.js'), compiled_baselib.pretty, 'utf-8');\n    fs.writeFileSync(path.join(out_path, 'baselib-plain-ugly.js'), compiled_baselib.ugly, 'utf-8');\n    console.log('Compiler built in', (new Date().getTime() - t1)/1000, 'seconds\\n');\n    return output;\n}\n\nfunction run_single_compile(base_path, src_path, lib_path, profile) {\n    var out_path = path.join(path.dirname(lib_path), 'dev');\n    var signatures = path.join(out_path, 'signatures.json');\n    var temp = check_for_changes(base_path, src_path, signatures);\n    var source_hash = temp[0], compiler_changed = temp[1], sources = temp[2], hashes = temp[3];\n    \n    if (compiler_changed) {\n        compile(src_path, lib_path, sources, source_hash, profile);\n        fs.writeFileSync(signatures, JSON.stringify(hashes, null, 4));\n    } else console.log('Compiler is built with the up-to-date version of itself');\n    return compiler_changed;\n}\n\nmodule.exports = function compile_self(base_path, src_path, lib_path, complete, profile) {\n    var changed;\n    do {\n        changed = run_single_compile(base_path, src_path, lib_path, profile);\n        lib_path = path.join(path.dirname(lib_path), 'dev');\n    } while (changed && complete);\n};\n"
  },
  {
    "path": "tools/test.js",
    "content": "/*\n * test.js\n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license.\n */\n\"use strict\";  /*jshint node:true */\nvar path = require('path');\nvar fs = require('fs');\nvar RapydScript = require('./compiler').create_compiler();\nvar utils = require('./utils');\nvar colored = utils.safe_colored;\n\nmodule.exports = function(argv, base_path, src_path, lib_path) {\n    // run all tests and exit\n    var assert = require(\"assert\");\n    var os = require('os');\n    var failures = [];\n    var vm = require('vm');\n    var compiler_dir = path.join(base_path, 'dev');\n    if (!utils.path_exists(path.join(compiler_dir, 'compiler.js'))) compiler_dir = path.join(base_path, 'release');\n    var test_dir = path.join(base_path, 'test');\n\tvar baselib = fs.readFileSync(path.join(lib_path, 'baselib-plain-pretty.js'), 'utf-8');\n    var files;\n    var deep_eq = assert.deepEqual;\n    assert.deepEqual = function(a, b, message) {\n        // Compare array objects that have extra properties as simple arrays\n        if (Array.isArray(a) && Array.isArray(b)) {\n            if (a === b) return;\n            if (a.length !== b.length) throw new assert.AssertionError({actual:a, expected:b, operator:'deepEqual', stackStartFunction:assert.deepEqual});\n            for(var i=0; i < a.length; i++) assert.deepEqual(a[i], b[i], message);\n        } else if (a !== undefined && a !== null && typeof a.__eq__ === 'function') {\n            if (!a.__eq__(b)) throw new assert.AssertionError({actual:a, expected:b, operator:'deepEqual', stackStartFunction:assert.deepEqual});\n        } else return deep_eq(a, b, message);\n    };\n\n    if (argv.files.length) {\n        files = [];\n\t\targv.files.forEach(function(fname) { files.push(fname + '.pyj'); });\n\t} else {\n        files = fs.readdirSync(test_dir).filter(function(name){\n            return /^[^_].*\\.pyj$/.test(name);\n        });\n\t}\n    files.forEach(function(file){\n        var ast;\n        var filepath = path.join(test_dir, file);\n        var failed = false;\n        try {\n            ast = RapydScript.parse(fs.readFileSync(filepath, \"utf-8\"), {\n                filename: file,\n                toplevel: ast,\n                basedir: test_dir,\n                libdir: path.join(src_path, 'lib'),\n            });\n        } catch(e) {\n            failures.push(file);\n            failed = true;\n            console.log(colored(file, 'red') + ': ' + e + \"\\n\\n\");\n            return;\n        }\n\n        var js_version = 5;\n        while (js_version < 7) {\n            // generate output\n            var output = new RapydScript.OutputStream({\n                baselib_plain: baselib,\n                beautify: true,\n                js_version: js_version,\n                keep_docstrings: true,\n            });\n            ast.print(output);\n\n            // test that output performs correct JS operations\n            var jsfile = path.join(os.tmpdir(), file + '-es' + js_version + '.js');\n            var code = output.toString();\n            try {\n                vm.runInNewContext(code, {\n                    'assrt':assert, \n                    '__name__': jsfile,\n                    'require':require, \n                    'fs':fs,\n                    'RapydScript':RapydScript, \n                    'console':console,\n                    'compiler_dir': compiler_dir,\n                    'test_path':test_dir,\n                    'Buffer': Buffer,\n                }, {'filename':jsfile});\n            } catch (e) {\n                failures.push(file);\n                failed = true;\n                fs.writeFileSync(jsfile, code);\n                console.error('Failed running: ' + colored(jsfile, 'red'));\n                if (e.stack) \n                    console.error(colored(file, 'red') + \":\\n\" + e.stack + \"\\n\\n\");\n                else \n                    console.error(colored(file, 'red') + \": \" + e + \"\\n\\n\");\n                js_version = 1000;\n            }\n            js_version++;\n        }\n\t\tif (!failed) console.log(colored(file, 'green') + \": test completed successfully\\n\");\n        else { console.log(colored(file, 'red') + \":\\ttest failed\\n\"); }\n    });\n    if (failures.length) {\n        console.log(colored('There were ' + failures.length + ' test failure(s):', 'red'));\n        console.log.apply(console, failures);\n    } else console.log(colored('All tests passed!', 'green'));\n    process.exit((failures.length) ? 1 : 0);\n};\n"
  },
  {
    "path": "tools/utils.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2015 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\n\nvar comment_contents = /\\/\\*!?(?:\\@preserve)?[ \\t]*(?:\\r\\n|\\n)([\\s\\S]*?)(?:\\r\\n|\\n)[ \\t]*\\*\\//;\nvar colors = ['red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'];\n\nfunction ansi(code) {\n    code = code || 0;\n    return String.fromCharCode(27) + '[' + code + 'm';\n}\n\nfunction path_exists(path) {\n    var fs = require('fs');\n    try {\n        fs.statSync(path);\n        return true;\n    } catch(e) {\n        if (e.code != 'ENOENT') throw e;\n    }\n}\n\nfunction colored(string, color, bold) {\n    var prefix = [];\n    if (bold) prefix.push(ansi(1));\n    if (color) prefix.push(ansi(colors.indexOf(color) + 31));\n    return prefix.join('') + string + ansi(0);\n}\n\nfunction supports_color(stdout) {\n    stdout = stdout || process.stdout;\n\tif (stdout && !stdout.isTTY) {\n\t\treturn false;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn false;\n\t}\n\n\tif ('COLORTERM' in process.env) {\n\t\treturn true;\n\t}\n\n\tif (process.env.TERM === 'dumb') {\n\t\treturn false;\n\t}\n\n\tif (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {\n\t\treturn true;\n\t}\n\n    return false;\n\n}\n\nfunction safe_colored(string) {\n    return string;\n}\n\nfunction repeat(str, num) {\n    return new Array( num + 1 ).join( str );\n}\n\nfunction generators_available() {\n    var gen;\n    try {\n        eval('gen = function *(){}'); // jshint ignore:line\n        return typeof gen === 'function' && gen.constructor.name == 'GeneratorFunction';\n    } catch(e) {\n        return false;\n    }\n}\n\nfunction wrap(lines, width) {\n\tvar ans = [];\n\tvar prev = '';\n\tlines.forEach(function (line) {\n\t\tline = prev + line;\n\t\tprev = '';\n\t\tif (line.length > width) {\n\t\t\tprev = line.substr(width);\n            if (prev) prev += ' ';\n\t\t\tline = line.substr(0, width - 1);\n\t\t\tif (line.substr(line.length - 1 !== ' ')) line += '-';\n\t\t} \n\t\tans.push(line);\n\t});\n\tif (prev) ans = ans.concat(wrap([prev]));\n\treturn ans;\n}\n\nfunction merge() {\n    // Simple merge of properties from all objects\n    var ans = {};\n    Array.prototype.slice.call(arguments).forEach(function (arg) {\n        Object.keys(arg).forEach(function(key) {\n            ans[key] = arg[key];\n        });\n    });\n    return ans;\n}\n\nfunction get_import_dirs(paths_string, ignore_env) {\n    var path = require('path');\n    var paths = [];\n    function merge(new_path) {\n        if (paths.indexOf(new_path) == -1) paths.push(new_path);\n    }\n    if (!ignore_env && process && process.env && process.env.RAPYDSCRIPT_IMPORT_PATH) {\n        process.env.RAPYDSCRIPT_IMPORT_PATH.split(path.delimiter).forEach(merge);\n    }\n    if (paths_string) paths_string.split(path.delimiter).forEach(merge);\n    return paths;\n}\n\nexports.comment_contents = comment_contents;\nexports.repeat = repeat;\nexports.wrap = wrap;\nexports.merge = merge;\nexports.colored = colored;\nexports.safe_colored = (supports_color()) ? colored : safe_colored;\nexports.generators_available = generators_available;\nexports.get_import_dirs = get_import_dirs;\nexports.path_exists = path_exists;\n"
  },
  {
    "path": "tools/web_repl.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2016 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\"use strict\";  /*jshint node:true */\nvar vm = require('vm');\nvar embedded_compiler = require('tools/embedded_compiler.js');\n\nmodule.exports = function(compiler, baselib) {\n    var ctx = vm.createContext();\n    var LINE_CONTINUATION_CHARS = ':\\\\';\n    var find_completions = null;\n    var streaming_compiler = embedded_compiler(compiler, baselib, function(js) { return vm.runInContext(js, ctx); }, '__repl__');\n\n    return {\n        'in_block_mode': false,\n\n        'replace_print': function replace_print(write_line_func) {\n            ctx.print = function() {\n                var parts = [];\n                for (var i = 0; i < arguments.length; i++) \n                    parts.push(ctx.ρσ_str(arguments[i]));\n                write_line_func(parts.join(' '));\n            };\n        },\n\n        'is_input_complete': function is_input_complete(source) {\n            if (!source || !source.trim()) return false;\n            var lines = source.split('\\n');\n            var last_line = lines[lines.length - 1].trimRight();\n            if (this.in_block_mode) {\n                // In a block only exit after two blank lines\n                if (lines.length < 2) return false;\n                var second_last_line = lines[lines.length - 2].trimRight();\n                var block_ended = !!(!last_line && !second_last_line);\n                if (!block_ended) return false;\n                this.in_block_mode = false;\n                return true;\n            }\n\n            if (last_line && LINE_CONTINUATION_CHARS.indexOf(last_line.substr(last_line.length - 1)) > -1) {\n                this.in_block_mode = true;\n                return false;\n            }\n            try {\n                compiler.parse(source, {'filename': '<repl>', 'basedir': '__stdlib__'});\n            } catch(e) {\n                if (e.is_eof && e.line === lines.length && e.col > 0) {\n                    return false;\n                }\n                this.in_block_mode = false;\n                return true;\n            }\n            this.in_block_mode = false;\n            return true;\n        },\n\n        'compile': function web_repl_compile(code, opts) {\n            opts = opts || {};\n            opts.keep_docstrings = true;\n            opts.filename = '<input>';\n            return streaming_compiler.compile(code, opts);\n        },\n\n        'runjs': function runjs(code) {\n            var ans = vm.runInContext(code, ctx);\n            if (ans !== undefined || ans === null) {\n                ctx.ρσ_repl_val = ans;\n                var q = vm.runInContext('ρσ_repr(ρσ_repl_val)', ctx);\n                ans = (q === 'undefined') ? ans.toString() : q;\n            }\n            return ans;\n        },\n\n        'init_completions': function init_completions(completelib) {\n            find_completions = completelib(compiler);\n        },\n\n        'find_completions': function find_completions_(line) {\n            return find_completions(line, ctx);\n        },\n\n    };\n};\n\n"
  },
  {
    "path": "try",
    "content": "#!/usr/bin/env python3\n\nimport subprocess\nimport sys\nimport os\nimport shutil\n\nargs = sys.argv[1:]\nsource = None\n\ncmd = ['bin/rapydscript']\n\nwhile args:\n    if args[0] in ('-m', '-x'):\n        cmd.append(args.pop(0))\n    elif args[0] == '-f':\n        args.pop(0)\n        source = args[0]\n        cmd.append(source)\n    else:\n        break\n\nraw = ' '.join(args).replace('\\\\n', '\\n')\n\nif os.path.exists('dev'):\n    shutil.rmtree('dev')\nshutil.copytree('release', 'dev')\nsubprocess.check_call(cmd[:1] + ['self'])\nif source:\n    p = subprocess.Popen(\n        ['node', '--stack-trace-limit=1000'] + cmd)\nelse:\n    p = subprocess.Popen(\n        ['node', '--stack-trace-limit=1000'] + cmd, stdin=subprocess.PIPE)\n    p.stdin.write(raw.encode('utf-8'))\n    p.stdin.close()\ntry:\n    raise SystemExit(p.wait())\nexcept KeyboardInterrupt:\n    p.kill()\n    raise SystemExit(1)\n"
  },
  {
    "path": "web-repl/env.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2016 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n\nvar namespace = {}, jsSHA = {};\n\nvar write_cache = {};\n\nvar builtin_modules = {\n    'crypto' : {\n        'createHash': function create_hash() {\n            var ans = new jsSHA.jsSHA('SHA-1', 'TEXT');\n            ans.digest = function hex_digest() { return ans.getHash('HEX'); };\n            return ans;\n        },\n    },\n\n    'vm': {\n        'createContext': function create_context(ctx) {\n            var iframe = document.createElement('iframe');\n            iframe.style.display = 'none';\n            document.body.appendChild(iframe);\n            var win = iframe.contentWindow;\n            if(!ctx) ctx = {};\n            if (!ctx.sha1sum) ctx.sha1sum = sha1sum;\n            if (!ctx.require) ctx.require = require;\n            Object.keys(ctx).forEach(function(k) { win[k] = ctx[k]; });\n            return win;\n        },\n\n        'runInContext': function run_in_context(code, ctx) {\n            return ctx.eval(code);\n        },\n\n        'runInThisContext': eval,\n    },\n    'path': {\n        'join': function path_join() { return Array.prototype.slice.call(arguments).join('/'); },\n        'dirname': function path_dirname(path) {\n            return path.split('/').slice(0, -1).join('/');\n        },\n    },\n    'inspect': function inspect(x) { return x.toString(); },\n\n    'fs': {\n        'readFileSync': function readfile(name) {\n            if (namespace.virtual_file_system && namespace.virtual_file_system.read_file_sync) {\n                data = namespace.virtual_file_system.read_file_sync(name);\n                if (data !== null) return data;\n            }\n            var data = namespace.file_data[name];\n            if (data) return data;\n            data = write_cache[name];\n            if (data) return data;\n            var err = Error();\n            err.code = 'ENOENT';\n            throw err;\n        },\n\n        'writeFileSync': function writefile(name, data) {\n            if (namespace.virtual_file_system && namespace.virtual_file_system.write_file_sync) {\n                namespace.virtual_file_system.write_file_sync(name, data);\n            } else write_cache[name] = data;\n        },\n\n    },\n};\n\nfunction require(name) {\n    return builtin_modules[name] || {};\n}\n"
  },
  {
    "path": "web-repl/index.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>RapydScript REPL</title>\n        <meta charset=\"utf-8\" />\n        <script type=\"text/javascript\" src=\"prism.js\" defer data-manual></script>\n        <script type=\"text/javascript\" src=\"rapydscript.js\" defer></script>\n        <script type=\"text/javascript\" src=\"main.js\" defer></script>\n<style type=\"text/css\">\n\nbody, div, h1, h2, h3 { margin: 0; padding: 0; border-width: 0; box-sizing: border-box }\n\nbody {\n    color: black;\n    background-color: #f5f2f0;\n    font-family: monospace;\n}\n\nhr {\n    border: 0; height: 1px; background-image: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\n}\n\n#top, #bottom  {\n    display: none;\n}\n\n#top {\n    border-bottom: solid 1px currentColor;\n    height: 75vh;\n    max-height: 75vh;\n}\n\n#bottom {\n    border-top: solid 1px currentColor;\n    padding: 1ex 1rem;\n    height: 25vh;\n    justify-content: flex-start;\n    align-items: center;\n}\n\n.panel {\n    width: 50vw;\n}\n\n#left {\n    border-right: solid 1px currentColor;\n}\n\n#right {\n    border-left: solid 1px currentColor;\n}\n\n.panel > div {\n    height: 75vh;\n    max-height: 7xvh;\n    overflow:auto;\n}\n\n.panel h2 {\n    background-color: lightGray;\n    border-bottom: solid 1px currentColor;\n    vertical-align: middle;\n    padding: 1ex 1rem;\n}\n\n.panel .output {\n    padding: 1ex 1rem;\n    white-space: pre-wrap;\n}\n\ncode.language-javascript {\n    white-space: pre-wrap !important;\n    font-family: monospace !important;\n}\n\n#input {\n    margin-right: 1rem;\n    flex: 2;\n    align-self: stretch;\n}\n\n#completions {\n    display: none;\n    position: absolute;\n    bottom: 25vh;\n    bottom: calc(25vh - 1ex);\n    border: solid 1px currentColor;\n    background-color: #ffefd5;\n    z-index: 200;\n    border-radius: 4px;\n    padding: 1ex 1em;\n    margin: 0 1em;\n}\n\n#completions > div:first-of-type {\n    float: right;\n    margin-top: -27px;\n    margin-right: -25px;\n    width: 30px;\n    height: 30px;\n    border-radius: 30px;\n    font-size: 25px;\n    padding: 0;\n    z-index: 201;\n    line-height: 0px;\n    cursor: pointer;\n    left: 100%;\n    display:flex;\n    align-items: center;\n    justify-content: center;\n    background: #605F61;\n    border: 1px solid #AEAEAE;\n}\n\n#completions > div:first-of-type:hover {\n    color: red;\n}\n\n#completions > div:last-of-type {\n    overflow: auto;\n    height: auto;\n    max-height: 20vh;\n    width: 100%;\n}\n\n.completion-group {\n    display: flex;\n    flex-wrap: wrap;\n    align-items: baseline;\n    margin-bottom: 2ex;\n}\n\n.completion-group:last-of-type {\n    margin-bottom: 0;\n}\n\n</style>\n    </head>\n    <body>\n        <pre id=\"loading\">Loading RapydScript REPL, please wait...</pre>\n        <div id=\"top\">\n            <div id=\"left\" class=\"panel\"> \n                <div id=\"left-scroll\">\n                    <h2>Compiled JavaScript</h2>\n                    <div id=\"js\" class=\"output\"></div>\n                </div>\n            </div>\n            <div id=\"right\" class=\"panel\">\n                <div id=\"right-scroll\">\n                    <h2>Output</h2>\n                    <div id=\"output\" class=\"output\"></div>\n                </div>\n            </div>\n        </div>\n        <div id=\"bottom\">\n            <textarea id=\"input\" spellcheck=\"false\"></textarea>\n            <button id=\"run\">Run!</button>\n        </div>\n        <div id=\"completions\"><div title=\"Close completions popup\"><span>✖</span></div><div></div></div>\n        <link href=\"prism.css\" type=\"text/css\" rel=\"stylesheet\"></link>\n    </body>\n</html>\n\n"
  },
  {
    "path": "web-repl/main.js",
    "content": "/* vim:fileencoding=utf-8\n * \n * Copyright (C) 2016 Kovid Goyal <kovid at kovidgoyal.net>\n *\n * Distributed under terms of the BSD license\n */\n(function() {\n    \"use strict\";\n\n    var web_repl = null;\n\n    function compile(code) {\n        return web_repl.compile(code);\n    }\n\n    function runjs(code) {\n        return web_repl.runjs(code);\n    }\n\n    function println(text) {\n        document.getElementById('output').appendChild(document.createTextNode(text + '\\n'));\n    }\n\n    function add_output(text, color) {\n        var output = document.getElementById('output');\n        var node = document.createTextNode(text);\n        if (color) {\n            var e = document.createElement('span');\n            e.style.color = color;\n            e.appendChild(node);\n            node = e;\n        }\n        output.appendChild(node);\n        output.appendChild(document.createElement('hr'));\n        output.lastChild.scrollIntoView();\n    }\n\n    function add_javascript(text) {\n        var output = document.getElementById('js');\n        var code = document.createElement('code');\n        code.appendChild(document.createTextNode(text));\n        code.setAttribute('class', 'language-javascript');\n        output.appendChild(code);\n        output.appendChild(document.createElement('hr'));\n        Prism.highlightElement(code);\n        output.lastChild.scrollIntoView();\n    }\n\n    function show_compiler_error(text, line, col) {\n        var output = document.getElementById('js');\n        var e = document.createElement('div');\n        e.style.color = 'red';\n        var b = document.createElement('b');\n        b.textContent = \"Failed to compile RapydScript with error:\\n\";\n        e.appendChild(b);\n        e.appendChild(document.createTextNode(text + '\\n'));\n        if (line) {\n            var t = document.createElement('span');\n            t.style.color = 'black';\n            e.appendChild(document.createTextNode('☛ '));\n            t.textContent = line + '\\n';\n            e.appendChild(t);\n            if (col !== null) {\n                t = document.createElement('span');\n                e.appendChild(document.createTextNode('☛ '));\n                t.textContent = ' '.repeat(col) + '⬆';\n                e.appendChild(t);\n            }\n        }\n        output.appendChild(e);\n        output.appendChild(document.createElement('hr'));\n        output.lastChild.scrollIntoView();\n    }\n\n    function read_eval(code) {\n        var js, obj, text;\n        hide_completions();\n        try {\n            js = compile(code);\n        } catch(e) {\n            var text, line = null, col = null;\n            if (e.message && e.line) {\n                text = e.message;\n                line = code.split('\\n')[e.line - 1];\n                col = e.col;\n            } else text = e.stack || e.toString();\n            show_compiler_error(text, line, col);\n            return false;\n        }\n        add_javascript(js);\n        try {\n            obj = runjs(js);\n        } catch(e) {\n            add_output(e.toString(), 'red');\n            return;\n        }\n        if (typeof obj === 'string') add_output(obj, 'brown');\n        return false;\n    }\n\n    function run_code() {\n        var input = document.getElementById('input');\n        var code = input.value;\n        input.value = '';\n        if (code) read_eval(code);\n        document.getElementById('input').focus();\n    }\n\n    function hide_completions() {\n        document.getElementById('completions').style.display = 'none';\n    }\n\n    function completions_visible() {\n        return document.getElementById('completions').style.display !== 'none';\n    }\n\n    function show_completions(completions) {\n        var comps = document.getElementById('completions'), e = comps.lastChild;\n        e.innerHTML = '';\n        var groups = [], current_group = [];\n        completions.forEach(function(x) {\n            if (x) current_group.push(x);\n            else {\n                if (current_group.length) groups.push(current_group);\n                current_group = [];\n            }\n        });\n        if (current_group.length) groups.push(current_group);\n        groups.forEach(function(group) {\n            if (!group.length) return;\n            var g = document.createElement('div');\n            g.setAttribute('class', 'completion-group');\n            var longest_length = group.concat().sort(function (a, b) { return b.length - a.length; })[0].length + 1;\n            group.forEach(function(word) {\n                var node = document.createTextNode(word + '\\xa0'.repeat(longest_length - word.length));\n                var div = document.createElement('div');\n                div.appendChild(node);\n                g.appendChild(div);\n            });\n            e.appendChild(g);\n        });\n        comps.style.display = 'block';\n    }\n\n    function check_for_completions() {\n        var input = document.getElementById('input'), source = input.value;\n        var ss = input.selectionStart;\n        if (ss === undefined || input.selectionEnd !== ss) return hide_completions();\n        var before = source.substr(0, ss);\n        var ret = web_repl.find_completions(before);\n        if (!ret || ret.length != 2) return hide_completions();\n        var completions = ret[0], prefix = longest_common_prefix(completions), last_tok = ret[1];\n        if (prefix == last_tok && completions.length == 1) return hide_completions();\n        if (completions_visible() || completions.length == 1) {\n            if (prefix.length > last_tok.length) {\n                var insertion = prefix.substr(last_tok.length);\n                input.value = before + insertion + source.substr(ss);\n                input.setSelectionRange(ss + insertion.length, ss + insertion.length);\n            }\n        }\n        if (completions.length > 1) show_completions(completions);\n        else hide_completions();\n    }\n\n    function update_completions() {\n        if (completions_visible()) {\n            var input = document.getElementById('input'), source = input.value;\n            var ss = input.selectionStart;\n            if (ss === undefined || input.selectionEnd !== ss) return hide_completions();\n            var before = source.substr(0, ss);\n            var ret = web_repl.find_completions(before);\n            if (!ret || ret.length != 2) return hide_completions();\n            var completions = ret[0], prefix = longest_common_prefix(completions), last_tok = ret[1];\n            if (prefix == last_tok && completions.length == 1) return hide_completions();\n            show_completions(completions);\n        }\n    }\n\n    function longest_common_prefix(items) {\n        if (!items.length) return '';\n        var sorted = items.concat().sort(), a1 = sorted[0], a2 = sorted[sorted.length-1], limit = a1.length, i = 0;\n        while ( i < limit && a1.charAt(i) === a2.charAt(i)) i++;\n        return a1.substr(0, i);\n    }\n\n    function on_input(ev) {\n        var input, source;\n        var code = ev.keyCode || ev.which;\n        if (code === 13 && !ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {  // Enter\n            input = document.getElementById('input');\n            source = input.value;\n            ev.preventDefault();\n            if (web_repl.is_input_complete(source)) {\n                setTimeout(run_code, 0);\n                return;\n            }\n            var lines = source.split('\\n');\n            var last_line = lines[lines.length - 1];\n            var prev_leading_whitespace = last_line.match(/^\\s+/);\n            var next_line = prev_leading_whitespace || '';\n            if (source.trimRight().endsWith(':')) next_line += '    ';\n            input.value = source + '\\n' + next_line;\n        }\n        else if (code === 9 && !ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {  // Tab\n            ev.preventDefault();\n            check_for_completions();\n        }\n        else if (code === 27 && !ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {  // Esc\n            hide_completions();\n        }\n        else if (code === 115) {  // F4\n            input = document.getElementById('input');\n            source = input.value;\n            var ss = input.selectionStart;\n            if (ss === undefined) return;\n            ev.preventDefault();\n            var before = source.substr(0, ss);\n            input.value = before + 'ρσ_' + source.substr(ss);\n        }\n\n    }\n\n    function on_load() {\n        web_repl = RapydScript.web_repl();\n        web_repl.replace_print(println);\n        web_repl.init_completions(RapydScript.completer);\n        document.getElementById('loading').style.display = 'none';\n        document.getElementById('top').style.display = 'flex';\n        document.getElementById('bottom').style.display = 'flex';\n        add_output(\n            ('RapydScript-ng ' + RapydScript.rs_version + ' (at commit: ' + RapydScript.rs_commit_sha.substr(0, 10) + ')\\n' +\n            'Type RapydScript code into the box at the bottom and click the' + \n            ' Run button. You can press Tab for completions.'), 'blue'\n        );\n        document.getElementById('run').addEventListener('click', run_code);\n        document.getElementById('input').focus();\n        document.getElementById('input').addEventListener('keydown', on_input);\n        document.getElementById('input').addEventListener('keyup', function() { setTimeout(update_completions, 0); });\n        document.getElementById('completions').firstChild.addEventListener('click', hide_completions);\n    }\n\n    window.onload = on_load;\n})();\n"
  },
  {
    "path": "web-repl/prism.css",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+abap+actionscript+apacheconf+apl+applescript+asciidoc+aspnet+autoit+autohotkey+bash+basic+batch+c+brainfuck+bison+csharp+cpp+coffeescript+ruby+css-extras+d+dart+diff+docker+eiffel+elixir+erlang+fsharp+fortran+gherkin+git+glsl+go+groovy+haml+handlebars+haskell+haxe+http+icon+inform7+ini+j+jade+java+json+julia+keyman+kotlin+latex+less+lolcode+lua+makefile+markdown+matlab+mel+mizar+monkey+nasm+nginx+nim+nix+nsis+objectivec+ocaml+oz+parigp+parser+pascal+perl+php+php-extras+powershell+processing+prolog+puppet+pure+python+q+qore+r+jsx+rest+rip+roboconf+crystal+rust+sas+sass+scss+scala+scheme+smalltalk+smarty+sql+stylus+swift+tcl+textile+twig+typescript+verilog+vhdl+vim+wiki+yaml */\n/**\n * prism.js default theme for JavaScript, CSS and HTML\n * Based on dabblet (http://dabblet.com)\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: black;\n\tbackground: none;\n\ttext-shadow: 0 1px white;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\ttext-shadow: none;\n\tbackground: #b3d4fc;\n}\n\n@media print {\n\tcode[class*=\"language-\"],\n\tpre[class*=\"language-\"] {\n\t\ttext-shadow: none;\n\t}\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #f5f2f0;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: slategray;\n}\n\n.token.punctuation {\n\tcolor: #999;\n}\n\n.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #905;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.inserted {\n\tcolor: #690;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.style .token.string {\n\tcolor: #a67f59;\n\tbackground: hsla(0, 0%, 100%, .5);\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #07a;\n}\n\n.token.function {\n\tcolor: #DD4A68;\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #e90;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n"
  },
  {
    "path": "web-repl/prism.js",
    "content": "/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+abap+actionscript+apacheconf+apl+applescript+asciidoc+aspnet+autoit+autohotkey+bash+basic+batch+c+brainfuck+bison+csharp+cpp+coffeescript+ruby+css-extras+d+dart+diff+docker+eiffel+elixir+erlang+fsharp+fortran+gherkin+git+glsl+go+groovy+haml+handlebars+haskell+haxe+http+icon+inform7+ini+j+jade+java+json+julia+keyman+kotlin+latex+less+lolcode+lua+makefile+markdown+matlab+mel+mizar+monkey+nasm+nginx+nim+nix+nsis+objectivec+ocaml+oz+parigp+parser+pascal+perl+php+php-extras+powershell+processing+prolog+puppet+pure+python+q+qore+r+jsx+rest+rip+roboconf+crystal+rust+sas+sass+scss+scala+scheme+smalltalk+smarty+sql+stylus+swift+tcl+textile+twig+typescript+verilog+vhdl+vim+wiki+yaml */\nvar _self=\"undefined\"!=typeof window?window:\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\\blang(?:uage)?-(\\w+)\\b/i,t=0,n=_self.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):\"Array\"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/\\u00a0/g,\" \")},type:function(e){return Object.prototype.toString.call(e).match(/\\[object (\\w+)\\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,\"__id\",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case\"Object\":var a={};for(var r in e)e.hasOwnProperty(r)&&(a[r]=n.util.clone(e[r]));return a;case\"Array\":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var a=n.util.clone(n.languages[e]);for(var r in t)a[r]=t[r];return a},insertBefore:function(e,t,a,r){r=r||n.languages;var l=r[e];if(2==arguments.length){a=arguments[1];for(var i in a)a.hasOwnProperty(i)&&(l[i]=a[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in a)a.hasOwnProperty(i)&&(o[i]=a[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===r[e]&&t!=e&&(this[t]=o)}),r[e]=o},DFS:function(e,t,a,r){r=r||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],a||l),\"Object\"!==n.util.type(e[l])||r[n.util.objId(e[l])]?\"Array\"!==n.util.type(e[l])||r[n.util.objId(e[l])]||(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,r)):(r[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,r)))}},plugins:{},highlightAll:function(e,t){var a={callback:t,selector:'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'};n.hooks.run(\"before-highlightall\",a);for(var r,l=a.elements||document.querySelectorAll(a.selector),i=0;r=l[i++];)n.highlightElement(r,e===!0,a.callback)},highlightElement:function(t,a,r){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,\"\"])[1],i=n.languages[l]),t.className=t.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+l,o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,\"\").replace(/\\s+/g,\" \")+\" language-\"+l);var s=t.textContent,u={element:t,language:l,grammar:i,code:s};if(!s||!i)return n.hooks.run(\"complete\",u),void 0;if(n.hooks.run(\"before-highlight\",u),a&&_self.Worker){var c=new Worker(n.filename);c.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run(\"before-insert\",u),u.element.innerHTML=u.highlightedCode,r&&r.call(u.element),n.hooks.run(\"after-highlight\",u),n.hooks.run(\"complete\",u)},c.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run(\"before-insert\",u),u.element.innerHTML=u.highlightedCode,r&&r.call(t),n.hooks.run(\"after-highlight\",u),n.hooks.run(\"complete\",u)},highlight:function(e,t,r){var l=n.tokenize(e,t);return a.stringify(n.util.encode(l),r)},tokenize:function(e,t){var a=n.Token,r=[e],l=t.rest;if(l){for(var i in l)t[i]=l[i];delete t.rest}e:for(var i in t)if(t.hasOwnProperty(i)&&t[i]){var o=t[i];o=\"Array\"===n.util.type(o)?o:[o];for(var s=0;s<o.length;++s){var u=o[s],c=u.inside,g=!!u.lookbehind,h=!!u.greedy,f=0,d=u.alias;u=u.pattern||u;for(var p=0;p<r.length;p++){var m=r[p];if(r.length>e.length)break e;if(!(m instanceof a)){u.lastIndex=0;var y=u.exec(m),v=1;if(!y&&h&&p!=r.length-1){var b=r[p+1].matchedStr||r[p+1],k=m+b;if(p<r.length-2&&(k+=r[p+2].matchedStr||r[p+2]),u.lastIndex=0,y=u.exec(k),!y)continue;var w=y.index+(g?y[1].length:0);if(w>=m.length)continue;var _=y.index+y[0].length,P=m.length+b.length;if(v=3,P>=_){if(r[p+1].greedy)continue;v=2,k=k.slice(0,P)}m=k}if(y){g&&(f=y[1].length);var w=y.index+f,y=y[0].slice(f),_=w+y.length,S=m.slice(0,w),O=m.slice(_),j=[p,v];S&&j.push(S);var A=new a(i,c?n.tokenize(y,c):y,d,y,h);j.push(A),O&&j.push(O),Array.prototype.splice.apply(r,j)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,l=0;r=a[l++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.matchedStr=a||null,this.greedy=!!r};if(a.stringify=function(e,t,r){if(\"string\"==typeof e)return e;if(\"Array\"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join(\"\");var l={type:e.type,content:a.stringify(e.content,t,r),tag:\"span\",classes:[\"token\",e.type],attributes:{},language:t,parent:r};if(\"comment\"==l.type&&(l.attributes.spellcheck=\"true\"),e.alias){var i=\"Array\"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run(\"wrap\",l);var o=\"\";for(var s in l.attributes)o+=(o?\" \":\"\")+s+'=\"'+(l.attributes[s]||\"\")+'\"';return\"<\"+l.tag+' class=\"'+l.classes.join(\" \")+'\" '+o+\">\"+l.content+\"</\"+l.tag+\">\"},!_self.document)return _self.addEventListener?(_self.addEventListener(\"message\",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,l=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),l&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName(\"script\")).pop();return r&&(n.filename=r.src,document.addEventListener&&!r.hasAttribute(\"data-manual\")&&document.addEventListener(\"DOMContentLoaded\",n.highlightAll)),_self.Prism}();\"undefined\"!=typeof module&&module.exports&&(module.exports=Prism),\"undefined\"!=typeof global&&(global.Prism=Prism);\nPrism.languages.markup={comment:/<!--[\\w\\W]*?-->/,prolog:/<\\?[\\w\\W]+?\\?>/,doctype:/<!DOCTYPE[\\w\\W]+?>/,cdata:/<!\\[CDATA\\[[\\w\\W]*?]]>/i,tag:{pattern:/<\\/?(?!\\d)[^\\s>\\/=.$<]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,inside:{tag:{pattern:/^<\\/?[^\\s>\\/]+/i,inside:{punctuation:/^<\\/?/,namespace:/^[^\\s>\\/:]+:/}},\"attr-value\":{pattern:/=(?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i,inside:{punctuation:/[=>\"']/}},punctuation:/\\/?>/,\"attr-name\":{pattern:/[^\\s>\\/]+/,inside:{namespace:/^[^\\s>\\/:]+:/}}}},entity:/&#?[\\da-z]{1,8};/i},Prism.hooks.add(\"wrap\",function(a){\"entity\"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,\"&\"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup;\nPrism.languages.css={comment:/\\/\\*[\\w\\W]*?\\*\\//,atrule:{pattern:/@[\\w-]+?.*?(;|(?=\\s*\\{))/i,inside:{rule:/@[\\w-]+/}},url:/url\\((?:([\"'])(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,selector:/[^\\{\\}\\s][^\\{\\};]*?(?=\\s*\\{)/,string:/(\"|')(\\\\(?:\\r\\n|[\\w\\W])|(?!\\1)[^\\\\\\r\\n])*\\1/,property:/(\\b|\\B)[\\w-]+(?=\\s*:)/i,important:/\\B!important\\b/i,\"function\":/[-a-z0-9]+(?=\\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore(\"markup\",\"tag\",{style:{pattern:/(<style[\\w\\W]*?>)[\\w\\W]*?(?=<\\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:\"language-css\"}}),Prism.languages.insertBefore(\"inside\",\"attr-value\",{\"style-attr\":{pattern:/\\s*style=(\"|').*?\\1/i,inside:{\"attr-name\":{pattern:/^\\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\\s*=\\s*['\"]|['\"]\\s*$/,\"attr-value\":{pattern:/.+/i,inside:Prism.languages.css}},alias:\"language-css\"}},Prism.languages.markup.tag));\nPrism.languages.clike={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],string:{pattern:/([\"'])(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,greedy:!0},\"class-name\":{pattern:/((?:\\b(?:class|interface|extends|implements|trait|instanceof|new)\\s+)|(?:catch\\s+\\())[a-z0-9_\\.\\\\]+/i,lookbehind:!0,inside:{punctuation:/(\\.|\\\\)/}},keyword:/\\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\\b/,\"boolean\":/\\b(true|false)\\b/,\"function\":/[a-z0-9_]+(?=\\()/i,number:/\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)\\b/i,operator:/--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.javascript=Prism.languages.extend(\"clike\",{keyword:/\\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,number:/\\b-?(0x[\\dA-Fa-f]+|0b[01]+|0o[0-7]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?|NaN|Infinity)\\b/,\"function\":/[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*(?=\\()/i}),Prism.languages.insertBefore(\"javascript\",\"keyword\",{regex:{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\\\\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore(\"javascript\",\"class-name\",{\"template-string\":{pattern:/`(?:\\\\\\\\|\\\\?[^\\\\])*?`/,greedy:!0,inside:{interpolation:{pattern:/\\$\\{[^}]+\\}/,inside:{\"interpolation-punctuation\":{pattern:/^\\$\\{|\\}$/,alias:\"punctuation\"},rest:Prism.languages.javascript}},string:/[\\s\\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore(\"markup\",\"tag\",{script:{pattern:/(<script[\\w\\W]*?>)[\\w\\W]*?(?=<\\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:\"language-javascript\"}}),Prism.languages.js=Prism.languages.javascript;\nPrism.languages.abap={comment:/^\\*.*/m,string:/(`|')(\\\\?.)*?\\1/m,\"string-template\":{pattern:/(\\||\\})(\\\\?.)*?(?=\\||\\{)/,lookbehind:!0,alias:\"string\"},\"eol-comment\":{pattern:/(^|\\s)\".*/m,lookbehind:!0,alias:\"comment\"},keyword:{pattern:/(\\s|\\.|^)(?:SCIENTIFIC_WITH_LEADING_ZERO|SCALE_PRESERVING_SCIENTIFIC|RMC_COMMUNICATION_FAILURE|END-ENHANCEMENT-SECTION|MULTIPLY-CORRESPONDING|SUBTRACT-CORRESPONDING|VERIFICATION-MESSAGE|DIVIDE-CORRESPONDING|ENHANCEMENT-SECTION|CURRENCY_CONVERSION|RMC_SYSTEM_FAILURE|START-OF-SELECTION|MOVE-CORRESPONDING|RMC_INVALID_STATUS|CUSTOMER-FUNCTION|END-OF-DEFINITION|ENHANCEMENT-POINT|SYSTEM-EXCEPTIONS|ADD-CORRESPONDING|SCALE_PRESERVING|SELECTION-SCREEN|CURSOR-SELECTION|END-OF-SELECTION|LOAD-OF-PROGRAM|SCROLL-BOUNDARY|SELECTION-TABLE|EXCEPTION-TABLE|IMPLEMENTATIONS|PARAMETER-TABLE|RIGHT-JUSTIFIED|UNIT_CONVERSION|AUTHORITY-CHECK|LIST-PROCESSING|SIGN_AS_POSTFIX|COL_BACKGROUND|IMPLEMENTATION|INTERFACE-POOL|TRANSFORMATION|IDENTIFICATION|ENDENHANCEMENT|LINE-SELECTION|INITIALIZATION|LEFT-JUSTIFIED|SELECT-OPTIONS|SELECTION-SETS|COMMUNICATION|CORRESPONDING|DECIMAL_SHIFT|PRINT-CONTROL|VALUE-REQUEST|CHAIN-REQUEST|FUNCTION-POOL|FIELD-SYMBOLS|FUNCTIONALITY|INVERTED-DATE|SELECTION-SET|CLASS-METHODS|OUTPUT-LENGTH|CLASS-CODING|COL_NEGATIVE|ERRORMESSAGE|FIELD-GROUPS|HELP-REQUEST|NO-EXTENSION|NO-TOPOFPAGE|REDEFINITION|DISPLAY-MODE|ENDINTERFACE|EXIT-COMMAND|FIELD-SYMBOL|NO-SCROLLING|SHORTDUMP-ID|ACCESSPOLICY|CLASS-EVENTS|COL_POSITIVE|DECLARATIONS|ENHANCEMENTS|FILTER-TABLE|SWITCHSTATES|SYNTAX-CHECK|TRANSPORTING|ASYNCHRONOUS|SYNTAX-TRACE|TOKENIZATION|USER-COMMAND|WITH-HEADING|ABAP-SOURCE|BREAK-POINT|CHAIN-INPUT|COMPRESSION|FIXED-POINT|NEW-SECTION|NON-UNICODE|OCCURRENCES|RESPONSIBLE|SYSTEM-CALL|TRACE-TABLE|ABBREVIATED|CHAR-TO-HEX|END-OF-FILE|ENDFUNCTION|ENVIRONMENT|ASSOCIATION|COL_HEADING|EDITOR-CALL|END-OF-PAGE|ENGINEERING|IMPLEMENTED|INTENSIFIED|RADIOBUTTON|SYSTEM-EXIT|TOP-OF-PAGE|TRANSACTION|APPLICATION|CONCATENATE|DESTINATION|ENHANCEMENT|IMMEDIATELY|NO-GROUPING|PRECOMPILED|REPLACEMENT|TITLE-LINES|ACTIVATION|BYTE-ORDER|CLASS-POOL|CONNECTION|CONVERSION|DEFINITION|DEPARTMENT|EXPIRATION|INHERITING|MESSAGE-ID|NO-HEADING|PERFORMING|QUEUE-ONLY|RIGHTSPACE|SCIENTIFIC|STATUSINFO|STRUCTURES|SYNCPOINTS|WITH-TITLE|ATTRIBUTES|BOUNDARIES|CLASS-DATA|COL_NORMAL|DD\\/MM\\/YYYY|DESCENDING|INTERFACES|LINE-COUNT|MM\\/DD\\/YYYY|NON-UNIQUE|PRESERVING|SELECTIONS|STATEMENTS|SUBROUTINE|TRUNCATION|TYPE-POOLS|ARITHMETIC|BACKGROUND|ENDPROVIDE|EXCEPTIONS|IDENTIFIER|INDEX-LINE|OBLIGATORY|PARAMETERS|PERCENTAGE|PUSHBUTTON|RESOLUTION|COMPONENTS|DEALLOCATE|DISCONNECT|DUPLICATES|FIRST-LINE|HEAD-LINES|NO-DISPLAY|OCCURRENCE|RESPECTING|RETURNCODE|SUBMATCHES|TRACE-FILE|ASCENDING|BYPASSING|ENDMODULE|EXCEPTION|EXCLUDING|EXPORTING|INCREMENT|MATCHCODE|PARAMETER|PARTIALLY|PREFERRED|REFERENCE|REPLACING|RETURNING|SELECTION|SEPARATED|SPECIFIED|STATEMENT|TIMESTAMP|TYPE-POOL|ACCEPTING|APPENDAGE|ASSIGNING|COL_GROUP|COMPARING|CONSTANTS|DANGEROUS|IMPORTING|INSTANCES|LEFTSPACE|LOG-POINT|QUICKINFO|READ-ONLY|SCROLLING|SQLSCRIPT|STEP-LOOP|TOP-LINES|TRANSLATE|APPENDING|AUTHORITY|CHARACTER|COMPONENT|CONDITION|DIRECTORY|DUPLICATE|MESSAGING|RECEIVING|SUBSCREEN|ACCORDING|COL_TOTAL|END-LINES|ENDMETHOD|ENDSELECT|EXPANDING|EXTENSION|INCLUDING|INFOTYPES|INTERFACE|INTERVALS|LINE-SIZE|PF-STATUS|PROCEDURE|PROTECTED|REQUESTED|RESUMABLE|RIGHTPLUS|SAP-SPOOL|SECONDARY|STRUCTURE|SUBSTRING|TABLEVIEW|NUMOFCHAR|ADJACENT|ANALYSIS|ASSIGNED|BACKWARD|CHANNELS|CHECKBOX|CONTINUE|CRITICAL|DATAINFO|DD\\/MM\\/YY|DURATION|ENCODING|ENDCLASS|FUNCTION|LEFTPLUS|LINEFEED|MM\\/DD\\/YY|OVERFLOW|RECEIVED|SKIPPING|SORTABLE|STANDARD|SUBTRACT|SUPPRESS|TABSTRIP|TITLEBAR|TRUNCATE|UNASSIGN|WHENEVER|ANALYZER|COALESCE|COMMENTS|CONDENSE|DECIMALS|DEFERRED|ENDWHILE|EXPLICIT|KEYWORDS|MESSAGES|POSITION|PRIORITY|RECEIVER|RENAMING|TIMEZONE|TRAILING|ALLOCATE|CENTERED|CIRCULAR|CONTROLS|CURRENCY|DELETING|DESCRIBE|DISTANCE|ENDCATCH|EXPONENT|EXTENDED|GENERATE|IGNORING|INCLUDES|INTERNAL|MAJOR-ID|MODIFIER|NEW-LINE|OPTIONAL|PROPERTY|ROLLBACK|STARTING|SUPPLIED|ABSTRACT|CHANGING|CONTEXTS|CREATING|CUSTOMER|DATABASE|DAYLIGHT|DEFINING|DISTINCT|DIVISION|ENABLING|ENDCHAIN|ESCAPING|HARMLESS|IMPLICIT|INACTIVE|LANGUAGE|MINOR-ID|MULTIPLY|NEW-PAGE|NO-TITLE|POS_HIGH|SEPARATE|TEXTPOOL|TRANSFER|SELECTOR|DBMAXLEN|ITERATOR|SELECTOR|ARCHIVE|BIT-XOR|BYTE-CO|COLLECT|COMMENT|CURRENT|DEFAULT|DISPLAY|ENDFORM|EXTRACT|LEADING|LISTBOX|LOCATOR|MEMBERS|METHODS|NESTING|POS_LOW|PROCESS|PROVIDE|RAISING|RESERVE|SECONDS|SUMMARY|VISIBLE|BETWEEN|BIT-AND|BYTE-CS|CLEANUP|COMPUTE|CONTROL|CONVERT|DATASET|ENDCASE|FORWARD|HEADERS|HOTSPOT|INCLUDE|INVERSE|KEEPING|NO-ZERO|OBJECTS|OVERLAY|PADDING|PATTERN|PROGRAM|REFRESH|SECTION|SUMMING|TESTING|VERSION|WINDOWS|WITHOUT|BIT-NOT|BYTE-CA|BYTE-NA|CASTING|CONTEXT|COUNTRY|DYNAMIC|ENABLED|ENDLOOP|EXECUTE|FRIENDS|HANDLER|HEADING|INITIAL|\\*-INPUT|LOGFILE|MAXIMUM|MINIMUM|NO-GAPS|NO-SIGN|PRAGMAS|PRIMARY|PRIVATE|REDUCED|REPLACE|REQUEST|RESULTS|UNICODE|WARNING|ALIASES|BYTE-CN|BYTE-NS|CALLING|COL_KEY|COLUMNS|CONNECT|ENDEXEC|ENTRIES|EXCLUDE|FILTERS|FURTHER|HELP-ID|LOGICAL|MAPPING|MESSAGE|NAMETAB|OPTIONS|PACKAGE|PERFORM|RECEIVE|STATICS|VARYING|BINDING|CHARLEN|GREATER|XSTRLEN|ACCEPT|APPEND|DETAIL|ELSEIF|ENDING|ENDTRY|FORMAT|FRAMES|GIVING|HASHED|HEADER|IMPORT|INSERT|MARGIN|MODULE|NATIVE|OBJECT|OFFSET|REMOTE|RESUME|SAVING|SIMPLE|SUBMIT|TABBED|TOKENS|UNIQUE|UNPACK|UPDATE|WINDOW|YELLOW|ACTUAL|ASPECT|CENTER|CURSOR|DELETE|DIALOG|DIVIDE|DURING|ERRORS|EVENTS|EXTEND|FILTER|HANDLE|HAVING|IGNORE|LITTLE|MEMORY|NO-GAP|OCCURS|OPTION|PERSON|PLACES|PUBLIC|REDUCE|REPORT|RESULT|SINGLE|SORTED|SWITCH|SYNTAX|TARGET|VALUES|WRITER|ASSERT|BLOCKS|BOUNDS|BUFFER|CHANGE|COLUMN|COMMIT|CONCAT|COPIES|CREATE|DDMMYY|DEFINE|ENDIAN|ESCAPE|EXPAND|KERNEL|LAYOUT|LEGACY|LEVELS|MMDDYY|NUMBER|OUTPUT|RANGES|READER|RETURN|SCREEN|SEARCH|SELECT|SHARED|SOURCE|STABLE|STATIC|SUBKEY|SUFFIX|TABLES|UNWIND|YYMMDD|ASSIGN|BACKUP|BEFORE|BINARY|BIT-OR|BLANKS|CLIENT|CODING|COMMON|DEMAND|DYNPRO|EXCEPT|EXISTS|EXPORT|FIELDS|GLOBAL|GROUPS|LENGTH|LOCALE|MEDIUM|METHOD|MODIFY|NESTED|OTHERS|REJECT|SCROLL|SUPPLY|SYMBOL|ENDFOR|STRLEN|ALIGN|BEGIN|BOUND|ENDAT|ENTRY|EVENT|FINAL|FLUSH|GRANT|INNER|SHORT|USING|WRITE|AFTER|BLACK|BLOCK|CLOCK|COLOR|COUNT|DUMMY|EMPTY|ENDDO|ENDON|GREEN|INDEX|INOUT|LEAVE|LEVEL|LINES|MODIF|ORDER|OUTER|RANGE|RESET|RETRY|RIGHT|SMART|SPLIT|STYLE|TABLE|THROW|UNDER|UNTIL|UPPER|UTF-8|WHERE|ALIAS|BLANK|CLEAR|CLOSE|EXACT|FETCH|FIRST|FOUND|GROUP|LLANG|LOCAL|OTHER|REGEX|SPOOL|TITLE|TYPES|VALID|WHILE|ALPHA|BOXED|CATCH|CHAIN|CHECK|CLASS|COVER|ENDIF|EQUIV|FIELD|FLOOR|FRAME|INPUT|LOWER|MATCH|NODES|PAGES|PRINT|RAISE|ROUND|SHIFT|SPACE|SPOTS|STAMP|STATE|TASKS|TIMES|TRMAC|ULINE|UNION|VALUE|WIDTH|EQUAL|LOG10|TRUNC|BLOB|CASE|CEIL|CLOB|COND|EXIT|FILE|GAPS|HOLD|INCL|INTO|KEEP|KEYS|LAST|LINE|LONG|LPAD|MAIL|MODE|OPEN|PINK|READ|ROWS|TEST|THEN|ZERO|AREA|BACK|BADI|BYTE|CAST|EDIT|EXEC|FAIL|FIND|FKEQ|FONT|FREE|GKEQ|HIDE|INIT|ITNO|LATE|LOOP|MAIN|MARK|MOVE|NEXT|NULL|RISK|ROLE|UNIT|WAIT|ZONE|BASE|CALL|CODE|DATA|DATE|FKGE|GKGE|HIGH|KIND|LEFT|LIST|MASK|MESH|NAME|NODE|PACK|PAGE|POOL|SEND|SIGN|SIZE|SOME|STOP|TASK|TEXT|TIME|USER|VARY|WITH|WORD|BLUE|CONV|COPY|DEEP|ELSE|FORM|FROM|HINT|ICON|JOIN|LIKE|LOAD|ONLY|PART|SCAN|SKIP|SORT|TYPE|UNIX|VIEW|WHEN|WORK|ACOS|ASIN|ATAN|COSH|EACH|FRAC|LESS|RTTI|SINH|SQRT|TANH|AVG|BIT|DIV|ISO|LET|OUT|PAD|SQL|ALL|CI_|CPI|END|LOB|LPI|MAX|MIN|NEW|OLE|RUN|SET|\\?TO|YES|ABS|ADD|AND|BIG|FOR|HDB|JOB|LOW|NOT|SAP|TRY|VIA|XML|ANY|GET|IDS|KEY|MOD|OFF|PUT|RAW|RED|REF|SUM|TAB|XSD|CNT|COS|EXP|LOG|SIN|TAN|XOR|AT|CO|CP|DO|GT|ID|IF|NS|OR|BT|CA|CS|GE|NA|NB|EQ|IN|LT|NE|NO|OF|ON|PF|TO|AS|BY|CN|IS|LE|NP|UP|E|I|M|O|Z|C|X)\\b/i,lookbehind:!0},number:/\\b\\d+\\b/,operator:{pattern:/(\\s)(?:\\*\\*?|<[=>]?|>=?|\\?=|[-+\\/=])(?=\\s)/,lookbehind:!0},\"string-operator\":{pattern:/(\\s)&&?(?=\\s)/,lookbehind:!0,alias:\"keyword\"},\"token-operator\":[{pattern:/(\\w)(?:->?|=>|[~|{}])(?=\\w)/,lookbehind:!0,alias:\"punctuation\"},{pattern:/[|{}]/,alias:\"punctuation\"}],punctuation:/[,.:()]/};\nPrism.languages.actionscript=Prism.languages.extend(\"javascript\",{keyword:/\\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\\b/,operator:/\\+\\+|--|(?:[+\\-*\\/%^]|&&?|\\|\\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript[\"class-name\"].alias=\"function\",Prism.languages.markup&&Prism.languages.insertBefore(\"actionscript\",\"string\",{xml:{pattern:/(^|[^.])<\\/?\\w+(?:\\s+[^\\s>\\/=]+=(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\2)*\\s*\\/?>/,lookbehind:!0,inside:{rest:Prism.languages.markup}}});\nPrism.languages.apacheconf={comment:/#.*/,\"directive-inline\":{pattern:/^(\\s*)\\b(AcceptFilter|AcceptPathInfo|AccessFileName|Action|AddAlt|AddAltByEncoding|AddAltByType|AddCharset|AddDefaultCharset|AddDescription|AddEncoding|AddHandler|AddIcon|AddIconByEncoding|AddIconByType|AddInputFilter|AddLanguage|AddModuleInfo|AddOutputFilter|AddOutputFilterByType|AddType|Alias|AliasMatch|Allow|AllowCONNECT|AllowEncodedSlashes|AllowMethods|AllowOverride|AllowOverrideList|Anonymous|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail|AsyncRequestWorkerFactor|AuthBasicAuthoritative|AuthBasicFake|AuthBasicProvider|AuthBasicUseDigestAlgorithm|AuthDBDUserPWQuery|AuthDBDUserRealmQuery|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile|AuthDigestAlgorithm|AuthDigestDomain|AuthDigestNonceLifetime|AuthDigestProvider|AuthDigestQop|AuthDigestShmemSize|AuthFormAuthoritative|AuthFormBody|AuthFormDisableNoStore|AuthFormFakeBasicAuth|AuthFormLocation|AuthFormLoginRequiredLocation|AuthFormLoginSuccessLocation|AuthFormLogoutLocation|AuthFormMethod|AuthFormMimetype|AuthFormPassword|AuthFormProvider|AuthFormSitePassphrase|AuthFormSize|AuthFormUsername|AuthGroupFile|AuthLDAPAuthorizePrefix|AuthLDAPBindAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareAsUser|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPInitialBindAsUser|AuthLDAPInitialBindPattern|AuthLDAPMaxSubGroupDepth|AuthLDAPRemoteUserAttribute|AuthLDAPRemoteUserIsDN|AuthLDAPSearchAsUser|AuthLDAPSubGroupAttribute|AuthLDAPSubGroupClass|AuthLDAPUrl|AuthMerging|AuthName|AuthnCacheContext|AuthnCacheEnable|AuthnCacheProvideFor|AuthnCacheSOCache|AuthnCacheTimeout|AuthnzFcgiCheckAuthnProvider|AuthnzFcgiDefineProvider|AuthType|AuthUserFile|AuthzDBDLoginToReferer|AuthzDBDQuery|AuthzDBDRedirectQuery|AuthzDBMType|AuthzSendForbiddenOnFailure|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|CacheDefaultExpire|CacheDetailHeader|CacheDirLength|CacheDirLevels|CacheDisable|CacheEnable|CacheFile|CacheHeader|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheIgnoreQueryString|CacheIgnoreURLSessionIdentifiers|CacheKeyBaseURL|CacheLastModifiedFactor|CacheLock|CacheLockMaxAge|CacheLockPath|CacheMaxExpire|CacheMaxFileSize|CacheMinExpire|CacheMinFileSize|CacheNegotiatedDocs|CacheQuickHandler|CacheReadSize|CacheReadTime|CacheRoot|CacheSocache|CacheSocacheMaxSize|CacheSocacheMaxTime|CacheSocacheMinTime|CacheSocacheReadSize|CacheSocacheReadTime|CacheStaleOnError|CacheStoreExpired|CacheStoreNoStore|CacheStorePrivate|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateInflateLimitRequestBody|DeflateInflateRatioBurst|DeflateInflateRatioLimit|DeflateMemLevel|DeflateWindowSize|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|HeartbeatAddress|HeartbeatListen|HeartbeatMaxServers|HeartbeatStorage|HeartbeatStorage|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|IndexHeadInsert|IndexIgnore|IndexIgnoreReset|IndexOptions|IndexOrderDefault|IndexStyleSheet|InputSed|ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionPoolTTL|LDAPConnectionTimeout|LDAPLibraryDebug|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPReferralHopLimit|LDAPReferrals|LDAPRetries|LDAPRetryDelay|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTimeout|LDAPTrustedClientCert|LDAPTrustedGlobalCert|LDAPTrustedMode|LDAPVerifyServerCert|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|LuaHookAccessChecker|LuaHookAuthChecker|LuaHookCheckUserID|LuaHookFixups|LuaHookInsertFilter|LuaHookLog|LuaHookMapToStorage|LuaHookTranslateName|LuaHookTypeChecker|LuaInherit|LuaInputFilter|LuaMapHandler|LuaOutputFilter|LuaPackageCPath|LuaPackagePath|LuaQuickHandler|LuaRoot|LuaScope|MaxConnectionsPerChild|MaxKeepAliveRequests|MaxMemFree|MaxRangeOverlaps|MaxRangeReversals|MaxRanges|MaxRequestWorkers|MaxSpareServers|MaxSpareThreads|MaxThreads|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|ProxyAddHeaders|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyExpressDBMFile|ProxyExpressDBMType|ProxyExpressEnable|ProxyFtpDirCharset|ProxyFtpEscapeWildcards|ProxyFtpListOnWildcard|ProxyHTMLBufSize|ProxyHTMLCharsetOut|ProxyHTMLDocType|ProxyHTMLEnable|ProxyHTMLEvents|ProxyHTMLExtended|ProxyHTMLFixups|ProxyHTMLInterp|ProxyHTMLLinks|ProxyHTMLMeta|ProxyHTMLStripComments|ProxyHTMLURLMap|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassInherit|ProxyPassInterpolateEnv|ProxyPassMatch|ProxyPassReverse|ProxyPassReverseCookieDomain|ProxyPassReverseCookiePath|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxySCGIInternalRedirect|ProxySCGISendfile|ProxySet|ProxySourceAddress|ProxyStatus|ProxyTimeout|ProxyVia|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIPHeader|RemoteIPInternalProxy|RemoteIPInternalProxyList|RemoteIPProxiesHeader|RemoteIPTrustedProxy|RemoteIPTrustedProxyList|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|RewriteBase|RewriteCond|RewriteEngine|RewriteMap|RewriteOptions|RewriteRule|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script|ScriptAlias|ScriptAliasMatch|ScriptInterpreterSource|ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock|SecureListen|SeeRequestTail|SendBufferSize|ServerAdmin|ServerAlias|ServerLimit|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|Session|SessionCookieName|SessionCookieName2|SessionCookieRemove|SessionCryptoCipher|SessionCryptoDriver|SessionCryptoPassphrase|SessionCryptoPassphraseFile|SessionDBDCookieName|SessionDBDCookieName2|SessionDBDCookieRemove|SessionDBDDeleteLabel|SessionDBDInsertLabel|SessionDBDPerUser|SessionDBDSelectLabel|SessionDBDUpdateLabel|SessionEnv|SessionExclude|SessionHeader|SessionInclude|SessionMaxAge|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSLCACertificateFile|SSLCACertificatePath|SSLCADNRequestFile|SSLCADNRequestPath|SSLCARevocationCheck|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLCompression|SSLCryptoDevice|SSLEngine|SSLFIPS|SSLHonorCipherOrder|SSLInsecureRenegotiation|SSLOCSPDefaultResponder|SSLOCSPEnable|SSLOCSPOverrideResponder|SSLOCSPResponderTimeout|SSLOCSPResponseMaxAge|SSLOCSPResponseTimeSkew|SSLOCSPUseRequestNonce|SSLOpenSSLConfCmd|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationCheck|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCheckPeerCN|SSLProxyCheckPeerExpire|SSLProxyCheckPeerName|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateChainFile|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRenegBufferSize|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLSessionTicketKeyFile|SSLSRPUnknownUserSeed|SSLSRPVerifierFile|SSLStaplingCache|SSLStaplingErrorCacheTimeout|SSLStaplingFakeTryLater|SSLStaplingForceURL|SSLStaplingResponderTimeout|SSLStaplingResponseMaxAge|SSLStaplingResponseTimeSkew|SSLStaplingReturnResponderErrors|SSLStaplingStandardCacheTimeout|SSLStrictSNIVHostCheck|SSLUserName|SSLUseStapling|SSLVerifyClient|SSLVerifyDepth|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\\b/im,lookbehind:!0,alias:\"property\"},\"directive-block\":{pattern:/<\\/?\\b(AuthnProviderAlias|AuthzProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|RequireAll|RequireAny|RequireNone|VirtualHost)\\b *.*>/i,inside:{\"directive-block\":{pattern:/^<\\/?\\w+/,inside:{punctuation:/^<\\/?/},alias:\"tag\"},\"directive-block-parameter\":{pattern:/.*[^>]/,inside:{punctuation:/:/,string:{pattern:/(\"|').*\\1/,inside:{variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/}}},alias:\"attr-value\"},punctuation:/>/},alias:\"tag\"},\"directive-flags\":{pattern:/\\[(\\w,?)+\\]/,alias:\"keyword\"},string:{pattern:/(\"|').*\\1/,inside:{variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/}},variable:/(\\$|%)\\{?(\\w\\.?(\\+|\\-|:)?)+\\}?/,regex:/\\^?.*\\$|\\^.*\\$?/};\nPrism.languages.apl={comment:/(?:⍝|#[! ]).*$/m,string:/'(?:[^'\\r\\n]|'')*'/,number:/¯?(?:\\d*\\.?\\d+(?:e[+¯]?\\d+)?|¯|∞)(?:j¯?(?:\\d*\\.?\\d+(?:e[\\+¯]?\\d+)?|¯|∞))?/i,statement:/:[A-Z][a-z][A-Za-z]*\\b/,\"system-function\":{pattern:/⎕[A-Z]+/i,alias:\"function\"},constant:/[⍬⌾#⎕⍞]/,\"function\":/[-+×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,\"monadic-operator\":{pattern:/[\\\\\\/⌿⍀¨⍨⌶&∥]/,alias:\"operator\"},\"dyadic-operator\":{pattern:/[.⍣⍠⍤∘⌸]/,alias:\"operator\"},assignment:{pattern:/←/,alias:\"keyword\"},punctuation:/[\\[;\\]()◇⋄]/,dfn:{pattern:/[{}⍺⍵⍶⍹∇⍫:]/,alias:\"builtin\"}};\nPrism.languages.applescript={comment:[/\\(\\*(?:\\(\\*[\\w\\W]*?\\*\\)|[\\w\\W])*?\\*\\)/,/--.+/,/#.+/],string:/\"(?:\\\\?.)*?\"/,number:/\\b-?\\d*\\.?\\d+([Ee]-?\\d+)?\\b/,operator:[/[&=≠≤≥*+\\-\\/÷^]|[<>]=?/,/\\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\\b/],keyword:/\\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\\b/,\"class\":{pattern:/\\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\\b/,alias:\"builtin\"},punctuation:/[{}():,¬«»《》]/};\n!function(a){var i={pattern:/(^[ \\t]*)\\[(?!\\[)(?:([\"'$`])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\[(?:[^\\]\\\\]|\\\\.)*\\]|[^\\]\\\\]|\\\\.)*\\]/m,lookbehind:!0,inside:{quoted:{pattern:/([$`])(?:(?!\\1)[^\\\\]|\\\\.)*\\1/,inside:{punctuation:/^[$`]|[$`]$/}},interpreted:{pattern:/'(?:[^'\\\\]|\\\\.)*'/,inside:{punctuation:/^'|'$/}},string:/\"(?:[^\"\\\\]|\\\\.)*\"/,variable:/\\w+(?==)/,punctuation:/^\\[|\\]$|,/,operator:/=/,\"attr-value\":/(?!^\\s+$).+/}};a.languages.asciidoc={\"comment-block\":{pattern:/^(\\/{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1/m,alias:\"comment\"},table:{pattern:/^\\|={3,}(?:(?:\\r?\\n|\\r).*)*?(?:\\r?\\n|\\r)\\|={3,}$/m,inside:{specifiers:{pattern:/(?!\\|)(?:(?:(?:\\d+(?:\\.\\d+)?|\\.\\d+)[+*])?(?:[<^>](?:\\.[<^>])?|\\.[<^>])?[a-z]*)(?=\\|)/,alias:\"attr-value\"},punctuation:{pattern:/(^|[^\\\\])[|!]=*/,lookbehind:!0}}},\"passthrough-block\":{pattern:/^(\\+{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^\\++|\\++$/}},\"literal-block\":{pattern:/^(-{4,}|\\.{4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^(?:-+|\\.+)|(?:-+|\\.+)$/}},\"other-block\":{pattern:/^(--|\\*{4,}|_{4,}|={4,})(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?\\1$/m,inside:{punctuation:/^(?:-+|\\*+|_+|=+)|(?:-+|\\*+|_+|=+)$/}},\"list-punctuation\":{pattern:/(^[ \\t]*)(?:-|\\*{1,5}|\\.{1,5}|(?:[a-z]|\\d+)\\.|[xvi]+\\))(?= )/im,lookbehind:!0,alias:\"punctuation\"},\"list-label\":{pattern:/(^[ \\t]*)[a-z\\d].+(?::{2,4}|;;)(?=\\s)/im,lookbehind:!0,alias:\"symbol\"},\"indented-block\":{pattern:/((\\r?\\n|\\r)\\2)([ \\t]+)\\S.*(?:(?:\\r?\\n|\\r)\\3.+)*(?=\\2{2}|$)/,lookbehind:!0},comment:/^\\/\\/.*/m,title:{pattern:/^.+(?:\\r?\\n|\\r)(?:={3,}|-{3,}|~{3,}|\\^{3,}|\\+{3,})$|^={1,5} +.+|^\\.(?![\\s.]).*/m,alias:\"important\",inside:{punctuation:/^(?:\\.|=+)|(?:=+|-+|~+|\\^+|\\++)$/}},\"attribute-entry\":{pattern:/^:[^:\\r\\n]+:(?: .*?(?: \\+(?:\\r?\\n|\\r).*?)*)?$/m,alias:\"tag\"},attributes:i,hr:{pattern:/^'{3,}$/m,alias:\"punctuation\"},\"page-break\":{pattern:/^<{3,}$/m,alias:\"punctuation\"},admonition:{pattern:/^(?:TIP|NOTE|IMPORTANT|WARNING|CAUTION):/m,alias:\"keyword\"},callout:[{pattern:/(^[ \\t]*)<?\\d*>/m,lookbehind:!0,alias:\"symbol\"},{pattern:/<\\d+>/,alias:\"symbol\"}],macro:{pattern:/\\b[a-z\\d][a-z\\d-]*::?(?:(?:\\S+)??\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,inside:{\"function\":/^[a-z\\d-]+(?=:)/,punctuation:/^::?/,attributes:{pattern:/(?:\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*\\1|\\\\.)*\\])/,inside:i.inside}}},inline:{pattern:/(^|[^\\\\])(?:(?:\\B\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\2)[^\\\\]|\\\\.)*\\2|\\\\.)*\\])?(?:\\b_(?!\\s)(?: _|[^_\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: _|[^_\\\\\\r\\n]|\\\\.)+)*_\\b|\\B``(?!\\s).+?(?:(?:\\r?\\n|\\r).+?)*''\\B|\\B`(?!\\s)(?: ['`]|.)+?(?:(?:\\r?\\n|\\r)(?: ['`]|.)+?)*['`]\\B|\\B(['*+#])(?!\\s)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+(?:(?:\\r?\\n|\\r)(?: \\3|(?!\\3)[^\\\\\\r\\n]|\\\\.)+)*\\3\\B)|(?:\\[(?:[^\\]\\\\\"]|([\"'])(?:(?!\\4)[^\\\\]|\\\\.)*\\4|\\\\.)*\\])?(?:(__|\\*\\*|\\+\\+\\+?|##|\\$\\$|[~^]).+?(?:(?:\\r?\\n|\\r).+?)*\\5|\\{[^}\\r\\n]+\\}|\\[\\[\\[?.+?(?:(?:\\r?\\n|\\r).+?)*\\]?\\]\\]|<<.+?(?:(?:\\r?\\n|\\r).+?)*>>|\\(\\(\\(?.+?(?:(?:\\r?\\n|\\r).+?)*\\)?\\)\\)))/m,lookbehind:!0,inside:{attributes:i,url:{pattern:/^(?:\\[\\[\\[?.+?\\]?\\]\\]|<<.+?>>)$/,inside:{punctuation:/^(?:\\[\\[\\[?|<<)|(?:\\]\\]\\]?|>>)$/}},\"attribute-ref\":{pattern:/^\\{.+\\}$/,inside:{variable:{pattern:/(^\\{)[a-z\\d,+_-]+/,lookbehind:!0},operator:/^[=?!#%@$]|!(?=[:}])/,punctuation:/^\\{|\\}$|::?/}},italic:{pattern:/^(['_])[\\s\\S]+\\1$/,inside:{punctuation:/^(?:''?|__?)|(?:''?|__?)$/}},bold:{pattern:/^\\*[\\s\\S]+\\*$/,inside:{punctuation:/^\\*\\*?|\\*\\*?$/}},punctuation:/^(?:``?|\\+{1,3}|##?|\\$\\$|[~^]|\\(\\(\\(?)|(?:''?|\\+{1,3}|##?|\\$\\$|[~^`]|\\)?\\)\\))$/}},replacement:{pattern:/\\((?:C|TM|R)\\)/,alias:\"builtin\"},entity:/&#?[\\da-z]{1,8};/i,\"line-continuation\":{pattern:/(^| )\\+$/m,lookbehind:!0,alias:\"punctuation\"}},i.inside.interpreted.inside.rest={macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity},a.languages.asciidoc[\"passthrough-block\"].inside.rest={macro:a.languages.asciidoc.macro},a.languages.asciidoc[\"literal-block\"].inside.rest={callout:a.languages.asciidoc.callout},a.languages.asciidoc.table.inside.rest={\"comment-block\":a.languages.asciidoc[\"comment-block\"],\"passthrough-block\":a.languages.asciidoc[\"passthrough-block\"],\"literal-block\":a.languages.asciidoc[\"literal-block\"],\"other-block\":a.languages.asciidoc[\"other-block\"],\"list-punctuation\":a.languages.asciidoc[\"list-punctuation\"],\"indented-block\":a.languages.asciidoc[\"indented-block\"],comment:a.languages.asciidoc.comment,title:a.languages.asciidoc.title,\"attribute-entry\":a.languages.asciidoc[\"attribute-entry\"],attributes:a.languages.asciidoc.attributes,hr:a.languages.asciidoc.hr,\"page-break\":a.languages.asciidoc[\"page-break\"],admonition:a.languages.asciidoc.admonition,\"list-label\":a.languages.asciidoc[\"list-label\"],callout:a.languages.asciidoc.callout,macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity,\"line-continuation\":a.languages.asciidoc[\"line-continuation\"]},a.languages.asciidoc[\"other-block\"].inside.rest={table:a.languages.asciidoc.table,\"list-punctuation\":a.languages.asciidoc[\"list-punctuation\"],\"indented-block\":a.languages.asciidoc[\"indented-block\"],comment:a.languages.asciidoc.comment,\"attribute-entry\":a.languages.asciidoc[\"attribute-entry\"],attributes:a.languages.asciidoc.attributes,hr:a.languages.asciidoc.hr,\"page-break\":a.languages.asciidoc[\"page-break\"],admonition:a.languages.asciidoc.admonition,\"list-label\":a.languages.asciidoc[\"list-label\"],macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity,\"line-continuation\":a.languages.asciidoc[\"line-continuation\"]},a.languages.asciidoc.title.inside.rest={macro:a.languages.asciidoc.macro,inline:a.languages.asciidoc.inline,replacement:a.languages.asciidoc.replacement,entity:a.languages.asciidoc.entity},a.hooks.add(\"wrap\",function(a){\"entity\"===a.type&&(a.attributes.title=a.content.replace(/&amp;/,\"&\"))})}(Prism);\nPrism.languages.aspnet=Prism.languages.extend(\"markup\",{\"page-directive tag\":{pattern:/<%\\s*@.*%>/i,inside:{\"page-directive tag\":/<%\\s*@\\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},\"directive tag\":{pattern:/<%.*%>/i,inside:{\"directive tag\":/<%\\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\\/?[^\\s>\\/]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\w\\W])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,Prism.languages.insertBefore(\"inside\",\"punctuation\",{\"directive tag\":Prism.languages.aspnet[\"directive tag\"]},Prism.languages.aspnet.tag.inside[\"attr-value\"]),Prism.languages.insertBefore(\"aspnet\",\"comment\",{\"asp comment\":/<%--[\\w\\W]*?--%>/}),Prism.languages.insertBefore(\"aspnet\",Prism.languages.javascript?\"script\":\"tag\",{\"asp script\":{pattern:/(<script(?=.*runat=['\"]?server['\"]?)[\\w\\W]*?>)[\\w\\W]*?(?=<\\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}});\nPrism.languages.autoit={comment:[/;.*/,{pattern:/(^\\s*)#(?:comments-start|cs)[\\s\\S]*?^\\s*#(?:comments-end|ce)/m,lookbehind:!0}],url:{pattern:/(^\\s*#include\\s+)(?:<[^\\r\\n>]+>|\"[^\\r\\n\"]+\")/m,lookbehind:!0},string:{pattern:/([\"'])(?:\\1\\1|(?!\\1)[^\\r\\n])*\\1/,inside:{variable:/([%$@])\\w+\\1/}},directive:{pattern:/(^\\s*)#\\w+/m,lookbehind:!0,alias:\"keyword\"},\"function\":/\\b\\w+(?=\\()/,variable:/[$@]\\w+/,keyword:/\\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\\b/i,number:/\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b/i,\"boolean\":/\\b(?:True|False)\\b/i,operator:/<[=>]?|[-+*\\/=&>]=?|[?^]|\\b(?:And|Or|Not)\\b/i,punctuation:/[\\[\\]().,:]/};\nPrism.languages.autohotkey={comment:{pattern:/(^[^\";\\n]*(\"[^\"\\n]*?\"[^\"\\n]*?)*)(;.*$|^\\s*\\/\\*[\\s\\S]*\\n\\*\\/)/m,lookbehind:!0},string:/\"(([^\"\\n\\r]|\"\")*)\"/m,\"function\":/[^\\(\\); \\t,\\n\\+\\*\\-=\\?>:\\\\\\/<&%\\[\\]]+?(?=\\()/m,tag:/^[ \\t]*[^\\s:]+?(?=:(?:[^:]|$))/m,variable:/%\\w+%/,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/,operator:/\\?|\\/\\/?=?|:=|\\|[=|]?|&[=&]?|\\+[=+]?|-[=-]?|\\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\\b(?:AND|NOT|OR)\\b/,punctuation:/[\\{}[\\]\\(\\):,]/,\"boolean\":/\\b(true|false)\\b/,selector:/\\b(AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\\b/i,constant:/\\b(a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\b/i,builtin:/\\b(abs|acos|asc|asin|atan|ceil|chr|class|cos|dllcall|exp|fileexist|Fileopen|floor|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|IsObject|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|strsplit|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__New|__Call|__Get|__Set)\\b/i,symbol:/\\b(alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\\b/i,important:/#\\b(AllowSameLineComments|ClipboardTimeout|CommentFlag|ErrorStdOut|EscapeChar|HotkeyInterval|HotkeyModifierTimeout|Hotstring|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Include|IncludeAgain|InstallKeybdHook|InstallMouseHook|KeyHistory|LTrim|MaxHotkeysPerInterval|MaxMem|MaxThreads|MaxThreadsBuffer|MaxThreadsPerHotkey|NoEnv|NoTrayIcon|Persistent|SingleInstance|UseHook|WinActivateForce)\\b/i,keyword:/\\b(Abort|AboveNormal|Add|ahk_class|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Region|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|TryAgain|Type|UnCheck|underline|Unicode|Unlock|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\\b/i};\n!function(e){var t={variable:[{pattern:/\\$?\\(\\([\\w\\W]+?\\)\\)/,inside:{variable:[{pattern:/(^\\$\\(\\([\\w\\W]+)\\)\\)/,lookbehind:!0},/^\\$\\(\\(/],number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+(?:[Ee]-?\\d+)?)\\b/,operator:/--?|-=|\\+\\+?|\\+=|!=?|~|\\*\\*?|\\*=|\\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\\^=?|\\|\\|?|\\|=|\\?|:/,punctuation:/\\(\\(?|\\)\\)?|,|;/}},{pattern:/\\$\\([^)]+\\)|`[^`]+`/,inside:{variable:/^\\$\\(|^`|\\)$|`$/}},/\\$(?:[a-z0-9_#\\?\\*!@]+|\\{[^}]+\\})/i]};e.languages.bash={shebang:{pattern:/^#!\\s*\\/bin\\/bash|^#!\\s*\\/bin\\/sh/,alias:\"important\"},comment:{pattern:/(^|[^\"{\\\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\\s*)(?:\"|')?(\\w+?)(?:\"|')?\\s*\\r?\\n(?:[\\s\\S])*?\\r?\\n\\2/g,lookbehind:!0,inside:t},{pattern:/([\"'])(?:\\\\\\\\|\\\\?[^\\\\])*?\\1/g,inside:t}],variable:t.variable,\"function\":{pattern:/(^|\\s|;|\\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\\s|;|\\||&)/,lookbehind:!0},keyword:{pattern:/(^|\\s|;|\\||&)(?:let|:|\\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\\s|;|\\||&)/,lookbehind:!0},\"boolean\":{pattern:/(^|\\s|;|\\||&)(?:true|false)(?=$|\\s|;|\\||&)/,lookbehind:!0},operator:/&&?|\\|\\|?|==?|!=?|<<<?|>>|<=?|>=?|=~/,punctuation:/\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];]/};var a=t.variable[1].inside;a[\"function\"]=e.languages.bash[\"function\"],a.keyword=e.languages.bash.keyword,a.boolean=e.languages.bash.boolean,a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation}(Prism);\nPrism.languages.basic={string:/\"(?:\"\"|[!#$%&'()*,\\/:;<=>?^_ +\\-.A-Z\\d])*\"/i,comment:{pattern:/(?:!|REM\\b).+/i,inside:{keyword:/^REM/i}},number:/(?:\\b|\\B[.-])(?:\\d+\\.?\\d*)(?:E[+-]?\\d+)?/i,keyword:/\\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SHARED|SINGLE|SELECT CASE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\\$|\\b)/i,\"function\":/\\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\\$|\\b)/i,operator:/<[=>]?|>=?|[+\\-*\\/^=&]|\\b(?:AND|EQV|IMP|NOT|OR|XOR)\\b/i,punctuation:/[,;:()]/};\n!function(e){var r=/%%?[~:\\w]+%?|!\\S+!/,t={pattern:/\\/[a-z?]+(?=[ :]|$):?|-[a-z]\\b|--[a-z-]+\\b/im,alias:\"attr-name\",inside:{punctuation:/:/}},n=/\"[^\"]*\"/,i=/(?:\\b|-)\\d+\\b/;e.languages.batch={comment:[/^::.*/m,{pattern:/((?:^|[&(])[ \\t]*)rem\\b(?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0}],label:{pattern:/^:.*/m,alias:\"property\"},command:[{pattern:/((?:^|[&(])[ \\t]*)for(?: ?\\/[a-z?](?:[ :](?:\"[^\"]*\"|\\S+))?)* \\S+ in \\([^)]+\\) do/im,lookbehind:!0,inside:{keyword:/^for\\b|\\b(?:in|do)\\b/i,string:n,parameter:t,variable:r,number:i,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \\t]*)if(?: ?\\/[a-z?](?:[ :](?:\"[^\"]*\"|\\S+))?)* (?:not )?(?:cmdextversion \\d+|defined \\w+|errorlevel \\d+|exist \\S+|(?:\"[^\"]*\"|\\S+)?(?:==| (?:equ|neq|lss|leq|gtr|geq) )(?:\"[^\"]*\"|\\S+))/im,lookbehind:!0,inside:{keyword:/^if\\b|\\b(?:not|cmdextversion|defined|errorlevel|exist)\\b/i,string:n,parameter:t,variable:r,number:i,operator:/\\^|==|\\b(?:equ|neq|lss|leq|gtr|geq)\\b/i}},{pattern:/((?:^|[&()])[ \\t]*)else\\b/im,lookbehind:!0,inside:{keyword:/^else\\b/i}},{pattern:/((?:^|[&(])[ \\t]*)set(?: ?\\/[a-z](?:[ :](?:\"[^\"]*\"|\\S+))?)* (?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0,inside:{keyword:/^set\\b/i,string:n,parameter:t,variable:[r,/\\w+(?=(?:[*\\/%+\\-&^|]|<<|>>)?=)/],number:i,operator:/[*\\/%+\\-&^|]=?|<<=?|>>=?|[!~_=]/,punctuation:/[()',]/}},{pattern:/((?:^|[&(])[ \\t]*@?)\\w+\\b(?:[^^&)\\r\\n]|\\^(?:\\r\\n|[\\s\\S]))*/im,lookbehind:!0,inside:{keyword:/^\\w+\\b/i,string:n,parameter:t,label:{pattern:/(^\\s*):\\S+/m,lookbehind:!0,alias:\"property\"},variable:r,number:i,operator:/\\^/}}],operator:/[&@]/,punctuation:/[()']/}}(Prism);\nPrism.languages.c=Prism.languages.extend(\"clike\",{keyword:/\\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\\b/,operator:/\\-[>-]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|?\\||[~^%?*\\/]/,number:/\\b-?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)[ful]*\\b/i}),Prism.languages.insertBefore(\"c\",\"string\",{macro:{pattern:/(^\\s*)#\\s*[a-z]+([^\\r\\n\\\\]|\\\\.|\\\\(?:\\r\\n?|\\n))*/im,lookbehind:!0,alias:\"property\",inside:{string:{pattern:/(#\\s*include\\s*)(<.+?>|(\"|')(\\\\?.)+?\\3)/,lookbehind:!0},directive:{pattern:/(#\\s*)\\b(define|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\\b/,lookbehind:!0,alias:\"keyword\"}}},constant:/\\b(__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|stdin|stdout|stderr)\\b/}),delete Prism.languages.c[\"class-name\"],delete Prism.languages.c[\"boolean\"];\nPrism.languages.brainfuck={pointer:{pattern:/<|>/,alias:\"keyword\"},increment:{pattern:/\\+/,alias:\"inserted\"},decrement:{pattern:/-/,alias:\"deleted\"},branching:{pattern:/\\[|\\]/,alias:\"important\"},operator:/[.,]/,comment:/\\S+/};\nPrism.languages.bison=Prism.languages.extend(\"c\",{}),Prism.languages.insertBefore(\"bison\",\"comment\",{bison:{pattern:/^[\\s\\S]*?%%[\\s\\S]*?%%/,inside:{c:{pattern:/%\\{[\\s\\S]*?%\\}|\\{(?:\\{[^}]*\\}|[^{}])*\\}/,inside:{delimiter:{pattern:/^%?\\{|%?\\}$/,alias:\"punctuation\"},\"bison-variable\":{pattern:/[$@](?:<[^\\s>]+>)?[\\w$]+/,alias:\"variable\",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\\S+(?=:)/,keyword:/%\\w+/,number:{pattern:/(^|[^@])\\b(?:0x[\\da-f]+|\\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\\[\\]<>]/}}});\nPrism.languages.csharp=Prism.languages.extend(\"clike\",{keyword:/\\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\\b/,string:[/@(\"|')(\\1\\1|\\\\\\1|\\\\?(?!\\1)[\\s\\S])*\\1/,/(\"|')(\\\\?.)*?\\1/],number:/\\b-?(0x[\\da-f]+|\\d*\\.?\\d+f?)\\b/i}),Prism.languages.insertBefore(\"csharp\",\"keyword\",{preprocessor:{pattern:/(^\\s*)#.*/m,lookbehind:!0,alias:\"property\",inside:{directive:{pattern:/(\\s*#)\\b(define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\\b/,lookbehind:!0,alias:\"keyword\"}}}});\nPrism.languages.cpp=Prism.languages.extend(\"c\",{keyword:/\\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\\b/,\"boolean\":/\\b(true|false)\\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\\->|:{1,2}|={1,2}|\\^|~|%|&{1,2}|\\|?\\||\\?|\\*|\\/|\\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\\b/}),Prism.languages.insertBefore(\"cpp\",\"keyword\",{\"class-name\":{pattern:/(class\\s+)[a-z0-9_]+/i,lookbehind:!0}});\n!function(e){var n=/#(?!\\{).+/,t={pattern:/#\\{[^}]+\\}/,alias:\"variable\"};e.languages.coffeescript=e.languages.extend(\"javascript\",{comment:n,string:[/'(?:\\\\?[^\\\\])*?'/,{pattern:/\"(?:\\\\?[^\\\\])*?\"/,inside:{interpolation:t}}],keyword:/\\b(and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\\b/,\"class-member\":{pattern:/@(?!\\d)\\w+/,alias:\"variable\"}}),e.languages.insertBefore(\"coffeescript\",\"comment\",{\"multiline-comment\":{pattern:/###[\\s\\S]+?###/,alias:\"comment\"},\"block-regex\":{pattern:/\\/{3}[\\s\\S]*?\\/{3}/,alias:\"regex\",inside:{comment:n,interpolation:t}}}),e.languages.insertBefore(\"coffeescript\",\"string\",{\"inline-javascript\":{pattern:/`(?:\\\\?[\\s\\S])*?`/,inside:{delimiter:{pattern:/^`|`$/,alias:\"punctuation\"},rest:e.languages.javascript}},\"multiline-string\":[{pattern:/'''[\\s\\S]*?'''/,alias:\"string\"},{pattern:/\"\"\"[\\s\\S]*?\"\"\"/,alias:\"string\",inside:{interpolation:t}}]}),e.languages.insertBefore(\"coffeescript\",\"keyword\",{property:/(?!\\d)\\w+(?=\\s*:(?!:))/})}(Prism);\n!function(e){e.languages.ruby=e.languages.extend(\"clike\",{comment:/#(?!\\{[^\\r\\n]*?\\}).*/,keyword:/\\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\\b/});var n={pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"tag\"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore(\"ruby\",\"keyword\",{regex:[{pattern:/%r([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\][gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\\\]|\\\\[\\s\\S])*>[gim]{0,3}/,inside:{interpolation:n}},{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\r\\n])+\\/[gim]{0,3}(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\\b)/}),e.languages.insertBefore(\"ruby\",\"number\",{builtin:/\\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\\b/,constant:/\\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\{(?:[^#{}\\\\]|#(?:\\{[^}]+\\})?|\\\\[\\s\\S])*\\}/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\\[(?:[^\\[\\]\\\\]|\\\\[\\s\\S])*\\]/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\\\]|\\\\[\\s\\S])*>/,inside:{interpolation:n}},{pattern:/(\"|')(#\\{[^}]+\\}|\\\\(?:\\r?\\n|\\r)|\\\\?.)*?\\1/,inside:{interpolation:n}}]}(Prism);\nPrism.languages.css.selector={pattern:/[^\\{\\}\\s][^\\{\\}]*(?=\\s*\\{)/,inside:{\"pseudo-element\":/:(?:after|before|first-letter|first-line|selection)|::[-\\w]+/,\"pseudo-class\":/:[-\\w]+(?:\\(.*\\))?/,\"class\":/\\.[-:\\.\\w]+/,id:/#[-:\\.\\w]+/}},Prism.languages.insertBefore(\"css\",\"function\",{hexcode:/#[\\da-f]{3,6}/i,entity:/\\\\[\\da-f]{1,8}/i,number:/[\\d%\\.]+/});\nPrism.languages.d=Prism.languages.extend(\"clike\",{string:[/\\b[rx]\"(\\\\.|[^\\\\\"])*\"[cwd]?/,/\\bq\"(?:\\[[\\s\\S]*?\\]|\\([\\s\\S]*?\\)|<[\\s\\S]*?>|\\{[\\s\\S]*?\\})\"/,/\\bq\"([_a-zA-Z][_a-zA-Z\\d]*)(?:\\r?\\n|\\r)[\\s\\S]*?(?:\\r?\\n|\\r)\\1\"/,/\\bq\"(.)[\\s\\S]*?\\1\"/,/'(?:\\\\'|\\\\?[^']+)'/,/([\"`])(\\\\.|(?!\\1)[^\\\\])*\\1[cwd]?/],number:[/\\b0x\\.?[a-f\\d_]+(?:(?!\\.\\.)\\.[a-f\\d_]*)?(?:p[+-]?[a-f\\d_]+)?[ulfi]*/i,{pattern:/((?:\\.\\.)?)(?:\\b0b\\.?|\\b|\\.)\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:e[+-]?\\d[\\d_]*)?[ulfi]*/i,lookbehind:!0}],keyword:/\\$|\\b(?:abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|public|pure|real|ref|return|scope|shared|short|static|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|__(?:(?:FILE|MODULE|LINE|FUNCTION|PRETTY_FUNCTION|DATE|EOF|TIME|TIMESTAMP|VENDOR|VERSION)__|gshared|traits|vector|parameters)|string|wstring|dstring|size_t|ptrdiff_t)\\b/,operator:/\\|[|=]?|&[&=]?|\\+[+=]?|-[-=]?|\\.?\\.\\.|=[>=]?|!(?:i[ns]\\b|<>?=?|>=?|=)?|\\bi[ns]\\b|(?:<[<>]?|>>?>?|\\^\\^|[*\\/%^~])=?/}),Prism.languages.d.comment=[/^\\s*#!.+/,{pattern:/(^|[^\\\\])\\/\\+(?:\\/\\+[\\w\\W]*?\\+\\/|[\\w\\W])*?\\+\\//,lookbehind:!0}].concat(Prism.languages.d.comment),Prism.languages.insertBefore(\"d\",\"comment\",{\"token-string\":{pattern:/\\bq\\{(?:|\\{[^}]*\\}|[^}])*\\}/,alias:\"string\"}}),Prism.languages.insertBefore(\"d\",\"keyword\",{property:/\\B@\\w*/}),Prism.languages.insertBefore(\"d\",\"function\",{register:{pattern:/\\b(?:[ABCD][LHX]|E[ABCD]X|E?(?:BP|SP|DI|SI)|[ECSDGF]S|CR[0234]|DR[012367]|TR[3-7]|X?MM[0-7]|R[ABCD]X|[BS]PL|R[BS]P|[DS]IL|R[DS]I|R(?:[89]|1[0-5])[BWD]?|XMM(?:[89]|1[0-5])|YMM(?:1[0-5]|\\d))\\b|\\bST(?:\\([0-7]\\)|\\b)/,alias:\"variable\"}});\nPrism.languages.dart=Prism.languages.extend(\"clike\",{string:[/r?(\"\"\"|''')[\\s\\S]*?\\1/,/r?(\"|')(\\\\?.)*?\\1/],keyword:[/\\b(?:async|sync|yield)\\*/,/\\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|default|deferred|do|dynamic|else|enum|export|external|extends|factory|final|finally|for|get|if|implements|import|in|library|new|null|operator|part|rethrow|return|set|static|super|switch|this|throw|try|typedef|var|void|while|with|yield)\\b/],operator:/\\bis!|\\b(?:as|is)\\b|\\+\\+|--|&&|\\|\\||<<=?|>>=?|~(?:\\/=?)?|[+\\-*\\/%&^|=!<>]=?|\\?/}),Prism.languages.insertBefore(\"dart\",\"function\",{metadata:{pattern:/@\\w+/,alias:\"symbol\"}});\nPrism.languages.diff={coord:[/^(?:\\*{3}|-{3}|\\+{3}).*$/m,/^@@.*@@$/m,/^\\d+.*$/m],deleted:/^[-<].+$/m,inserted:/^[+>].+$/m,diff:{pattern:/^!(?!!).+$/m,alias:\"important\"}};\nPrism.languages.docker={keyword:{pattern:/(^\\s*)(?:ONBUILD|FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|COPY|VOLUME|USER|WORKDIR|CMD|LABEL|ENTRYPOINT)(?=\\s)/im,lookbehind:!0},string:/(\"|')(?:(?!\\1)[^\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*?\\1/,comment:/#.*/,punctuation:/---|\\.\\.\\.|[:[\\]{}\\-,|>?]/};\nPrism.languages.eiffel={string:[/\"([^[]*)\\[[\\s\\S]+?\\]\\1\"/,/\"([^{]*)\\{[\\s\\S]+?\\}\\1\"/,/\"(?:%\\s+%|%\"|.)*?\"/],comment:/--.*/,\"char\":/'(?:%'|.)+?'/,keyword:/\\b(?:across|agent|alias|all|and|attached|as|assign|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\\b/i,\"boolean\":/\\b(?:True|False)\\b/i,number:[/\\b0[xcb][\\da-f](?:_*[\\da-f])*\\b/i,/(?:\\d(?:_*\\d)*)?\\.(?:(?:\\d(?:_*\\d)*)?[eE][+-]?)?\\d(?:_*\\d)*|\\d(?:_*\\d)*\\.?/],punctuation:/:=|<<|>>|\\(\\||\\|\\)|->|\\.(?=\\w)|[{}[\\];(),:?]/,operator:/\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/=]?|[><]=?|[-+*^=~]/};\nPrism.languages.elixir={comment:{pattern:/(^|[^#])#(?![{#]).*/m,lookbehind:!0},regex:/~[rR](?:(\"\"\"|'''|[\\/|\"'])(?:\\\\.|(?!\\1)[^\\\\])+\\1|\\((?:\\\\\\)|[^)])+\\)|\\[(?:\\\\\\]|[^\\]])+\\]|\\{(?:\\\\\\}|[^}])+\\}|<(?:\\\\>|[^>])+>)[uismxfr]*/,string:[{pattern:/~[cCsSwW](?:(\"\"\"|'''|[\\/|\"'])(?:\\\\.|(?!\\1)[^\\\\])+\\1|\\((?:\\\\\\)|[^)])+\\)|\\[(?:\\\\\\]|[^\\]])+\\]|\\{(?:\\\\\\}|#\\{[^}]+\\}|[^}])+\\}|<(?:\\\\>|[^>])+>)[csa]?/,inside:{}},{pattern:/(\"\"\"|''')[\\s\\S]*?\\1/,inside:{}},{pattern:/(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/,inside:{}}],atom:{pattern:/(^|[^:]):\\w+/,lookbehind:!0,alias:\"symbol\"},\"attr-name\":/\\w+:(?!:)/,capture:{pattern:/(^|[^&])&(?:[^&\\s\\d()][^\\s()]*|(?=\\())/,lookbehind:!0,alias:\"function\"},argument:{pattern:/(^|[^&])&\\d+/,lookbehind:!0,alias:\"variable\"},attribute:{pattern:/@[\\S]+/,alias:\"variable\"},number:/\\b(?:0[box][a-f\\d_]+|\\d[\\d_]*)(?:\\.[\\d_]+)?(?:e[+-]?[\\d_]+)?\\b/i,keyword:/\\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|require|rescue|try|unless|use|when)\\b/,\"boolean\":/\\b(?:true|false|nil)\\b/,operator:[/\\bin\\b|&&?|\\|[|>]?|\\\\\\\\|::|\\.\\.\\.?|\\+\\+?|-[->]?|<[-=>]|>=|!==?|\\B!|=(?:==?|[>~])?|[*\\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\\[\\]{}()]/},Prism.languages.elixir.string.forEach(function(e){e.inside={interpolation:{pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"punctuation\"},rest:Prism.util.clone(Prism.languages.elixir)}}}});\nPrism.languages.erlang={comment:/%.+/,string:/\"(?:\\\\?.)*?\"/,\"quoted-function\":{pattern:/'(?:\\\\.|[^'\\\\])+'(?=\\()/,alias:\"function\"},\"quoted-atom\":{pattern:/'(?:\\\\.|[^'\\\\])+'/,alias:\"atom\"},\"boolean\":/\\b(?:true|false)\\b/,keyword:/\\b(?:fun|when|case|of|end|if|receive|after|try|catch)\\b/,number:[/\\$\\\\?./,/\\d+#[a-z0-9]+/i,/(?:\\b|-)\\d*\\.?\\d+([Ee][+-]?\\d+)?\\b/],\"function\":/\\b[a-z][\\w@]*(?=\\()/,variable:{pattern:/(^|[^@])(?:\\b|\\?)[A-Z_][\\w@]*/,lookbehind:!0},operator:[/[=\\/<>:]=|=[:\\/]=|\\+\\+?|--?|[=*\\/!]|\\b(?:bnot|div|rem|band|bor|bxor|bsl|bsr|not|and|or|xor|orelse|andalso)\\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\\b[a-z][\\w@]*/,punctuation:/[()[\\]{}:;,.#|]|<<|>>/};\nPrism.languages.fsharp=Prism.languages.extend(\"clike\",{comment:[{pattern:/(^|[^\\\\])\\(\\*[\\w\\W]*?\\*\\)/,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],keyword:/\\b(?:let|return|use|yield)(?:!\\B|\\b)|\\b(abstract|and|as|assert|base|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|global|if|in|inherit|inline|interface|internal|lazy|match|member|module|mutable|namespace|new|not|null|of|open|or|override|private|public|rec|select|static|struct|then|to|true|try|type|upcast|val|void|when|while|with|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|include|method|mixin|object|parallel|process|protected|pure|sealed|tailcall|trait|virtual|volatile)\\b/,string:/(?:\"\"\"[\\s\\S]*?\"\"\"|@\"(?:\"\"|[^\"])*\"|(\"|')(?:\\\\\\1|\\\\?(?!\\1)[\\s\\S])*\\1)B?/,number:[/\\b-?0x[\\da-fA-F]+(un|lf|LF)?\\b/,/\\b-?0b[01]+(y|uy)?\\b/,/\\b-?(\\d*\\.?\\d+|\\d+\\.)([fFmM]|[eE][+-]?\\d+)?\\b/,/\\b-?\\d+(y|uy|s|us|l|u|ul|L|UL|I)?\\b/]}),Prism.languages.insertBefore(\"fsharp\",\"keyword\",{preprocessor:{pattern:/^[^\\r\\n\\S]*#.*/m,alias:\"property\",inside:{directive:{pattern:/(\\s*#)\\b(else|endif|if|light|line|nowarn)\\b/,lookbehind:!0,alias:\"keyword\"}}}});\nPrism.languages.fortran={\"quoted-number\":{pattern:/[BOZ](['\"])[A-F0-9]+\\1/i,alias:\"number\"},string:{pattern:/(?:\\w+_)?(['\"])(?:\\1\\1|&(?:\\r\\n?|\\n)(?:\\s*!.+(?:\\r\\n?|\\n))?|(?!\\1).)*(?:\\1|&)/,inside:{comment:{pattern:/(&(?:\\r\\n?|\\n)\\s*)!.*/,lookbehind:!0}}},comment:/!.*/,\"boolean\":/\\.(?:TRUE|FALSE)\\.(?:_\\w+)?/i,number:/(?:\\b|[+-])(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[ED][+-]?\\d+)?(?:_\\w+)?/i,keyword:[/\\b(?:INTEGER|REAL|DOUBLE ?PRECISION|COMPLEX|CHARACTER|LOGICAL)\\b/i,/\\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\\b/i,/\\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\\b/i,/\\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEWHERE|ELSEIF|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\\b/i],operator:[/\\*\\*|\\/\\/|=>|[=\\/]=|[<>]=?|::|[+\\-*=%]|\\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV)\\.|\\.[A-Z]+\\./i,{pattern:/(^|(?!\\().)\\/(?!\\))/,lookbehind:!0}],punctuation:/\\(\\/|\\/\\)|[(),;:&]/};\nPrism.languages.gherkin={pystring:{pattern:/(\"\"\"|''')[\\s\\S]+?\\1/,alias:\"string\"},comment:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)#.*/,lookbehind:!0},tag:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)@\\S*/,lookbehind:!0},feature:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)(Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|laH|Lastnost|Mak|Mogucnost|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|perbogh|poQbogh malja'|Potrzeba biznesowa|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):([^:]+(?:\\r?\\n|\\r|$))*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\\r\\n]+/,lookbehind:!0},keyword:/[^:\\r\\n]+:/}},scenario:{pattern:/((^|\\r?\\n|\\r)[ \\t]*)(Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram senaryo|Dyagram Senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|Examples|EXAMPLZ|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|ghantoH|Grundlage|Hannergrond|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut|lut chovnatlh|lutmey|Lýsing Atburðarásar|Lýsing Dæma|Menggariskan Senario|MISHUN|MISHUN SRSLY|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan senaryo|Plan Senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo|Senaryo deskripsyon|Senaryo Deskripsyon|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie|Situasie Uiteensetting|Skenario|Skenario konsep|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa|Swa hwaer swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo\\-ho\\-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\\r\\n]*/,lookbehind:!0,inside:{important:{pattern:/(:)[^\\r\\n]*/,lookbehind:!0},keyword:/[^:\\r\\n]+:/}},\"table-body\":{pattern:/((?:\\r?\\n|\\r)[ \\t]*\\|.+\\|[^\\r\\n]*)+/,lookbehind:!0,inside:{outline:{pattern:/<[^>]+?>/,alias:\"variable\"},td:{pattern:/\\s*[^\\s|][^|]*/,alias:\"string\"},punctuation:/\\|/}},\"table-head\":{pattern:/((?:\\r?\\n|\\r)[ \\t]*\\|.+\\|[^\\r\\n]*)/,inside:{th:{pattern:/\\s*[^\\s|][^|]*/,alias:\"variable\"},punctuation:/\\|/}},atrule:{pattern:/((?:\\r?\\n|\\r)[ \\t]+)('ach|'a|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cando|Cand|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|Dato|DEN|Den youse gotta|Dengan|De|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|Entonces|En|Epi|E|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kadar|Kada|Kad|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Majd|Maka|Manawa|Mas|Ma|Menawa|Men|Mutta|Nalikaning|Nalika|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Og|Och|Oletetaan|Onda|Ond|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|qaSDI'|Quando|Quand|Quan|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|ugeholl|Und|Un|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadani|Zadano|Zadan|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \\t]+)/,lookbehind:!0},string:{pattern:/(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/,inside:{outline:{pattern:/<[^>]+?>/,alias:\"variable\"}}},outline:{pattern:/<[^>]+?>/,alias:\"variable\"}};\nPrism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\\+.*/m,string:/(\"|')(\\\\?.)*?\\1/m,command:{pattern:/^.*\\$ git .*$/m,inside:{parameter:/\\s(--|-)\\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \\w{40}$/m};\nPrism.languages.glsl=Prism.languages.extend(\"clike\",{comment:[/\\/\\*[\\w\\W]*?\\*\\//,/\\/\\/(?:\\\\(?:\\r\\n|[\\s\\S])|.)*/],number:/\\b(?:0x[\\da-f]+|(?:\\.\\d+|\\d+\\.?\\d*)(?:e[+-]?\\d+)?)[ulf]*\\b/i,keyword:/\\b(?:attribute|const|uniform|varying|buffer|shared|coherent|volatile|restrict|readonly|writeonly|atomic_uint|layout|centroid|flat|smooth|noperspective|patch|sample|break|continue|do|for|while|switch|case|default|if|else|subroutine|in|out|inout|float|double|int|void|bool|true|false|invariant|precise|discard|return|d?mat[234](?:x[234])?|[ibdu]?vec[234]|uint|lowp|mediump|highp|precision|[iu]?sampler[123]D|[iu]?samplerCube|sampler[12]DShadow|samplerCubeShadow|[iu]?sampler[12]DArray|sampler[12]DArrayShadow|[iu]?sampler2DRect|sampler2DRectShadow|[iu]?samplerBuffer|[iu]?sampler2DMS(?:Array)?|[iu]?samplerCubeArray|samplerCubeArrayShadow|[iu]?image[123]D|[iu]?image2DRect|[iu]?imageCube|[iu]?imageBuffer|[iu]?image[12]DArray|[iu]?imageCubeArray|[iu]?image2DMS(?:Array)?|struct|common|partition|active|asm|class|union|enum|typedef|template|this|resource|goto|inline|noinline|public|static|extern|external|interface|long|short|half|fixed|unsigned|superp|input|output|hvec[234]|fvec[234]|sampler3DRect|filter|sizeof|cast|namespace|using)\\b/}),Prism.languages.insertBefore(\"glsl\",\"comment\",{preprocessor:{pattern:/(^[ \\t]*)#(?:(?:define|undef|if|ifdef|ifndef|else|elif|endif|error|pragma|extension|version|line)\\b)?/m,lookbehind:!0,alias:\"builtin\"}});\nPrism.languages.go=Prism.languages.extend(\"clike\",{keyword:/\\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\\b/,builtin:/\\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\\b/,\"boolean\":/\\b(_|iota|nil|true|false)\\b/,operator:/[*\\/%^!=]=?|\\+[=+]?|-[=-]?|\\|[=|]?|&(?:=|&|\\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\\.\\.\\./,number:/\\b(-?(0x[a-f\\d]+|(\\d+\\.?\\d*|\\.\\d+)(e[-+]?\\d+)?)i?)\\b/i,string:/(\"|'|`)(\\\\?.|\\r|\\n)*?\\1/}),delete Prism.languages.go[\"class-name\"];\nPrism.languages.groovy=Prism.languages.extend(\"clike\",{keyword:/\\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\\b/,string:/(\"\"\"|''')[\\W\\w]*?\\1|(\"|'|\\/)(?:\\\\?.)*?\\2|(\\$\\/)(\\$\\/\\$|[\\W\\w])*?\\/\\$/,number:/\\b(?:0b[01_]+|0x[\\da-f_]+(?:\\.[\\da-f_p\\-]+)?|[\\d_]+(?:\\.[\\d_]+)?(?:e[+-]?[\\d]+)?)[glidf]?\\b/i,operator:{pattern:/(^|[^.])(~|==?~?|\\?[.:]?|\\*(?:[.=]|\\*=?)?|\\.[@&]|\\.\\.<|\\.{1,2}(?!\\.)|-[-=>]?|\\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\\|[|=]?|\\/=?|\\^=?|%=?)/,lookbehind:!0},punctuation:/\\.+|[{}[\\];(),:$]/}),Prism.languages.insertBefore(\"groovy\",\"string\",{shebang:{pattern:/#!.+/,alias:\"comment\"}}),Prism.languages.insertBefore(\"groovy\",\"punctuation\",{\"spock-block\":/\\b(setup|given|when|then|and|cleanup|expect|where):/}),Prism.languages.insertBefore(\"groovy\",\"function\",{annotation:{alias:\"punctuation\",pattern:/(^|[^.])@\\w+/,lookbehind:!0}}),Prism.hooks.add(\"wrap\",function(e){if(\"groovy\"===e.language&&\"string\"===e.type){var t=e.content[0];if(\"'\"!=t){var n=/([^\\\\])(\\$(\\{.*?\\}|[\\w\\.]+))/;\"$\"===t&&(n=/([^\\$])(\\$(\\{.*?\\}|[\\w\\.]+))/),e.content=e.content.replace(/&amp;/g,\"&\").replace(/&lt;/g,\"<\"),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push(\"/\"===t?\"regex\":\"gstring\")}}});\n!function(e){e.languages.haml={\"multiline-comment\":{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*))(?:\\/|-#).*((?:\\r?\\n|\\r)\\2[\\t ]+.+)*/,lookbehind:!0,alias:\"comment\"},\"multiline-code\":[{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*,[\\t ]*((?:\\r?\\n|\\r)\\2[\\t ]+.*,[\\t ]*)*((?:\\r?\\n|\\r)\\2[\\t ]+.+)/,lookbehind:!0,inside:{rest:e.languages.ruby}},{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)(?:[~-]|[&!]?=)).*\\|[\\t ]*((?:\\r?\\n|\\r)\\2[\\t ]+.*\\|[\\t ]*)*/,lookbehind:!0,inside:{rest:e.languages.ruby}}],filter:{pattern:/((?:^|\\r?\\n|\\r)([\\t ]*)):[\\w-]+((?:\\r?\\n|\\r)(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/,lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"}}},markup:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)<.+/,lookbehind:!0,inside:{rest:e.languages.markup}},doctype:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)!!!(?: .+)?/,lookbehind:!0},tag:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)[%.#][\\w\\-#.]*[\\w\\-](?:\\([^)]+\\)|\\{(?:\\{[^}]+\\}|[^}])+\\}|\\[[^\\]]+\\])*[\\/<>]*/,lookbehind:!0,inside:{attributes:[{pattern:/(^|[^#])\\{(?:\\{[^}]+\\}|[^}])+\\}/,lookbehind:!0,inside:{rest:e.languages.ruby}},{pattern:/\\([^)]+\\)/,inside:{\"attr-value\":{pattern:/(=\\s*)(?:\"(?:\\\\?.)*?\"|[^)\\s]+)/,lookbehind:!0},\"attr-name\":/[\\w:-]+(?=\\s*!?=|\\s*[,)])/,punctuation:/[=(),]/}},{pattern:/\\[[^\\]]+\\]/,inside:{rest:e.languages.ruby}}],punctuation:/[<>]/}},code:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*(?:[~-]|[&!]?=)).+/,lookbehind:!0,inside:{rest:e.languages.ruby}},interpolation:{pattern:/#\\{[^}]+\\}/,inside:{delimiter:{pattern:/^#\\{|\\}$/,alias:\"punctuation\"},rest:e.languages.ruby}},punctuation:{pattern:/((?:^|\\r?\\n|\\r)[\\t ]*)[~=\\-&!]+/,lookbehind:!0}};for(var t=\"((?:^|\\\\r?\\\\n|\\\\r)([\\\\t ]*)):{{filter_name}}((?:\\\\r?\\\\n|\\\\r)(?:\\\\2[\\\\t ]+.+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+\",r=[\"css\",{filter:\"coffee\",language:\"coffeescript\"},\"erb\",\"javascript\",\"less\",\"markdown\",\"ruby\",\"scss\",\"textile\"],n={},a=0,i=r.length;i>a;a++){var l=r[a];l=\"string\"==typeof l?{filter:l,language:l}:l,e.languages[l.language]&&(n[\"filter-\"+l.filter]={pattern:RegExp(t.replace(\"{{filter_name}}\",l.filter)),lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"},rest:e.languages[l.language]}})}e.languages.insertBefore(\"haml\",\"filter\",n)}(Prism);\n!function(e){var a=/\\{\\{\\{[\\w\\W]+?\\}\\}\\}|\\{\\{[\\w\\W]+?\\}\\}/g;e.languages.handlebars=e.languages.extend(\"markup\",{handlebars:{pattern:a,inside:{delimiter:{pattern:/^\\{\\{\\{?|\\}\\}\\}?$/i,alias:\"punctuation\"},string:/([\"'])(\\\\?.)*?\\1/,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee][+-]?\\d+)?)\\b/,\"boolean\":/\\b(true|false)\\b/,block:{pattern:/^(\\s*~?\\s*)[#\\/]\\S+?(?=\\s*~?\\s*$|\\s)/i,lookbehind:!0,alias:\"keyword\"},brackets:{pattern:/\\[[^\\]]+\\]/,inside:{punctuation:/\\[|\\]/,variable:/[\\w\\W]+/}},punctuation:/[!\"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{|}~]/,variable:/[^!\"#%&'()*+,.\\/;<=>@\\[\\\\\\]^`{|}~\\s]+/}}}),e.languages.insertBefore(\"handlebars\",\"tag\",{\"handlebars-comment\":{pattern:/\\{\\{![\\w\\W]*?\\}\\}/,alias:[\"handlebars\",\"comment\"]}}),e.hooks.add(\"before-highlight\",function(e){\"handlebars\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(a,function(a){return e.tokenStack.push(a),\"___HANDLEBARS\"+e.tokenStack.length+\"___\"}))}),e.hooks.add(\"before-insert\",function(e){\"handlebars\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),e.hooks.add(\"after-highlight\",function(a){if(\"handlebars\"===a.language){for(var n,t=0;n=a.tokenStack[t];t++)a.highlightedCode=a.highlightedCode.replace(\"___HANDLEBARS\"+(t+1)+\"___\",e.highlight(n,a.grammar,\"handlebars\").replace(/\\$/g,\"$$$$\"));a.element.innerHTML=a.highlightedCode}})}(Prism);\nPrism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\\\\/])(--[^-!#$%*+=?&@|~.:<>^\\\\\\/].*|{-[\\w\\W]*?-})/m,lookbehind:!0},\"char\":/'([^\\\\']|\\\\([abfnrtv\\\\\"'&]|\\^[A-Z@[\\]\\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\\d+|o[0-7]+|x[0-9a-fA-F]+))'/,string:/\"([^\\\\\"]|\\\\([abfnrtv\\\\\"'&]|\\^[A-Z@[\\]\\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\\d+|o[0-7]+|x[0-9a-fA-F]+)|\\\\\\s+\\\\)*\"/,keyword:/\\b(case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\\b/,import_statement:{pattern:/(\\r?\\n|\\r|^)\\s*import\\s+(qualified\\s+)?([A-Z][_a-zA-Z0-9']*)(\\.[A-Z][_a-zA-Z0-9']*)*(\\s+as\\s+([A-Z][_a-zA-Z0-9']*)(\\.[A-Z][_a-zA-Z0-9']*)*)?(\\s+hiding\\b)?/m,inside:{keyword:/\\b(import|qualified|as|hiding)\\b/}},builtin:/\\b(abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\b/,number:/\\b(\\d+(\\.\\d+)?(e[+-]?\\d+)?|0o[0-7]+|0x[0-9a-f]+)\\b/i,operator:/\\s\\.\\s|[-!#$%*+=?&@|~.:<>^\\\\\\/]*\\.[-!#$%*+=?&@|~.:<>^\\\\\\/]+|[-!#$%*+=?&@|~.:<>^\\\\\\/]+\\.[-!#$%*+=?&@|~.:<>^\\\\\\/]*|[-!#$%*+=?&@|~:<>^\\\\\\/]+|`([A-Z][_a-zA-Z0-9']*\\.)*[_a-z][_a-zA-Z0-9']*`/,hvariable:/\\b([A-Z][_a-zA-Z0-9']*\\.)*[_a-z][_a-zA-Z0-9']*\\b/,constant:/\\b([A-Z][_a-zA-Z0-9']*\\.)*[A-Z][_a-zA-Z0-9']*\\b/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.haxe=Prism.languages.extend(\"clike\",{string:{pattern:/([\"'])(?:(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/,inside:{interpolation:{pattern:/(^|[^\\\\])\\$(?:\\w+|\\{[^}]+\\})/,lookbehind:!0,inside:{interpolation:{pattern:/^\\$\\w*/,alias:\"variable\"}}}}},keyword:/\\bthis\\b|\\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|from|for|function|if|implements|import|in|inline|interface|macro|new|null|override|public|private|return|static|super|switch|throw|to|try|typedef|using|var|while)(?!\\.)\\b/,operator:/\\.{3}|\\+\\+?|-[->]?|[=!]=?|&&?|\\|\\|?|<[<=]?|>[>=]?|[*\\/%~^]/}),Prism.languages.insertBefore(\"haxe\",\"class-name\",{regex:{pattern:/~\\/(?:[^\\/\\\\\\r\\n]|\\\\.)+\\/[igmsu]*/}}),Prism.languages.insertBefore(\"haxe\",\"keyword\",{preprocessor:{pattern:/#\\w+/,alias:\"builtin\"},metadata:{pattern:/@:?\\w+/,alias:\"symbol\"},reification:{pattern:/\\$(?:\\w+|(?=\\{))/,alias:\"variable\"}}),Prism.languages.haxe.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.haxe),delete Prism.languages.haxe[\"class-name\"];\nPrism.languages.http={\"request-line\":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\\b\\shttps?:\\/\\/\\S+\\sHTTP\\/[0-9.]+/m,inside:{property:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\\b/,\"attr-name\":/:\\w+/}},\"response-status\":{pattern:/^HTTP\\/1.[01] [0-9]+.*/m,inside:{property:{pattern:/(^HTTP\\/1.[01] )[0-9]+.*/i,lookbehind:!0}}},\"header-name\":{pattern:/^[\\w-]+:(?=.)/m,alias:\"keyword\"}};var httpLanguages={\"application/json\":Prism.languages.javascript,\"application/xml\":Prism.languages.markup,\"text/xml\":Prism.languages.markup,\"text/html\":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp(\"(content-type:\\\\s*\"+contentType+\"[\\\\w\\\\W]*?)(?:\\\\r?\\\\n|\\\\r){2}[\\\\w\\\\W]*\",\"i\"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore(\"http\",\"header-name\",options)};\nPrism.languages.icon={comment:/#.*/,string:/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\.|_(?:\\r?\\n|\\r))*\\1/,number:/\\b(?:\\d+r[a-z\\d]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)\\b|\\.\\d+\\b/i,\"builtin-keyword\":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\\b/,alias:\"variable\"},directive:{pattern:/\\$\\w+/,alias:\"builtin\"},keyword:/\\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*[({]|\\s*!\\s*\\[)/,operator:/[+-]:(?!=)|(?:[\\/?@^%&]|\\+\\+?|--?|==?=?|~==?=?|\\*\\*?|\\|\\|\\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\\\|~]/,punctuation:/[\\[\\](){},;]/};\nPrism.languages.inform7={string:{pattern:/\"[^\"]*\"/,inside:{substitution:{pattern:/\\[[^\\]]+\\]/,inside:{delimiter:{pattern:/\\[|\\]/,alias:\"punctuation\"}}}}},comment:/\\[[^\\]]+\\]/,title:{pattern:/^[ \\t]*(?:volume|book|part(?! of)|chapter|section|table)\\b.+/im,alias:\"important\"},number:{pattern:/(^|[^-])(?:(?:\\b|-)\\d+(?:\\.\\d+)?(?:\\^\\d+)?\\w*|\\b(?:one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve))\\b(?!-)/i,lookbehind:!0},verb:{pattern:/(^|[^-])\\b(?:applying to|are|attacking|answering|asking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:s|ing)?|consulting|contain(?:s|ing)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:ve|s|ving)|hold(?:s|ing)?|impl(?:y|ies)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:s|ing)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:s|ing)?|setting|showing|singing|sleeping|smelling|squeezing|switching|support(?:s|ing)?|swearing|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:s|ing)?|var(?:y|ies|ying)|waiting|waking|waving|wear(?:s|ing)?)\\b(?!-)/i,lookbehind:!0,alias:\"operator\"},keyword:{pattern:/(^|[^-])\\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|unless|the story)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\\b(?!-)/i,lookbehind:!0},property:{pattern:/(^|[^-])\\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: on| off)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\\b(?!-)/i,lookbehind:!0,alias:\"symbol\"},position:{pattern:/(^|[^-])\\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\\b(?!-)/i,lookbehind:!0,alias:\"keyword\"},type:{pattern:/(^|[^-])\\b(?:actions?|activit(?:y|ies)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\\b(?!-)/i,lookbehind:!0,alias:\"variable\"},punctuation:/[.,:;(){}]/},Prism.languages.inform7.string.inside.substitution.inside.rest=Prism.util.clone(Prism.languages.inform7),Prism.languages.inform7.string.inside.substitution.inside.rest.text={pattern:/\\S(?:\\s*\\S)*/,alias:\"comment\"};\nPrism.languages.ini={comment:/^[ \\t]*;.*$/m,important:/\\[.*?\\]/,constant:/^[ \\t]*[^\\s=]+?(?=[ \\t]*=)/m,\"attr-value\":{pattern:/=.*/,inside:{punctuation:/^[=]/}}};\nPrism.languages.j={comment:/\\bNB\\..*/,string:/'(?:''|[^'\\r\\n])*'/,keyword:/\\b(?:(?:adverb|conjunction|CR|def|define|dyad|LF|monad|noun|verb)\\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\\w+|goto_\\w+|if|label_\\w+|return|select|throw|try|while|whilst)\\.)/,verb:{pattern:/(?!\\^:|;\\.|[=!][.:])(?:\\{(?:\\.|::?)?|p(?:\\.\\.?|:)|[=!\\]]|[<>+*\\-%$|,#][.:]?|[\\^?]\\.?|[;\\[]:?|[~}\"i][.:]|[ACeEIjLor]\\.|(?:[_\\/\\\\qsux]|_?\\d):)/,alias:\"keyword\"},number:/\\b_?(?:(?!\\d:)\\d+(?:\\.\\d+)?(?:(?:[ejpx]|ad|ar)_?\\d+(?:\\.\\d+)?)*(?:b_?[\\da-z]+(?:\\.[\\da-z]+)?)?|_(?!\\.))/,adverb:{pattern:/[~}]|[\\/\\\\]\\.?|[bfM]\\.|t[.:]/,alias:\"builtin\"},operator:/[=a][.:]|_\\./,conjunction:{pattern:/&(?:\\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\\.|`:?|[\\^LS]:|\"/,alias:\"variable\"},punctuation:/[()]/};\n!function(e){e.languages.jade={comment:{pattern:/(^([\\t ]*))\\/\\/.*((?:\\r?\\n|\\r)\\2[\\t ]+.+)*/m,lookbehind:!0},\"multiline-script\":{pattern:/(^([\\t ]*)script\\b.*\\.[\\t ]*)((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0,inside:{rest:e.languages.javascript}},filter:{pattern:/(^([\\t ]*)):.+((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"}}},\"multiline-plain-text\":{pattern:/(^([\\t ]*)[\\w\\-#.]+\\.[\\t ]*)((?:\\r?\\n|\\r(?!\\n))(?:\\2[\\t ]+.+|\\s*?(?=\\r?\\n|\\r)))+/m,lookbehind:!0},markup:{pattern:/(^[\\t ]*)<.+/m,lookbehind:!0,inside:{rest:e.languages.markup}},doctype:{pattern:/((?:^|\\n)[\\t ]*)doctype(?: .+)?/,lookbehind:!0},\"flow-control\":{pattern:/(^[\\t ]*)(?:if|unless|else|case|when|default|each|while)\\b(?: .+)?/m,lookbehind:!0,inside:{each:{pattern:/^each .+? in\\b/,inside:{keyword:/\\b(?:each|in)\\b/,punctuation:/,/}},branch:{pattern:/^(?:if|unless|else|case|when|default|while)\\b/,alias:\"keyword\"},rest:e.languages.javascript}},keyword:{pattern:/(^[\\t ]*)(?:block|extends|include|append|prepend)\\b.+/m,lookbehind:!0},mixin:[{pattern:/(^[\\t ]*)mixin .+/m,lookbehind:!0,inside:{keyword:/^mixin/,\"function\":/\\w+(?=\\s*\\(|\\s*$)/,punctuation:/[(),.]/}},{pattern:/(^[\\t ]*)\\+.+/m,lookbehind:!0,inside:{name:{pattern:/^\\+\\w+/,alias:\"function\"},rest:e.languages.javascript}}],script:{pattern:/(^[\\t ]*script(?:(?:&[^(]+)?\\([^)]+\\))*[\\t ]+).+/m,lookbehind:!0,inside:{rest:e.languages.javascript}},\"plain-text\":{pattern:/(^[\\t ]*(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?[\\t ]+).+/m,lookbehind:!0},tag:{pattern:/(^[\\t ]*)(?!-)[\\w\\-#.]*[\\w\\-](?:(?:&[^(]+)?\\([^)]+\\))*\\/?:?/m,lookbehind:!0,inside:{attributes:[{pattern:/&[^(]+\\([^)]+\\)/,inside:{rest:e.languages.javascript}},{pattern:/\\([^)]+\\)/,inside:{\"attr-value\":{pattern:/(=\\s*)(?:\\{[^}]*\\}|[^,)\\r\\n]+)/,lookbehind:!0,inside:{rest:e.languages.javascript}},\"attr-name\":/[\\w-]+(?=\\s*!?=|\\s*[,)])/,punctuation:/[!=(),]+/}}],punctuation:/:/}},code:[{pattern:/(^[\\t ]*(?:-|!?=)).+/m,lookbehind:!0,inside:{rest:e.languages.javascript}}],punctuation:/[.\\-!=|]+/};for(var t=\"(^([\\\\t ]*)):{{filter_name}}((?:\\\\r?\\\\n|\\\\r(?!\\\\n))(?:\\\\2[\\\\t ]+.+|\\\\s*?(?=\\\\r?\\\\n|\\\\r)))+\",n=[{filter:\"atpl\",language:\"twig\"},{filter:\"coffee\",language:\"coffeescript\"},\"ejs\",\"handlebars\",\"hogan\",\"less\",\"livescript\",\"markdown\",\"mustache\",\"plates\",{filter:\"sass\",language:\"scss\"},\"stylus\",\"swig\"],a={},i=0,r=n.length;r>i;i++){var s=n[i];s=\"string\"==typeof s?{filter:s,language:s}:s,e.languages[s.language]&&(a[\"filter-\"+s.filter]={pattern:RegExp(t.replace(\"{{filter_name}}\",s.filter),\"m\"),lookbehind:!0,inside:{\"filter-name\":{pattern:/^:[\\w-]+/,alias:\"variable\"},rest:e.languages[s.language]}})}e.languages.insertBefore(\"jade\",\"filter\",a)}(Prism);\nPrism.languages.java=Prism.languages.extend(\"clike\",{keyword:/\\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\\b/,number:/\\b0b[01]+\\b|\\b0x[\\da-f]*\\.?[\\da-fp\\-]+\\b|\\b\\d*\\.?\\d+(?:e[+-]?\\d+)?[df]?\\b/i,operator:{pattern:/(^|[^.])(?:\\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\\|[|=]?|\\*=?|\\/=?|%=?|\\^=?|[?:~])/m,lookbehind:!0}}),Prism.languages.insertBefore(\"java\",\"function\",{annotation:{alias:\"punctuation\",pattern:/(^|[^.])@\\w+/,lookbehind:!0}});\nPrism.languages.json={property:/\".*?\"(?=\\s*:)/gi,string:/\"(?!:)(\\\\?[^\"])*?\"(?!:)/g,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/g,punctuation:/[{}[\\]);,]/g,operator:/:/g,\"boolean\":/\\b(true|false)\\b/gi,\"null\":/\\bnull\\b/gi},Prism.languages.jsonp=Prism.languages.json;\nPrism.languages.julia={comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/\"\"\"[\\s\\S]+?\"\"\"|'''[\\s\\S]+?'''|(\"|')(\\\\?.)*?\\1/,keyword:/\\b(abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|let|local|macro|module|print|println|quote|return|try|type|typealias|using|while)\\b/,\"boolean\":/\\b(true|false)\\b/,number:/\\b-?(0[box])?(?:[\\da-f]+\\.?\\d*|\\.\\d+)(?:[efp][+-]?\\d+)?j?\\b/i,operator:/\\+=?|-=?|\\*=?|\\/[\\/=]?|\\\\=?|\\^=?|%=?|÷=?|!=?=?|&=?|\\|[=>]?|\\$=?|<(?:<=?|[=:])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥]/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.keyman={comment:/\\bc\\s.*/i,\"function\":/\\[\\s*((CTRL|SHIFT|ALT|LCTRL|RCTRL|LALT|RALT|CAPS|NCAPS)\\s+)*([TKU]_[a-z0-9_?]+|\".+?\"|'.+?')\\s*\\]/i,string:/(\"|')((?!\\1).)*\\1/,bold:[/&(baselayout|bitmap|capsononly|capsalwaysoff|shiftfreescaps|copyright|ethnologuecode|hotkey|includecodes|keyboardversion|kmw_embedcss|kmw_embedjs|kmw_helpfile|kmw_helptext|kmw_rtl|language|layer|layoutfile|message|mnemoniclayout|name|oldcharposmatching|platform|targets|version|visualkeyboard|windowslanguages)\\b/i,/\\b(bitmap|bitmaps|caps on only|caps always off|shift frees caps|copyright|hotkey|language|layout|message|name|version)\\b/i],keyword:/\\b(any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|return|reset|save|set|store|use)\\b/i,atrule:/\\b(ansi|begin|unicode|group|using keys|match|nomatch)\\b/i,number:/\\b(U\\+[\\dA-F]+|d\\d+|x[\\da-f]+|\\d+)\\b/i,operator:/[+>\\\\,()]/,tag:/\\$(keyman|kmfl|weaver|keymanweb|keymanonly):/i};\n!function(n){n.languages.kotlin=n.languages.extend(\"clike\",{keyword:{pattern:/(^|[^.])\\b(?:abstract|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|else|enum|final|finally|for|fun|get|if|import|in|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|out|override|package|private|protected|public|reified|return|sealed|set|super|tailrec|this|throw|to|try|val|var|when|where|while)\\b/,lookbehind:!0},\"function\":[/\\w+(?=\\s*\\()/,{pattern:/(\\.)\\w+(?=\\s*\\{)/,lookbehind:!0}],number:/\\b(?:0[bx][\\da-fA-F]+|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?[fFL]?)\\b/,operator:/\\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\\/*%<>]=?|[?:]:?|\\.\\.|&&|\\|\\||\\b(?:and|inv|or|shl|shr|ushr|xor)\\b/}),delete n.languages.kotlin[\"class-name\"],n.languages.insertBefore(\"kotlin\",\"string\",{\"raw-string\":{pattern:/([\"'])\\1\\1[\\s\\S]*?\\1{3}/,alias:\"string\"}}),n.languages.insertBefore(\"kotlin\",\"keyword\",{annotation:{pattern:/\\B@(?:\\w+:)?(?:[A-Z]\\w*|\\[[^\\]]+\\])/,alias:\"builtin\"}}),n.languages.insertBefore(\"kotlin\",\"function\",{label:{pattern:/\\w+@|@\\w+/,alias:\"symbol\"}});var e=[{pattern:/\\$\\{[^}]+\\}/,inside:{delimiter:{pattern:/^\\$\\{|\\}$/,alias:\"variable\"},rest:n.util.clone(n.languages.kotlin)}},{pattern:/\\$\\w+/,alias:\"variable\"}];n.languages.kotlin.string.inside=n.languages.kotlin[\"raw-string\"].inside={interpolation:e}}(Prism);\n!function(a){var e=/\\\\([^a-z()[\\]]|[a-z\\*]+)/i,n={\"equation-command\":{pattern:e,alias:\"regex\"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\\\begin\\{((?:verbatim|lstlisting)\\*?)\\})([\\w\\W]*?)(?=\\\\end\\{\\2\\})/,lookbehind:!0},equation:[{pattern:/\\$(?:\\\\?[\\w\\W])*?\\$|\\\\\\((?:\\\\?[\\w\\W])*?\\\\\\)|\\\\\\[(?:\\\\?[\\w\\W])*?\\\\\\]/,inside:n,alias:\"string\"},{pattern:/(\\\\begin\\{((?:equation|math|eqnarray|align|multline|gather)\\*?)\\})([\\w\\W]*?)(?=\\\\end\\{\\2\\})/,lookbehind:!0,inside:n,alias:\"string\"}],keyword:{pattern:/(\\\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\})/,lookbehind:!0},url:{pattern:/(\\\\url\\{)[^}]+(?=\\})/,lookbehind:!0},headline:{pattern:/(\\\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\\*?(?:\\[[^\\]]+\\])?\\{)[^}]+(?=\\}(?:\\[[^\\]]+\\])?)/,lookbehind:!0,alias:\"class-name\"},\"function\":{pattern:e,alias:\"selector\"},punctuation:/[[\\]{}&]/}}(Prism);\nPrism.languages.less=Prism.languages.extend(\"css\",{comment:[/\\/\\*[\\w\\W]*?\\*\\//,{pattern:/(^|[^\\\\])\\/\\/.*/,lookbehind:!0}],atrule:{pattern:/@[\\w-]+?(?:\\([^{}]+\\)|[^(){};])*?(?=\\s*\\{)/i,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\\{[\\w-]+\\}|[^{};\\s@])(?:@\\{[\\w-]+\\}|\\([^{}]*\\)|[^{};@])*?(?=\\s*\\{)/,inside:{variable:/@+[\\w-]+/}},property:/(?:@\\{[\\w-]+\\}|[\\w-])+(?:\\+_?)?(?=\\s*:)/i,punctuation:/[{}();:,]/,operator:/[+\\-*\\/]/}),Prism.languages.insertBefore(\"less\",\"punctuation\",{\"function\":Prism.languages.less.function}),Prism.languages.insertBefore(\"less\",\"property\",{variable:[{pattern:/@[\\w-]+\\s*:/,inside:{punctuation:/:/}},/@@?[\\w-]+/],\"mixin-usage\":{pattern:/([{;]\\s*)[.#](?!\\d)[\\w-]+.*?(?=[(;])/,lookbehind:!0,alias:\"function\"}});\nPrism.languages.lolcode={comment:[/\\bOBTW\\s+[\\s\\S]*?\\s+TLDR\\b/,/\\bBTW.+/],string:{pattern:/\"(?::.|[^\"])*\"/,inside:{variable:/:\\{[^}]+\\}/,symbol:[/:\\([a-f\\d]+\\)/i,/:\\[[^\\]]+\\]/,/:[)>o\":]/]}},number:/(-|\\b)\\d*\\.?\\d+/,symbol:{pattern:/(^|\\s)(?:A )?(?:YARN|NUMBR|NUMBAR|TROOF|BUKKIT|NOOB)(?=\\s|,|$)/,lookbehind:!0,inside:{keyword:/A(?=\\s)/}},label:{pattern:/((?:^|\\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\\w*/,lookbehind:!0,alias:\"string\"},\"function\":{pattern:/((?:^|\\s)(?:I IZ|HOW IZ I|IZ) )[a-zA-Z]\\w*/,lookbehind:!0},keyword:[{pattern:/(^|\\s)(?:O HAI IM|KTHX|HAI|KTHXBYE|I HAS A|ITZ(?: A)?|R|AN|MKAY|SMOOSH|MAEK|IS NOW(?: A)?|VISIBLE|GIMMEH|O RLY\\?|YA RLY|NO WAI|OIC|MEBBE|WTF\\?|OMG|OMGWTF|GTFO|IM IN YR|IM OUTTA YR|FOUND YR|YR|TIL|WILE|UPPIN|NERFIN|I IZ|HOW IZ I|IF U SAY SO|SRS|HAS A|LIEK(?: A)?|IZ)(?=\\s|,|$)/,lookbehind:!0},/'Z(?=\\s|,|$)/],\"boolean\":{pattern:/(^|\\s)(?:WIN|FAIL)(?=\\s|,|$)/,lookbehind:!0},variable:{pattern:/(^|\\s)IT(?=\\s|,|$)/,lookbehind:!0},operator:{pattern:/(^|\\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:SUM|DIFF|PRODUKT|QUOSHUNT|MOD|BIGGR|SMALLR|BOTH|EITHER|WON|ALL|ANY) OF)(?=\\s|,|$)/,lookbehind:!0},punctuation:/\\.{3}|…|,|!/};\nPrism.languages.lua={comment:/^#!.+|--(?:\\[(=*)\\[[\\s\\S]*?\\]\\1\\]|.*)/m,string:/([\"'])(?:(?!\\1)[^\\\\\\r\\n]|\\\\z(?:\\r\\n|\\s)|\\\\(?:\\r\\n|[\\s\\S]))*\\1|\\[(=*)\\[[\\s\\S]*?\\]\\2\\]/,number:/\\b0x[a-f\\d]+\\.?[a-f\\d]*(?:p[+-]?\\d+)?\\b|\\b\\d+(?:\\.\\B|\\.?\\d*(?:e[+-]?\\d+)?\\b)|\\B\\.\\d+(?:e[+-]?\\d+)?\\b/i,keyword:/\\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*(?:[({]))/,operator:[/[-+*%^&|#]|\\/\\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\\.\\.(?!\\.)/,lookbehind:!0}],punctuation:/[\\[\\](){},;]|\\.+|:+/};\nPrism.languages.makefile={comment:{pattern:/(^|[^\\\\])#(?:\\\\(?:\\r\\n|[\\s\\S])|.)*/,lookbehind:!0},string:/([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,builtin:/\\.[A-Z][^:#=\\s]+(?=\\s*:(?!=))/,symbol:{pattern:/^[^:=\\r\\n]+(?=\\s*:(?!=))/m,inside:{variable:/\\$+(?:[^(){}:#=\\s]+|(?=[({]))/}},variable:/\\$+(?:[^(){}:#=\\s]+|\\([@*%<^+?][DF]\\)|(?=[({]))/,keyword:[/-include\\b|\\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\\b/,{pattern:/(\\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \\t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/};\nPrism.languages.markdown=Prism.languages.extend(\"markup\",{}),Prism.languages.insertBefore(\"markdown\",\"prolog\",{blockquote:{pattern:/^>(?:[\\t ]*>)*/m,alias:\"punctuation\"},code:[{pattern:/^(?: {4}|\\t).+/m,alias:\"keyword\"},{pattern:/``.+?``|`[^`\\n]+`/,alias:\"keyword\"}],title:[{pattern:/\\w+.*(?:\\r?\\n|\\r)(?:==+|--+)/,alias:\"important\",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\\s*)#+.+/m,lookbehind:!0,alias:\"important\",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\\s*)([*-])([\\t ]*\\2){2,}(?=\\s*$)/m,lookbehind:!0,alias:\"punctuation\"},list:{pattern:/(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,lookbehind:!0,alias:\"punctuation\"},\"url-reference\":{pattern:/!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,inside:{variable:{pattern:/^(!?\\[)[^\\]]+/,lookbehind:!0},string:/(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,punctuation:/^[\\[\\]!:]|[<>]/},alias:\"url\"},bold:{pattern:/(^|[^\\\\])(\\*\\*|__)(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,lookbehind:!0,inside:{punctuation:/^\\*\\*|^__|\\*\\*$|__$/}},italic:{pattern:/(^|[^\\\\])([*_])(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\\[[^\\]]+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)| ?\\[[^\\]\\n]*\\])/,inside:{variable:{pattern:/(!?\\[)[^\\]]+(?=\\]$)/,lookbehind:!0},string:{pattern:/\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.italic.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.bold.inside.italic=Prism.util.clone(Prism.languages.markdown.italic),Prism.languages.markdown.italic.inside.bold=Prism.util.clone(Prism.languages.markdown.bold);\nPrism.languages.matlab={string:/\\B'(?:''|[^'\\n])*'/,comment:[/%\\{[\\s\\S]*?\\}%/,/%.+/],number:/\\b-?(?:\\d*\\.?\\d+(?:[eE][+-]?\\d+)?(?:[ij])?|[ij])\\b/,keyword:/\\b(?:break|case|catch|continue|else|elseif|end|for|function|if|inf|NaN|otherwise|parfor|pause|pi|return|switch|try|while)\\b/,\"function\":/(?!\\d)\\w+(?=\\s*\\()/,operator:/\\.?[*^\\/\\\\']|[+\\-:@]|[<>=~]=?|&&?|\\|\\|?/,punctuation:/\\.{3}|[.,;\\[\\](){}!]/};\nPrism.languages.mel={comment:/\\/\\/.*/,code:{pattern:/`(?:\\\\.|[^\\\\`\\r\\n])*`/,alias:\"italic\",inside:{delimiter:{pattern:/^`|`$/,alias:\"punctuation\"}}},string:/\"(?:\\\\.|[^\\\\\"\\r\\n])*\"/,variable:/\\$\\w+/,number:/(?:\\b|-)(?:0x[\\da-fA-F]+|\\d+\\.?\\d*)/,flag:{pattern:/-[^\\d\\W]\\w*/,alias:\"operator\"},keyword:/\\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\\b/,\"function\":/\\w+(?=\\()|\\b(?:about|abs|addAttr|addAttributeEditorNodeHelp|addDynamic|addNewShelfTab|addPP|addPanelCategory|addPrefixToName|advanceToNextDrivenKey|affectedNet|affects|aimConstraint|air|alias|aliasAttr|align|alignCtx|alignCurve|alignSurface|allViewFit|ambientLight|angle|angleBetween|animCone|animCurveEditor|animDisplay|animView|annotate|appendStringArray|applicationName|applyAttrPreset|applyTake|arcLenDimContext|arcLengthDimension|arclen|arrayMapper|art3dPaintCtx|artAttrCtx|artAttrPaintVertexCtx|artAttrSkinPaintCtx|artAttrTool|artBuildPaintMenu|artFluidAttrCtx|artPuttyCtx|artSelectCtx|artSetPaintCtx|artUserPaintCtx|assignCommand|assignInputDevice|assignViewportFactories|attachCurve|attachDeviceAttr|attachSurface|attrColorSliderGrp|attrCompatibility|attrControlGrp|attrEnumOptionMenu|attrEnumOptionMenuGrp|attrFieldGrp|attrFieldSliderGrp|attrNavigationControlGrp|attrPresetEditWin|attributeExists|attributeInfo|attributeMenu|attributeQuery|autoKeyframe|autoPlace|bakeClip|bakeFluidShading|bakePartialHistory|bakeResults|bakeSimulation|basename|basenameEx|batchRender|bessel|bevel|bevelPlus|binMembership|bindSkin|blend2|blendShape|blendShapeEditor|blendShapePanel|blendTwoAttr|blindDataType|boneLattice|boundary|boxDollyCtx|boxZoomCtx|bufferCurve|buildBookmarkMenu|buildKeyframeMenu|button|buttonManip|CBG|cacheFile|cacheFileCombine|cacheFileMerge|cacheFileTrack|camera|cameraView|canCreateManip|canvas|capitalizeString|catch|catchQuiet|ceil|changeSubdivComponentDisplayLevel|changeSubdivRegion|channelBox|character|characterMap|characterOutlineEditor|characterize|chdir|checkBox|checkBoxGrp|checkDefaultRenderGlobals|choice|circle|circularFillet|clamp|clear|clearCache|clip|clipEditor|clipEditorCurrentTimeCtx|clipSchedule|clipSchedulerOutliner|clipTrimBefore|closeCurve|closeSurface|cluster|cmdFileOutput|cmdScrollFieldExecuter|cmdScrollFieldReporter|cmdShell|coarsenSubdivSelectionList|collision|color|colorAtPoint|colorEditor|colorIndex|colorIndexSliderGrp|colorSliderButtonGrp|colorSliderGrp|columnLayout|commandEcho|commandLine|commandPort|compactHairSystem|componentEditor|compositingInterop|computePolysetVolume|condition|cone|confirmDialog|connectAttr|connectControl|connectDynamic|connectJoint|connectionInfo|constrain|constrainValue|constructionHistory|container|containsMultibyte|contextInfo|control|convertFromOldLayers|convertIffToPsd|convertLightmap|convertSolidTx|convertTessellation|convertUnit|copyArray|copyFlexor|copyKey|copySkinWeights|cos|cpButton|cpCache|cpClothSet|cpCollision|cpConstraint|cpConvClothToMesh|cpForces|cpGetSolverAttr|cpPanel|cpProperty|cpRigidCollisionFilter|cpSeam|cpSetEdit|cpSetSolverAttr|cpSolver|cpSolverTypes|cpTool|cpUpdateClothUVs|createDisplayLayer|createDrawCtx|createEditor|createLayeredPsdFile|createMotionField|createNewShelf|createNode|createRenderLayer|createSubdivRegion|cross|crossProduct|ctxAbort|ctxCompletion|ctxEditMode|ctxTraverse|currentCtx|currentTime|currentTimeCtx|currentUnit|curve|curveAddPtCtx|curveCVCtx|curveEPCtx|curveEditorCtx|curveIntersect|curveMoveEPCtx|curveOnSurface|curveSketchCtx|cutKey|cycleCheck|cylinder|dagPose|date|defaultLightListCheckBox|defaultNavigation|defineDataServer|defineVirtualDevice|deformer|deg_to_rad|delete|deleteAttr|deleteShadingGroupsAndMaterials|deleteShelfTab|deleteUI|deleteUnusedBrushes|delrandstr|detachCurve|detachDeviceAttr|detachSurface|deviceEditor|devicePanel|dgInfo|dgdirty|dgeval|dgtimer|dimWhen|directKeyCtx|directionalLight|dirmap|dirname|disable|disconnectAttr|disconnectJoint|diskCache|displacementToPoly|displayAffected|displayColor|displayCull|displayLevelOfDetail|displayPref|displayRGBColor|displaySmoothness|displayStats|displayString|displaySurface|distanceDimContext|distanceDimension|doBlur|dolly|dollyCtx|dopeSheetEditor|dot|dotProduct|doubleProfileBirailSurface|drag|dragAttrContext|draggerContext|dropoffLocator|duplicate|duplicateCurve|duplicateSurface|dynCache|dynControl|dynExport|dynExpression|dynGlobals|dynPaintEditor|dynParticleCtx|dynPref|dynRelEdPanel|dynRelEditor|dynamicLoad|editAttrLimits|editDisplayLayerGlobals|editDisplayLayerMembers|editRenderLayerAdjustment|editRenderLayerGlobals|editRenderLayerMembers|editor|editorTemplate|effector|emit|emitter|enableDevice|encodeString|endString|endsWith|env|equivalent|equivalentTol|erf|error|eval|evalDeferred|evalEcho|event|exactWorldBoundingBox|exclusiveLightCheckBox|exec|executeForEachObject|exists|exp|expression|expressionEditorListen|extendCurve|extendSurface|extrude|fcheck|fclose|feof|fflush|fgetline|fgetword|file|fileBrowserDialog|fileDialog|fileExtension|fileInfo|filetest|filletCurve|filter|filterCurve|filterExpand|filterStudioImport|findAllIntersections|findAnimCurves|findKeyframe|findMenuItem|findRelatedSkinCluster|finder|firstParentOf|fitBspline|flexor|floatEq|floatField|floatFieldGrp|floatScrollBar|floatSlider|floatSlider2|floatSliderButtonGrp|floatSliderGrp|floor|flow|fluidCacheInfo|fluidEmitter|fluidVoxelInfo|flushUndo|fmod|fontDialog|fopen|formLayout|format|fprint|frameLayout|fread|freeFormFillet|frewind|fromNativePath|fwrite|gamma|gauss|geometryConstraint|getApplicationVersionAsFloat|getAttr|getClassification|getDefaultBrush|getFileList|getFluidAttr|getInputDeviceRange|getMayaPanelTypes|getModifiers|getPanel|getParticleAttr|getPluginResource|getenv|getpid|glRender|glRenderEditor|globalStitch|gmatch|goal|gotoBindPose|grabColor|gradientControl|gradientControlNoAttr|graphDollyCtx|graphSelectContext|graphTrackCtx|gravity|grid|gridLayout|group|groupObjectsByName|HfAddAttractorToAS|HfAssignAS|HfBuildEqualMap|HfBuildFurFiles|HfBuildFurImages|HfCancelAFR|HfConnectASToHF|HfCreateAttractor|HfDeleteAS|HfEditAS|HfPerformCreateAS|HfRemoveAttractorFromAS|HfSelectAttached|HfSelectAttractors|HfUnAssignAS|hardenPointCurve|hardware|hardwareRenderPanel|headsUpDisplay|headsUpMessage|help|helpLine|hermite|hide|hilite|hitTest|hotBox|hotkey|hotkeyCheck|hsv_to_rgb|hudButton|hudSlider|hudSliderButton|hwReflectionMap|hwRender|hwRenderLoad|hyperGraph|hyperPanel|hyperShade|hypot|iconTextButton|iconTextCheckBox|iconTextRadioButton|iconTextRadioCollection|iconTextScrollList|iconTextStaticLabel|ikHandle|ikHandleCtx|ikHandleDisplayScale|ikSolver|ikSplineHandleCtx|ikSystem|ikSystemInfo|ikfkDisplayMethod|illustratorCurves|image|imfPlugins|inheritTransform|insertJoint|insertJointCtx|insertKeyCtx|insertKnotCurve|insertKnotSurface|instance|instanceable|instancer|intField|intFieldGrp|intScrollBar|intSlider|intSliderGrp|interToUI|internalVar|intersect|iprEngine|isAnimCurve|isConnected|isDirty|isParentOf|isSameObject|isTrue|isValidObjectName|isValidString|isValidUiName|isolateSelect|itemFilter|itemFilterAttr|itemFilterRender|itemFilterType|joint|jointCluster|jointCtx|jointDisplayScale|jointLattice|keyTangent|keyframe|keyframeOutliner|keyframeRegionCurrentTimeCtx|keyframeRegionDirectKeyCtx|keyframeRegionDollyCtx|keyframeRegionInsertKeyCtx|keyframeRegionMoveKeyCtx|keyframeRegionScaleKeyCtx|keyframeRegionSelectKeyCtx|keyframeRegionSetKeyCtx|keyframeRegionTrackCtx|keyframeStats|lassoContext|lattice|latticeDeformKeyCtx|launch|launchImageEditor|layerButton|layeredShaderPort|layeredTexturePort|layout|layoutDialog|lightList|lightListEditor|lightListPanel|lightlink|lineIntersection|linearPrecision|linstep|listAnimatable|listAttr|listCameras|listConnections|listDeviceAttachments|listHistory|listInputDeviceAxes|listInputDeviceButtons|listInputDevices|listMenuAnnotation|listNodeTypes|listPanelCategories|listRelatives|listSets|listTransforms|listUnselected|listerEditor|loadFluid|loadNewShelf|loadPlugin|loadPluginLanguageResources|loadPrefObjects|localizedPanelLabel|lockNode|loft|log|longNameOf|lookThru|ls|lsThroughFilter|lsType|lsUI|Mayatomr|mag|makeIdentity|makeLive|makePaintable|makeRoll|makeSingleSurface|makeTubeOn|makebot|manipMoveContext|manipMoveLimitsCtx|manipOptions|manipRotateContext|manipRotateLimitsCtx|manipScaleContext|manipScaleLimitsCtx|marker|match|max|memory|menu|menuBarLayout|menuEditor|menuItem|menuItemToShelf|menuSet|menuSetPref|messageLine|min|minimizeApp|mirrorJoint|modelCurrentTimeCtx|modelEditor|modelPanel|mouse|movIn|movOut|move|moveIKtoFK|moveKeyCtx|moveVertexAlongDirection|multiProfileBirailSurface|mute|nParticle|nameCommand|nameField|namespace|namespaceInfo|newPanelItems|newton|nodeCast|nodeIconButton|nodeOutliner|nodePreset|nodeType|noise|nonLinear|normalConstraint|normalize|nurbsBoolean|nurbsCopyUVSet|nurbsCube|nurbsEditUV|nurbsPlane|nurbsSelect|nurbsSquare|nurbsToPoly|nurbsToPolygonsPref|nurbsToSubdiv|nurbsToSubdivPref|nurbsUVSet|nurbsViewDirectionVector|objExists|objectCenter|objectLayer|objectType|objectTypeUI|obsoleteProc|oceanNurbsPreviewPlane|offsetCurve|offsetCurveOnSurface|offsetSurface|openGLExtension|openMayaPref|optionMenu|optionMenuGrp|optionVar|orbit|orbitCtx|orientConstraint|outlinerEditor|outlinerPanel|overrideModifier|paintEffectsDisplay|pairBlend|palettePort|paneLayout|panel|panelConfiguration|panelHistory|paramDimContext|paramDimension|paramLocator|parent|parentConstraint|particle|particleExists|particleInstancer|particleRenderInfo|partition|pasteKey|pathAnimation|pause|pclose|percent|performanceOptions|pfxstrokes|pickWalk|picture|pixelMove|planarSrf|plane|play|playbackOptions|playblast|plugAttr|plugNode|pluginInfo|pluginResourceUtil|pointConstraint|pointCurveConstraint|pointLight|pointMatrixMult|pointOnCurve|pointOnSurface|pointPosition|poleVectorConstraint|polyAppend|polyAppendFacetCtx|polyAppendVertex|polyAutoProjection|polyAverageNormal|polyAverageVertex|polyBevel|polyBlendColor|polyBlindData|polyBoolOp|polyBridgeEdge|polyCacheMonitor|polyCheck|polyChipOff|polyClipboard|polyCloseBorder|polyCollapseEdge|polyCollapseFacet|polyColorBlindData|polyColorDel|polyColorPerVertex|polyColorSet|polyCompare|polyCone|polyCopyUV|polyCrease|polyCreaseCtx|polyCreateFacet|polyCreateFacetCtx|polyCube|polyCut|polyCutCtx|polyCylinder|polyCylindricalProjection|polyDelEdge|polyDelFacet|polyDelVertex|polyDuplicateAndConnect|polyDuplicateEdge|polyEditUV|polyEditUVShell|polyEvaluate|polyExtrudeEdge|polyExtrudeFacet|polyExtrudeVertex|polyFlipEdge|polyFlipUV|polyForceUV|polyGeoSampler|polyHelix|polyInfo|polyInstallAction|polyLayoutUV|polyListComponentConversion|polyMapCut|polyMapDel|polyMapSew|polyMapSewMove|polyMergeEdge|polyMergeEdgeCtx|polyMergeFacet|polyMergeFacetCtx|polyMergeUV|polyMergeVertex|polyMirrorFace|polyMoveEdge|polyMoveFacet|polyMoveFacetUV|polyMoveUV|polyMoveVertex|polyNormal|polyNormalPerVertex|polyNormalizeUV|polyOptUvs|polyOptions|polyOutput|polyPipe|polyPlanarProjection|polyPlane|polyPlatonicSolid|polyPoke|polyPrimitive|polyPrism|polyProjection|polyPyramid|polyQuad|polyQueryBlindData|polyReduce|polySelect|polySelectConstraint|polySelectConstraintMonitor|polySelectCtx|polySelectEditCtx|polySeparate|polySetToFaceNormal|polySewEdge|polyShortestPathCtx|polySmooth|polySoftEdge|polySphere|polySphericalProjection|polySplit|polySplitCtx|polySplitEdge|polySplitRing|polySplitVertex|polyStraightenUVBorder|polySubdivideEdge|polySubdivideFacet|polyToSubdiv|polyTorus|polyTransfer|polyTriangulate|polyUVSet|polyUnite|polyWedgeFace|popen|popupMenu|pose|pow|preloadRefEd|print|progressBar|progressWindow|projFileViewer|projectCurve|projectTangent|projectionContext|projectionManip|promptDialog|propModCtx|propMove|psdChannelOutliner|psdEditTextureFile|psdExport|psdTextureFile|putenv|pwd|python|querySubdiv|quit|rad_to_deg|radial|radioButton|radioButtonGrp|radioCollection|radioMenuItemCollection|rampColorPort|rand|randomizeFollicles|randstate|rangeControl|readTake|rebuildCurve|rebuildSurface|recordAttr|recordDevice|redo|reference|referenceEdit|referenceQuery|refineSubdivSelectionList|refresh|refreshAE|registerPluginResource|rehash|reloadImage|removeJoint|removeMultiInstance|removePanelCategory|rename|renameAttr|renameSelectionList|renameUI|render|renderGlobalsNode|renderInfo|renderLayerButton|renderLayerParent|renderLayerPostProcess|renderLayerUnparent|renderManip|renderPartition|renderQualityNode|renderSettings|renderThumbnailUpdate|renderWindowEditor|renderWindowSelectContext|renderer|reorder|reorderDeformers|requires|reroot|resampleFluid|resetAE|resetPfxToPolyCamera|resetTool|resolutionNode|retarget|reverseCurve|reverseSurface|revolve|rgb_to_hsv|rigidBody|rigidSolver|roll|rollCtx|rootOf|rot|rotate|rotationInterpolation|roundConstantRadius|rowColumnLayout|rowLayout|runTimeCommand|runup|sampleImage|saveAllShelves|saveAttrPreset|saveFluid|saveImage|saveInitialState|saveMenu|savePrefObjects|savePrefs|saveShelf|saveToolSettings|scale|scaleBrushBrightness|scaleComponents|scaleConstraint|scaleKey|scaleKeyCtx|sceneEditor|sceneUIReplacement|scmh|scriptCtx|scriptEditorInfo|scriptJob|scriptNode|scriptTable|scriptToShelf|scriptedPanel|scriptedPanelType|scrollField|scrollLayout|sculpt|searchPathArray|seed|selLoadSettings|select|selectContext|selectCurveCV|selectKey|selectKeyCtx|selectKeyframeRegionCtx|selectMode|selectPref|selectPriority|selectType|selectedNodes|selectionConnection|separator|setAttr|setAttrEnumResource|setAttrMapping|setAttrNiceNameResource|setConstraintRestPosition|setDefaultShadingGroup|setDrivenKeyframe|setDynamic|setEditCtx|setEditor|setFluidAttr|setFocus|setInfinity|setInputDeviceMapping|setKeyCtx|setKeyPath|setKeyframe|setKeyframeBlendshapeTargetWts|setMenuMode|setNodeNiceNameResource|setNodeTypeFlag|setParent|setParticleAttr|setPfxToPolyCamera|setPluginResource|setProject|setStampDensity|setStartupMessage|setState|setToolTo|setUITemplate|setXformManip|sets|shadingConnection|shadingGeometryRelCtx|shadingLightRelCtx|shadingNetworkCompare|shadingNode|shapeCompare|shelfButton|shelfLayout|shelfTabLayout|shellField|shortNameOf|showHelp|showHidden|showManipCtx|showSelectionInTitle|showShadingGroupAttrEditor|showWindow|sign|simplify|sin|singleProfileBirailSurface|size|sizeBytes|skinCluster|skinPercent|smoothCurve|smoothTangentSurface|smoothstep|snap2to2|snapKey|snapMode|snapTogetherCtx|snapshot|soft|softMod|softModCtx|sort|sound|soundControl|source|spaceLocator|sphere|sphrand|spotLight|spotLightPreviewPort|spreadSheetEditor|spring|sqrt|squareSurface|srtContext|stackTrace|startString|startsWith|stitchAndExplodeShell|stitchSurface|stitchSurfacePoints|strcmp|stringArrayCatenate|stringArrayContains|stringArrayCount|stringArrayInsertAtIndex|stringArrayIntersector|stringArrayRemove|stringArrayRemoveAtIndex|stringArrayRemoveDuplicates|stringArrayRemoveExact|stringArrayToString|stringToStringArray|strip|stripPrefixFromName|stroke|subdAutoProjection|subdCleanTopology|subdCollapse|subdDuplicateAndConnect|subdEditUV|subdListComponentConversion|subdMapCut|subdMapSewMove|subdMatchTopology|subdMirror|subdToBlind|subdToPoly|subdTransferUVsToCache|subdiv|subdivCrease|subdivDisplaySmoothness|substitute|substituteAllString|substituteGeometry|substring|surface|surfaceSampler|surfaceShaderList|swatchDisplayPort|switchTable|symbolButton|symbolCheckBox|sysFile|system|tabLayout|tan|tangentConstraint|texLatticeDeformContext|texManipContext|texMoveContext|texMoveUVShellContext|texRotateContext|texScaleContext|texSelectContext|texSelectShortestPathCtx|texSmudgeUVContext|texWinToolCtx|text|textCurves|textField|textFieldButtonGrp|textFieldGrp|textManip|textScrollList|textToShelf|textureDisplacePlane|textureHairColor|texturePlacementContext|textureWindow|threadCount|threePointArcCtx|timeControl|timePort|timerX|toNativePath|toggle|toggleAxis|toggleWindowVisibility|tokenize|tokenizeList|tolerance|tolower|toolButton|toolCollection|toolDropped|toolHasOptions|toolPropertyWindow|torus|toupper|trace|track|trackCtx|transferAttributes|transformCompare|transformLimits|translator|trim|trunc|truncateFluidCache|truncateHairCache|tumble|tumbleCtx|turbulence|twoPointArcCtx|uiRes|uiTemplate|unassignInputDevice|undo|undoInfo|ungroup|uniform|unit|unloadPlugin|untangleUV|untitledFileName|untrim|upAxis|updateAE|userCtx|uvLink|uvSnapshot|validateShelfName|vectorize|view2dToolCtx|viewCamera|viewClipPlane|viewFit|viewHeadOn|viewLookAt|viewManip|viewPlace|viewSet|visor|volumeAxis|vortex|waitCursor|warning|webBrowser|webBrowserPrefs|whatIs|window|windowPref|wire|wireContext|workspace|wrinkle|wrinkleContext|writeTake|xbmLangPathList|xform)\\b/,operator:[/\\+[+=]?|-[-=]?|&&|\\|\\||[<>]=|[*\\/!=]=?|[%^]/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,:;?\\[\\](){}]/},Prism.languages.mel.code.inside.rest=Prism.util.clone(Prism.languages.mel);\nPrism.languages.mizar={comment:/::.+/,keyword:/@proof\\b|\\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|equals|end|environ|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:y|ies)|when|where|with|wrt)\\b/,parameter:{pattern:/\\$(?:10|\\d)/,alias:\"variable\"},variable:/\\w+(?=:)/,number:/(?:\\b|-)\\d+\\b/,operator:/\\.\\.\\.|->|&|\\.?=/,punctuation:/\\(#|#\\)|[,:;\\[\\](){}]/};\nPrism.languages.monkey={string:/\"[^\"\\r\\n]*\"/,comment:[/^#Rem\\s+[\\s\\S]*?^#End/im,/'.+/],preprocessor:{pattern:/(^[ \\t]*)#.+/m,lookbehind:!0,alias:\"comment\"},\"function\":/\\w+(?=\\()/,\"type-char\":{pattern:/(\\w)[?%#$]/,lookbehind:!0,alias:\"variable\"},number:{pattern:/((?:\\.\\.)?)(?:(?:\\b|\\B-\\.?|\\B\\.)\\d+((?!\\.\\.)\\.\\d*)?|\\$[\\da-f]+)/i,lookbehind:!0},keyword:/\\b(?:Void|Strict|Public|Private|Property|Bool|Int|Float|String|Array|Object|Continue|Exit|Import|Extern|New|Self|Super|Try|Catch|Eachin|True|False|Extends|Abstract|Final|Select|Case|Default|Const|Local|Global|Field|Method|Function|Class|End|If|Then|Else|ElseIf|EndIf|While|Wend|Repeat|Until|Forever|For|To|Step|Next|Return|Module|Interface|Implements|Inline|Throw|Null)\\b/i,operator:/\\.\\.|<[=>]?|>=?|:?=|(?:[+\\-*\\/&~|]|\\b(?:Mod|Shl|Shr)\\b)=?|\\b(?:And|Not|Or)\\b/i,punctuation:/[.,:;()\\[\\]]/};\nPrism.languages.nasm={comment:/;.*$/m,string:/(\"|'|`)(\\\\?.)*?\\1/m,label:{pattern:/(^\\s*)[A-Za-z._?$][\\w.?$@~#]*:/m,lookbehind:!0,alias:\"function\"},keyword:[/\\[?BITS (16|32|64)\\]?/m,{pattern:/(^\\s*)section\\s*[a-zA-Z\\.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\\r\\n]*/im,/(?:CPU|FLOAT|DEFAULT).*$/m],register:{pattern:/\\b(?:st\\d|[xyz]mm\\d\\d?|[cdt]r\\d|r\\d\\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(bp|sp|si|di)|[cdefgs]s)\\b/i,alias:\"variable\"},number:/(\\b|-|(?=\\$))(0[hx][\\da-f]*\\.?[\\da-f]+(p[+-]?\\d+)?|\\d[\\da-f]+[hx]|\\$\\d[\\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\\d+|\\d*\\.?\\d+(\\.?e[+-]?\\d+)?[dt]?)\\b/i,operator:/[\\[\\]*+\\-\\/%<>=&|$!]/};\nPrism.languages.nginx=Prism.languages.extend(\"clike\",{comment:{pattern:/(^|[^\"{\\\\])#.*/,lookbehind:!0},keyword:/\\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\\b/i}),Prism.languages.insertBefore(\"nginx\",\"keyword\",{variable:/\\$[a-z_]+/i});\nPrism.languages.nim={comment:/#.*/,string:/(?:(?:\\b(?!\\d)(?:\\w|\\\\x[8-9a-fA-F][0-9a-fA-F])+)?(?:\"\"\"[\\s\\S]*?\"\"\"(?!\")|\"(?:\\\\[\\s\\S]|\"\"|[^\"\\\\])*\")|'(?:\\\\(?:\\d+|x[\\da-fA-F]{2}|.)|[^'])')/,number:/\\b(?:0[xXoObB][\\da-fA-F_]+|\\d[\\d_]*(?:(?!\\.\\.)\\.[\\d_]*)?(?:[eE][+-]?\\d[\\d_]*)?)(?:'?[iuf]\\d*)?/,keyword:/\\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\\b/,\"function\":{pattern:/(?:(?!\\d)(?:\\w|\\\\x[8-9a-fA-F][0-9a-fA-F])+|`[^`\\r\\n]+`)\\*?(?:\\[[^\\]]+\\])?(?=\\s*\\()/,inside:{operator:/\\*$/}},ignore:{pattern:/`[^`\\r\\n]+`/,inside:{punctuation:/`/}},operator:{pattern:/(^|[({\\[](?=\\.\\.)|(?![({\\[]\\.).)(?:(?:[=+\\-*\\/<>@$~&%|!?^:\\\\]|\\.\\.|\\.(?![)}\\]]))+|\\b(?:and|div|of|or|in|is|isnot|mod|not|notin|shl|shr|xor)\\b)/m,lookbehind:!0},punctuation:/[({\\[]\\.|\\.[)}\\]]|[`(){}\\[\\],:]/};\nPrism.languages.nix={comment:/\\/\\*[\\s\\S]*?\\*\\/|#.*/,string:{pattern:/\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|''(?:(?!'')[\\s\\S]|''(?:'|\\\\|\\$\\{))*''/,inside:{interpolation:{pattern:/(^|(?:^|(?!'').)[^\\\\])\\$\\{(?:[^}]|\\{[^}]*\\})*}/,lookbehind:!0,inside:{antiquotation:{pattern:/^\\$(?=\\{)/,alias:\"variable\"}}}}},url:[/\\b(?:[a-z]{3,7}:\\/\\/)[\\w\\-+%~\\/.:#=?&]+/,{pattern:/([^\\/])(?:[\\w\\-+%~.:#=?&]*(?!\\/\\/)[\\w\\-+%~\\/.:#=?&])?(?!\\/\\/)\\/[\\w\\-+%~\\/.:#=?&]*/,lookbehind:!0}],antiquotation:{pattern:/\\$(?=\\{)/,alias:\"variable\"},number:/\\b\\d+\\b/,keyword:/\\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\\b/,\"function\":/\\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:url|Tarball)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\\b|\\bfoldl'\\B/,\"boolean\":/\\b(?:true|false)\\b/,operator:/[=!<>]=?|\\+\\+?|\\|\\||&&|\\/\\/|->?|[?@]/,punctuation:/[{}()[\\].,:;]/},Prism.languages.nix.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.nix);\nPrism.languages.nsis={comment:{pattern:/(^|[^\\\\])(\\/\\*[\\w\\W]*?\\*\\/|[#;].*)/,lookbehind:!0},string:/(\"|')(\\\\?.)*?\\1/,keyword:/\\b(Abort|Add(BrandingImage|Size)|AdvSplash|Allow(RootDirInstall|SkipFiles)|AutoCloseWindow|Banner|BG(Font|Gradient|Image)|BrandingText|BringToFront|Call(InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|CRCCheck|Create(Directory|Font|ShortCut)|Delete(INISec|INIStr|RegKey|RegValue)?|Detail(Print|sButtonText)|Dialer|Dir(Text|Var|Verify)|EnableWindow|Enum(RegKey|RegValue)|Exch|Exec(Shell|Wait)?|ExpandEnvStrings|File(BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|WriteUTF16LE|Seek|Write|WriteByte|WriteWord)?|Find(Close|First|Next|Window)|FlushINI|Get(CurInstType|CurrentAddress|DlgItem|DLLVersion(Local)?|ErrorLevel|FileTime(Local)?|FullPathName|Function(Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|Install(ButtonText|Colors|Dir(RegKey)?)|InstProgressFlags|Inst(Type(GetText|SetText)?)|Int(CmpU?|Fmt|Op)|IsWindow|Lang(DLL|String)|License(BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(Set|Text)|Manifest(DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|Name|Nop|ns(Dialogs|Exec)|NSISdl|OutFile|Page(Callbacks)?|Pop|Push|Quit|Read(EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|RMDir|SearchPath|Section(End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(AutoClose|BrandingImage|Compress|Compressor(DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(InstDetails|UninstDetails|Window)|Silent(Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(CmpS?|Cpy|Len)|SubCaption|System|Unicode|Uninstall(ButtonText|Caption|Icon|SubCaption|Text)|UninstPage|UnRegDLL|UserInfo|Var|VI(AddVersionKey|FileVersion|ProductVersion)|VPatch|WindowIcon|Write(INIStr|RegBin|RegDWORD|RegExpandStr|RegStr|Uninstaller)|XPStyle)\\b/,property:/\\b(admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user|ARCHIVE|FILE_(ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(CR|CU|DD|LM|PD|U)|HKEY_(CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)\\b/,variable:/\\$[({]?[-_\\w]+[)}]?/i,number:/\\b-?(0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee]-?\\d+)?)\\b/,operator:/--?|\\+\\+?|<=?|>=?|==?=?|&&?|\\|?\\||[?*\\/~^%]/,punctuation:/[{}[\\];(),.:]/,important:/!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|makensis|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)\\b/i};\nPrism.languages.objectivec=Prism.languages.extend(\"c\",{keyword:/\\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\\b|(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\\b/,string:/(\"|')(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|@\"(\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,operator:/-[->]?|\\+\\+?|!=?|<<?=?|>>?=?|==?|&&?|\\|\\|?|[~^%?*\\/@]/});\nPrism.languages.ocaml={comment:/\\(\\*[\\s\\S]*?\\*\\)/,string:[/\"(?:\\\\.|[^\\\\\\r\\n\"])*\"/,/(['`])(?:\\\\(?:\\d+|x[\\da-f]+|.)|(?!\\1)[^\\\\\\r\\n])\\1/i],number:/\\b-?(?:0x[\\da-f][\\da-f_]+|(?:0[bo])?\\d[\\d_]*\\.?[\\d_]*(?:e[+-]?[\\d_]+)?)/i,type:{pattern:/\\B['`][a-z\\d_]*/i,alias:\"variable\"},directive:{pattern:/\\B#[a-z\\d_]+/i,alias:\"function\"},keyword:/\\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|prefix|private|rec|then|sig|struct|to|try|type|val|value|virtual|where|while|with)\\b/,\"boolean\":/\\b(?:false|true)\\b/,operator:/:=|[=<>@^|&+\\-*\\/$%!?~][!$%&\\*+\\-.\\/:<=>?@^|~]*|\\b(?:and|asr|land|lor|lxor|lsl|lsr|mod|nor|or)\\b/,punctuation:/[(){}\\[\\]|_.,:;]/};\nPrism.languages.oz={comment:/\\/\\*[\\s\\S]*?\\*\\/|%.*/,string:/\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"/,atom:{pattern:/'(?:[^'\\\\]|\\\\.)*'/,alias:\"builtin\"},keyword:/[$_]|\\[\\]|\\b(?:at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\\b/,\"function\":[/[a-z][A-Za-z\\d]*(?=\\()/,{pattern:/(\\{)[A-Z][A-Za-z\\d]*/,lookbehind:!0}],number:/\\b(?:0[bx][\\da-f]+|\\d+\\.?\\d*(?:e~?\\d+)?\\b)|&(?:[^\\\\]|\\\\(?:\\d{3}|.))/i,variable:/\\b[A-Z][A-Za-z\\d]*|`(?:[^`\\\\]|\\\\.)+`/,\"attr-name\":/\\w+(?=:)/,operator:/:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\\\=:?|!!?|[|#+\\-*\\/,~^@]|\\b(?:andthen|div|mod|orelse)\\b/,punctuation:/[\\[\\](){}.:;?]/};\nPrism.languages.parigp={comment:/\\/\\*[\\s\\S]*?\\*\\/|\\\\\\\\.*/,string:/\"(?:[^\"\\\\]|\\\\.)*\"/,keyword:function(){var r=[\"breakpoint\",\"break\",\"dbg_down\",\"dbg_err\",\"dbg_up\",\"dbg_x\",\"forcomposite\",\"fordiv\",\"forell\",\"forpart\",\"forprime\",\"forstep\",\"forsubgroup\",\"forvec\",\"for\",\"iferr\",\"if\",\"local\",\"my\",\"next\",\"return\",\"until\",\"while\"];return r=r.map(function(r){return r.split(\"\").join(\" *\")}).join(\"|\"),RegExp(\"\\\\b(?:\"+r+\")\\\\b\")}(),\"function\":/\\w[\\w ]*?(?= *\\()/,number:{pattern:/((?:\\. *\\. *)?)(?:\\d(?: *\\d)*(?: *(?!\\. *\\.)\\.(?: *\\d)*)?|\\. *\\d(?: *\\d)*)(?: *e *[+-]? *\\d(?: *\\d)*)?/i,lookbehind:!0},operator:/\\. *\\.|[*\\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\\+(?: *[+=])?|-(?: *[-=>])?|<(?:(?: *<)?(?: *=)?| *>)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\\\(?: *\\/)?(?: *=)?|&(?: *&)?|\\| *\\||['#~^]/,punctuation:/[\\[\\]{}().,:;|]/};\nPrism.languages.parser=Prism.languages.extend(\"markup\",{keyword:{pattern:/(^|[^^])(?:\\^(?:case|eval|for|if|switch|throw)\\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\\b)/,lookbehind:!0},variable:{pattern:/(^|[^^])\\B\\$(?:\\w+|(?=[.\\{]))(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,lookbehind:!0,inside:{punctuation:/\\.|:+/}},\"function\":{pattern:/(^|[^^])\\B[@^]\\w+(?:(?:\\.|::?)\\w+)*(?:\\.|::?)?/,lookbehind:!0,inside:{keyword:{pattern:/(^@)(?:GET_|SET_)/,lookbehind:!0},punctuation:/\\.|:+/}},escape:{pattern:/\\^(?:[$^;@()\\[\\]{}\"':]|#[a-f\\d]*)/i,alias:\"builtin\"},punctuation:/[\\[\\](){};]/}),Prism.languages.insertBefore(\"parser\",\"keyword\",{\"parser-comment\":{pattern:/(\\s)#.*/,lookbehind:!0,alias:\"comment\"},expression:{pattern:/(^|[^^])\\((?:[^()]|\\((?:[^()]|\\((?:[^()])*\\))*\\))*\\)/,lookbehind:!0,inside:{string:{pattern:/(^|[^^])([\"'])(?:(?!\\2)[^^]|\\^[\\s\\S])*\\2/,lookbehind:!0},keyword:Prism.languages.parser.keyword,variable:Prism.languages.parser.variable,\"function\":Prism.languages.parser.function,\"boolean\":/\\b(?:true|false)\\b/,number:/\\b(?:0x[a-f\\d]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?)\\b/i,escape:Prism.languages.parser.escape,operator:/[~+*\\/\\\\%]|!(?:\\|\\|?|=)?|&&?|\\|\\|?|==|<[<=]?|>[>=]?|-[fd]?|\\b(?:def|eq|ge|gt|in|is|le|lt|ne)\\b/,punctuation:Prism.languages.parser.punctuation}}}),Prism.languages.insertBefore(\"inside\",\"punctuation\",{expression:Prism.languages.parser.expression,keyword:Prism.languages.parser.keyword,variable:Prism.languages.parser.variable,\"function\":Prism.languages.parser.function,escape:Prism.languages.parser.escape,\"parser-punctuation\":{pattern:Prism.languages.parser.punctuation,alias:\"punctuation\"}},Prism.languages.parser.tag.inside[\"attr-value\"]);\nPrism.languages.pascal={comment:[/\\(\\*[\\s\\S]+?\\*\\)/,/\\{[\\s\\S]+?\\}/,/\\/\\/.*/],string:/(?:'(?:''|[^'\\r\\n])*'|#[&$%]?[a-f\\d]+)+|\\^[a-z]/i,keyword:[{pattern:/(^|[^&])\\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:dispose|exit|false|new|true)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\\b/i,lookbehind:!0},{pattern:/(^|[^&])\\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\\b/i,lookbehind:!0}],number:[/[+-]?(?:[&%]\\d+|\\$[a-f\\d]+)/i,/([+-]|\\b)\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?/i],operator:[/\\.\\.|\\*\\*|:=|<[<=>]?|>[>=]?|[+\\-*\\/]=?|[@^=]/i,{pattern:/(^|[^&])\\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\\b/,lookbehind:!0}],punctuation:/\\(\\.|\\.\\)|[()\\[\\]:;,.]/};\nPrism.languages.perl={comment:[{pattern:/(^\\s*)=\\w+[\\s\\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\\\$])#.*/,lookbehind:!0}],string:[/\\b(?:q|qq|qx|qw)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/\\b(?:q|qq|qx|qw)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/\\b(?:q|qq|qx|qw)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)/,/\\b(?:q|qq|qx|qw)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}/,/\\b(?:q|qq|qx|qw)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\]/,/\\b(?:q|qq|qx|qw)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>/,/(\"|`)(?:[^\\\\]|\\\\[\\s\\S])*?\\1/,/'(?:[^'\\\\\\r\\n]|\\\\.)*'/],regex:[/\\b(?:m|qr)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\1[msixpodualngc]*/,/\\b(?:m|qr)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\.)*?\\1[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}[msixpodualngc]*/,/\\b(?:m|qr)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\][msixpodualngc]*/,/\\b(?:m|qr)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>[msixpodualngc]*/,{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*([^a-zA-Z0-9\\s\\{\\(\\[<])(?:[^\\\\]|\\\\[\\s\\S])*?\\2(?:[^\\\\]|\\\\[\\s\\S])*?\\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s+([a-zA-Z0-9])(?:[^\\\\]|\\\\[\\s\\S])*?\\2(?:[^\\\\]|\\\\[\\s\\S])*?\\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)\\s*\\((?:[^()\\\\]|\\\\[\\s\\S])*\\)[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}\\s*\\{(?:[^{}\\\\]|\\\\[\\s\\S])*\\}[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\]\\s*\\[(?:[^[\\]\\\\]|\\\\[\\s\\S])*\\][msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\\b)(?:s|tr|y)\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>\\s*<(?:[^<>\\\\]|\\\\[\\s\\S])*>[msixpodualngcer]*/,lookbehind:!0},/\\/(?:[^\\/\\\\\\r\\n]|\\\\.)*\\/[msixpodualngc]*(?=\\s*(?:$|[\\r\\n,.;})&|\\-+*~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\\b))/],variable:[/[&*$@%]\\{\\^[A-Z]+\\}/,/[&*$@%]\\^[A-Z_]/,/[&*$@%]#?(?=\\{)/,/[&*$@%]#?((::)*'?(?!\\d)[\\w$]+)+(::)*/i,/[&*$@%]\\d+/,/(?!%=)[$@%][!\"#$%&'()*+,\\-.\\/:;<=>?@[\\\\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\\S*>|\\b_\\b/,alias:\"symbol\"},vstring:{pattern:/v\\d+(\\.\\d+)*|\\d+(\\.\\d+){2,}/,alias:\"string\"},\"function\":{pattern:/sub [a-z0-9_]+/i,inside:{keyword:/sub/}},keyword:/\\b(any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|say|state|sub|switch|undef|unless|until|use|when|while)\\b/,number:/\\b-?(0x[\\dA-Fa-f](_?[\\dA-Fa-f])*|0b[01](_?[01])*|(\\d(_?\\d)*)?\\.?\\d(_?\\d)*([Ee][+-]?\\d+)?)\\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\\b|\\+[+=]?|-[-=>]?|\\*\\*?=?|\\/\\/?=?|=[=~>]?|~[~=]?|\\|\\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\\.(?:=|\\.\\.?)?|[\\\\?]|\\bx(?:=|\\b)|\\b(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\\b/,punctuation:/[{}[\\];(),:]/};\nPrism.languages.php=Prism.languages.extend(\"clike\",{keyword:/\\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\\b/i,constant:/\\b[A-Z0-9_]{2,}\\b/,comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0}}),Prism.languages.insertBefore(\"php\",\"class-name\",{\"shell-comment\":{pattern:/(^|[^\\\\])#.*/,lookbehind:!0,alias:\"comment\"}}),Prism.languages.insertBefore(\"php\",\"keyword\",{delimiter:/\\?>|<\\?(?:php)?/i,variable:/\\$\\w+\\b/i,\"package\":{pattern:/(\\\\|namespace\\s+|use\\s+)[\\w\\\\]+/,lookbehind:!0,inside:{punctuation:/\\\\/}}}),Prism.languages.insertBefore(\"php\",\"operator\",{property:{pattern:/(->)[\\w]+/,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add(\"before-highlight\",function(e){\"php\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\\?php|<\\?)[\\w\\W]*?(?:\\?>)/gi,function(a){return e.tokenStack.push(a),\"{{{PHP\"+e.tokenStack.length+\"}}}\"}))}),Prism.hooks.add(\"before-insert\",function(e){\"php\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add(\"after-highlight\",function(e){if(\"php\"===e.language){for(var a,n=0;a=e.tokenStack[n];n++)e.highlightedCode=e.highlightedCode.replace(\"{{{PHP\"+(n+1)+\"}}}\",Prism.highlight(a,e.grammar,\"php\").replace(/\\$/g,\"$$$$\"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add(\"wrap\",function(e){\"php\"===e.language&&\"markup\"===e.type&&(e.content=e.content.replace(/(\\{\\{\\{PHP[0-9]+\\}\\}\\})/g,'<span class=\"token php\">$1</span>'))}),Prism.languages.insertBefore(\"php\",\"comment\",{markup:{pattern:/<[^?]\\/?(.*?)>/,inside:Prism.languages.markup},php:/\\{\\{\\{PHP[0-9]+\\}\\}\\}/}));\nPrism.languages.insertBefore(\"php\",\"variable\",{\"this\":/\\$this\\b/,global:/\\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)/,scope:{pattern:/\\b[\\w\\\\]+::/,inside:{keyword:/(static|self|parent)/,punctuation:/(::|\\\\)/}}});\nPrism.languages.powershell={comment:[{pattern:/(^|[^`])<#[\\w\\W]*?#>/,lookbehind:!0},{pattern:/(^|[^`])#.+/,lookbehind:!0}],string:[{pattern:/\"(`?[\\w\\W])*?\"/,inside:{\"function\":{pattern:/[^`]\\$\\(.*?\\)/,inside:{}}}},/'([^']|'')*'/],namespace:/\\[[a-z][\\w\\W]*?\\]/i,\"boolean\":/\\$(true|false)\\b/i,variable:/\\$\\w+\\b/i,\"function\":[/\\b(Add-(Computer|Content|History|Member|PSSnapin|Type)|Checkpoint-Computer|Clear-(Content|EventLog|History|Item|ItemProperty|Variable)|Compare-Object|Complete-Transaction|Connect-PSSession|ConvertFrom-(Csv|Json|StringData)|Convert-Path|ConvertTo-(Csv|Html|Json|Xml)|Copy-(Item|ItemProperty)|Debug-Process|Disable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)|Disconnect-PSSession|Enable-(ComputerRestore|PSBreakpoint|PSRemoting|PSSessionConfiguration)|Enter-PSSession|Exit-PSSession|Export-(Alias|Clixml|Console|Csv|FormatData|ModuleMember|PSSession)|ForEach-Object|Format-(Custom|List|Table|Wide)|Get-(Alias|ChildItem|Command|ComputerRestorePoint|Content|ControlPanelItem|Culture|Date|Event|EventLog|EventSubscriber|FormatData|Help|History|Host|HotFix|Item|ItemProperty|Job|Location|Member|Module|Process|PSBreakpoint|PSCallStack|PSDrive|PSProvider|PSSession|PSSessionConfiguration|PSSnapin|Random|Service|TraceSource|Transaction|TypeData|UICulture|Unique|Variable|WmiObject)|Group-Object|Import-(Alias|Clixml|Csv|LocalizedData|Module|PSSession)|Invoke-(Command|Expression|History|Item|RestMethod|WebRequest|WmiMethod)|Join-Path|Limit-EventLog|Measure-(Command|Object)|Move-(Item|ItemProperty)|New-(Alias|Event|EventLog|Item|ItemProperty|Module|ModuleManifest|Object|PSDrive|PSSession|PSSessionConfigurationFile|PSSessionOption|PSTransportOption|Service|TimeSpan|Variable|WebServiceProxy)|Out-(Default|File|GridView|Host|Null|Printer|String)|Pop-Location|Push-Location|Read-Host|Receive-(Job|PSSession)|Register-(EngineEvent|ObjectEvent|PSSessionConfiguration|WmiEvent)|Remove-(Computer|Event|EventLog|Item|ItemProperty|Job|Module|PSBreakpoint|PSDrive|PSSession|PSSnapin|TypeData|Variable|WmiObject)|Rename-(Computer|Item|ItemProperty)|Reset-ComputerMachinePassword|Resolve-Path|Restart-(Computer|Service)|Restore-Computer|Resume-(Job|Service)|Save-Help|Select-(Object|String|Xml)|Send-MailMessage|Set-(Alias|Content|Date|Item|ItemProperty|Location|PSBreakpoint|PSDebug|PSSessionConfiguration|Service|StrictMode|TraceSource|Variable|WmiInstance)|Show-(Command|ControlPanelItem|EventLog)|Sort-Object|Split-Path|Start-(Job|Process|Service|Sleep|Transaction)|Stop-(Computer|Job|Process|Service)|Suspend-(Job|Service)|Tee-Object|Test-(ComputerSecureChannel|Connection|ModuleManifest|Path|PSSessionConfigurationFile)|Trace-Command|Unblock-File|Undo-Transaction|Unregister-(Event|PSSessionConfiguration)|Update-(FormatData|Help|List|TypeData)|Use-Transaction|Wait-(Event|Job|Process)|Where-Object|Write-(Debug|Error|EventLog|Host|Output|Progress|Verbose|Warning))\\b/i,/\\b(ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\\b/i],keyword:/\\b(Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\\b/i,operator:{pattern:/(\\W?)(!|-(eq|ne|gt|ge|lt|le|sh[lr]|not|b?(and|x?or)|(Not)?(Like|Match|Contains|In)|Replace|Join|is(Not)?|as)\\b|-[-=]?|\\+[+=]?|[*\\/%]=?)/i,lookbehind:!0},punctuation:/[|{}[\\];(),.]/},Prism.languages.powershell.string[0].inside.boolean=Prism.languages.powershell.boolean,Prism.languages.powershell.string[0].inside.variable=Prism.languages.powershell.variable,Prism.languages.powershell.string[0].inside.function.inside=Prism.util.clone(Prism.languages.powershell);\nPrism.languages.processing=Prism.languages.extend(\"clike\",{keyword:/\\b(?:break|catch|case|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\\b/,operator:/<[<=]?|>[>=]?|&&?|\\|\\|?|[%?]|[!=+\\-*\\/]=?/}),Prism.languages.insertBefore(\"processing\",\"number\",{constant:/\\b(?!XML\\b)[A-Z][A-Z\\d_]+\\b/,type:{pattern:/\\b(?:boolean|byte|char|color|double|float|int|XML|[A-Z][A-Za-z\\d_]*)\\b/,alias:\"variable\"}}),Prism.languages.processing[\"function\"].pattern=/[a-z0-9_]+(?=\\s*\\()/i,Prism.languages.processing[\"class-name\"].alias=\"variable\";\nPrism.languages.prolog={comment:[/%.+/,/\\/\\*[\\s\\S]*?\\*\\//],string:/([\"'])(?:\\1\\1|\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,builtin:/\\b(?:fx|fy|xf[xy]?|yfx?)\\b/,variable:/\\b[A-Z_]\\w*/,\"function\":/\\b[a-z]\\w*(?:(?=\\()|\\/\\d+)/,number:/\\b\\d+\\.?\\d*/,operator:/[:\\\\=><\\-?*@\\/;+^|!$.]+|\\b(?:is|mod|not|xor)\\b/,punctuation:/[(){}\\[\\],]/};\n!function(e){e.languages.puppet={heredoc:[{pattern:/(@\\(\"([^\"\\r\\n\\/):]+)\"(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r))*?[ \\t]*\\|?[ \\t]*-?[ \\t]*\\2/,lookbehind:!0,alias:\"string\",inside:{punctuation:/(?=\\S).*\\S(?= *$)/}},{pattern:/(@\\(([^\"\\r\\n\\/):]+)(?:\\/[nrts$uL]*)?\\).*(?:\\r?\\n|\\r))(?:.*(?:\\r?\\n|\\r))*?[ \\t]*\\|?[ \\t]*-?[ \\t]*\\2/,lookbehind:!0,alias:\"string\",inside:{punctuation:/(?=\\S).*\\S(?= *$)/}},{pattern:/@\\(\"?(?:[^\"\\r\\n\\/):]+)\"?(?:\\/[nrts$uL]*)?\\)/,alias:\"string\",inside:{punctuation:{pattern:/(\\().+?(?=\\))/,lookbehind:!0}}}],\"multiline-comment\":{pattern:/(^|[^\\\\])\\/\\*[\\s\\S]*?\\*\\//,lookbehind:!0,alias:\"comment\"},regex:{pattern:/((?:\\bnode\\s+|[^\\s\\w\\\\]\\s*))\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/(?:[imx]+\\b|\\B)/,lookbehind:!0,inside:{\"extended-regex\":{pattern:/^\\/(?:[^\\/\\\\]|\\\\[\\s\\S])+\\/[im]*x[im]*$/,inside:{comment:/#.*/}}}},comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:{pattern:/([\"'])(?:\\$\\{(?:[^'\"}]|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}|(?!\\1)[^\\\\]|\\\\[\\s\\S])*\\1/,inside:{\"double-quoted\":{pattern:/^\"[\\s\\S]*\"$/,inside:{}}}},variable:{pattern:/\\$(?:::)?\\w+(?:::\\w+)*/,inside:{punctuation:/::/}},\"attr-name\":/(?:\\w+|\\*)(?=\\s*=>)/,\"function\":[{pattern:/(\\.)(?!\\d)\\w+/,lookbehind:!0},/\\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\\b|\\b(?!\\d)\\w+(?=\\()/],number:/\\b(?:0x[a-f\\d]+|\\d+(?:\\.\\d+)?(?:e-?\\d+)?)\\b/i,\"boolean\":/\\b(?:true|false)\\b/,keyword:/\\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\\b/,datatype:{pattern:/\\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\\b/,alias:\"symbol\"},operator:/=[=~>]?|![=~]?|<(?:<\\|?|[=~|-])?|>[>=]?|->?|~>|\\|>?>?|[*\\/%+?]|\\b(?:and|in|or)\\b/,punctuation:/[\\[\\]{}().,;]|:+/};var n=[{pattern:/(^|[^\\\\])\\$\\{(?:[^'\"{}]|\\{[^}]*\\}|([\"'])(?:(?!\\2)[^\\\\]|\\\\[\\s\\S])*\\2)+\\}/,lookbehind:!0,inside:{\"short-variable\":{pattern:/(^\\$\\{)(?!\\w+\\()(?:::)?\\w+(?:::\\w+)*/,lookbehind:!0,alias:\"variable\",inside:{punctuation:/::/}},delimiter:{pattern:/^\\$/,alias:\"variable\"},rest:e.util.clone(e.languages.puppet)}},{pattern:/(^|[^\\\\])\\$(?:::)?\\w+(?:::\\w+)*/,lookbehind:!0,alias:\"variable\",inside:{punctuation:/::/}}];e.languages.puppet.heredoc[0].inside.interpolation=n,e.languages.puppet.string.inside[\"double-quoted\"].inside.interpolation=n}(Prism);\n!function(e){e.languages.pure={\"inline-lang\":{pattern:/%<[\\s\\S]+?%>/,inside:{lang:{pattern:/(^%< *)-\\*-.+?-\\*-/,lookbehind:!0,alias:\"comment\"},delimiter:{pattern:/^%<.*|%>$/,alias:\"punctuation\"}}},comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0},/#!.+/],string:/\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,number:{pattern:/((?:\\.\\.)?)(?:\\b(?:inf|nan)\\b|\\b0x[\\da-f]+|(?:\\b(?:0b)?\\d+(?:\\.\\d)?|\\B\\.\\d)\\d*(?:e[+-]?\\d+)?L?)/i,lookbehind:!0},keyword:/\\b(?:ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|NULL|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\\b/,\"function\":/\\b(?:abs|add_(?:(?:fundef|interface|macdef|typedef)(?:_at)?|addr|constdef|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_(?:matrix|pointer)|byte_c?string(?:_pointer)?|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|short|sentry|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\\b/,special:{pattern:/\\b__[a-z]+__\\b/i,alias:\"builtin\"},operator:/(?=\\b_|[^_])[!\"#$%&'*+,\\-.\\/:<=>?@\\\\^_`|~\\u00a1-\\u00bf\\u00d7-\\u00f7\\u20d0-\\u2bff]+|\\b(?:and|div|mod|not|or)\\b/,punctuation:/[(){}\\[\\];,|]/};var t=[\"c\",{lang:\"c++\",alias:\"cpp\"},\"fortran\",\"ats\",\"dsp\"],a=\"%< *-\\\\*- *{lang}\\\\d* *-\\\\*-[\\\\s\\\\S]+?%>\";t.forEach(function(t){var r=t;if(\"string\"!=typeof t&&(r=t.alias,t=t.lang),e.languages[r]){var i={};i[\"inline-lang-\"+r]={pattern:RegExp(a.replace(\"{lang}\",t.replace(/([.+*?\\/\\\\(){}\\[\\]])/g,\"\\\\$1\")),\"i\"),inside:e.util.clone(e.languages.pure[\"inline-lang\"].inside)},i[\"inline-lang-\"+r].inside.rest=e.util.clone(e.languages[r]),e.languages.insertBefore(\"pure\",\"inline-lang\",i)}}),e.languages.c&&(e.languages.pure[\"inline-lang\"].inside.rest=e.util.clone(e.languages.c))}(Prism);\nPrism.languages.python={\"triple-quoted-string\":{pattern:/\"\"\"[\\s\\S]+?\"\"\"|'''[\\s\\S]+?'''/,alias:\"string\"},comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/(\"|')(?:\\\\?.)*?\\1/,\"function\":{pattern:/((?:^|\\s)def[ \\t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\\()/g,lookbehind:!0},\"class-name\":{pattern:/(\\bclass\\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\\b/,\"boolean\":/\\b(?:True|False)\\b/,number:/\\b-?(?:0[bo])?(?:(?:\\d|0x[\\da-f])[\\da-f]*\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?j?\\b/i,operator:/[-+%=]=?|!=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]|\\b(?:or|and|not)\\b/,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.q={string:/\"(?:\\\\.|[^\"\\\\\\r\\n])*\"/,comment:[{pattern:/([\\t )\\]}])\\/.*/,lookbehind:!0},{pattern:/(^|\\r?\\n|\\r)\\/[\\t ]*(?:(?:\\r?\\n|\\r)(?:.*(?:\\r?\\n|\\r))*?(?:\\\\(?=[\\t ]*(?:\\r?\\n|\\r))|$)|\\S.*)/,lookbehind:!0},/^\\\\[\\t ]*(?:\\r?\\n|\\r)[\\s\\S]+/m,/^#!.+/m],symbol:/`(?::\\S+|[\\w.]*)/,datetime:{pattern:/0N[mdzuvt]|0W[dtz]|\\d{4}\\.\\d\\d(?:m|\\.\\d\\d(?:T(?:\\d\\d(?::\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?)?)?)?[dz]?)|\\d\\d:\\d\\d(?::\\d\\d(?:[.:]\\d\\d\\d)?)?[uvt]?/,alias:\"number\"},number:/\\b-?(?![01]:)(?:0[wn]|0W[hj]?|0N[hje]?|0x[\\da-fA-F]+|\\d+\\.?\\d*(?:e[+-]?\\d+)?[hjfeb]?)/,keyword:/\\\\\\w+\\b|\\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\\b/,adverb:{pattern:/['\\/\\\\]:?|\\beach\\b/,alias:\"function\"},verb:{pattern:/(?:\\B\\.\\B|\\b[01]:|<[=>]?|>=?|[:+\\-*%,!?_~=|$&#@^]):?/,alias:\"operator\"},punctuation:/[(){}\\[\\];.]/};\nPrism.languages.qore=Prism.languages.extend(\"clike\",{comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|(?:\\/\\/|#).*)/,lookbehind:!0},string:/(\"|')(\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\])*\\1/,variable:/\\$(?!\\d)\\w+\\b/,keyword:/\\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:int|float|number|bool|string|date|list)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\\b/,number:/\\b(?:0b[01]+|0x[\\da-f]*\\.?[\\da-fp\\-]+|\\d*\\.?\\d+e?\\d*[df]|\\d*\\.?\\d+)\\b/i,\"boolean\":/\\b(?:true|false)\\b/i,operator:{pattern:/(^|[^\\.])(?:\\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\\|[|=]?|[*\\/%^]=?|[~?])/,lookbehind:!0},\"function\":/\\$?\\b(?!\\d)\\w+(?=\\()/});\nPrism.languages.r={comment:/#.*/,string:/(['\"])(?:\\\\?.)*?\\1/,\"percent-operator\":{pattern:/%[^%\\s]*%/,alias:\"operator\"},\"boolean\":/\\b(?:TRUE|FALSE)\\b/,ellipsis:/\\.\\.(?:\\.|\\d+)/,number:[/\\b(?:NaN|Inf)\\b/,/\\b(?:0x[\\dA-Fa-f]+(?:\\.\\d*)?|\\d*\\.?\\d+)(?:[EePp][+-]?\\d+)?[iL]?\\b/],keyword:/\\b(?:if|else|repeat|while|function|for|in|next|break|NULL|NA|NA_integer_|NA_real_|NA_complex_|NA_character_)\\b/,operator:/->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\\|\\|?|[+*\\/^$@~]/,punctuation:/[(){}\\[\\],;]/};\n!function(a){var e=a.util.clone(a.languages.javascript);a.languages.jsx=a.languages.extend(\"markup\",e),a.languages.jsx.tag.pattern=/<\\/?[\\w\\.:-]+\\s*(?:\\s+[\\w\\.:-]+(?:=(?:(\"|')(\\\\?[\\w\\W])*?\\1|[^\\s'\">=]+|(\\{[\\w\\W]*?\\})))?\\s*)*\\/?>/i,a.languages.jsx.tag.inside[\"attr-value\"].pattern=/=[^\\{](?:('|\")[\\w\\W]*?(\\1)|[^\\s>]+)/i;var s=a.util.clone(a.languages.jsx);delete s.punctuation,s=a.languages.insertBefore(\"jsx\",\"operator\",{punctuation:/=(?={)|[{}[\\];(),.:]/},{jsx:s}),a.languages.insertBefore(\"inside\",\"attr-value\",{script:{pattern:/=(\\{(?:\\{[^}]*\\}|[^}])+\\})/i,inside:s,alias:\"language-javascript\"}},a.languages.jsx.tag)}(Prism);\nPrism.languages.rest={table:[{pattern:/(\\s*)(?:\\+[=-]+)+\\+(?:\\r?\\n|\\r)(?:\\1(?:[+|].+)+[+|](?:\\r?\\n|\\r))+\\1(?:\\+[=-]+)+\\+/,lookbehind:!0,inside:{punctuation:/\\||(?:\\+[=-]+)+\\+/}},{pattern:/(\\s*)(?:=+ +)+=+((?:\\r?\\n|\\r)\\1.+)+(?:\\r?\\n|\\r)\\1(?:=+ +)+=+(?=(?:\\r?\\n|\\r){2}|\\s*$)/,lookbehind:!0,inside:{punctuation:/[=-]+/}}],\"substitution-def\":{pattern:/(^\\s*\\.\\. )\\|(?:[^|\\s](?:[^|]*[^|\\s])?)\\| [^:]+::/m,lookbehind:!0,inside:{substitution:{pattern:/^\\|(?:[^|\\s]|[^|\\s][^|]*[^|\\s])\\|/,alias:\"attr-value\",inside:{punctuation:/^\\||\\|$/}},directive:{pattern:/( +)[^:]+::/,lookbehind:!0,alias:\"function\",inside:{punctuation:/::$/}}}},\"link-target\":[{pattern:/(^\\s*\\.\\. )\\[[^\\]]+\\]/m,lookbehind:!0,alias:\"string\",inside:{punctuation:/^\\[|\\]$/}},{pattern:/(^\\s*\\.\\. )_(?:`[^`]+`|(?:[^:\\\\]|\\\\.)+):/m,lookbehind:!0,alias:\"string\",inside:{punctuation:/^_|:$/}}],directive:{pattern:/(^\\s*\\.\\. )[^:]+::/m,lookbehind:!0,alias:\"function\",inside:{punctuation:/::$/}},comment:{pattern:/(^\\s*\\.\\.)(?:(?: .+)?(?:(?:\\r?\\n|\\r).+)+| .+)(?=(?:\\r?\\n|\\r){2}|$)/m,lookbehind:!0},title:[{pattern:/^(([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+)(?:\\r?\\n|\\r).+(?:\\r?\\n|\\r)\\1$/m,inside:{punctuation:/^[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+|[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,important:/.+/}},{pattern:/(^|(?:\\r?\\n|\\r){2}).+(?:\\r?\\n|\\r)([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2+(?=\\r?\\n|\\r|$)/,lookbehind:!0,inside:{punctuation:/[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]+$/,important:/.+/}}],hr:{pattern:/((?:\\r?\\n|\\r){2})([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\2{3,}(?=(?:\\r?\\n|\\r){2})/,lookbehind:!0,alias:\"punctuation\"},field:{pattern:/(^\\s*):[^:\\r\\n]+:(?= )/m,lookbehind:!0,alias:\"attr-name\"},\"command-line-option\":{pattern:/(^\\s*)(?:[+-][a-z\\d]|(?:\\-\\-|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][a-z\\d_-]*|<[^<>]+>))?(?:, (?:[+-][a-z\\d]|(?:\\-\\-|\\/)[a-z\\d-]+)(?:[ =](?:[a-z][a-z\\d_-]*|<[^<>]+>))?)*(?=(?:\\r?\\n|\\r)? {2,}\\S)/im,lookbehind:!0,alias:\"symbol\"},\"literal-block\":{pattern:/::(?:\\r?\\n|\\r){2}([ \\t]+).+(?:(?:\\r?\\n|\\r)\\1.+)*/,inside:{\"literal-block-punctuation\":{pattern:/^::/,alias:\"punctuation\"}}},\"quoted-literal-block\":{pattern:/::(?:\\r?\\n|\\r){2}([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~]).*(?:(?:\\r?\\n|\\r)\\1.*)*/,inside:{\"literal-block-punctuation\":{pattern:/^(?:::|([!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~])\\1*)/m,alias:\"punctuation\"}}},\"list-bullet\":{pattern:/(^\\s*)(?:[*+\\-•‣⁃]|\\(?(?:\\d+|[a-z]|[ivxdclm]+)\\)|(?:\\d+|[a-z]|[ivxdclm]+)\\.)(?= )/im,lookbehind:!0,alias:\"punctuation\"},\"doctest-block\":{pattern:/(^\\s*)>>> .+(?:(?:\\r?\\n|\\r).+)*/m,lookbehind:!0,inside:{punctuation:/^>>>/}},inline:[{pattern:/(^|[\\s\\-:\\/'\"<(\\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\\*\\*?|``?|\\|)(?!\\s).*?[^\\s]\\2(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$))/m,lookbehind:!0,inside:{bold:{pattern:/(^\\*\\*).+(?=\\*\\*$)/,lookbehind:!0},italic:{pattern:/(^\\*).+(?=\\*$)/,lookbehind:!0},\"inline-literal\":{pattern:/(^``).+(?=``$)/,lookbehind:!0,alias:\"symbol\"},role:{pattern:/^:[^:]+:|:[^:]+:$/,alias:\"function\",inside:{punctuation:/^:|:$/}},\"interpreted-text\":{pattern:/(^`).+(?=`$)/,lookbehind:!0,alias:\"attr-value\"},substitution:{pattern:/(^\\|).+(?=\\|$)/,lookbehind:!0,alias:\"attr-value\"},punctuation:/\\*\\*?|``?|\\|/}}],link:[{pattern:/\\[[^\\]]+\\]_(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/,alias:\"string\",inside:{punctuation:/^\\[|\\]_$/}},{pattern:/(?:\\b[a-z\\d](?:[_.:+]?[a-z\\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\\s\\-.,:;!?\\\\\\/'\")\\]}]|$)/i,alias:\"string\",inside:{punctuation:/^_?`|`$|`?_?_$/}}],punctuation:{pattern:/(^\\s*)(?:\\|(?= |$)|(?:---?|—|\\.\\.|__)(?= )|\\.\\.$)/m,lookbehind:!0}};\nPrism.languages.rip={comment:/#.*/,keyword:/(?:=>|->)|\\b(?:class|if|else|switch|case|return|exit|try|catch|finally|raise)\\b/,builtin:/@|\\bSystem\\b/,\"boolean\":/\\b(?:true|false)\\b/,date:/\\b\\d{4}-\\d{2}-\\d{2}\\b/,time:/\\b\\d{2}:\\d{2}:\\d{2}\\b/,datetime:/\\b\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\b/,character:/\\B`[^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]\\b/,regex:{pattern:/(^|[^\\/])\\/(?!\\/)(\\[.+?]|\\\\.|[^\\/\\\\\\r\\n])+\\/(?=\\s*($|[\\r\\n,.;})]))/,lookbehind:!0},symbol:/:[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/,string:/(\"|')(\\\\?.)*?\\1/,number:/[+-]?(?:(?:\\d+\\.\\d+)|(?:\\d+))/,punctuation:/(?:\\.{2,3})|[`,.:;=\\/\\\\()<>\\[\\]{}]/,reference:/[^\\d\\s`'\",.:;#\\/\\\\()<>\\[\\]{}][^\\s`'\",.:;#\\/\\\\()<>\\[\\]{}]*/};\nPrism.languages.roboconf={comment:/#.*/,keyword:{pattern:/(^|\\s)(?:(?:facet|instance of)(?=[ \\t]+[\\w-]+[ \\t]*\\{)|(?:external|import)\\b)/,lookbehind:!0},component:{pattern:/[\\w-]+(?=[ \\t]*\\{)/,alias:\"variable\"},property:/[\\w.-]+(?=[ \\t]*:)/,value:{pattern:/(=[ \\t]*)[^,;]+/,lookbehind:!0,alias:\"attr-value\"},optional:{pattern:/\\(optional\\)/,alias:\"builtin\"},wildcard:{pattern:/(\\.)\\*/,lookbehind:!0,alias:\"operator\"},punctuation:/[{},.;:=]/};\n!function(e){e.languages.crystal=e.languages.extend(\"ruby\",{keyword:[/\\b(?:abstract|alias|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|rescue|return|require|self|sizeof|struct|super|then|type|typeof|union|unless|until|when|while|with|yield|__DIR__|__FILE__|__LINE__)\\b/,{pattern:/(\\.\\s*)(?:is_a|responds_to)\\?/,lookbehind:!0}],number:/\\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[0-9a-fA-F_]*[0-9a-fA-F]|(?:[0-9](?:[0-9_]*[0-9])?)(?:\\.[0-9_]*[0-9])?(?:[eE][+-]?[0-9_]*[0-9])?)(?:_(?:[uif](?:8|16|32|64))?)?\\b/});var t=e.util.clone(e.languages.crystal);e.languages.insertBefore(\"crystal\",\"string\",{attribute:{pattern:/@\\[.+?\\]/,alias:\"attr-name\",inside:{delimiter:{pattern:/^@\\[|\\]$/,alias:\"tag\"},rest:t}},expansion:[{pattern:/\\{\\{.+?\\}\\}/,inside:{delimiter:{pattern:/^\\{\\{|\\}\\}$/,alias:\"tag\"},rest:t}},{pattern:/\\{%.+?%\\}/,inside:{delimiter:{pattern:/^\\{%|%\\}$/,alias:\"tag\"},rest:t}}]})}(Prism);\nPrism.languages.rust={comment:[{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0},{pattern:/(^|[^\\\\:])\\/\\/.*/,lookbehind:!0}],string:[/b?r(#*)\"(?:\\\\?.)*?\"\\1/,/b?(\"|')(?:\\\\?.)*?\\1/],keyword:/\\b(?:abstract|alignof|as|be|box|break|const|continue|crate|do|else|enum|extern|false|final|fn|for|if|impl|in|let|loop|match|mod|move|mut|offsetof|once|override|priv|pub|pure|ref|return|sizeof|static|self|struct|super|true|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\\b/,attribute:{pattern:/#!?\\[.+?\\]/,alias:\"attr-name\"},\"function\":[/[a-z0-9_]+(?=\\s*\\()/i,/[a-z0-9_]+!(?=\\s*\\(|\\[)/i],\"macro-rules\":{pattern:/[a-z0-9_]+!/i,alias:\"function\"},number:/\\b-?(?:0x[\\dA-Fa-f](?:_?[\\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(\\d(_?\\d)*)?\\.?\\d(_?\\d)*([Ee][+-]?\\d+)?)(?:_?(?:[iu](?:8|16|32|64)?|f32|f64))?\\b/,\"closure-params\":{pattern:/\\|[^|]*\\|(?=\\s*[{-])/,inside:{punctuation:/[\\|:,]/,operator:/[&*]/}},punctuation:/[{}[\\];(),:]|\\.+|->/,operator:/[-+*\\/%!^=]=?|@|&[&=]?|\\|[|=]?|<<?=?|>>?=?/};\nPrism.languages.sas={datalines:{pattern:/^\\s*(?:(?:data)?lines|cards);[\\s\\S]+?(?:\\r?\\n|\\r);/im,alias:\"string\",inside:{keyword:{pattern:/^(\\s*)(?:(?:data)?lines|cards)/i,lookbehind:!0},punctuation:/;/}},comment:[{pattern:/(^\\s*|;\\s*)\\*.*;/m,lookbehind:!0},/\\/\\*[\\s\\S]+?\\*\\//],datetime:{pattern:/'[^']+'(?:dt?|t)\\b/i,alias:\"number\"},string:/([\"'])(?:\\1\\1|(?!\\1)[\\s\\S])*\\1/,keyword:/\\b(?:data|else|format|if|input|proc|run|then)\\b/i,number:/(?:\\B-|\\b)(?:[\\da-f]+x|\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?)/i,operator:/\\*\\*?|\\|\\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\\/=&]|[~¬^]=?|\\b(?:eq|ne|gt|lt|ge|le|in|not)\\b/i,punctuation:/[$%@.(){}\\[\\];,\\\\]/};\n!function(e){e.languages.sass=e.languages.extend(\"css\",{comment:{pattern:/^([ \\t]*)\\/[\\/*].*(?:(?:\\r?\\n|\\r)\\1[ \\t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore(\"sass\",\"atrule\",{\"atrule-line\":{pattern:/^(?:[ \\t]*)[@+=].+/m,inside:{atrule:/(?:@[\\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var a=/((\\$[-_\\w]+)|(#\\{\\$[-_\\w]+\\}))/i,t=[/[+*\\/%]|[=!]=|<=?|>=?|\\b(?:and|or|not)\\b/,{pattern:/(\\s+)-(?=\\s)/,lookbehind:!0}];e.languages.insertBefore(\"sass\",\"property\",{\"variable-line\":{pattern:/^[ \\t]*\\$.+/m,inside:{punctuation:/:/,variable:a,operator:t}},\"property-line\":{pattern:/^[ \\t]*(?:[^:\\s]+ *:.*|:[^:\\s]+.*)/m,inside:{property:[/[^:\\s]+(?=\\s*:)/,{pattern:/(:)[^:\\s]+/,lookbehind:!0}],punctuation:/:/,variable:a,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,delete e.languages.sass.selector,e.languages.insertBefore(\"sass\",\"punctuation\",{selector:{pattern:/([ \\t]*)\\S(?:,?[^,\\r\\n]+)*(?:,(?:\\r?\\n|\\r)\\1[ \\t]+\\S(?:,?[^,\\r\\n]+)*)*/,lookbehind:!0}})}(Prism);\nPrism.languages.scss=Prism.languages.extend(\"css\",{comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0},atrule:{pattern:/@[\\w-]+(?:\\([^()]+\\)|[^(])*?(?=\\s+[{;])/,inside:{rule:/@[\\w-]+/}},url:/(?:[-a-z]+-)*url(?=\\()/i,selector:{pattern:/(?=\\S)[^@;\\{\\}\\(\\)]?([^@;\\{\\}\\(\\)]|&|#\\{\\$[-_\\w]+\\})+(?=\\s*\\{(\\}|\\s|[^\\}]+(:|\\{)[^\\}]+))/m,inside:{placeholder:/%[-_\\w]+/}}}),Prism.languages.insertBefore(\"scss\",\"atrule\",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore(\"scss\",\"property\",{variable:/\\$[-_\\w]+|#\\{\\$[-_\\w]+\\}/}),Prism.languages.insertBefore(\"scss\",\"function\",{placeholder:{pattern:/%[-_\\w]+/,alias:\"selector\"},statement:/\\B!(?:default|optional)\\b/i,\"boolean\":/\\b(?:true|false)\\b/,\"null\":/\\bnull\\b/,operator:{pattern:/(\\s)(?:[-+*\\/%]|[=!]=|<=?|>=?|and|or|not)(?=\\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.util.clone(Prism.languages.scss);\nPrism.languages.scala=Prism.languages.extend(\"java\",{keyword:/<-|=>|\\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\\b/,string:/\"\"\"[\\W\\w]*?\"\"\"|\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^\\\\\\r\\n']|\\\\.[^\\\\']*)'/,builtin:/\\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\\b/,number:/\\b(?:0x[\\da-f]*\\.?[\\da-f]+|\\d*\\.?\\d+e?\\d*[dfl]?)\\b/i,symbol:/'[^\\d\\s\\\\]\\w*/}),delete Prism.languages.scala[\"class-name\"],delete Prism.languages.scala[\"function\"];\nPrism.languages.scheme={comment:/;.*/,string:/\"(?:[^\"\\\\\\r\\n]|\\\\.)*?\"|'[^('\\s]*/,keyword:{pattern:/(\\()(?:define(?:-syntax|-library|-values)?|(?:case-)?lambda|let(?:\\*|rec)?(?:-values)?|else|if|cond|begin|delay(?:-force)?|parameterize|guard|set!|(?:quasi-)?quote|syntax-rules)/,lookbehind:!0},builtin:{pattern:/(\\()(?:(?:cons|car|cdr|list|call-with-current-continuation|call\\/cc|append|abs|apply|eval)\\b|null\\?|pair\\?|boolean\\?|eof-object\\?|char\\?|procedure\\?|number\\?|port\\?|string\\?|vector\\?|symbol\\?|bytevector\\?)/,lookbehind:!0},number:{pattern:/(\\s|\\))[-+]?[0-9]*\\.?[0-9]+(?:\\s*[-+]\\s*[0-9]*\\.?[0-9]+i)?\\b/,lookbehind:!0},\"boolean\":/#[tf]/,operator:{pattern:/(\\()(?:[-+*%\\/]|[<>]=?|=>?)/,lookbehind:!0},\"function\":{pattern:/(\\()[^\\s()]*(?=\\s)/,lookbehind:!0},punctuation:/[()]/};\nPrism.languages.smalltalk={comment:/\"(?:\"\"|[^\"])+\"/,string:/'(?:''|[^'])+'/,symbol:/#[\\da-z]+|#(?:-|([+\\/\\\\*~<>=@%|&?!])\\1?)|#(?=\\()/i,\"block-arguments\":{pattern:/(\\[\\s*):[^\\[|]*?\\|/,lookbehind:!0,inside:{variable:/:[\\da-z]+/i,punctuation:/\\|/}},\"temporary-variables\":{pattern:/\\|[^|]+\\|/,inside:{variable:/[\\da-z]+/i,punctuation:/\\|/}},keyword:/\\b(?:nil|true|false|self|super|new)\\b/,character:{pattern:/\\$./,alias:\"string\"},number:[/\\d+r-?[\\dA-Z]+(?:\\.[\\dA-Z]+)?(?:e-?\\d+)?/,/(?:\\B-|\\b)\\d+(?:\\.\\d+)?(?:e-?\\d+)?/],operator:/[<=]=?|:=|~[~=]|\\/\\/?|\\\\\\\\|>[>=]?|[!^+\\-*&|,@]/,punctuation:/[.;:?\\[\\](){}]/};\n!function(e){var t=/\\{\\*[\\w\\W]+?\\*\\}|\\{[\\w\\W]+?\\}/g,a=\"{literal}\",n=\"{/literal}\",o=!1;e.languages.smarty=e.languages.extend(\"markup\",{smarty:{pattern:t,inside:{delimiter:{pattern:/^\\{|\\}$/i,alias:\"punctuation\"},string:/([\"'])(?:\\\\?.)*?\\1/,number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+(?:[Ee][-+]?\\d+)?)\\b/,variable:[/\\$(?!\\d)\\w+/,/#(?!\\d)\\w+#/,{pattern:/(\\.|->)(?!\\d)\\w+/,lookbehind:!0},{pattern:/(\\[)(?!\\d)\\w+(?=\\])/,lookbehind:!0}],\"function\":[{pattern:/(\\|\\s*)@?(?!\\d)\\w+/,lookbehind:!0},/^\\/?(?!\\d)\\w+/,/(?!\\d)\\w+(?=\\()/],\"attr-name\":{pattern:/\\w+\\s*=\\s*(?:(?!\\d)\\w+)?/,inside:{variable:{pattern:/(=\\s*)(?!\\d)\\w+/,lookbehind:!0},operator:/=/}},punctuation:[/[\\[\\]().,:`]|\\->/],operator:[/[+\\-*\\/%]|==?=?|[!<>]=?|&&|\\|\\|?/,/\\bis\\s+(?:not\\s+)?(?:div|even|odd)(?:\\s+by)?\\b/,/\\b(?:eq|neq?|gt|lt|gt?e|lt?e|not|mod|or|and)\\b/],keyword:/\\b(?:false|off|on|no|true|yes)\\b/}}}),e.languages.insertBefore(\"smarty\",\"tag\",{\"smarty-comment\":{pattern:/\\{\\*[\\w\\W]*?\\*\\}/,alias:[\"smarty\",\"comment\"]}}),e.hooks.add(\"before-highlight\",function(e){\"smarty\"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(t,function(t){return t===n&&(o=!1),o?t:(t===a&&(o=!0),e.tokenStack.push(t),\"___SMARTY\"+e.tokenStack.length+\"___\")}))}),e.hooks.add(\"before-insert\",function(e){\"smarty\"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),e.hooks.add(\"after-highlight\",function(t){if(\"smarty\"===t.language){for(var a,n=0;a=t.tokenStack[n];n++)t.highlightedCode=t.highlightedCode.replace(\"___SMARTY\"+(n+1)+\"___\",e.highlight(a,t.grammar,\"smarty\").replace(/\\$/g,\"$$$$\"));t.element.innerHTML=t.highlightedCode}})}(Prism);\nPrism.languages.sql={comment:{pattern:/(^|[^\\\\])(?:\\/\\*[\\w\\W]*?\\*\\/|(?:--|\\/\\/|#).*)/,lookbehind:!0},string:{pattern:/(^|[^@\\\\])(\"|')(?:\\\\?[\\s\\S])*?\\2/,lookbehind:!0},variable:/@[\\w.$]+|@(\"|'|`)(?:\\\\?[\\s\\S])+?\\1/,\"function\":/\\b(?:COUNT|SUM|AVG|MIN|MAX|FIRST|LAST|UCASE|LCASE|MID|LEN|ROUND|NOW|FORMAT)(?=\\s*\\()/i,keyword:/\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR VARYING|CHARACTER (?:SET|VARYING)|CHARSET|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|DATA(?:BASES?)?|DATETIME|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE(?: PRECISION)?|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE KEY|ELSE|ENABLE|ENCLOSED BY|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPE(?:D BY)?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTO|INVOKER|ISOLATION LEVEL|JOIN|KEYS?|KILL|LANGUAGE SQL|LAST|LEFT|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MODIFIES SQL DATA|MODIFY|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL(?: CHAR VARYING| CHARACTER(?: VARYING)?| VARCHAR)?|NATURAL|NCHAR(?: VARCHAR)?|NEXT|NO(?: SQL|CHECK|CYCLE)?|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READ(?:S SQL DATA|TEXT)?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEATABLE|REPLICATION|REQUIRE|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE MODE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|START(?:ING BY)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED BY|TEXT(?:SIZE)?|THEN|TIMESTAMP|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNPIVOT|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?)\\b/i,\"boolean\":/\\b(?:TRUE|FALSE|NULL)\\b/i,number:/\\b-?(?:0x)?\\d*\\.?[\\da-f]+\\b/,operator:/[-+*\\/=%^~]|&&?|\\|?\\||!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,punctuation:/[;[\\]()`,.]/};\n!function(n){var t={url:/url\\(([\"']?).*?\\1\\)/i,string:/(\"|')(?:[^\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*?\\1/,interpolation:null,func:null,important:/\\B!(?:important|optional)\\b/i,keyword:{pattern:/(^|\\s+)(?:(?:if|else|for|return|unless)(?=\\s+|$)|@[\\w-]+)/,lookbehind:!0},hexcode:/#[\\da-f]{3,6}/i,number:/\\b\\d+(?:\\.\\d+)?%?/,\"boolean\":/\\b(?:true|false)\\b/,operator:[/~|[+!\\/%<>?=]=?|[-:]=|\\*[*=]?|\\.+|&&|\\|\\||\\B-\\B|\\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\\b/],punctuation:/[{}()\\[\\];:,]/};t.interpolation={pattern:/\\{[^\\r\\n}:]+\\}/,alias:\"variable\",inside:n.util.clone(t)},t.func={pattern:/[\\w-]+\\([^)]*\\).*/,inside:{\"function\":/^[^(]+/,rest:n.util.clone(t)}},n.languages.stylus={comment:{pattern:/(^|[^\\\\])(\\/\\*[\\w\\W]*?\\*\\/|\\/\\/.*)/,lookbehind:!0},\"atrule-declaration\":{pattern:/(^\\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\\w-]+/,rest:t}},\"variable-declaration\":{pattern:/(^[ \\t]*)[\\w$-]+\\s*.?=[ \\t]*(?:(?:\\{[^}]*\\}|.+)|$)/m,lookbehind:!0,inside:{variable:/^\\S+/,rest:t}},statement:{pattern:/(^[ \\t]*)(?:if|else|for|return|unless)[ \\t]+.+/m,lookbehind:!0,inside:{keyword:/^\\S+/,rest:t}},\"property-declaration\":{pattern:/((?:^|\\{)([ \\t]*))(?:[\\w-]|\\{[^}\\r\\n]+\\})+(?:\\s*:\\s*|[ \\t]+)[^{\\r\\n]*(?:;|[^{\\r\\n,](?=$)(?!(\\r?\\n|\\r)(?:\\{|\\2[ \\t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \\t]*)(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\))?|\\{[^}\\r\\n]+\\})+)(?:(?:\\r?\\n|\\r)(?:\\1(?:(?=\\S)(?:[^{}\\r\\n:()]|::?[\\w-]+(?:\\([^)\\r\\n]*\\))?|\\{[^}\\r\\n]+\\})+)))*(?:,$|\\{|(?=(?:\\r?\\n|\\r)(?:\\{|\\1[ \\t]+)))/m,lookbehind:!0,inside:{interpolation:t.interpolation,punctuation:/[{},]/}},func:t.func,string:t.string,interpolation:t.interpolation,punctuation:/[{}()\\[\\];:.]/}}(Prism);\nPrism.languages.swift=Prism.languages.extend(\"clike\",{string:{pattern:/(\"|')(\\\\(?:\\((?:[^()]|\\([^)]+\\))+\\)|\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,inside:{interpolation:{pattern:/\\\\\\((?:[^()]|\\([^)]+\\))+\\)/,inside:{delimiter:{pattern:/^\\\\\\(|\\)$/,alias:\"variable\"}}}}},keyword:/\\b(as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|Protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\\b/,number:/\\b([\\d_]+(\\.[\\de_]+)?|0x[a-f0-9_]+(\\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b/i,constant:/\\b(nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\\b/,atrule:/@\\b(IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure)\\b/,builtin:/\\b([A-Z]\\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.swift);\nPrism.languages.tcl={comment:{pattern:/(^|[^\\\\])#.*/,lookbehind:!0},string:/\"(?:[^\"\\\\\\r\\n]|\\\\(?:\\r\\n|[\\s\\S]))*\"/,variable:[{pattern:/(\\$)(?:::)?(?:[a-zA-Z0-9]+::)*[a-zA-Z0-9_]+/,lookbehind:!0},{pattern:/(\\$){[^}]+}/,lookbehind:!0},{pattern:/(^\\s*set[ \\t]+)(?:::)?(?:[a-zA-Z0-9]+::)*[a-zA-Z0-9_]+/m,lookbehind:!0}],\"function\":{pattern:/(^\\s*proc[ \\t]+)[^\\s]+/m,lookbehind:!0},builtin:[{pattern:/(^\\s*)(?:proc|return|class|error|eval|exit|for|foreach|if|switch|while|break|continue)\\b/m,lookbehind:!0},/\\b(elseif|else)\\b/],scope:{pattern:/(^\\s*)(global|upvar|variable)\\b/m,lookbehind:!0,alias:\"constant\"},keyword:{pattern:/(^\\s*|\\[)(after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|Safe_Base|scan|seek|set|socket|source|split|string|subst|Tcl|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|wordBreak(?:After|Before)|test|vars)|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\\b/m,lookbehind:!0},operator:/!=?|\\*\\*?|==|&&?|\\|\\|?|<[=<]?|>[=>]?|[-+~\\/%?^]|\\b(?:eq|ne|in|ni)\\b/,punctuation:/[{}()\\[\\]]/};\n!function(e){var i=\"(?:\\\\([^|)]+\\\\)|\\\\[[^\\\\]]+\\\\]|\\\\{[^}]+\\\\})+\",n={css:{pattern:/\\{[^}]+\\}/,inside:{rest:e.languages.css}},\"class-id\":{pattern:/(\\()[^)]+(?=\\))/,lookbehind:!0,alias:\"attr-value\"},lang:{pattern:/(\\[)[^\\]]+(?=\\])/,lookbehind:!0,alias:\"attr-value\"},punctuation:/[\\\\\\/]\\d+|\\S/};e.languages.textile=e.languages.extend(\"markup\",{phrase:{pattern:/(^|\\r|\\n)\\S[\\s\\S]*?(?=$|\\r?\\n\\r?\\n|\\r\\r)/,lookbehind:!0,inside:{\"block-tag\":{pattern:RegExp(\"^[a-z]\\\\w*(?:\"+i+\"|[<>=()])*\\\\.\"),inside:{modifier:{pattern:RegExp(\"(^[a-z]\\\\w*)(?:\"+i+\"|[<>=()])+(?=\\\\.)\"),lookbehind:!0,inside:e.util.clone(n)},tag:/^[a-z]\\w*/,punctuation:/\\.$/}},list:{pattern:RegExp(\"^[*#]+(?:\"+i+\")?\\\\s+.+\",\"m\"),inside:{modifier:{pattern:RegExp(\"(^[*#]+)\"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/^[*#]+/}},table:{pattern:RegExp(\"^(?:(?:\"+i+\"|[<>=()^~])+\\\\.\\\\s*)?(?:\\\\|(?:(?:\"+i+\"|[<>=()^~_]|[\\\\\\\\/]\\\\d+)+\\\\.)?[^|]*)+\\\\|\",\"m\"),inside:{modifier:{pattern:RegExp(\"(^|\\\\|(?:\\\\r?\\\\n|\\\\r)?)(?:\"+i+\"|[<>=()^~_]|[\\\\\\\\/]\\\\d+)+(?=\\\\.)\"),lookbehind:!0,inside:e.util.clone(n)},punctuation:/\\||^\\./}},inline:{pattern:RegExp(\"(\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])(?:\"+i+\")?.+?\\\\1\"),inside:{bold:{pattern:RegExp(\"((^\\\\*\\\\*?)(?:\"+i+\")?).+?(?=\\\\2)\"),lookbehind:!0},italic:{pattern:RegExp(\"((^__?)(?:\"+i+\")?).+?(?=\\\\2)\"),lookbehind:!0},cite:{pattern:RegExp(\"(^\\\\?\\\\?(?:\"+i+\")?).+?(?=\\\\?\\\\?)\"),lookbehind:!0,alias:\"string\"},code:{pattern:RegExp(\"(^@(?:\"+i+\")?).+?(?=@)\"),lookbehind:!0,alias:\"keyword\"},inserted:{pattern:RegExp(\"(^\\\\+(?:\"+i+\")?).+?(?=\\\\+)\"),lookbehind:!0},deleted:{pattern:RegExp(\"(^-(?:\"+i+\")?).+?(?=-)\"),lookbehind:!0},span:{pattern:RegExp(\"(^%(?:\"+i+\")?).+?(?=%)\"),lookbehind:!0},modifier:{pattern:RegExp(\"(^\\\\*\\\\*|__|\\\\?\\\\?|[*_%@+\\\\-^~])\"+i),lookbehind:!0,inside:e.util.clone(n)},punctuation:/[*_%?@+\\-^~]+/}},\"link-ref\":{pattern:/^\\[[^\\]]+\\]\\S+$/m,inside:{string:{pattern:/(\\[)[^\\]]+(?=\\])/,lookbehind:!0},url:{pattern:/(\\])\\S+$/,lookbehind:!0},punctuation:/[\\[\\]]/}},link:{pattern:RegExp('\"(?:'+i+')?[^\"]+\":.+?(?=[^\\\\w/]?(?:\\\\s|$))'),inside:{text:{pattern:RegExp('(^\"(?:'+i+')?)[^\"]+(?=\")'),lookbehind:!0},modifier:{pattern:RegExp('(^\")'+i),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[\":]/}},image:{pattern:RegExp(\"!(?:\"+i+\"|[<>=()])*[^!\\\\s()]+(?:\\\\([^)]+\\\\))?!(?::.+?(?=[^\\\\w/]?(?:\\\\s|$)))?\"),inside:{source:{pattern:RegExp(\"(^!(?:\"+i+\"|[<>=()])*)[^!\\\\s()]+(?:\\\\([^)]+\\\\))?(?=!)\"),lookbehind:!0,alias:\"url\"},modifier:{pattern:RegExp(\"(^!)(?:\"+i+\"|[<>=()])+\"),lookbehind:!0,inside:e.util.clone(n)},url:{pattern:/(:).+/,lookbehind:!0},punctuation:/[!:]/}},footnote:{pattern:/\\b\\[\\d+\\]/,alias:\"comment\",inside:{punctuation:/\\[|\\]/}},acronym:{pattern:/\\b[A-Z\\d]+\\([^)]+\\)/,inside:{comment:{pattern:/(\\()[^)]+(?=\\))/,lookbehind:!0},punctuation:/[()]/}},mark:{pattern:/\\b\\((TM|R|C)\\)/,alias:\"comment\",inside:{punctuation:/[()]/}}}}});var t={inline:e.util.clone(e.languages.textile.phrase.inside.inline),link:e.util.clone(e.languages.textile.phrase.inside.link),image:e.util.clone(e.languages.textile.phrase.inside.image),footnote:e.util.clone(e.languages.textile.phrase.inside.footnote),acronym:e.util.clone(e.languages.textile.phrase.inside.acronym),mark:e.util.clone(e.languages.textile.phrase.inside.mark)};e.languages.textile.phrase.inside.inline.inside.bold.inside=t,e.languages.textile.phrase.inside.inline.inside.italic.inside=t,e.languages.textile.phrase.inside.inline.inside.inserted.inside=t,e.languages.textile.phrase.inside.inline.inside.deleted.inside=t,e.languages.textile.phrase.inside.inline.inside.span.inside=t,e.languages.textile.phrase.inside.table.inside.inline=t.inline,e.languages.textile.phrase.inside.table.inside.link=t.link,e.languages.textile.phrase.inside.table.inside.image=t.image,e.languages.textile.phrase.inside.table.inside.footnote=t.footnote,e.languages.textile.phrase.inside.table.inside.acronym=t.acronym,e.languages.textile.phrase.inside.table.inside.mark=t.mark}(Prism);\nPrism.languages.twig={comment:/\\{#[\\s\\S]*?#\\}/,tag:{pattern:/\\{\\{[\\s\\S]*?\\}\\}|\\{%[\\s\\S]*?%\\}/,inside:{ld:{pattern:/^(?:\\{\\{\\-?|\\{%\\-?\\s*\\w+)/,inside:{punctuation:/^(?:\\{\\{|\\{%)\\-?/,keyword:/\\w+/}},rd:{pattern:/\\-?(?:%\\}|\\}\\})$/,inside:{punctuation:/.*/}},string:{pattern:/(\"|')(?:\\\\?.)*?\\1/,inside:{punctuation:/^['\"]|['\"]$/}},keyword:/\\b(?:even|if|odd)\\b/,\"boolean\":/\\b(?:true|false|null)\\b/,number:/\\b-?(?:0x[\\dA-Fa-f]+|\\d*\\.?\\d+([Ee][-+]?\\d+)?)\\b/,operator:[{pattern:/(\\s)(?:and|b\\-and|b\\-xor|b\\-or|ends with|in|is|matches|not|or|same as|starts with)(?=\\s)/,lookbehind:!0},/[=<>]=?|!=|\\*\\*?|\\/\\/?|\\?:?|[-+~%|]/],property:/\\b[a-zA-Z_][a-zA-Z0-9_]*\\b/,punctuation:/[()\\[\\]{}:.,]/}},other:{pattern:/\\S(?:[\\s\\S]*\\S)?/,inside:Prism.languages.markup}};\nPrism.languages.typescript=Prism.languages.extend(\"javascript\",{keyword:/\\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield|module|declare|constructor|string|Function|any|number|boolean|Array|enum)\\b/});\nPrism.languages.verilog={comment:/\\/\\/.*|\\/\\*[\\w\\W]*?\\*\\//,string:/\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"/,property:/\\B\\$\\w+\\b/,constant:/\\B`\\w+\\b/,\"function\":/[a-z\\d_]+(?=\\()/i,keyword:/\\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|class|case|casex|casez|cell|chandle|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endspecify|endsequence|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\\b/,important:/\\b(?:always_latch|always_comb|always_ff|always)\\b ?@?/,number:/\\B##?\\d+|(?:\\b\\d+)?'[odbh] ?[\\da-fzx_?]+|\\b\\d*[._]?\\d+(?:e[-+]?\\d+)?/i,operator:/[-+{}^~%*\\/?=!<>&|]+/,punctuation:/[[\\];(),.:]/};\nPrism.languages.vhdl={comment:/--.+/,\"vhdl-vectors\":{pattern:/\\b[oxb]\"[\\da-f_]+\"|\"[01uxzwlh-]+\"/i,alias:\"number\"},\"quoted-function\":{pattern:/\"\\S+?\"(?=\\()/,alias:\"function\"},string:/\"(?:[^\\\\\\r\\n]|\\\\?(?:\\r\\n|[\\s\\S]))*?\"/,constant:/\\b(?:use|library)\\b/i,keyword:/\\b(?:'active|'ascending|'base|'delayed|'driving|'driving_value|'event|'high|'image|'instance_name|'last_active|'last_event|'last_value|'left|'leftof|'length|'low|'path_name|'pos|'pred|'quiet|'range|'reverse_range|'right|'rightof|'simple_name|'stable|'succ|'transaction|'val|'value|access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with)\\b/i,\"boolean\":/\\b(?:true|false)\\b/i,\"function\":/[a-z0-9_]+(?=\\()/i,number:/'[01uxzwlh-]'|\\b(?:\\d+#[\\da-f_.]+#|\\d[\\d_.]*)(?:e[-+]?\\d+)?/i,operator:/[<>]=?|:=|[-+*\\/&=]|\\b(?:abs|not|mod|rem|sll|srl|sla|sra|rol|ror|and|or|nand|xnor|xor|nor)\\b/i,punctuation:/[{}[\\];(),.:]/};\nPrism.languages.vim={string:/\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\r\\n]|'')*'/,comment:/\".*/,\"function\":/\\w+(?=\\()/,keyword:/\\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|sm|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\\b/,builtin:/\\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\\b/,number:/\\b(?:0x[\\da-f]+|\\d+(?:\\.\\d+)?)\\b/i,operator:/\\|\\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\\/%?]|\\b(?:is(?:not)?)\\b/,punctuation:/[{}[\\](),;:]/};\nPrism.languages.wiki=Prism.languages.extend(\"markup\",{\"block-comment\":{pattern:/(^|[^\\\\])\\/\\*[\\w\\W]*?\\*\\//,lookbehind:!0,alias:\"comment\"},heading:{pattern:/^(=+).+?\\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\\1/,inside:{\"bold italic\":{pattern:/(''''').+?(?=\\1)/,lookbehind:!0},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:\"punctuation\"},url:[/ISBN +(?:97[89][ -]?)?(?:\\d[ -]?){9}[\\dx]\\b|(?:RFC|PMID) +\\d+/i,/\\[\\[.+?\\]\\]|\\[.+?\\]/],variable:[/__[A-Z]+__/,/\\{{3}.+?\\}{3}/,/\\{\\{.+?}}/],symbol:[/^#redirect/im,/~{3,5}/],\"table-tag\":{pattern:/((?:^|[|!])[|!])[^|\\r\\n]+\\|(?!\\|)/m,lookbehind:!0,inside:{\"table-bar\":{pattern:/\\|$/,alias:\"punctuation\"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\\{\\||\\|\\}|\\|-|[*#:;!|])|\\|\\||!!/m}),Prism.languages.insertBefore(\"wiki\",\"tag\",{nowiki:{pattern:/<(nowiki|pre|source)\\b[\\w\\W]*?>[\\w\\W]*?<\\/\\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\\b[\\w\\W]*?>|<\\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}});\nPrism.languages.yaml={scalar:{pattern:/([\\-:]\\s*(![^\\s]+)?[ \\t]*[|>])[ \\t]*(?:((?:\\r?\\n|\\r)[ \\t]+)[^\\r\\n]+(?:\\3[^\\r\\n]+)*)/,lookbehind:!0,alias:\"string\"},comment:/#.*/,key:{pattern:/(\\s*[:\\-,[{\\r\\n?][ \\t]*(![^\\s]+)?[ \\t]*)[^\\r\\n{[\\]},#]+?(?=\\s*:\\s)/,lookbehind:!0,alias:\"atrule\"},directive:{pattern:/(^[ \\t]*)%.+/m,lookbehind:!0,alias:\"important\"},datetime:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(\\d{4}-\\d\\d?-\\d\\d?([tT]|[ \\t]+)\\d\\d?:\\d{2}:\\d{2}(\\.\\d*)?[ \\t]*(Z|[-+]\\d\\d?(:\\d{2})?)?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(:\\d{2}(\\.\\d*)?)?)(?=[ \\t]*($|,|]|}))/m,lookbehind:!0,alias:\"number\"},\"boolean\":{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(true|false)[ \\t]*(?=$|,|]|})/im,lookbehind:!0,alias:\"important\"},\"null\":{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(null|~)[ \\t]*(?=$|,|]|})/im,lookbehind:!0,alias:\"important\"},string:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*')(?=[ \\t]*($|,|]|}))/m,lookbehind:!0},number:{pattern:/([:\\-,[{]\\s*(![^\\s]+)?[ \\t]*)[+\\-]?(0x[\\da-f]+|0o[0-7]+|(\\d+\\.?\\d*|\\.?\\d+)(e[\\+\\-]?\\d+)?|\\.inf|\\.nan)[ \\t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\\s]+/,important:/[&*][\\w]+/,punctuation:/---|[:[\\]{}\\-,|>?]|\\.\\.\\./};\n"
  },
  {
    "path": "web-repl/sha1.js",
    "content": "/*\n A JavaScript implementation of the SHA family of hashes, as\n defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding\n HMAC implementation as defined in FIPS PUB 198a\n\n Copyright Brian Turek 2008-2017\n Distributed under the BSD License\n See http://caligatio.github.com/jsSHA/ for more information\n\n Several functions taken from Paul Johnston\n*/\n(function(G){function x(b,a,d){var c=0,e=[],h=0,l=!1,f=[],g=[],q=!1;d=d||{};var r=d.encoding||\"UTF8\";var k=d.numRounds||1;if(k!==parseInt(k,10)||1>k)throw Error(\"numRounds must a integer >= 1\");if(\"SHA-1\"===b){var n=512;var y=z;var m=H;var p=160;var t=function(c){return c.slice()}}else throw Error(\"Chosen SHA variant is not supported\");var v=A(a,r);var u=w(b);this.setHMACKey=function(e,a,d){if(!0===l)throw Error(\"HMAC key already set\");if(!0===q)throw Error(\"Cannot set HMAC key after calling update\");\nr=(d||{}).encoding||\"UTF8\";a=A(a,r)(e);e=a.binLen;a=a.value;var h=n>>>3;d=h/4-1;if(h<e/8){for(a=m(a,e,0,w(b),p);a.length<=d;)a.push(0);a[d]&=4294967040}else if(h>e/8){for(;a.length<=d;)a.push(0);a[d]&=4294967040}for(e=0;e<=d;e+=1)f[e]=a[e]^909522486,g[e]=a[e]^1549556828;u=y(f,u);c=n;l=!0};this.update=function(a){var d,b=0,l=n>>>5;var f=v(a,e,h);a=f.binLen;var g=f.value;f=a>>>5;for(d=0;d<f;d+=l)b+n<=a&&(u=y(g.slice(d,d+l),u),b+=n);c+=b;e=g.slice(b>>>5);h=a%n;q=!0};this.getHash=function(a,d){if(!0===\nl)throw Error(\"Cannot call getHash after setting HMAC key\");var f=B(d);switch(a){case \"HEX\":a=function(a){return C(a,p,f)};break;case \"B64\":a=function(a){return D(a,p,f)};break;case \"BYTES\":a=function(a){return E(a,p)};break;case \"ARRAYBUFFER\":try{d=new ArrayBuffer(0)}catch(I){throw Error(\"ARRAYBUFFER not supported by this environment\");}a=function(a){return F(a,p)};break;default:throw Error(\"format must be HEX, B64, BYTES, or ARRAYBUFFER\");}var g=m(e.slice(),h,c,t(u),p);for(d=1;d<k;d+=1)g=m(g,p,\n0,w(b),p);return a(g)};this.getHMAC=function(a,d){if(!1===l)throw Error(\"Cannot call getHMAC without first setting HMAC key\");var f=B(d);switch(a){case \"HEX\":a=function(a){return C(a,p,f)};break;case \"B64\":a=function(a){return D(a,p,f)};break;case \"BYTES\":a=function(a){return E(a,p)};break;case \"ARRAYBUFFER\":try{a=new ArrayBuffer(0)}catch(I){throw Error(\"ARRAYBUFFER not supported by this environment\");}a=function(a){return F(a,p)};break;default:throw Error(\"outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER\");\n}d=m(e.slice(),h,c,t(u),p);var k=y(g,w(b));k=m(d,p,n,k,p);return a(k)}}function C(b,a,d){var c=\"\";a/=8;var e;for(e=0;e<a;e+=1){var h=b[e>>>2]>>>8*(3+e%4*-1);c+=\"0123456789abcdef\".charAt(h>>>4&15)+\"0123456789abcdef\".charAt(h&15)}return d.outputUpper?c.toUpperCase():c}function D(b,a,d){var c=\"\",e=a/8,h;for(h=0;h<e;h+=3){var l=h+1<e?b[h+1>>>2]:0;var f=h+2<e?b[h+2>>>2]:0;f=(b[h>>>2]>>>8*(3+h%4*-1)&255)<<16|(l>>>8*(3+(h+1)%4*-1)&255)<<8|f>>>8*(3+(h+2)%4*-1)&255;for(l=0;4>l;l+=1)8*h+6*l<=a?c+=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(f>>>\n6*(3-l)&63):c+=d.b64Pad}return c}function E(b,a){var d=\"\";a/=8;var c;for(c=0;c<a;c+=1){var e=b[c>>>2]>>>8*(3+c%4*-1)&255;d+=String.fromCharCode(e)}return d}function F(b,a){a/=8;var d,c=new ArrayBuffer(a);var e=new Uint8Array(c);for(d=0;d<a;d+=1)e[d]=b[d>>>2]>>>8*(3+d%4*-1)&255;return c}function B(b){var a={outputUpper:!1,b64Pad:\"=\",shakeLen:-1};b=b||{};a.outputUpper=b.outputUpper||!1;!0===b.hasOwnProperty(\"b64Pad\")&&(a.b64Pad=b.b64Pad);b.hasOwnProperty(\"shakeLen\");if(\"boolean\"!==typeof a.outputUpper)throw Error(\"Invalid outputUpper formatting option\");\nif(\"string\"!==typeof a.b64Pad)throw Error(\"Invalid b64Pad formatting option\");return a}function A(b,a){switch(a){case \"UTF8\":case \"UTF16BE\":case \"UTF16LE\":break;default:throw Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\");}switch(b){case \"HEX\":b=function(a,c,e){var d=a.length,b,f;if(d%2)throw Error(\"String of HEX type must be in byte increments\");c=c||[0];e=e||0;var g=e>>>3;for(b=0;b<d;b+=2){var q=parseInt(a.substr(b,2),16);if(isNaN(q))throw Error(\"String of HEX type contains invalid characters\");\nvar r=(b>>>1)+g;for(f=r>>>2;c.length<=f;)c.push(0);c[f]|=q<<8*(3+r%4*-1)}return{value:c,binLen:4*d+e}};break;case \"TEXT\":b=function(d,c,e){var b=0,l,f,g;c=c||[0];e=e||0;var q=e>>>3;if(\"UTF8\"===a){var r=3;for(l=0;l<d.length;l+=1){var k=d.charCodeAt(l);var n=[];128>k?n.push(k):2048>k?(n.push(192|k>>>6),n.push(128|k&63)):55296>k||57344<=k?n.push(224|k>>>12,128|k>>>6&63,128|k&63):(l+=1,k=65536+((k&1023)<<10|d.charCodeAt(l)&1023),n.push(240|k>>>18,128|k>>>12&63,128|k>>>6&63,128|k&63));for(f=0;f<n.length;f+=\n1){var m=b+q;for(g=m>>>2;c.length<=g;)c.push(0);c[g]|=n[f]<<8*(r+m%4*-1);b+=1}}}else if(\"UTF16BE\"===a||\"UTF16LE\"===a)for(r=2,n=\"UTF16LE\"===a&&!0||\"UTF16LE\"!==a&&!1,l=0;l<d.length;l+=1){k=d.charCodeAt(l);!0===n&&(f=k&255,k=f<<8|k>>>8);m=b+q;for(g=m>>>2;c.length<=g;)c.push(0);c[g]|=k<<8*(r+m%4*-1);b+=2}return{value:c,binLen:8*b+e}};break;case \"B64\":b=function(a,c,e){var d=0,b,f;if(-1===a.search(/^[a-zA-Z0-9=+\\/]+$/))throw Error(\"Invalid character in base-64 string\");var g=a.indexOf(\"=\");a=a.replace(/\\=/g,\n\"\");if(-1!==g&&g<a.length)throw Error(\"Invalid '=' found in base-64 string\");c=c||[0];e=e||0;var q=e>>>3;for(g=0;g<a.length;g+=4){var m=a.substr(g,4);for(b=f=0;b<m.length;b+=1){var k=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".indexOf(m[b]);f|=k<<18-6*b}for(b=0;b<m.length-1;b+=1){var n=d+q;for(k=n>>>2;c.length<=k;)c.push(0);c[k]|=(f>>>16-8*b&255)<<8*(3+n%4*-1);d+=1}}return{value:c,binLen:8*d+e}};break;case \"BYTES\":b=function(a,c,b){var d;c=c||[0];b=b||0;var e=b>>>3;for(d=0;d<\na.length;d+=1){var f=a.charCodeAt(d);var g=d+e;var m=g>>>2;c.length<=m&&c.push(0);c[m]|=f<<8*(3+g%4*-1)}return{value:c,binLen:8*a.length+b}};break;case \"ARRAYBUFFER\":try{b=new ArrayBuffer(0)}catch(d){throw Error(\"ARRAYBUFFER not supported by this environment\");}b=function(a,c,b){var d;c=c||[0];b=b||0;var e=b>>>3;var f=new Uint8Array(a);for(d=0;d<a.byteLength;d+=1){var g=d+e;var m=g>>>2;c.length<=m&&c.push(0);c[m]|=f[d]<<8*(3+g%4*-1)}return{value:c,binLen:8*a.byteLength+b}};break;default:throw Error(\"format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER\");\n}return b}function m(b,a){return b<<a|b>>>32-a}function t(b,a){var d=(b&65535)+(a&65535);return((b>>>16)+(a>>>16)+(d>>>16)&65535)<<16|d&65535}function v(b,a,d,c,e){var h=(b&65535)+(a&65535)+(d&65535)+(c&65535)+(e&65535);return((b>>>16)+(a>>>16)+(d>>>16)+(c>>>16)+(e>>>16)+(h>>>16)&65535)<<16|h&65535}function w(b){if(\"SHA-1\"===b)b=[1732584193,4023233417,2562383102,271733878,3285377520];else throw Error(\"No SHA variants supported\");return b}function z(b,a){var d=[],c;var e=a[0];var h=a[1];var l=a[2];\nvar f=a[3];var g=a[4];for(c=0;80>c;c+=1){d[c]=16>c?b[c]:m(d[c-3]^d[c-8]^d[c-14]^d[c-16],1);var q=20>c?v(m(e,5),h&l^~h&f,g,1518500249,d[c]):40>c?v(m(e,5),h^l^f,g,1859775393,d[c]):60>c?v(m(e,5),h&l^h&f^l&f,g,2400959708,d[c]):v(m(e,5),h^l^f,g,3395469782,d[c]);g=f;f=l;l=m(h,30);h=e;e=q}a[0]=t(e,a[0]);a[1]=t(h,a[1]);a[2]=t(l,a[2]);a[3]=t(f,a[3]);a[4]=t(g,a[4]);return a}function H(b,a,d,c){var e;for(e=(a+65>>>9<<4)+15;b.length<=e;)b.push(0);b[a>>>5]|=128<<24-a%32;a+=d;b[e]=a&4294967295;b[e-1]=a/4294967296|\n0;a=b.length;for(e=0;e<a;e+=16)c=z(b.slice(e,e+16),c);return c}\"undefined\"!==typeof exports?(\"undefined\"!==typeof module&&module.exports&&(module.exports=x),exports=x):G.jsSHA=x})(this);\n"
  }
]