diff --git a/.github/workflows/binaries.yml b/.github/workflows/binaries.yml deleted file mode 100644 index b0324230..00000000 --- a/.github/workflows/binaries.yml +++ /dev/null @@ -1,254 +0,0 @@ -name: "binaries" - -on: [push] - -jobs: - generate-headers: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - - uses: leafo/gh-actions-lua@master - with: - luaVersion: "5.1" - - - uses: leafo/gh-actions-luarocks@master - - - name: Install dependencies - run: | - luarocks install argparse - luarocks make - - - name: Generate moonscript.h - run: | - bin/splat.moon -l moonscript moonscript moon > moonscript.lua - xxd -i moonscript.lua > bin/binaries/moonscript.h - - - name: Generate moon.h - run: | - awk 'FNR>1' bin/moon > moon.lua - xxd -i moon.lua > bin/binaries/moon.h - - - name: Generate argparse.h - run: | - luarocks install argparse --tree=lua_modules - bin/splat.moon --strip-prefix -l argparse $(find lua_modules/share/lua -name "argparse.lua" -exec dirname {} \; | head -1) > bin/binaries/argparse.lua - xxd -i -n argparse_lua bin/binaries/argparse.lua > bin/binaries/argparse.h - - - name: Generate moonc.h - run: | - awk 'FNR>1' bin/moonc > moonc.lua - xxd -i moonc.lua > bin/binaries/moonc.h - - - name: Upload headers - uses: actions/upload-artifact@v6 - with: - name: generated-headers - path: bin/binaries/*.h - - linux: - runs-on: ubuntu-latest - needs: generate-headers - - strategy: - matrix: - lua_version: ["5.1.5"] - - steps: - - uses: actions/checkout@master - - - name: Set version suffix - run: | - if [[ "${{ github.ref_type }}" == "tag" ]]; then - echo "VERSION_SUFFIX=${{ github.ref_name }}" >> $GITHUB_ENV - else - echo "VERSION_SUFFIX=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - fi - - - name: Download headers - uses: actions/download-artifact@v4 - with: - name: generated-headers - path: bin/binaries/ - - - name: Show GCC - run: gcc -v - - - name: Setup Lua - run: | - curl -L -O https://www.lua.org/ftp/lua-${{ matrix.lua_version }}.tar.gz - tar -xzf lua-${{ matrix.lua_version }}.tar.gz - cd lua-${{ matrix.lua_version }}/src && make liblua.a MYCFLAGS=-DLUA_USE_POSIX - - - name: Get LPeg - run: | - curl -L -o lpeg.tar.gz https://www.inf.puc-rio.br/~roberto/lpeg/lpeg-1.0.2.tar.gz - tar -xzf lpeg.tar.gz - - - name: Get Luafilesystem - run: | - curl -L -o luafilesystem.tar.gz https://github.com/keplerproject/luafilesystem/archive/v1_8_0.tar.gz - tar -xzf luafilesystem.tar.gz - - - name: Build - run: | - mkdir -p dist - gcc -static -o dist/moon \ - -Ilua-${{ matrix.lua_version }}/src/ \ - -Ilpeg-1.0.2/ \ - -Ibin/binaries/ \ - bin/binaries/moon.c \ - bin/binaries/moonscript.c \ - lpeg-1.0.2/lpvm.c \ - lpeg-1.0.2/lpcap.c \ - lpeg-1.0.2/lptree.c \ - lpeg-1.0.2/lpcode.c \ - lpeg-1.0.2/lpprint.c \ - lua-${{ matrix.lua_version }}/src/liblua.a \ - -lm -ldl - gcc -static -o dist/moonc \ - -Ilua-${{ matrix.lua_version }}/src/ \ - -Ilpeg-1.0.2/ \ - -Ibin/binaries/ \ - bin/binaries/moonc.c \ - bin/binaries/moonscript.c \ - lpeg-1.0.2/lpvm.c \ - lpeg-1.0.2/lpcap.c \ - lpeg-1.0.2/lptree.c \ - lpeg-1.0.2/lpcode.c \ - lpeg-1.0.2/lpprint.c \ - luafilesystem-1_8_0/src/lfs.c \ - lua-${{ matrix.lua_version }}/src/liblua.a \ - -lm -ldl - - - name: Test run - run: | - dist/moon -h - dist/moon -e 'print "hello world"' - dist/moonc -h - - - name: Upload artifact - uses: actions/upload-artifact@v6 - with: - name: moonscript-${{ env.VERSION_SUFFIX }}-linux-lua${{ matrix.lua_version }} - path: dist/ - - - name: Package for release - if: github.ref_type == 'tag' - run: | - cd dist - tar -czvf ../moonscript-${{ env.VERSION_SUFFIX }}-linux-x86_64.tar.gz * - - - name: Upload to release - if: github.ref_type == 'tag' - uses: softprops/action-gh-release@v2 - with: - files: moonscript-${{ env.VERSION_SUFFIX }}-linux-x86_64.tar.gz - - windows: - runs-on: windows-latest - needs: generate-headers - - strategy: - matrix: - lua_version: ["5.1.5"] - - defaults: - run: - shell: msys2 {0} - - steps: - - uses: actions/checkout@master - - - name: Download headers - uses: actions/download-artifact@v4 - with: - name: generated-headers - path: bin/binaries/ - - - uses: msys2/setup-msys2@v2 - with: - install: gcc make curl zip - - - name: Set version suffix - shell: bash - run: | - if [[ "${{ github.ref_type }}" == "tag" ]]; then - echo "VERSION_SUFFIX=${{ github.ref_name }}" >> $GITHUB_ENV - else - echo "VERSION_SUFFIX=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - fi - - - name: Show GCC - run: gcc -v - - - name: Setup Lua - run: | - curl -L -O https://www.lua.org/ftp/lua-${{ matrix.lua_version }}.tar.gz - tar -xzf lua-${{ matrix.lua_version }}.tar.gz - cd lua-${{ matrix.lua_version }}/src && make liblua.a - - - name: Get LPeg - run: | - curl -L -o lpeg.tar.gz https://www.inf.puc-rio.br/~roberto/lpeg/lpeg-1.0.2.tar.gz - tar -xzf lpeg.tar.gz - - - name: Get Luafilesystem - run: | - curl -L -o luafilesystem.tar.gz https://github.com/keplerproject/luafilesystem/archive/v1_8_0.tar.gz - tar -xzf luafilesystem.tar.gz - - - name: Build - run: | - mkdir -p dist - gcc -static -o dist/moon.exe \ - -Ilua-${{ matrix.lua_version }}/src/ \ - -Ilpeg-1.0.2/ \ - -Ibin/binaries/ \ - bin/binaries/moon.c \ - bin/binaries/moonscript.c \ - lpeg-1.0.2/lpvm.c \ - lpeg-1.0.2/lpcap.c \ - lpeg-1.0.2/lptree.c \ - lpeg-1.0.2/lpcode.c \ - lpeg-1.0.2/lpprint.c \ - lua-${{ matrix.lua_version }}/src/liblua.a \ - -lm - gcc -static -o dist/moonc.exe \ - -Ilua-${{ matrix.lua_version }}/src/ \ - -Ilpeg-1.0.2/ \ - -Ibin/binaries/ \ - bin/binaries/moonc.c \ - bin/binaries/moonscript.c \ - lpeg-1.0.2/lpvm.c \ - lpeg-1.0.2/lpcap.c \ - lpeg-1.0.2/lptree.c \ - lpeg-1.0.2/lpcode.c \ - lpeg-1.0.2/lpprint.c \ - luafilesystem-1_8_0/src/lfs.c \ - lua-${{ matrix.lua_version }}/src/liblua.a \ - -lm - - - name: Test run - run: | - dist/moon.exe -h - dist/moon.exe -e 'print "hello world"' - dist/moonc.exe -h - - - name: Upload artifact - uses: actions/upload-artifact@v6 - with: - name: moonscript-${{ env.VERSION_SUFFIX }}-windows-lua${{ matrix.lua_version }} - path: dist/ - - - name: Package for release - if: github.ref_type == 'tag' - run: | - cd dist - zip ../moonscript-${{ env.VERSION_SUFFIX }}-windows-x86_64.zip * - - - name: Upload to release - if: github.ref_type == 'tag' - uses: softprops/action-gh-release@v2 - with: - files: moonscript-${{ env.VERSION_SUFFIX }}-windows-x86_64.zip diff --git a/.github/workflows/spec.yml b/.github/workflows/spec.yml deleted file mode 100644 index 91707d8c..00000000 --- a/.github/workflows/spec.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: "spec" - -on: [push, pull_request] - -jobs: - test: - strategy: - fail-fast: false - matrix: - luaVersion: ["5.1", "5.2", "5.3", "5.4", "luajit", "luajit-openresty"] - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@master - - - uses: leafo/gh-actions-lua@master - with: - luaVersion: ${{ matrix.luaVersion }} - - - uses: leafo/gh-actions-luarocks@master - - - name: build - run: | - luarocks install busted - luarocks install loadkit - luarocks make - - - name: test - run: | - busted -o utfTerminal diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..879e1f0b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.o +*.exe +*.dll + +moon +moonc +*.so \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index dd9c43dc..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,578 +0,0 @@ - - -# MoonScript v0.5.0 (2016-9-25) - -## Syntax updates - -### Function calls - -Function calls with parentheses can now have free whitespace around the -arguments. Additionally, a line break may be used in place of a comma: - -```moonscript -my_func( - "first arg" - => - print "some func" - - "third arg", "fourth arg" -) -``` - -### Function argument definitions - -Just like the function all update, function argument definitions have no -whitespace restrictions between arguments, and line breaks can be used to -separate arguments: - - -```moonscript -some_func = ( - name - type - action="print" -) => - print name, type, action -``` - -## Additions - -* `elseif` can be used part of an `unless` block (nymphium) -* `unless` conditional expression can contain an assignment like an `if` statement (#251) -* Lua 5.3 bitwise operator support (nymphium) (Kawahara Satoru) -* Makefile is Lua version agnostic (nymphium) -* Lint flag can be used with `moonc` watch mode (ChickenNuggers) -* Lint exits with status 1 if there was a problem detected (ChickenNuggers) -* Compiler can be used with lulpeg - -## Bug Fixes - -* Slice boundaries can be full expressions (#233) -* Destructure works when used as loop variable in comprehension (#236) -* Proper name local hoisting works for classes again (#287) -* Quoted table key literals can now be parsed when table declaration is in single line (#286) -* Fix an issue where `else` could get attached to wrong `if` statement (#276) -* Loop variables will no longer overwrite variables of the same name in the same scope (egonSchiele) -* A file being deleted will not crash polling watch mode (ChickenNuggers) -* The compiler will not try to compile a directory ending in `.moon` (Gskartwii) -* alt_getopt import works with modern version (Jon Allen) -* Code coverage not being able to find file from chunk name - - -# MoonScript v0.4.0 (2015-12-06) - -## Changes to `super` - -`super` now looks up the parent method via the class reference, instead of a -(fixed) closure to the parent class. - -Given the following code: - -```moonscript -class MyThing extends OtherThing - the_method: => - super! -``` - -In the past `super` would compile to something like this: - -```lua -_parent_0.the_method(self) -``` - -Where `_parent_0` was an internal local variable that contains a reference to -the parent class. Because the reference to parent is an internal local -variable, you could never swap out the parent unless resorting to the debug -library. - -This version will compile to: - -```lua -_class_0.__parent.__base.the_method(self) -``` - -Where `_class_0` is an internal local variable that contains the current class (`MyThing`). - -Another difference is that the instance method is looked up on `__base` instead -of the class. The old variation would trigger the metamethod for looking up on -the instance, but a class method of the same name could conflict, take -precedence, and be retuned instead. By referencing `__base` directly we avoid -this issue. - -### Super on class methods - -`super` can now be used on class methods. It works exactly as you would expect. - -```moonscript -class MyThing extends OtherThing - @static_method: => - print super! -``` - -Calling `super` will compile to: - -```moonscript -_class_0.__parent.static_method(self) -``` - -### Improved scoping for super - -The scoping of super is more intelligent. You can warp your methods in other -code and `super` will still generate correctly. For example, syntax like this -will now work as expected: - -```moonscript -class Sub extends Base - value: if debugging - => super! + 100 - else - => super! + 10 - - other_value: some_decorator { - the_func: => - super! - } -``` - -`super` will refer to the lexically closest class declaration to find the name -of the method it should call on the parent. - -## Bug Fixes - -* Nested `with` blocks used incorrect ref (#214 by @geomaster) -* Lua quote string literals had wrong precedence (#200 by @nonchip) -* Returning from `with` block would generate two `return` statements (#208) -* Including `return` or `break` in a `continue` wrapped block would generate invalid code (#215 #190 #183) - -## Other - -* Refactor transformer out into multiple files -* `moon` command line script rewritten in MoonScript -* `moonscript.parse.build_grammar` function for getting new instance of parser grammar -* Chain AST updated to be simpler - -# MoonScript v0.3.2 (2015-6-01) - -## Bug Fixes - -* `package.moonpath` geneator does not use paths that don't end in `lua` - -# MoonScript v0.3.1 (2015-3-07) - -## Bug Fixes - -* Fixed a bug where an error from a previous compile would prevent the compiler from running again - -# MoonScript v0.3.0 (2015-2-28) - -## New Features - -* New [unused assignment linter](http://moonscript.org/reference/command_line.html#unused_variable_assigns) finds assignments that are never referenced after being defined. - -## Parsing Updates - -Whitespace parsing has been relaxed in a handful of locations: - -* You can put unrestricted whitespace/newlines after operator in a binary operator before writing the right hand side. The following are now valid: - -```moonscript -x = really_long_function! + - 2304 - -big_math = 123 / - 12 - - 43 * 17 - - -bool_exp = nice_shirt and cool_shoes or - skateboard and shades -``` - -* You can put unrestricted whitespace/newlines immediately after an opening parenthesis, and immediately before closing parenthesis. The following are now valid: - -```moonscript -hello = 100 + ( - var * 0.23 -) - 15 - - -funcall( - "height", "age", "weight" -) - - -takes_two_functions (-> - print "hello" -), -> - print "world" -``` - -* You can put unrestricted whitespace/newlines immediately after a `:` when defining a table literal. The following is now valid: - -```moonscript -x = { - hello: - call_a_function "football", "hut" -} -``` - -## Code Generation - -* Single value `import`/`destructure` compiles directly into single assignment - -## Bug Fixes - -* Some `moonc` command line flags were being ignored -* Linter would not report global reference when inside self assign in table -* Fixed an issue where parser would crash in Lpeg 0.12 when compiling hundreds of times per process - -## Misc - -* MoonScript parser now written in MoonScript - -# MoonScript v0.2.6 (2014-6-18) - -## Bug Fixes - -* Fixes to posmap generation for multi-line mappings and variable declarations -* Prefix file name with `@` when loading code so stack traces tread it as file -* Fix bug where `moonc` couldn't work with absolute paths -* Improve target file path generation for `moonc` - -# MoonScript v0.2.5 (2014-3-5) - -## New Things - -* New [code coverage tool](http://moonscript.org/reference/#code_coverage) built into `moonc` -* New [linting tool](http://moonscript.org/reference/#linter) built into `moonc`, identifies global variable references that don't pass whitelist -* Numbers can have `LL` and `ULL` suffixes for LuaJIT - -## Bug Fixes - -* Error messages from `moonc` are written to standard error -* Moonloader correctly throws error when moon file can't be parsed, instead of skipping the module -* Line number rewriting is no longer incorrectly offset due to multiline strings - -## Code Generation - -Bound functions will avoid creating an anonymous function unless necessary. - -```moonscript -x = hello\world -``` - -**Before:** - -```lua -local x = (function() - local _base_0 = hello - local _fn_0 = _base_0.world - return function(...) - return _fn_0(_base_0, ...) - end -end)() -``` - -**After:** - -```lua -local x -do - local _base_0 = hello - local _fn_0 = _base_0.world - x = function(...) - return _fn_0(_base_0, ...) - end -end -``` - -Explicit return statement now avoids creating anonymous function for statements -where return can be cascaded into the body. - -```moon --> - if test1 - return [x for x in *y] - - if test2 - return if true - "yes" - else - "no" - - false -``` - - -**Before:** - -```lua -local _ -_ = function() - if test1 then - return (function() - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = y - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() - end - if test2 then - return (function() - if true then - return "yes" - else - return "no" - end - end)() - end - return false -end -``` - -**After:** - -```lua -local _ -_ = function() - if test1 then - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = y - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 - end - if test2 then - if true then - return "yes" - else - return "no" - end - end - return false -end -``` - - - -# MoonScript v0.2.4 (2013-07-02) - -## Changes - -* The way the subtraction operator works has changed. There was always a little confusion as to the rules regarding whitespace around it and it was recommended to always add whitespace around the operator when doing subtraction. Not anymore. Hopefully it now [works how you would expect](http://moonscript.org/reference/#considerations). (`a-b` compiles to `a - b` and not `a(-b)` anymore). -* The `moon` library is no longer sets a global variable and instead returns the module. Your code should now be: - -```moonscript -moon = require "moon" -``` - -* Generated code will reuse local variables when appropriate. Local variables are guaranteed to not have side effects when being accessed as opposed to expressions and global variables. MoonScript will now take advantage of this and reuse those variable without creating and copying to a temporary name. -* Reduced the creation of anonymous functions that are called immediately. - MoonScript uses this technique to convert a series of statements into a single expression. It's inefficient because it allocates a new function object and has to do a function call. It also obfuscates stack traces. MoonScript will flatten these functions into the current scope in a lot of situations now. -* Reduced the amount of code generated for classes. Parent class code it left out if there is no parent. - -## New Things - -* You can now put line breaks inside of string literals. It will be replaced with `\n` in the generated code. - -```moonscript -x = "hello -world" -``` - -* Added `moonscript.base` module. It's a way of including the `moonscript` module without automatically installing the moonloader. -* You are free to use any whitespace around the name list in an import statement. It has the same rules as an array table, meaning you can delimit names with line breaks. - -```moonscript -import a, b - c, d from z -``` - -* Added significantly better tests. Previously the testing suite would only verify that code compiled to an expected string. Now there are unit tests that execute the code as well. This will make it easier to change the generated output while still guaranteeing the semantics are the same. - -## Bug Fixes - -* `b` is not longer treated as self assign in `{ a : b }` -* load functions will return `nil` instead of throwing error, as described in documentation -* fixed an issue with `moon.mixin` where it did not work as described - - -# MoonScript v0.2.3-2 (2013-01-29) - -Fixed bug with moonloader not loading anything - -# MoonScript v0.2.3 (2013-01-24) - -## Changes - -* For loops when used as expressions will no longer discard nil values when accumulating into an array table. **This is a backwards incompatible change**. Instead you should use the `continue` keyword to filter out iterations you don't want to keep. [Read more here](https://github.com/leafo/moonscript/issues/66). -* The `moonscript` module no longer sets a global value for `moonscript` and instead returns it. You should update your code: - -```moonscript -moonscript = require "moonscript" -``` - -## New Things - -* Lua 5.2 Support. The compiler can now run in either Lua 5.2 and 5.1 -* A switch `when` clause [can take multiple values](http://moonscript.org/reference/#switch), comma separated. -* Added [destructuring assignment](http://moonscript.org/reference/#destructuring_assignment). -* Added `local *` (and `local ^`) for [hoisting variable declarations](http://moonscript.org/reference/#local_statement) in the current scope -* List comprehensions and line decorators now support numeric loop syntax - -## Bug Fixes - -* Numbers that start with a dot, like `.03`, are correctly parsed -* Fixed typo in `fold` library function -* Fix declaration hoisting inside of class body, works the same as `local *` now - -## Other Stuff - -MoonScript has [made its way into GitHub](https://github.com/github/linguist/pull/246). `.moon` files should start to be recognized in the near future. - - -# MoonScript v0.2.2 (2012-11-03) - -## Changes - -* Compiled [files will now implicitly return](http://moonscript.org/reference/#implicit_returns_on_files) their last statement. Be careful, this might change what `require` returns. - -## New Things - -### The Language - -* Added [`continue` keyword](http://moonscript.org/reference/#continue) for skipping the current iteration in a loop. -* Added [string interpolation](http://moonscript.org/reference/#string_interpolation). -* Added [`do` expression and block](http://moonscript.org/reference/#do). -* Added `unless` as a block and line decorator. Is the inverse of `if`. -* Assignment can be used in an [`if` statement's expression](http://moonscript.org/reference/#with_assignment). -* Added `or=` and `and=` operators. -* `@@` can be prefixed in front of a name to access that name within `self.__class` -* `@` and `@@` can be [used as values](http://moonscript.org/reference/#_and__values) to reference `self` and `self.__class`. -* In class declarations it's possible to [assign to the class object](http://moonscript.org/reference/#class_variables) instead of the instance metatable by prefixing the key with `@`. -* Class methods can access [locals defined within the body](http://moonscript.org/reference/#class_declaration_statements) of the class declaration. -* Super classes are [notified when they are extended](http://moonscript.org/reference/#inheritance) from with an `__inherited` callback. -* Classes can now [implicitly return and be expressions](http://moonscript.org/reference/#anonymous_classes). -* `local` keyword returns, can be used for forward declaration or shadowing a variable. -* String literals can be used as keys in [table literals](http://moonscript.org/reference/#table_literals). -* Call methods on string literals without wrapping in parentheses: `"hello"\upper!` -* Table comprehensions can return a single value that is unpacked into the key and value. -* The expression in a [`with` statement can now be an assignment](http://moonscript.org/reference/#with_statement), to give a name to the expression that is being operated on. - - -### The API - -* The `load` functions can take an [optional last argument of options](http://moonscript.org/reference/#load_functions). - -### The Tools - -* The [online compiler](http://moonscript.org/compiler/) now runs through a web service instead of emscripten, should work reliably on any computer now. -* [Windows binaries](http://moonscript.org/bin/) have been updated. - -## Bug Fixes - -* Significantly improved the [line number rewriter](http://moonscript.org/reference/#error_rewriting). It should now accurately report all line numbers. -* Generic `for` loops correctly parse for multiple values as defined in Lua. -* Update expressions don't fail with certain combinations of precedence. -* All statements/expressions are allowed in a class body, not just some. -* `x = "hello" if something` will extract the declaration of `x` if it's not in scope yet. Preventing an impossible to access variable from being created. -* varargs, `...`, correctly bubble up through automatically generated anonymous functions. -* Compiler doesn't crash if you try to assign something that isn't assignable. -* Numerous other small fixes. See [commit log](https://github.com/leafo/moonscript/commits/master). - - -# MoonScript v0.2.0 (2011-12-12) - -## Changes - -* `,` is used instead of `:` for delimiting table slice parts. -* Class objects store the metatable of their instances in `__base`. `__base` is also used in inheritance when chaining metatables. - -## New Things - -### The Language - -* Added [key-value table comprehensions][4]. -* Added a [`switch` statement][7]. -* The body of a class can contain arbitrary expressions in addition to assigning properties. `self` in this scope refers to the class itself. -* Class objects themselves support accessing the properties of the superclass they extend (like instances). -* Class objects store their name as a string in the `__name` property. -* [Enhanced the `super` keyword][8] in instance methods. -* Bound methods can be created for an object by using `object\function_name` as a value. Called [function stubs][6]. -* Added `export *` statement to export all assigned names following the statement. -* Added `export ^` statement to export all assigning names that begin with a capital letter following the statement. -* `export` can be used before any assignment or class declaration to export just that assignment (or class declaration). -* Argument lists can be broken up over several lines with trailing comma. -* `:hello` is short hand for `hello: hello` inside of table literal. -* Added `..=` for string concatenation. -* `table.insert` no longer used to build accumlated values in comprehensions. - -### The API - -* Added `loadfile`, `loadstring`, and `dofile` functions to `moonscript` module to load/run MoonScript code. -* Added `to_lua` function to `moonscript` module to convert a MoonScript code string to Lua string. - -### The Tools - -* Created [prebuilt MoonScript Windows executables][2]. -* Wrote a [Textmate/Sublime Text bundle][9]. -* Wrote a [SciTE syntax highlighter with scintillua][10]. -* Created a [SciTE package for Windows][11] that has everything configured. -* Created an [online compiler and snippet site][12] using [emscripten][13]. -* Watch mode works on all platforms now. Uses polling if `inotify` is not - available. - -### Standard Library - -I'm now including a small set of useful functions in a single module called `moon`: - -```moonscript -require "moon" -``` - -Documentation is [available here][3]. - -## Bug Fixes - -* Windows line endings don't break the parser. -* Fixed issues when using `...` within comprehensions when the compiled code uses an intermediate function in the output. -* Names whose first characters happen to be a keyword don't break parser. -* Return statement can have no arguments -* argument names prefixed with `@` in function definitions work outside of classes work with default values. -* Fixed parse issues with the shorthand values within a `with` block. -* Numerous other small fixes. See [commit log][5]. - -## Other Stuff - -Since the first release, I've written one other project in MoonScript (other than the compiler). It's a static site generator called [sitegen][15]. It's what I now use to generate all of my project pages and this blog. - -# MoonScript 0.1.0 (2011-08-12) - -Initial release - - - [1]: http://moonscript.org - [2]: http://moonscript.org/bin/ - [3]: http://moonscript.org/reference/standard_lib.html - [4]: http://moonscript.org/reference/#table_comprehensions - [5]: https://github.com/leafo/moonscript/commits/master - [6]: http://moonscript.org/reference/#function_stubs - [7]: http://moonscript.org/reference/#switch - [8]: http://moonscript.org/reference/#super - [9]: https://github.com/leafo/moonscript-tmbundle - [10]: https://github.com/leafo/moonscript/tree/master/extra/scintillua - [11]: http://moonscript.org/scite/ - [12]: http://moonscript.org/compiler/ - [13]: http://emscripten.org - [14]: http://twitter.com/moonscript - [15]: http://leafo.net/sitegen/ - diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..9c589de4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,108 @@ + +moonscript: + +Copyright (C) 2014 by Leaf Corcoran + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +lua_getopt: + +Copyright (c) 2009 Aleksey Cheusov + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +lpeg: + +Copyright (C) 2008 Lua.org, PUC-Rio. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +lua: + +Copyright (C) 1994–2013 Lua.org, PUC-Rio. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +luafilesystem: + +Copyright (C) 2003 Kepler Project. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + diff --git a/Makefile b/Makefile index c3c0868b..5349a295 100644 --- a/Makefile +++ b/Makefile @@ -1,122 +1,86 @@ -LUA ?= lua5.1 -LUA_VERSION = $(shell $(LUA) -e 'print(_VERSION:match("%d%.%d"))') -LUAROCKS = luarocks --lua-version=$(LUA_VERSION) -LUA_PATH_MAKE = $(shell $(LUAROCKS) path --lr-path);./?.lua;./?/init.lua -LUA_CPATH_MAKE = $(shell $(LUAROCKS) path --lr-cpath);./?.so -LUA_SRC_VERSION ?= 5.1.5 -LPEG_VERSION ?= 1.0.2 -LFS_VERSION ?= 1_8_0 +ifeq ($(OS),Windows_NT) +FLAGS=-Iinclude/ -O2 +LINK=-L. +else +FLAGS=-fpic -O2 +LINK= +endif -.PHONY: test local build watch lint count show test_binary +all: moon.exe moonc.exe moonscript.dll -build: - LUA_PATH='$(LUA_PATH_MAKE)' LUA_CPATH='$(LUA_CPATH_MAKE)' $(LUA) bin/moonc moon/ moonscript/ - echo "#!/usr/bin/env lua" > bin/moon - $(LUA) bin/moonc -p bin/moon.moon >> bin/moon - echo "-- vim: set filetype=lua:" >> bin/moon +moon.exe: moon.c lfs.o lpeg.o moonscript.h moon.h alt_getopt.h + gcc $(LINK) $(FLAGS) -o $@ $< lfs.o lpeg.o -llua51 +moonc.exe: moonc.c lfs.o lpeg.o moonscript.h moonc.h alt_getopt.h + gcc $(LINK) $(FLAGS) -o $@ $< lfs.o lpeg.o -llua51 -# This will rebuild MoonScript from the (hopefully working) system installation of moonc -build_from_system: - moonc moon/ moonscript/ - echo "#!/usr/bin/env lua" > bin/moon - moonc -p bin/moon.moon >> bin/moon - echo "-- vim: set filetype=lua:" >> bin/moon +moonscript.dll: lpeg.o moonscript.o + gcc $(LINK) $(FLAGS) -o $@ $+ -llua51 -shared -show: - # LUA $(LUA) - # LUA_VERSION $(LUA_VERSION) - # LUAROCKS $(LUAROCKS) - # LUA_PATH_MAKE $(LUA_PATH_MAKE) - # LUA_CPATH_MAKE $(LUA_CPATH_MAKE) +moon.o: moon.c moonscript.h moon.h alt_getopt.h + gcc $(FLAGS) -c $< -o $@ -test: build - busted +moonc.o: moonc.c moonscript.h moon.h alt_getopt.h + gcc $(FLAGS) -c $< -o $@ -build_test_outputs: build - BUILD=1 busted spec/lang_spec.moon +moonscript.o: moonscript.c moonscript.h + gcc $(FLAGS) -c $< -o $@ -local: build - LUA_PATH='$(LUA_PATH_MAKE)' LUA_CPATH='$(LUA_CPATH_MAKE)' $(LUAROCKS) make --local moonscript-dev-1.rockspec +lpeg.o: lpeg/lpeg.c + gcc $(FLAGS) -c $< -o $@ -watch: - moonc moon/ moonscript/ && moonc -w moon/ moonscript/ +lfs.o: luafilesystem/src/lfs.c + gcc $(FLAGS) -c $< -o $@ -lint: - moonc -l moonscript moon bin +# commited to repo: -count: - wc -l $$(git ls-files | grep 'moon$$') | sort -n | tail +headers: moonscript.h moonc.h moon.h alt_getopt.h -# Binary build targets for local verification (Linux only) -lua_modules: - luarocks install argparse --tree=lua_modules - -lua-$(LUA_SRC_VERSION)/src/liblua.a: - curl -L -O https://www.lua.org/ftp/lua-$(LUA_SRC_VERSION).tar.gz - tar -xzf lua-$(LUA_SRC_VERSION).tar.gz - cd lua-$(LUA_SRC_VERSION)/src && make liblua.a MYCFLAGS=-DLUA_USE_POSIX - -lpeg-$(LPEG_VERSION)/lptree.c: - curl -L -o lpeg.tar.gz https://www.inf.puc-rio.br/~roberto/lpeg/lpeg-$(LPEG_VERSION).tar.gz - tar -xzf lpeg.tar.gz - -luafilesystem-$(LFS_VERSION)/src/lfs.c: - curl -L -o luafilesystem.tar.gz https://github.com/keplerproject/luafilesystem/archive/v$(LFS_VERSION).tar.gz - tar -xzf luafilesystem.tar.gz - -bin/binaries/moonscript.h: moonscript/*.lua moon/*.lua - bin/splat.moon -l moonscript moonscript moon > moonscript.lua +moonscript.h: + (cd moonscript/; bin/splat.moon -l moonscript moonscript moon) > moonscript.lua xxd -i moonscript.lua > $@ rm moonscript.lua -bin/binaries/moon.h: bin/moon - awk 'FNR>1' bin/moon > moon.lua +alt_getopt.h: alt_getopt.lua + xxd -i $< > $@ + +moon.h: + awk 'FNR>1' moonscript/bin/moon > moon.lua xxd -i moon.lua > $@ rm moon.lua -bin/binaries/argparse.h: lua_modules - bin/splat.moon --strip-prefix -l argparse $$(find lua_modules/share/lua -name "argparse.lua" -exec dirname {} \; | head -1) > bin/binaries/argparse.lua - xxd -i -n argparse_lua bin/binaries/argparse.lua > $@ - -bin/binaries/moonc.h: bin/moonc - awk 'FNR>1' bin/moonc > moonc.lua +moonc.h: + awk 'FNR>1' moonscript/bin/moonc > moonc.lua xxd -i moonc.lua > $@ rm moonc.lua -dist/moon: lua-$(LUA_SRC_VERSION)/src/liblua.a lpeg-$(LPEG_VERSION)/lptree.c bin/binaries/moonscript.h bin/binaries/moon.h bin/binaries/argparse.h bin/binaries/moon.c bin/binaries/moonscript.c - mkdir -p dist - gcc -static -o dist/moon \ - -Ilua-$(LUA_SRC_VERSION)/src/ \ - -Ilpeg-$(LPEG_VERSION)/ \ - -Ibin/binaries/ \ - bin/binaries/moon.c \ - bin/binaries/moonscript.c \ - lpeg-$(LPEG_VERSION)/lpvm.c \ - lpeg-$(LPEG_VERSION)/lpcap.c \ - lpeg-$(LPEG_VERSION)/lptree.c \ - lpeg-$(LPEG_VERSION)/lpcode.c \ - lpeg-$(LPEG_VERSION)/lpprint.c \ - lua-$(LUA_SRC_VERSION)/src/liblua.a \ - -lm -ldl - -dist/moonc: lua-$(LUA_SRC_VERSION)/src/liblua.a lpeg-$(LPEG_VERSION)/lptree.c luafilesystem-$(LFS_VERSION)/src/lfs.c bin/binaries/moonscript.h bin/binaries/moonc.h bin/binaries/argparse.h bin/binaries/moonc.c bin/binaries/moonscript.c - mkdir -p dist - gcc -static -o dist/moonc \ - -Ilua-$(LUA_SRC_VERSION)/src/ \ - -Ilpeg-$(LPEG_VERSION)/ \ - -Ibin/binaries/ \ - bin/binaries/moonc.c \ - bin/binaries/moonscript.c \ - lpeg-$(LPEG_VERSION)/lpvm.c \ - lpeg-$(LPEG_VERSION)/lpcap.c \ - lpeg-$(LPEG_VERSION)/lptree.c \ - lpeg-$(LPEG_VERSION)/lpcode.c \ - lpeg-$(LPEG_VERSION)/lpprint.c \ - luafilesystem-$(LFS_VERSION)/src/lfs.c \ - lua-$(LUA_SRC_VERSION)/src/liblua.a \ - -lm -ldl - -test_binary: dist/moon - dist/moon +clean: + -rm *.o + -rm *.exe + -rm moon + -rm moonc + +clean_headers: + rm *.h + +# linux + +moon: moon.o lfs.o lpeg.o + gcc -o $@ $+ -llua -O2 + +moonc: moonc.o lfs.o lpeg.o + gcc -o $@ $+ -llua -O2 + +moonscript.so: moonscript.o lpeg.o + gcc -o $@ $+ -fpic -shared -O2 + +# misc +love_header: moonscript.lua.h +moonscript.lua.h:: + cd moonscript/; bin/splat.moon -l moonscript moonscript moon > ../moonscript.lua + echo namespace love { > $@ + xxd -i moonscript.lua >> $@ + echo } >> $@ + + diff --git a/README.md b/README.md deleted file mode 100644 index b5bb5f92..00000000 --- a/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# MoonScript - -[![MoonScript](https://leafo.net/dump/sailormoonscript.png)](https://moonscript.org) - - -[![spec](https://github.com/leafo/moonscript/workflows/spec/badge.svg)](https://github.com/leafo/moonscript/actions?query=workflow%3Aspec) [![Build status](https://ci.appveyor.com/api/projects/status/f5prpi4wvytul290/branch/binaries?svg=true)](https://ci.appveyor.com/project/leafo/moonscript/branch/binaries) - - -[![](https://leafo.net/dump/twitch-banner.svg)](https://www.twitch.tv/moonscript) - -MoonScript is a programmer friendly language that compiles into -[Lua](https://www.lua.org/). It gives you the power of the fastest scripting -language combined with a rich set of features. It runs on Lua 5.1 and above, -including alternative runtimes like LuaJIT. - -See . - -Online demo/compiler at . - -## Join Our Community - -We have a Discord for those interested in MoonScript and related projects. You can join us here: - -## Contributing - -MoonScript is a self-hosted compiler, meaning it's written in MoonScript itself. When contributing, please follow the following guidelines: - -1. Edit `.moon` files, never modify the alongside `.lua` files directly -2. After making changes to `.moon` files, run the compiler to regenerate the corresponding `.lua` files -3. Both `.moon` and `.lua` files are included in the repository to ensure that: - - Users can install and use MoonScript without having to compile it themselves - - The compiler bootstrapping process works consistently - -It's helpful to have a separate installation of MoonScript should you break -something and you need to re-build the MoonScript with a working version of -MoonScript. You can check out the repo in another directory, or install it -using LuaRocks to have a separate working version. - -## Running Tests - -Tests are written in MoonScript and use [Busted](https://olivinelabs.com/busted/). -In order to run the tests you must have MoonScript and [Loadkit](https://github.com/leafo/loadkit) installed. - -To run tests, execute from the root directory: - -```bash -busted -``` - -Writing specs is a bit more complicated. Check out [the spec writing guide](spec/README.md). - -## Binaries - -Precompiled versions of MoonScript are provided for Windows. You can find them -in the [GitHub releases page](https://github.com/leafo/moonscript/releases). -(Scroll down to the `win32-` tags. - -The build code can be found in the [`binaries` -branch](https://github.com/leafo/moonscript/tree/binaries) - -## Editor Support - -* [Vim](https://github.com/leafo/moonscript-vim) -* [Textadept](https://github.com/leafo/moonscript-textadept) -* [Sublime/Textmate](https://github.com/leafo/moonscript-tmbundle) -* [Emacs](https://github.com/k2052/moonscript-mode) - -## License (MIT) - -Copyright (C) 2025 by Leaf Corcoran - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..3fed16c3 --- /dev/null +++ b/README.txt @@ -0,0 +1,14 @@ + __ _ _ + /\/\ ___ ___ _ __ / _\ ___ _ __(_)_ __ | |_ + / \ / _ \ / _ \| '_ \\ \ / __| '__| | '_ \| __| +/ /\/\ \ (_) | (_) | | | |\ \ (__| | | | |_) | |_ +\/ \/\___/ \___/|_| |_\__/\___|_| |_| .__/ \__| + |_| + +MoonScript 0.5.0 +Sep 25 2016 + +============================ + +This is the Windows binary of MoonScript. You can always find the latest +version and sources at http://moonscript.org diff --git a/alt_getopt.h b/alt_getopt.h new file mode 100644 index 00000000..4220270a --- /dev/null +++ b/alt_getopt.h @@ -0,0 +1,335 @@ +unsigned char alt_getopt_lua[] = { + 0x2d, 0x2d, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x39, 0x20, 0x41, 0x6c, + 0x65, 0x6b, 0x73, 0x65, 0x79, 0x20, 0x43, 0x68, 0x65, 0x75, 0x73, 0x6f, + 0x76, 0x20, 0x3c, 0x76, 0x6c, 0x65, 0x40, 0x67, 0x6d, 0x78, 0x2e, 0x6e, + 0x65, 0x74, 0x3e, 0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x50, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, + 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, + 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, + 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x2d, 0x2d, 0x20, 0x61, + 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, + 0x68, 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, + 0x75, 0x74, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, + 0x67, 0x0a, 0x2d, 0x2d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, + 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, + 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, + 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, + 0x0a, 0x2d, 0x2d, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x65, 0x6e, + 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, + 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, + 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0a, 0x2d, + 0x2d, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, + 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x0a, + 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x54, + 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, + 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, + 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x0a, 0x2d, 0x2d, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, + 0x69, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, + 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, 0x2d, 0x2d, 0x0a, + 0x2d, 0x2d, 0x20, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, + 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, + 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, + 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, + 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x0a, 0x2d, 0x2d, 0x20, 0x45, 0x58, + 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, + 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, + 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, + 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x54, + 0x48, 0x45, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, + 0x53, 0x20, 0x4f, 0x46, 0x0a, 0x2d, 0x2d, 0x20, 0x4d, 0x45, 0x52, 0x43, + 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, + 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, + 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, + 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, + 0x44, 0x0a, 0x2d, 0x2d, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, + 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x2e, 0x20, 0x49, 0x4e, + 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, + 0x41, 0x4c, 0x4c, 0x20, 0x54, 0x48, 0x45, 0x20, 0x41, 0x55, 0x54, 0x48, + 0x4f, 0x52, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, + 0x49, 0x47, 0x48, 0x54, 0x20, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x53, + 0x20, 0x42, 0x45, 0x0a, 0x2d, 0x2d, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, + 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, + 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, + 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x4c, 0x49, + 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x57, 0x48, 0x45, + 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x2d, 0x2d, 0x20, 0x4f, 0x46, 0x20, + 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, + 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, + 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, + 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, + 0x46, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x2d, 0x2d, 0x20, 0x57, 0x49, + 0x54, 0x48, 0x20, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, + 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, + 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, + 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, + 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, + 0x2e, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x69, 0x6f, 0x2c, 0x20, 0x6f, 0x73, + 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x2c, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x2c, 0x20, + 0x69, 0x6f, 0x2c, 0x20, 0x6f, 0x73, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x20, 0x28, 0x22, 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, 0x74, + 0x6f, 0x70, 0x74, 0x22, 0x29, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, + 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x6f, 0x70, 0x74, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x2c, + 0x20, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x20, + 0x69, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x3a, 0x67, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x28, 0x25, 0x77, 0x29, 0x28, 0x3a, 0x3f, 0x29, + 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x5b, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x70, + 0x74, 0x5d, 0x3d, 0x23, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x5f, 0x61, + 0x72, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x74, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x69, + 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x28, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x69, + 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x20, 0x28, 0x65, 0x78, 0x69, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x0a, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x20, 0x28, 0x6f, + 0x70, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, + 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x2d, 0x22, 0x20, 0x2e, 0x2e, 0x0a, 0x09, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x28, 0x23, 0x6f, 0x70, 0x74, 0x20, 0x3e, + 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x2d, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x31, + 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, + 0x6e, 0x6f, 0x6e, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x5f, 0x6f, 0x70, 0x74, + 0x20, 0x28, 0x6f, 0x70, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x5b, 0x6f, 0x70, 0x74, + 0x5d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, + 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x20, 0x65, 0x72, 0x72, 0x5f, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x5f, 0x6f, 0x70, 0x74, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, + 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, + 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x73, 0x68, 0x5f, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6f, 0x70, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x20, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x32, + 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x28, 0x73, 0x68, 0x5f, 0x6f, 0x70, 0x74, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, + 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x28, + 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x20, 0x3c, 0x3d, 0x20, 0x23, 0x61, + 0x72, 0x67, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x72, + 0x67, 0x20, 0x5b, 0x69, 0x5d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, 0x2d, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x09, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x61, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x61, 0x3a, 0x73, 0x75, 0x62, 0x20, 0x28, + 0x31, 0x2c, 0x20, 0x32, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, 0x2d, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x3a, 0x66, + 0x69, 0x6e, 0x64, 0x20, 0x28, 0x22, 0x3d, 0x22, 0x2c, 0x20, 0x31, 0x2c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x0a, 0x09, 0x20, 0x69, 0x66, + 0x20, 0x70, 0x6f, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, + 0x20, 0x3d, 0x20, 0x61, 0x3a, 0x73, 0x75, 0x62, 0x20, 0x28, 0x33, 0x2c, + 0x20, 0x70, 0x6f, 0x73, 0x2d, 0x31, 0x29, 0x0a, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6e, 0x6f, + 0x6e, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x29, 0x0a, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x22, 0x42, 0x61, 0x64, 0x20, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x60, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x61, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x27, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x31, 0x29, 0x0a, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, 0x20, 0x5b, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x3a, 0x73, 0x75, + 0x62, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x2b, 0x31, 0x29, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, 0x09, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x3a, + 0x73, 0x75, 0x62, 0x20, 0x28, 0x33, 0x29, 0x0a, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6e, 0x6f, + 0x6e, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x29, 0x0a, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, 0x09, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x61, + 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x20, 0x20, + 0x65, 0x78, 0x69, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x20, 0x28, 0x22, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x61, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x5c, 0x6e, 0x22, 0x2c, 0x20, + 0x31, 0x29, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, 0x20, 0x5b, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x20, 0x5b, 0x69, 0x2b, + 0x31, 0x5d, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x61, 0x3a, 0x73, 0x75, 0x62, 0x20, 0x28, 0x31, 0x2c, 0x20, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x0a, + 0x09, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6a, 0x3d, 0x32, 0x2c, 0x61, 0x3a, + 0x6c, 0x65, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, + 0x20, 0x3d, 0x20, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x7a, 0x65, 0x20, + 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x3a, + 0x73, 0x75, 0x62, 0x20, 0x28, 0x6a, 0x2c, 0x20, 0x6a, 0x29, 0x29, 0x0a, + 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, + 0x31, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x61, 0x3a, 0x6c, 0x65, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x6a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3d, 0x3d, + 0x20, 0x23, 0x61, 0x72, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x22, 0x4d, 0x69, 0x73, + 0x73, 0x65, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x60, 0x2d, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x27, 0x5c, 0x6e, 0x22, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, + 0x20, 0x5b, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x20, 0x5b, 0x69, 0x2b, 0x31, 0x5d, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x09, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x09, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, 0x20, 0x5b, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x3a, 0x73, + 0x75, 0x62, 0x20, 0x28, 0x6a, 0x2b, 0x31, 0x29, 0x0a, 0x09, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x5b, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x0a, + 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2b, 0x20, + 0x31, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x0a, 0x09, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x09, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2c, 0x69, 0x2c, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x20, + 0x28, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x73, 0x68, 0x5f, 0x6f, 0x70, 0x74, + 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x6f, + 0x70, 0x74, 0x69, 0x6e, 0x64, 0x2c, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x65, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, + 0x2c, 0x20, 0x73, 0x68, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x6c, + 0x6f, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x76, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x20, 0x28, 0x6f, 0x70, 0x74, 0x73, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, 0x20, 0x5b, 0x69, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x20, 0x72, 0x65, 0x74, 0x20, + 0x5b, 0x76, 0x5d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x61, 0x72, 0x67, + 0x20, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x20, 0x72, 0x65, 0x74, 0x20, 0x5b, 0x76, + 0x5d, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x2c, 0x6f, 0x70, 0x74, 0x69, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, + 0x0a +}; +unsigned int alt_getopt_lua_len = 3973; diff --git a/alt_getopt.lua b/alt_getopt.lua new file mode 100644 index 00000000..7a6591a4 --- /dev/null +++ b/alt_getopt.lua @@ -0,0 +1,166 @@ +-- Copyright (c) 2009 Aleksey Cheusov +-- +-- Permission is hereby granted, free of charge, to any person obtaining +-- a copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be +-- included in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +-- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +-- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +-- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +-- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +local type, pairs, ipairs, io, os = type, pairs, ipairs, io, os + +module ("alt_getopt") + +local function convert_short2long (opts) + local i = 1 + local len = #opts + local ret = {} + + for short_opt, accept_arg in opts:gmatch("(%w)(:?)") do + ret[short_opt]=#accept_arg + end + + return ret +end + +local function exit_with_error (msg, exit_status) + io.stderr:write (msg) + os.exit (exit_status) +end + +local function err_unknown_opt (opt) + exit_with_error ("Unknown option `-" .. + (#opt > 1 and "-" or "") .. opt .. "'\n", 1) +end + +local function canonize (options, opt) + if not options [opt] then + err_unknown_opt (opt) + end + + while type (options [opt]) == "string" do + opt = options [opt] + + if not options [opt] then + err_unknown_opt (opt) + end + end + + return opt +end + +function get_ordered_opts (arg, sh_opts, long_opts) + local i = 1 + local count = 1 + local opts = {} + local optarg = {} + + local options = convert_short2long (sh_opts) + for k,v in pairs (long_opts) do + options [k] = v + end + + while i <= #arg do + local a = arg [i] + + if a == "--" then + i = i + 1 + break + + elseif a == "-" then + break + + elseif a:sub (1, 2) == "--" then + local pos = a:find ("=", 1, true) + + if pos then + local opt = a:sub (3, pos-1) + + opt = canonize (options, opt) + + if options [opt] == 0 then + exit_with_error ("Bad usage of option `" .. a .. "'\n", 1) + end + + optarg [count] = a:sub (pos+1) + opts [count] = opt + else + local opt = a:sub (3) + + opt = canonize (options, opt) + + if options [opt] == 0 then + opts [count] = opt + else + if i == #arg then + exit_with_error ("Missed value for option `" .. a .. "'\n", 1) + end + + optarg [count] = arg [i+1] + opts [count] = opt + i = i + 1 + end + end + count = count + 1 + + elseif a:sub (1, 1) == "-" then + local j + for j=2,a:len () do + local opt = canonize (options, a:sub (j, j)) + + if options [opt] == 0 then + opts [count] = opt + count = count + 1 + elseif a:len () == j then + if i == #arg then + exit_with_error ("Missed value for option `-" .. opt .. "'\n", 1) + end + + optarg [count] = arg [i+1] + opts [count] = opt + i = i + 1 + count = count + 1 + break + else + optarg [count] = a:sub (j+1) + opts [count] = opt + count = count + 1 + break + end + end + else + break + end + + i = i + 1 + end + + return opts,i,optarg +end + +function get_opts (arg, sh_opts, long_opts) + local ret = {} + + local opts,optind,optarg = get_ordered_opts (arg, sh_opts, long_opts) + for i,v in ipairs (opts) do + if optarg [i] then + ret [v] = optarg [i] + else + ret [v] = 1 + end + end + + return ret,optind +end diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..bb943222 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,35 @@ +branches: + only: + - binaries + +install: + - curl -O 'http://commondatastorage.googleapis.com/leafo/lua5_1_4_Win32_dll8_lib.zip' + - curl -O 'http://commondatastorage.googleapis.com/leafo/lua5_1_4_Win32_bin.zip' + - 7z x lua5_1_4_Win32_dll8_lib.zip + - 7z x lua5_1_4_Win32_bin.zip -aos + - set PATH=C:\MinGW\bin;C:\MinGW\msys\1.0\bin;%PATH% + - dir . + +build_script: + - make + +test_script: + - moon.exe test.moon + - moonc.exe test.moon + - lua5.1.exe -e "assert(require('moonscript')); print(require('moonscript.version').version)" + +after_build: + - 7z a moonscript-%APPVEYOR_REPO_COMMIT%.zip moonscript.dll lua51.dll lua5.1.dll moon.exe moonc.exe LICENSE README.txt + - dir + +artifacts: + - path: moonscript-$(appveyor_repo_commit).zip + +deploy: + - provider: GitHub + artifact: /moonscript.*\.zip/ + auth_token: + secure: ow29ymI+HSG5ZGMF0vtyPTFQsRnOvebxAI0FXChgfJ327UOnZcXImQ0LN7DW7ImF + on: + branch: binaries + appveyor_repo_tag: true diff --git a/bin/binaries/moon.c b/bin/binaries/moon.c deleted file mode 100644 index f668d436..00000000 --- a/bin/binaries/moon.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include - -#include "moon.h" // the CLI script - -// from moonscript.c -extern int luaopen_moonscript(lua_State *l); - -int main(int argc, char **argv) { - lua_State *l = luaL_newstate(); - luaL_openlibs(l); - - // Load moonscript (this also loads lpeg) - luaopen_moonscript(l); - lua_pop(l, 1); - - // Set up arg table - lua_newtable(l); - lua_pushstring(l, "moon"); - lua_rawseti(l, -2, -1); - for (int i = 0; i < argc; i++) { - lua_pushstring(l, argv[i]); - lua_rawseti(l, -2, i); - } - lua_setglobal(l, "arg"); - - // Load and execute the moon CLI script - if (luaL_loadbuffer(l, (const char *)moon_lua, moon_lua_len, "moon") != 0) { - fprintf(stderr, "Failed to load moon: %s\n", lua_tostring(l, -1)); - return 1; - } - if (lua_pcall(l, 0, 0, 0) != 0) { - fprintf(stderr, "Error: %s\n", lua_tostring(l, -1)); - return 1; - } - - lua_close(l); - return 0; -} diff --git a/bin/binaries/moonc.c b/bin/binaries/moonc.c deleted file mode 100644 index 9cd9a67b..00000000 --- a/bin/binaries/moonc.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include -#include - -#include "moonc.h" // the CLI script - -// from moonscript.c -extern int luaopen_moonscript(lua_State *l); - -// from lfs.c -extern int luaopen_lfs(lua_State *l); - -int main(int argc, char **argv) { - lua_State *l = luaL_newstate(); - luaL_openlibs(l); - - // Load moonscript (this also loads lpeg and argparse) - luaopen_moonscript(l); - lua_pop(l, 1); - - // Load luafilesystem and register it in package.loaded - int nresults = luaopen_lfs(l); - if (nresults > 0) { - lua_getglobal(l, "package"); - lua_getfield(l, -1, "loaded"); - lua_pushvalue(l, -3); // push lfs table - lua_setfield(l, -2, "lfs"); - lua_pop(l, 2); // pop loaded, package - } - lua_pop(l, nresults); - - // Set up arg table - lua_newtable(l); - lua_pushstring(l, "moonc"); - lua_rawseti(l, -2, -1); - for (int i = 0; i < argc; i++) { - lua_pushstring(l, argv[i]); - lua_rawseti(l, -2, i); - } - lua_setglobal(l, "arg"); - - // Load and execute the moonc CLI script - if (luaL_loadbuffer(l, (const char *)moonc_lua, moonc_lua_len, "moonc") != 0) { - fprintf(stderr, "Failed to load moonc: %s\n", lua_tostring(l, -1)); - return 1; - } - if (lua_pcall(l, 0, 0, 0) != 0) { - fprintf(stderr, "Error: %s\n", lua_tostring(l, -1)); - return 1; - } - - lua_close(l); - return 0; -} diff --git a/bin/moon b/bin/moon deleted file mode 100755 index 759cae8a..00000000 --- a/bin/moon +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env lua -local argparse = require("argparse") -local moonscript = require("moonscript.base") -local util = require("moonscript.util") -local errors = require("moonscript.errors") -local unpack = util.unpack -local argparser = argparse()({ - name = "moon" -}) -argparser:argument("script"):args("?") -argparser:argument("args"):args("*") -argparser:flag("--coverage -c", "Collect and print code coverage") -argparser:flag("-d", "Disable stack trace rewriting") -argparser:option("--execute -e", "Execute MoonScript code string") -argparser:flag("--version -v", "Print version information") -local base = 0 -local _list_0 = arg -for _index_0 = 1, #_list_0 do - local flag = _list_0[_index_0] - base = base + 1 - if flag:sub(1, 1) ~= "-" then - break - end -end -local args = { - unpack(arg, 1, base) -} -local opts = argparser:parse(args) -local print_err -print_err = function(...) - local msg = table.concat((function(...) - local _accum_0 = { } - local _len_0 = 1 - local _list_1 = { - ... - } - for _index_0 = 1, #_list_1 do - local v = _list_1[_index_0] - _accum_0[_len_0] = tostring(v) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(...), "\t") - return io.stderr:write(msg .. "\n") -end -local run -run = function() - if opts.version then - require("moonscript.version").print_version() - os.exit() - end - args = { - unpack(arg, base + 1) - } - args[-1] = arg[0] - local moonscript_chunk, lua_parse_error - if opts.execute then - args[0] = "-e" - local passed, err = pcall(function() - moonscript_chunk, lua_parse_error = moonscript.loadstring(opts.execute, "=(command line)", { - implicitly_return_root = false - }) - end) - if not (passed) then - print_err(err) - os.exit(1) - end - if not (moonscript_chunk) then - if lua_parse_error then - print_err(lua_parse_error) - else - print_err("Failed to compile: " .. tostring(opts.execute)) - end - os.exit(1) - end - else - local script_fname = opts.script - if not (script_fname) then - print_err("Usage: moon [options] script [args]") - print_err("Use 'moon --help' for more information.") - os.exit(1) - end - args[0] = script_fname - local passed, err = pcall(function() - moonscript_chunk, lua_parse_error = moonscript.loadfile(script_fname, { - implicitly_return_root = false - }) - end) - if not (passed) then - print_err(err) - os.exit(1) - end - if not (moonscript_chunk) then - if lua_parse_error then - print_err(lua_parse_error) - else - print_err("Can't file file: " .. tostring(script_fname)) - end - os.exit(1) - end - end - util.getfenv(moonscript_chunk).arg = args - local run_chunk - run_chunk = function() - moonscript.insert_loader() - moonscript_chunk(unpack(args)) - return moonscript.remove_loader() - end - if opts.d then - return run_chunk() - end - local err, trace, cov - if opts.coverage then - print("starting coverage") - local coverage = require("moonscript.cmd.coverage") - cov = coverage.CodeCoverage() - cov:start() - end - xpcall(run_chunk, function(_err) - err = _err - trace = debug.traceback("", 2) - end) - if err then - local truncated = errors.truncate_traceback(util.trim(trace)) - local rewritten = errors.rewrite_traceback(truncated, err) - if rewritten then - print_err(rewritten) - else - print_err(table.concat({ - err, - util.trim(trace) - }, "\n")) - end - return os.exit(1) - else - if cov then - cov:stop() - return cov:print_results() - end - end -end -return run() --- vim: set filetype=lua: diff --git a/bin/moon-tags b/bin/moon-tags deleted file mode 100755 index 5f657d55..00000000 --- a/bin/moon-tags +++ /dev/null @@ -1,202 +0,0 @@ -#!/usr/bin/env moon - -HEADER = [[ -!_TAG_FILE_FORMAT 2 /extended format/ -!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ -!_TAG_PROGRAM_AUTHOR leaf corcoran /leafot@gmail.com/ -!_TAG_PROGRAM_NAME MoonTags // -!_TAG_PROGRAM_URL https://github.com/leafo/moonscript /GitHub repository/ -!_TAG_PROGRAM_VERSION 0.0.1 // -]] - --- see `ctags --list-kinds` for examples of kinds --- see `ctags --list-fields` - -argparse = require "argparse" - -parser = argparse "moon-tags", "Generate ctags style tags file for MoonScript files" -parser\argument("files", "MoonScript files to generate tags for")\args "+" -parser\flag "--include-line", "Include line number field for each tag" -parser\flag "--lapis", "Support extracting lapis routes" -parser\flag "--no-header", "Don't print the header" - -args = parser\parse [v for _, v in ipairs _G.arg] - -TAGS = {} -- the final output of tags - -literals = require "moonscript.parse.literals" -import Indent, simple_string from require "moonscript.parse.util" - -import P, S, C, Cc, Cg, Cb, Ct, Cs, V from require "lpeg" - --- consome the rest of the file -until_end = (1 - literals.Stop)^0 -whitespace = S"\t " -- not including newline -ignore_line = Ct until_end -- tag it for empty line - --- NOTE: we disable interpolation parsing since we don't have full grammar -SingleString = simple_string "'", false -DoubleString = simple_string '"', false -String = SingleString + DoubleString - --- we have to do this double Ct to capture both the full line and the grouped captures -Type = (name) -> Cg Cc(name), "type" -Line = (type_name, p) -> Ct C Ct Cg(Indent, "indent") * p * Type type_name - -method = P { P"=>" + P(1 - literals.Stop) * V(1) } -func = P { P"->" + P"=>" + P(1 - literals.Stop) * V(1) } - -self_prefix = Cg(P("@") * Cc(true), "self") - --- this matches end-of-file return table convention for module files to figure --- out what names are exported -export_list = Ct P"{" * P { - P"}" + ((P":" * literals.Name) + (P(1) - P"}")) * V(1) -} - -eof_exports = P { export_list * S(" \t\r\n")^0 * P(-1) + P(1) * V(1) } - --- convert a parsed string to the value the string represents -StringVal = C(String) / (str) -> loadstring("return " .. str)() - -class_line = Line "class", P"class" * whitespace^1 * Cg(literals.Name, "tag") * until_end -class_property = Line "property", self_prefix^-1 * Cg(literals.Name, "tag") * P":" * whitespace^0 * Cg(String, "value")^0 * until_end -class_method = Line("method", P("@")^-1 * Cg(literals.Name, "tag") * P":" * method) * until_end -function_def = Line("function", Cg(literals.Name, "tag") * whitespace^0 * P"=" * func) * until_end -lapis_route = Line "lapis-route", P"[" * Cg(literals.Name + StringVal, "tag") * P":" * whitespace^0 * Cg(String, "route") * whitespace^0 * P("]:") * until_end - -line_types = class_line + class_method + class_property + function_def - -if args.lapis - line_types += lapis_route - -parse_lines = Ct P { - (line_types + ignore_line) * (P(-1) + literals.Break * V(1)) -} - -escape_tagaddress = (line_text) -> - replacements = S([[\/.$^]]) / [[\%0]]+ P("\t") / [[\t]] + P("\r") / [[\r]] + P("\n") / [[\n]] - Cs((replacements + 1)^0)\match line_text - -import types from require "tableshape" - -class_field = types.partial { - "self": true - tag: types.string\tag "name" - value: types.partial { - "string" - types.string - types.string\tag "value" -- TODO: will need to un-escape this - } -} - -for fname in *args.files - file = assert io.open fname - contents = assert file\read "*a" - exports = {e, true for e in *eof_exports\match(contents) or {}} - - lines = assert parse_lines\match contents - - class_stack = {} - - push_class = (cls) -> - assert cls.type == "class", "not a class match" - -- remove classes that are longer in scope due to indentation - for i=#class_stack,1,-1 - top = class_stack[i] - - if cls.indent <= top.indent - table.remove class_stack, i - else - break - - table.insert class_stack, cls - - -- find the class this property is associated with based on change in indent - -- the expeted indent is written to `step` on the first proprety - find_class = (property) -> - for i=#class_stack,1,-1 - top = class_stack[i] - step = property.indent - top.indent - - if step > 0 - if top.step == nil - top.step = step - - if step == top.step - return top - - for line_no, line in ipairs lines - continue unless next line - - {line_text, properties} = line - - fields = {"language:moon"} - if args.include_line - table.insert fields, 1, "line:#{line_no}" - - switch properties.type - when "lapis-route" - if cls = find_class properties - prefix = if cls.fields - cls.fields.name - - table.insert TAGS, { - "#{prefix or ""}#{properties.tag}" - fname - "/^#{escape_tagaddress line_text}/;\"" - "f" - table.concat fields, " " - } - - when "property" - -- this is necessary to register the correct indent level for the class - cls = find_class properties - - -- record the fields into the class object so they can be referenced by - -- other tags. Note this is code-order dependent - if cls and args.lapis - if field = class_field properties - cls.fields or= {} - cls.fields[field.name] = field.value - - when "function" - if exports[properties.tag] and properties.indent == 0 - table.insert TAGS, { - properties.tag - fname - -- note we don't use $ here - "/^#{escape_tagaddress line_text}/;\"" - "f" - table.concat fields, " " - } - - when "method" - if cls = find_class properties - table.insert fields, "class:#{cls.tag}" - - table.insert TAGS, { - properties.tag - fname - -- note we don't use $ here - "/^#{escape_tagaddress line_text}/;\"" - "f" - table.concat fields, " " - } - when "class" - push_class properties - - table.insert TAGS, { - properties.tag - fname - "/^#{escape_tagaddress line_text}$/;\"" - "c" - table.concat fields, " " - } - -unless args.no_header - print HEADER - -tag_lines = [table.concat(t, "\t") for t in *TAGS] -table.sort tag_lines -print table.concat tag_lines, "\n" diff --git a/bin/moon.moon b/bin/moon.moon deleted file mode 100644 index fcb8de89..00000000 --- a/bin/moon.moon +++ /dev/null @@ -1,124 +0,0 @@ -argparse = require "argparse" - -moonscript = require "moonscript.base" -util = require "moonscript.util" -errors = require "moonscript.errors" - -unpack = util.unpack - -argparser = argparse! name: "moon" - -argparser\argument("script")\args "?" -argparser\argument("args")\args "*" -argparser\flag "--coverage -c", "Collect and print code coverage" -argparser\flag "-d", "Disable stack trace rewriting" -argparser\option "--execute -e", "Execute MoonScript code string" -argparser\flag "--version -v", "Print version information" - -base = 0 -for flag in *arg - base += 1 - break if flag\sub(1, 1) != "-" -args = {unpack arg, 1, base} -opts = argparser\parse args - -print_err = (...) -> - msg = table.concat [tostring v for v in *{...}], "\t" - io.stderr\write msg .. "\n" - -run = -> - - if opts.version - require("moonscript.version").print_version! - os.exit! - - args = {unpack arg, base + 1} - args[-1] = arg[0] - - local moonscript_chunk, lua_parse_error - - if opts.execute - args[0] = "-e" - - passed, err = pcall -> - moonscript_chunk, lua_parse_error = moonscript.loadstring opts.execute, "=(command line)", { - implicitly_return_root: false - } - - unless passed - print_err err - os.exit 1 - - unless moonscript_chunk - if lua_parse_error - print_err lua_parse_error - else - print_err "Failed to compile: #{opts.execute}" - os.exit 1 - else - script_fname = opts.script - - unless script_fname - print_err "Usage: moon [options] script [args]" - print_err "Use 'moon --help' for more information." - os.exit 1 - - args[0] = script_fname - - passed, err = pcall -> - moonscript_chunk, lua_parse_error = moonscript.loadfile script_fname, { - implicitly_return_root: false - } - - unless passed - print_err err - os.exit 1 - - unless moonscript_chunk - if lua_parse_error - print_err lua_parse_error - else - print_err "Can't file file: #{script_fname}" - os.exit 1 - - util.getfenv(moonscript_chunk).arg = args - - run_chunk = -> - moonscript.insert_loader! - moonscript_chunk unpack args - moonscript.remove_loader! - - if opts.d - return run_chunk! - - local err, trace, cov - - if opts.coverage - print "starting coverage" - coverage = require "moonscript.cmd.coverage" - cov = coverage.CodeCoverage! - cov\start! - - xpcall run_chunk, (_err) -> - err = _err - trace = debug.traceback "", 2 - - if err - truncated = errors.truncate_traceback util.trim trace - rewritten = errors.rewrite_traceback truncated, err - - if rewritten - print_err rewritten - else - -- failed to rewrite, show original - print_err table.concat { - err, - util.trim trace - }, "\n" - os.exit 1 - else - if cov - cov\stop! - cov\print_results! - -run! diff --git a/bin/moonc b/bin/moonc deleted file mode 100644 index 44f412dd..00000000 --- a/bin/moonc +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env lua - -local argparse = require "argparse" -local lfs = require "lfs" - -local parser = argparse() - -parser:flag("-l --lint", "Perform a lint on the file instead of compiling") - -parser:flag("-v --version", "Print version") -parser:flag("-w --watch", "Watch file/directory for updates") -parser:option("--transform", "Transform syntax tree with module") - -parser:mutex( - parser:option("-t --output-to", "Specify where to place compiled files"), - parser:option("-o", "Write output to file"), - parser:flag("-p", "Write output to standard output"), - parser:flag("-T", "Write parse tree instead of code (to stdout)"), - parser:flag("-b", "Write parse and compile time instead of code(to stdout)"), - parser:flag("-X", "Write line rewrite map instead of code (to stdout)") -) - -parser:flag("-", - "Read from standard in, print to standard out (Must be only argument)") - -local read_stdin = arg[1] == "-" -- luacheck: ignore 113 - -if not read_stdin then - parser:argument("file/directory"):args("+") -else - if arg[2] ~= nil then - io.stderr:write("- must be the only argument\n") - os.exit(1) - end -end - -local opts = read_stdin and {} or parser:parse() - -if opts.version then - local v = require "moonscript.version" - v.print_version() - os.exit() -end - -function log_msg(...) - if not opts.p then - io.stderr:write(table.concat({...}, " ") .. "\n") - end -end - -local moonc = require("moonscript.cmd.moonc") -local util = require "moonscript.util" -local normalize_dir = moonc.normalize_dir -local compile_and_write = moonc.compile_and_write -local path_to_target = moonc.path_to_target - -local function scan_directory(root, collected) - root = normalize_dir(root) - collected = collected or {} - - for fname in lfs.dir(root) do - if not fname:match("^%.") then - local full_path = root..fname - - if lfs.attributes(full_path, "mode") == "directory" then - scan_directory(full_path, collected) - elseif fname:match("%.moon$") then - table.insert(collected, full_path) - end - end - end - - return collected -end - -local function remove_dups(tbl, key_fn) - local hash = {} - local final = {} - - for _, v in ipairs(tbl) do - local dup_key = key_fn and key_fn(v) or v - if not hash[dup_key] then - table.insert(final, v) - hash[dup_key] = true - end - end - - return final -end - --- creates tuples of input and target -local function get_files(fname, files) - files = files or {} - - if lfs.attributes(fname, "mode") == "directory" then - for _, sub_fname in ipairs(scan_directory(fname)) do - table.insert(files, { - sub_fname, - path_to_target(sub_fname, opts.output_to, fname) - }) - end - else - table.insert(files, { - fname, - path_to_target(fname, opts.output_to) - }) - end - - return files -end - -if read_stdin then - local parse = require "moonscript.parse" - local compile = require "moonscript.compile" - - local text = io.stdin:read("*a") - local tree, err = parse.string(text) - - if not tree then error(err) end - local code, err, pos = compile.tree(tree) - - if not code then - error(compile.format_error(err, pos, text)) - end - - print(code) - os.exit() -end - -local inputs = opts["file/directory"] - -local files = {} -for _, input in ipairs(inputs) do - get_files(input, files) -end - -files = remove_dups(files, function(f) - return f[2] -end) - --- returns an iterator that returns files that have been updated -local function create_watcher(files) - local watchers = require("moonscript.cmd.watchers") - - if watchers.InotifyWacher:available() then - return watchers.InotifyWacher(files):each_update() - end - - return watchers.SleepWatcher(files):each_update() -end - -if opts.watch then - -- build function to check for lint or compile in watch - local handle_file - if opts.lint then - local lint = require "moonscript.cmd.lint" - handle_file = lint.lint_file - else - handle_file = compile_and_write - end - - local watcher = create_watcher(files) - -- catches interrupt error for ctl-c - local protected = function() - local status, file = true, watcher() - if status then - return file - elseif file ~= "interrupted!" then - error(file) - end - end - - for fname in protected do - local target = path_to_target(fname, opts.t) - - if opts.o then - target = opts.o - end - - local success, err = handle_file(fname, target) - if opts.lint then - if success then - io.stderr:write(success .. "\n\n") - elseif err then - io.stderr:write(fname .. "\n" .. err .. "\n\n") - end - elseif not success then - io.stderr:write(table.concat({ - "", - "Error: " .. fname, - err, - "\n", - }, "\n")) - elseif success == "build" then - log_msg("Built", fname, "->", target) - end - end - - io.stderr:write("\nQuitting...\n") -elseif opts.lint then - local has_linted_with_error; - local lint = require "moonscript.cmd.lint" - for _, tuple in pairs(files) do - local fname = tuple[1] - local res, err = lint.lint_file(fname) - if res then - has_linted_with_error = true - io.stderr:write(res .. "\n\n") - elseif err then - has_linted_with_error = true - io.stderr:write(fname .. "\n" .. err.. "\n\n") - end - end - if has_linted_with_error then - os.exit(1) - end -else - for _, tuple in ipairs(files) do - local fname, target = util.unpack(tuple) - if opts.o then - target = opts.o - end - - local success, err = compile_and_write(fname, target, { - print = opts.p, - fname = fname, - benchmark = opts.b, - show_posmap = opts.X, - show_parse_tree = opts.T, - transform_module = opts.transform - }) - - if not success then - io.stderr:write(fname .. "\t" .. err .. "\n") - os.exit(1) - end - end -end - - diff --git a/bin/splat.moon b/bin/splat.moon deleted file mode 100755 index d6127042..00000000 --- a/bin/splat.moon +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env moon -argparse = require "argparse" - --- TODO: it would be cool if you could just point this at a luarocks tree, pass a list of top level module names, and it figures it out for you. --- Perhaps even merge the header generation into here as well to avoid using xxd - -normalize = (path) -> - path\match("(.-)/*$").."/" - -parser = argparse "splat.moon", "Concatenate a collection of Lua modules into a single file" -parser\option("--load -l", "Module names that will be load on require")\count "*" -parser\flag("--strip-prefix -s", "Strip directory prefix from module names") - -parser\argument("directories", "Directories to scan for Lua modules")\args "+" - -args = parser\parse [v for _, v in ipairs _G.arg] -dirs = args.directories -strip_prefix = args.strip_prefix - -lfs = require "lfs" -scan_directory = (root, patt, collected={}) -> - root = normalize root - for fname in lfs.dir root - if not fname\match "^%." - full_path = root..fname - - if lfs.attributes(full_path, "mode") == "directory" - scan_directory full_path, patt, collected - else - if full_path\match patt - table.insert collected, full_path - - collected - -path_to_module_name = (path, prefix) -> - if prefix and path\sub(1, #prefix) == prefix - path = path\sub(#prefix + 1) - (path\match("(.-)%.lua")\gsub("/", ".")) - -each_line = (text) -> - coroutine.wrap -> - start = 1 - while true - pos, after = text\find "\n", start, true - break if not pos - coroutine.yield text\sub start, pos - 1 - start = after + 1 - coroutine.yield text\sub start, #text - nil - -write_module = (name, text) -> - print "package.preload['"..name.."'] = function()" - for line in each_line text - print " "..line - print "end" - -modules = {} -for dir in *dirs - files = scan_directory dir, "%.lua$" - prefix = strip_prefix and normalize(dir) or nil - chunks = for path in *files - module_name = path_to_module_name path, prefix - content = io.open(path)\read"*a" - modules[module_name] = true - {module_name, content} - - for chunk in *chunks - name, content = unpack chunk - base = name\match"(.-)%.init" - if base and not modules[base] then - modules[base] = true - name = base - write_module name, content - -for module_name in *args.load - if modules[module_name] - print ([[package.preload["%s"]()]])\format module_name - diff --git a/bin/util/file_to_header.lua b/bin/util/file_to_header.lua deleted file mode 100644 index 71378367..00000000 --- a/bin/util/file_to_header.lua +++ /dev/null @@ -1,42 +0,0 @@ --- this script is used to convert a source input file into a C header to embed --- that file as a string. Works the same as xxd -i - -local input = ... - -local function read_file(file_path) - local file = assert(io.open(file_path, "rb")) - local content = file:read("*a") - file:close() - return content -end - -local function generate_c_header(input_file) - local function byte_to_hex(byte) - return string.format("0x%02x", byte:byte()) - end - - local function sanitize_name(name) - return (name:gsub("[^%w_]", "_")) - end - - local data = read_file(input_file) - local name = sanitize_name(input_file) - local header = {} - - table.insert(header, string.format("unsigned char %s[] = {", name)) - for i = 1, #data do - if i % 16 == 1 then - table.insert(header, "\n ") - end - table.insert(header, byte_to_hex(data:sub(i, i))) - if i ~= #data then - table.insert(header, ", ") - end - end - table.insert(header, "\n};\n") - table.insert(header, string.format("unsigned int %s_len = %d;\n", name, #data)) - - return table.concat(header) -end - -print(generate_c_header(input)) diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index 56425264..00000000 --- a/docs/api.md +++ /dev/null @@ -1,132 +0,0 @@ -{ - target: "reference/api" - template: "reference" - title: "Compiler API" - short_name: "api" -} - -# MoonScript Compiler API - -## Autocompiling with the `moonscript` Module - -After installing MoonScript, you can include the `moonscript` module to make -any Lua script MoonScript aware. - -```lua -require "moonscript" -``` - -After `moonscript` is required, Lua's package loader is updated to search for -`.moon` files on any subsequent calls to `require`. The search path for `.moon` -files is based on the current `package.path` value in Lua when `moonscript` is -required. Any search paths in `package.path` ending in `.lua` are copied, -rewritten to end in `.moon`, and then inserted in `package.moonpath`. - -The `moonloader` is the function that is responsible for searching -`package.moonpath` for a file available to be included. It is inserted in the -second position of the `package.loaders` table. This means that a matching `.moon` file -will be loaded over a matching `.lua` file that has the same base name. - -For more information on Lua's `package.loaders` see [Lua Reference Manual -— -package.loaders](http://www.lua.org/manual/5.1/manual.html#pdf-package.loaders) - -The `moonloader`, when finding a valid path to a `.moon` file, will parse and -compile the file in memory. The code is then turned into a function using the -built in `load` function, which is run as the module. - -If you are executing MoonScript code with the included `moon` command line tool -then it is not required to include this module before including any other -MoonScript modules. - -## `moonscript.base` Module - -```moononly -moonscript = require "moonscript.base" -``` - -This module contains an assortment of functions for loading and compiling -MoonScript code from within Lua. - -The module provides `load`, `loadfile`, `loadstring` functions, which are -analogous to the similarly named Lua functions. The major difference is that -they load MoonScript code instead of Lua code. - - -```moononly -moonscript = require "moonscript.base" - -fn = moonscript.loadstring 'print "hi!"' -fn! -``` - -All of these functions can take an optional last argument, a table of options. -The only option right now is `implicitly_return_root`. Setting this to `false` -makes it so the file does not implicitly return its last statement. - - -```moononly -moonscript = require "moonscript.base" - -fn = moonscript.loadstring "10" -print fn! -- prints "10" - -fn = moonscript.loadstring "10", implicitly_return_root: false -print fn! -- prints nothing -``` - -One more useful function is provided: `to_lua`. This function takes a string of -MoonScript code and returns the compiled Lua result along with the line mapping -table. If there are any errors then `nil` and the error message are returned. - - -```moononly -import to_lua from require "moonscript.base" - -lua_code, line_table = to_lua [[ -x = 124 -print "hello world #{x}" -]] -``` - -Similar to the `load*` functions from above, `to_lua` can take an optional -final argument of a table of options. - -The second return value of `to_lua` is useful if you want to perform line -number reversal. It's a table where the key is a Lua line number and the value -is a character offset from the original MoonScript source. - -## Programmatically Compiling - -If you need finer grained control over the compilation process you can use the -raw parse and compile modules. - -Parsing converts a string of MoonScript into an abstract syntax tree. Compiling -converts an abstract syntax tree into a Lua code string. - -Knowledge of this API may be useful for creating tools to aid the generation of -Lua code from MoonScript code. For example, you could build a macro system by -analyzing and manipulating the abstract syntax tree. Be warned though, the -format of the abstract syntax tree is undocumented and may change in the -future. - -Here is a quick example of how you would compile a MoonScript string to a Lua -String (This is effectively the same as the `to_lua` function described above): - -```moononly -parse = require "moonscript.parse" -compile = require "moonscript.compile" - -moon_code = [[(-> print "hello world")!]] - -tree, err = parse.string moon_code -unless tree - error "Parse error: " .. err - -lua_code, err, pos = compile.tree tree -unless lua_code - error compile.format_error err, pos, moon_code - --- our code is ready -print lua_code -``` diff --git a/docs/command_line.md b/docs/command_line.md deleted file mode 100644 index f0e5d4b2..00000000 --- a/docs/command_line.md +++ /dev/null @@ -1,309 +0,0 @@ -{ - target: "reference/command_line" - template: "reference" - title: "Command Line Tools" - short_name: "command_line" -} - -# Command Line Tools - -Two tools are installed with MoonScript, `moon` and `moonc`. - -`moonc` is for compiling MoonScript code to Lua. -`moon` is for running MoonScript code directly. - -## `moon` - -`moon` can be used to run MoonScript files directly from the command line, -without needing a separate compile step. All MoonScript files are compiled in -memory as they are executed. - -```bash -$ moon my_script.moon -``` - -Any MoonScript files that are required will also be compiled on demand as they -are loaded. - -When an error occurs during runtime, the stack trace is rewritten to give line -numbers from the original `.moon` file. - -If you want to disable [error rewriting](#error_rewriting), you can pass the -`-d` flag. A full list of flags can be seen by passing the `-h` or `--help` -flag. - -### Error Rewriting - -Runtime errors are given special attention when running code using the `moon` -command line tool. Because code is written in MoonScript but executed as Lua, -errors that happen during runtime report Lua line numbers. This can make -debugging less than ideal. - -In order to solve this problem MoonScript builds up a table of line number -mappings, allowing the runtime to calculate what line of MoonScript generated -the line of Lua that triggered the error. - -Consider the following file with a bug (note the invalid `z` variable): - -```moon -add_numbers = (x,y) -> x + z -- 1 -print add_numbers 10,0 -- 2 -``` - -The following error is generated: - - moon: scrap.moon:1(3): attempt to perform arithmetic on global 'z' (a nil value) - stack traceback: - scrap.moon:1(3): in function 'add_numbers' - scrap.moon:2(5): in main chunk - - -Notice how next to the file name there are two numbers. The first number is the -rewritten line number. The number in the parentheses is the original Lua line -number. - -The error in this example is being reported on line 1 of the `moon` file, which -corresponds to line 3 of the generated Lua code. The entire stack trace is rewritten in -addition to the error message. - -### Code Coverage - -`moon` lets you run a MoonScript file while keeping track of which lines -are executed with the `-c` flag. - -For example, consider the following `.moon` file: - -```moononly --- test.moon -first = -> - print "hello" - -second = -> - print "world" - -first! -``` - -We can execute and get a glance of which lines ran: - -```bash -$ moon -c test.moon -``` - -The following output is produced: - - ------| @cool.moon - 1| -- test.moon - * 2| first = -> - * 3| print "hello" - 4| - * 5| second = -> - 6| print "world" - 7| - * 8| first! - 9| - -The star next to the line means that it was executed. Blank lines are not -considered when running so by default they don't get marked as executed. - -## `moonc` - -`moonc` is used for transforming MoonScript files into Lua files. -It takes a list of files, compiles them all, and creates the associated `.lua` -files in the same directories. - -```bash -$ moonc my_script1.moon my_script2.moon ... -``` - -You can control where the compiled files are put using the `-t` flag, followed -by a directory. - -`moonc` can also take a directory as an argument, and it will recursively scan -for all MoonScript files and compile them. - -`moonc` can write to standard out by passing the `-p` flag. - -The `-w` flag can be used to enable watch mode. `moonc` will stay running, and -watch for changes to the input files. If any of them change then they will be -compiled automatically. - -A full list of flags can be seen by passing the `-h` or `--help` flag. - -### Syntax Transformer - -A syntax transformer is a function that manipulates MoonScript code before -compiling to Lua. It operates on the parsed AST (Abstract Syntax Tree). It can -be used to implement macros, change syntax, optimize code, among other things. -You specify the name of a Lua module. This module must return a single function -(or callable object) that takes AST as an argument, and returns the new AST. - -```bash -moonc --transform my_transfomer my_script.moon -``` - -The transform can fail by returning `nil` and an error message. MoonScript AST -is currently undocumented, so you'll have to experiment by printing out the AST -to see how to make changes. MoonScript AST is made up of standard Lua tables -that are nested. - -### Linter - -`moonc` contains a [lint][1] tool for statically detecting potential problems -with code. The linter has two tests: detects accessed global variables, -detect unused declared variables. If the linter detects any issues with a file, -the program will exit with a status of `1`. - -You can execute the linter with the `-l` flag. When the linting flag is -provided only linting takes place and no compiled code is generated. - -The linter is compatible with the watch mode (see above) for automatic linting. - -```bash -moonc -l file1.moon file2.moon -``` - -Like when compiling, you can also pass a directory as a command line argument -to recursively process all the `.moon` files. - -#### Global Variable Checking - -It's considered good practice to avoid using global variables and create local -variables for all the values referenced. A good case for not using global -variables is that you can analyize the code ahead of time without the need to -execute it to find references to undeclared variables. - -MoonScript makes it difficult to declare global variables by forcing you to be -explicit with the `export` keyword, so it's a good candidate for doing this -kind of linting. - -Consider the following program with a typo: (`my_number` is spelled wrong as -`my_nmuber` in the function) - -```moononly --- lint_example.moon -my_number = 1234 - -some_function = -> - -- a contrived example with a small chance to pass - if math.random() < 0.01 - my_nmuber + 10 - -some_function! -``` - -Although there is a bug in this code, it rarely happens during execution. It's -more likely to be missed during development and cause problems in the future. - -Running the linter immediately identifies the problem: - -```bash -$ moonc -l lint_example.moon -``` - -Outputs: - - ./lint_example.moon - - line 7: accessing global `my_nmuber` - ================================== - > my_nmuber + 10 - -#### Global Variable Whitelist - -In most circumstances it's impossible to avoid using some global variables. For -example, to access any of the built in modules or functions you typically -access them globally. - -For this reason a global variable whitelist is used. It's a list of global -variables that are allowed to be used. A default whitelist is provided that -contains all of Lua's built in functions and modules. - -You can create your own entires in the whitelist as well. For example, the -testing framework [Busted](http://olivinelabs.com/busted) uses a collection of -global functions (like `describe`, `before_each`, `setup`) to make writing -tests easy. - -It would be nice if we could allow all of those global functions to be called -for `.moon` files located in the `spec/` directory. We can do that by creating -a `lint_config` file. - -`lint_config` is a regular MoonScript or Lua file that provides configuration -for the linter. One of those settings is `whitelist_globals`. - -To create a configuration for Busted we might do something like this: - -```moononly --- lint_config.moon -{ - whitelist_globals: { - ["spec/"]: { - "it", "describe", "setup", "teardown", - "before_each", "after_each", "pending" - } - } -} -``` - -Compile the file: - -```bash -$ moonc lint_config.moon -``` - -Then run the linter on your entire project: - -```bash -$ moonc -l . -``` - -The whitelisted global references in `spec/` will no longer raise notices. - -The `whitelist_globals` property of the `lint_config` is a table where the keys -are Lua patterns that match file names, and the values are an array of globals -that are allowed. - -Multiple patterns in `whitelist_globals` can match a single file, the union of -the allowed globals will be used when linting that file. - -#### Unused Variable Assigns - -Sometimes when debugging, refactoring, or just developing, you might leave -behind stray assignments that aren't actually necessary for the execution of -your code. It's good practice to clean them up to avoid any potential confusion -they might cause. - -The unused assignment detector keeps track of any variables that are assigned, -and if they aren't accessed in within their available scope, they are reported -as an error. - -Given the following code: - -```moononly -a, b = 1, 2 -print "hello", a -``` - -The linter will identify the problem: - - ./lint_example.moon - - line 1: assigned but unused `b` - =============================== - > a, b = 1, 2 - - -Sometimes you need a name to assign to even though you know it will never be -accessed. The linter will treat `_` as a special name that's allowed to be -written to but never accessed: - -The following code would not produce any lint errors: - -```moononly -item = {123, "shoe", "brown", 123} -_, name, _, count = unpack item -print name, count -``` - - [1]: http://en.wikipedia.org/wiki/Lint_(software) - diff --git a/docs/reference.md b/docs/reference.md deleted file mode 100644 index b95e8faf..00000000 --- a/docs/reference.md +++ /dev/null @@ -1,1588 +0,0 @@ -{ - target: "reference/index" - template: "reference" - title: "Language Guide" - short_name: "lang" -} - -MoonScript is a programming language that compiles to -[Lua](http://www.lua.org). This guide expects the reader to have basic -familiarity with Lua. For each code snippet below, the MoonScript is on the -left and the compiled Lua is on right right. - -This is the official language reference manual, installation directions and the -homepage are located at . - -
- - -
- -# The Language - -## Whitespace - -MoonScript is a whitespace sensitive language. This means that -instead of using `do` and `end` (or `{` and `}`) to delimit sections of code we -use line-breaks and indentation. - -This means that how you indent your code is important. Luckily MoonScript -doesn't care how you do it but only requires that you be consistent. - -An indent must be at least 1 space or 1 tab, but you can use as many as you -like. All the code snippets on this page will use two spaces. - -> Should you happen to mix tabs and spaces, a tab is equivalent to 4 spaces. I -> shouldn't be telling you this though because you should never do it. - -## Assignment - -Assigning to an undeclared name will cause it to be declared as a new local -variable. The language is dynamically typed so you can assign any value to any -variable. You can assign multiple names and values at once just like Lua: - -```moon -hello = "world" -a,b,c = 1, 2, 3 -hello = 123 -- uses the existing variable -``` - -If you wish to create a global variable it must be done using the -[`export`](#export_statement) keyword. - -The [`local`](#local_statement) keyword can be used to forward declare a -variable, or shadow an existing one. - -## Update Assignment - -`+=`, `-=`, `/=`, `*=`, `%=`, `..=`, `or=`, `and=`, `&=`, `|=`, `>>=`, and -`<<=` operators have been added for updating and assigning at the same time. -They are aliases for their expanded equivalents. - -```moon -x = 0 -x += 10 - -s = "hello " -s ..= "world" - -b = false -b and= true or false - -p = 50 -p &= 5 -p |= 3 -p >>= 3 -p <<= 3 -``` - -## Comments - -Like Lua, comments start with `--` and continue to the end of the line. -Comments are not written to the output. - -```moon --- I am a comment -``` - -## Literals & Operators - -All of the primitive literals in Lua can be used. This applies to numbers, -strings, booleans, and `nil`. - -All of Lua's binary and unary operators are available. Additionally `!=` is as -an alias for `~=`. - -Unlike Lua, Line breaks are allowed inside of single and double quote strings -without an escape sequence: - -```moon -some_string = "Here is a string - that has a line break in it." -``` - -## Function Literals - -All functions are created using a function expression. A simple function is -denoted using the arrow: `->` - -```moon -my_function = -> -my_function() -- call the empty function -``` - -The body of the function can either be one statement placed directly after the -arrow, or it can be a series of statements indented on the following lines: - -```moon -func_a = -> print "hello world" - -func_b = -> - value = 100 - print "The value:", value -``` - -If a function has no arguments, it can be called using the `!` operator, -instead of empty parentheses. The `!` invocation is the preferred way to call -functions with no arguments. - -```moon -func_a! -func_b() -``` - -Functions with arguments can be created by preceding the arrow with a list of -argument names in parentheses: - -```moon -sum = (x, y) -> print "sum", x + y -``` - -Functions can be called by listing the arguments after the name of an expression -that evaluates to a function. When chaining together function calls, the -arguments are applied to the closest function to the left. - -```moon -sum 10, 20 -print sum 10, 20 - -a b c "a", "b", "c" -``` - -In order to avoid ambiguity in when calling functions, parentheses can also be -used to surround the arguments. This is required here in order to make sure the -right arguments get sent to the right functions. - -```moon -print "x:", sum(10, 20), "y:", sum(30, 40) -``` - -There must not be any space between the opening parenthesis and the function. - -Functions will coerce the last statement in their body into a return statement, -this is called implicit return: - -```moon -sum = (x, y) -> x + y -print "The sum is ", sum 10, 20 -``` - -And if you need to explicitly return, you can use the `return` keyword: - -```moon -sum = (x, y) -> return x + y -``` - -Just like in Lua, functions can return multiple values. The last statement must -be a list of values separated by commas: - -```moon -mystery = (x, y) -> x + y, x - y -a,b = mystery 10, 20 -``` - -### Fat Arrows - -Because it is an idiom in Lua to send an object as the first argument when -calling a method, a special syntax is provided for creating functions which -automatically includes a `self` argument. - -```moon -func = (num) => @value + num -``` - -### Argument Defaults - -It is possible to provide default values for the arguments of a function. An -argument is determined to be empty if its value is `nil`. Any `nil` arguments -that have a default value will be replaced before the body of the function is run. - -```moon -my_function = (name="something", height=100) -> - print "Hello I am", name - print "My height is", height -``` - -An argument default value expression is evaluated in the body of the function -in the order of the argument declarations. For this reason default values have -access to previously declared arguments. - -```moon -some_args = (x=100, y=x+1000) -> - print x + y -``` - -### Considerations - -Because of the expressive parentheses-less way of calling functions, some -restrictions must be put in place to avoid parsing ambiguity involving -whitespace. - -The minus sign plays two roles, a unary negation operator and a binary -subtraction operator. Consider how the following examples compile: - -```moon -a = x - 10 -b = x-10 -c = x -y -d = x- z -``` - -The precedence of the first argument of a function call can be controlled using -whitespace if the argument is a literal string. In Lua, it is common to leave -off parentheses when calling a function with a single string or table literal. - -When there is no space between a variable and a string literal, the -function call takes precedence over any following expressions. No other -arguments can be passed to the function when it is called this way. - -Where there is a space following a variable and a string literal, the function -call acts as show above. The string literal belongs to any following -expressions (if they exist), which serves as the argument list. - -```moon -x = func"hello" + 100 -y = func "hello" + 100 -``` - -### Multi-line arguments - -When calling functions that take a large number of arguments, it is convenient -to split the argument list over multiple lines. Because of the white-space -sensitive nature of the language, care must be taken when splitting up the -argument list. - -If an argument list is to be continued onto the next line, the current line -must end in a comma. And the following line must be indented more than the -current indentation. Once indented, all other argument lines must be at the -same level of indentation to be part of the argument list - -```moon -my_func 5,4,3, - 8,9,10 - -cool_func 1,2, - 3,4, - 5,6, - 7,8 -``` - -This type of invocation can be nested. The level of indentation is used to -determine to which function the arguments belong to. - -```moon -my_func 5,6,7, - 6, another_func 6,7,8, - 9,1,2, - 5,4 -``` - -Because [tables](#table_literals) also use the comma as a delimiter, this -indentation syntax is helpful for letting values be part of the argument list -instead of being part of the table. - -```moon -x = { - 1,2,3,4, a_func 4,5, - 5,6, - 8,9,10 -} -``` - -Although uncommon, notice how we can give a deeper indentation for function -arguments if we know we will be using a lower indentation further on. - -```moon -y = { my_func 1,2,3, - 4,5, - 5,6,7 -} -``` - -The same thing can be done with other block level statements like -[conditionals](#conditionals). We can use indentation level to determine what -statement a value belongs to: - -```moon -if func 1,2,3, - "hello", - "world" - print "hello" - print "I am inside if" - -if func 1,2,3, - "hello", - "world" - print "hello" - print "I am inside if" -``` - -## Table Literals - -Like in Lua, tables are delimited in curly braces. - -```moon -some_values = { 1, 2, 3, 4 } -``` - -Unlike Lua, assigning a value to a key in a table is done with `:` (instead of -`=`). - -```moon -some_values = { - name: "Bill", - age: 200, - ["favorite food"]: "rice" -} -``` - -The curly braces can be left off if a single table of key value pairs is being -assigned. - -```moon -profile = - height: "4 feet", - shoe_size: 13, - favorite_foods: {"ice cream", "donuts"} -``` - -Newlines can be used to delimit values instead of a comma (or both): - -```moon -values = { - 1,2,3,4 - 5,6,7,8 - name: "superman" - occupation: "crime fighting" -} -``` - -When creating a single line table literal, the curly braces can also be left -off: - -```moon -my_function dance: "Tango", partner: "none" - -y = type: "dog", legs: 4, tails: 1 -``` - -The keys of a table literal can be language keywords without being escaped: - -```moon -tbl = { - do: "something" - end: "hunger" -} -``` - -If you are constructing a table out of variables and wish the keys to be the -same as the variable names, then the `:` prefix operator can be used: - -```moon -hair = "golden" -height = 200 -person = { :hair, :height, shoe_size: 40 } - -print_table :hair, :height -``` - -If you want the key of a field in the table to to be result of an expression, -then you can wrap it in `[` `]`, just like in Lua. You can also use a string -literal directly as a key, leaving out the square brackets. This is useful if -your key has any special characters. - -```moon -t = { - [1 + 2]: "hello" - "hello world": true -} - -``` - -## Comprehensions - -Comprehensions provide a convenient syntax for constructing a new table by -iterating over some existing object and applying an expression to its values. -There are two kinds of comprehensions: list comprehensions and table -comprehensions. They both produce Lua tables; _list comprehensions_ accumulate -values into an array-like table, and _table comprehensions_ let you set both -the key and the value on each iteration. - -### List Comprehensions - -The following creates a copy of the `items` table but with all the values -doubled. - -```moon -items = { 1, 2, 3, 4 } -doubled = [item * 2 for i, item in ipairs items] -``` - -The items included in the new table can be restricted with a `when` clause: - -```moon -iter = ipairs items -slice = [item for i, item in iter when i > 1 and i < 3] -``` - -Because it is common to iterate over the values of a numerically indexed table, -an `*` operator is introduced. The doubled example can be rewritten as: - -```moon -doubled = [item * 2 for item in *items] -``` - -The `for` and `when` clauses can be chained as much as desired. The only -requirement is that a comprehension has at least one `for` clause. - -Using multiple `for` clauses is the same as using nested loops: - -```moon -x_coords = {4, 5, 6, 7} -y_coords = {9, 2, 3} - -points = [{x,y} for x in *x_coords for y in *y_coords] -``` - -Numeric for loops can also be used in comprehensions: - -```moon -evens = [i for i=1,100 when i % 2 == 0] -``` - -### Table Comprehensions - -The syntax for table comprehensions is very similar, only differing by using `{` and -`}` and taking two values from each iteration. - -This example makes a copy of the table`thing`: - -```moon -thing = { - color: "red" - name: "fast" - width: 123 -} - -thing_copy = {k,v for k,v in pairs thing} -``` - -Table comprehensions, like list comprehensions, also support multiple `for` and -`when` clauses. In this example we use a `when` clause to prevent the value -associated with the `color` key from being copied. - -```moon -no_color = {k,v for k,v in pairs thing when k != "color"} -``` - -The `*` operator is also supported. Here we create a square root look up table -for a few numbers. - -```moon -numbers = {1,2,3,4} -sqrts = {i, math.sqrt i for i in *numbers} -``` - -The key-value tuple in a table comprehension can also come from a single -expression, in which case the expression should return two values. The -first is used as the key and the second is used as the value: - -In this example we convert an array of pairs to a table where the first item in -the pair is the key and the second is the value. - -```moon -tuples = {{"hello", "world"}, {"foo", "bar"}} -tbl = {unpack tuple for tuple in *tuples} -``` - -### Slicing - -A special syntax is provided to restrict the items that are iterated over when -using the `*` operator. This is equivalent to setting the iteration bounds and -a step size in a `for` loop. - -Here we can set the minimum and maximum bounds, taking all items with indexes -between 1 and 5 inclusive: - -```moon -slice = [item for item in *items[1,5]] -``` - -Any of the slice arguments can be left off to use a sensible default. In this -example, if the max index is left off it defaults to the length of the table. -This will take everything but the first element: - -```moon -slice = [item for item in *items[2,]] -``` - -If the minimum bound is left out, it defaults to 1. Here we only provide a step -size and leave the other bounds blank. This takes all odd indexed items: (1, 3, -5, ...) - -```moon -slice = [item for item in *items[,,2]] -``` - -## String Interpolation - -You can mix expressions into string literals using `#{}` syntax. - -```moon -print "I am #{math.random! * 100}% sure." -``` -String interpolation is only available in double quoted strings. - -## For Loop - -There are two for loop forms, just like in Lua. A numeric one and a generic one: - -```moon -for i = 10, 20 - print i - -for k = 1,15,2 -- an optional step provided - print k - -for key, value in pairs object - print key, value -``` - -The slicing and `*` operators can be used, just like with comprehensions: - -```moon -for item in *items[2,4] - print item -``` - -A shorter syntax is also available for all variations when the body is only a -single line: - -```moon -for item in *items do print item - -for j = 1,10,3 do print j -``` - -A for loop can also be used as an expression. The last statement in the body of -the for loop is coerced into an expression and appended to an accumulating -array table. - -Doubling every even number: - -```moon -doubled_evens = for i=1,20 - if i % 2 == 0 - i * 2 - else - i -``` - -You can also filter values by combining the for loop expression with the -[`continue`](#continue) statement. - -For loops at the end of a function body are not accumulated into a table for a -return value (Instead the function will return `nil`). Either an explicit -`return` statement can be used, or the loop can be converted into a list -comprehension. - -```moon -func_a = -> for i=1,10 do i -func_b = -> return for i=1,10 do i - -print func_a! -- prints nil -print func_b! -- prints table object -``` - -This is done to avoid the needless creation of tables for functions that don't -need to return the results of the loop. - -## While Loop - -The while loop also comes in two variations: - -```moon -i = 10 -while i > 0 - print i - i -= 1 - -while running == true do my_function! -``` - -Like for loops, the while loop can also be used an expression. Additionally, -for a function to return the accumulated value of a while loop, the statement -must be explicitly returned. - -## Continue - -A `continue` statement can be used to skip the current iteration in a loop. - -```moon -i = 0 -while i < 10 - continue if i % 2 == 0 - print i -``` -`continue` can also be used with loop expressions to prevent that iteration -from accumulating into the result. This examples filters the array table into -just even numbers: - -```moon -my_numbers = {1,2,3,4,5,6} -odds = for x in *my_numbers - continue if x % 2 == 1 - x -``` - -## Conditionals - -```moon -have_coins = false -if have_coins - print "Got coins" -else - print "No coins" -``` - -A short syntax for single statements can also be used: - -```moon -have_coins = false -if have_coins then print "Got coins" else print "No coins" -``` - -Because if statements can be used as expressions, this can also be written as: - -```moon -have_coins = false -print if have_coins then "Got coins" else "No coins" -``` - -Conditionals can also be used in return statements and assignments: - -```moon -is_tall = (name) -> - if name == "Rob" - true - else - false - -message = if is_tall "Rob" - "I am very tall" -else - "I am not so tall" - -print message -- prints: I am very tall -``` - -The opposite of `if` is `unless`: - -```moon -unless os.date("%A") == "Monday" - print "it is not Monday!" -``` - -```moon -print "You're lucky!" unless math.random! > 0.1 -``` - -### With Assignment - -`if` and `elseif` blocks can take an assignment in place of a conditional -expression. Upon evaluating the conditional, the assignment will take place and -the value that was assigned to will be used as the conditional expression. The -assigned variable is only in scope for the body of the conditional, meaning it -is never available if the value is not truthy. - -```moon -if user = database.find_user "moon" - print user.name -``` - -```moon -if hello = os.getenv "hello" - print "You have hello", hello -elseif world = os.getenv "world" - print "you have world", world -else - print "nothing :(" -``` - -## Line Decorators - -For convenience, the for loop and if statement can be applied to single -statements at the end of the line: - -```moon -print "hello world" if name == "Rob" -``` - -And with basic loops: - -```moon -print "item: ", item for item in *items -``` - -## Switch - -The switch statement is shorthand for writing a series of if statements that -check against the same value. Note that the value is only evaluated once. Like -if statements, switches can have an else block to handle no matches. Comparison -is done with the `==` operator. - -```moon -name = "Dan" -switch name - when "Robert" - print "You are Robert" - when "Dan", "Daniel" - print "Your name, it's Dan" - else - print "I don't know about your name" -``` - -A switch `when` clause can match against multiple values by listing them out -comma separated. - -Switches can be used as expressions as well, here we can assign the result of -the switch to a variable: - -```moon -b = 1 -next_number = switch b - when 1 - 2 - when 2 - 3 - else - error "can't count that high!" -``` - -We can use the `then` keyword to write a switch's `when` block on a single line. -No extra keyword is needed to write the else block on a single line. - -```moon -msg = switch math.random(1, 5) - when 1 then "you are lucky" - when 2 then "you are almost lucky" - else "not so lucky" -``` - -It is worth noting the order of the case comparison expression. The case's -expression is on the left hand side. This can be useful if the case's -expression wants to overwrite how the comparison is done by defining an `eq` -metamethod. - -## Object Oriented Programming - -In these examples, the generated Lua code may appear overwhelming. It is best -to focus on the meaning of the MoonScript code at first, then look into the Lua -code if you wish to know the implementation details. - -A simple class: - -```moon -class Inventory - new: => - @items = {} - - add_item: (name) => - if @items[name] - @items[name] += 1 - else - @items[name] = 1 -``` - -A class is declared with a `class` statement followed by a table-like -declaration where all of the methods and properties are listed. - -The `new` property is special in that it will become the constructor. - -Notice how all the methods in the class use the fat arrow function syntax. When -calling methods on a instance, the instance itself is sent in as the first -argument. The fat arrow handles the creation of a `self` argument. - -The `@` prefix on a variable name is shorthand for `self.`. `@items` becomes -`self.items`. - -Creating an instance of the class is done by calling the name of the class as a -function. - -```moon -inv = Inventory! -inv\add_item "t-shirt" -inv\add_item "pants" -``` - -Because the instance of the class needs to be sent to the methods when they are -called, the \\ operator is used. - -All properties of a class are shared among the instances. This is fine for -functions, but for other types of objects, undesired results may occur. - -Consider the example below, the `clothes` property is shared amongst all -instances, so modifications to it in one instance will show up in another: - -```moononly -class Person - clothes: {} - give_item: (name) => - table.insert @clothes, name - -a = Person! -b = Person! - -a\give_item "pants" -b\give_item "shirt" - --- will print both pants and shirt -print item for item in *a.clothes -``` - -The proper way to avoid this problem is to create the mutable state of the -object in the constructor: - -```moononly -class Person - new: => - @clothes = {} -``` - -### Inheritance - -The `extends` keyword can be used in a class declaration to inherit the -properties and methods from another class. - -```moon -class BackPack extends Inventory - size: 10 - add_item: (name) => - if #@items > size then error "backpack is full" - super name -``` - -Here we extend our Inventory class, and limit the amount of items it can carry. - -In this example, we don't define a constructor on the subclass, so the parent -class' constructor is called when we make a new instance. If we did define a -constructor then we can use the [`super`](#super) method to call the parent -constructor. - -Whenever a class inherits from another, it sends a message to the parent class -by calling the method `__inherited` on the parent class if it exists. The -function receives two arguments, the class that is being inherited and the -child class. - -```moononly -class Shelf - @__inherited: (child) => - print @__name, "was inherited by", child.__name - --- will print: Shelf was inherited by Cupboard -class Cupboard extends Shelf -``` - -### Super - -`super` is a special keyword that can be used in two different ways: It can be -treated as an object, or it can be called like a function. It only has special -functionality when inside a class. - -When called as a function, it will call the function of the same name in the -parent class. The current `self` will automatically be passed as the first -argument. (As seen in the [inheritance](#inheritance) example above) - -When `super` is used as a normal value, it is a reference to the parent class -object. - -It can be accessed like any of object in order to retrieve values in the -parent class that might have been shadowed by the child class. - -When the \\ calling operator is used with `super`, `self` is inserted as the -first argument instead of the value of `super` itself. When using `.` to -retrieve a function, the raw function is returned. - -A few examples of using `super` in different ways: - -```moon -class MyClass extends ParentClass - a_method: => - -- the following have the same effect: - super "hello", "world" - super\a_method "hello", "world" - super.a_method self, "hello", "world" - - -- super as a value is equal to the parent class: - assert super == ParentClass -``` - -`super` can also be used on left side of a [Function Stub](#function_stubs). -The only major difference is that instead of the resulting function being bound -to the value of `super`, it is bound to `self`. - -### Types - -Every instance of a class carries its type with it. This is stored in the -special `__class` property. This property holds the class object. The class -object is what we call to build a new instance. We can also index the class -object to retrieve class methods and properties. - -```moon -b = BackPack! -assert b.__class == BackPack - -print BackPack.size -- prints 10 -``` -### Class Objects - -The class object is what we create when we use a `class` statement. The class -object is stored in a variable of the same name of the class. - -The class object can be called like a function in order to create new -instances. That's how we created instances of classes in the examples above. - -A class is made up of two tables. The class table itself, and the *base* table. The -*base* is used as the metatable for all the instances. All properties listed in -the class declaration are placed in the *base*. - -The class object's metatable reads properties from the base if they don't exist -in the class object. This means we can access functions and properties directly -from the class. - -It is important to note that assigning to the class object does not assign into -the *base*, so it's not a valid way to add new methods to instances. Instead -the *base* must explicitly be changed. See the `__base` field below. - -The class object has a couple special properties: - -The name of the class as when it was declared is stored as a string in the -`__name` field of the class object. - -```moon -print BackPack.__name -- prints Backpack -``` - -The *base* object is stored in `__base`. We can modify this table to add -functionality to instances that have already been created and ones that are yet -to be created. - -If the class extends from anything, the parent class object is stored in -`__parent`. - -### Class Variables - -We can create variables directly in the class object instead of in the *base* -by using `@` in the front of the property name in a class declaration. - -```moononly -class Things - @some_func: => print "Hello from", @__name - -Things\some_func! - --- class variables not visible in instances -assert Things().some_func == nil - -``` - -In expressions, we can use `@@` to access a value that is stored in the -`__class` of `self`. Thus, `@@hello` is shorthand for `self.__class.hello`. - -```moononly -class Counter - @count: 0 - - new: => - @@count += 1 - -Counter! -Counter! - -print Counter.count -- prints 2 -``` - -The calling semantics of `@@` are similar to `@`. Calling a `@@` name will pass -the class in as the first argument using Lua's colon syntax. - -```moon -@@hello 1,2,3,4 -``` -### Class Declaration Statements - -In the body of a class declaration, we can have normal expressions in addition -to key/value pairs. In this context, `self` is equal to the class object. - -Here is an alternative way to create a class variable compared to what's -described above: - -```moon -class Things - @class_var = "hello world" - -``` - -These expressions are executed after all the properties have been added to the -*base*. - -All variables declared in the body of the class are local to the classes -properties. This is convenient for placing private values or helper functions -that only the class methods can access: - - -```moononly -class MoreThings - secret = 123 - log = (msg) -> print "LOG:", msg - - some_method: => - log "hello world: " .. secret - -``` - -### `@` and `@@` Values - -When `@` and `@@` are prefixed in front of a name they represent, respectively, -that name accessed in `self` and `self.__class`. - -If they are used all by themselves, they are aliases for `self` and -`self.__class`. - -```moon -assert @ == self -assert @@ == self.__class -``` - -For example, a quick way to create a new instance of the same class from an -instance method using `@@`: - -```moon -some_instance_method = (...) => @@ ... -``` - - -### Class Expressions - -The `class` syntax can also be used as an expression which can be assigned to a -variable or explicitly returned. - -```moononly -x = class Bucket - drops: 0 - add_drop: => @drops += 1 -``` - -### Anonymous classes - -The name can be left out when declaring a class. The `__name` attribute will be -`nil`, unless the class expression is in an assignment. The name on the left -hand side of the assignment is used instead of `nil`. - - -```moononly -BigBucket = class extends Bucket - add_drop: => @drops += 10 - -assert Bucket.__name == "BigBucket" -``` - -You can even leave off the body, meaning you can write a blank anonymous class -like this: - -```moononly -x = class -``` - -## Export Statement - -Because all assignments to variables that are not lexically visible will -be declared as local, special syntax is required to declare a variable globally. - -The export keyword makes it so any following assignments to the specified names -will not be assigned locally. - -```moon -export var_name, var_name2 -var_name, var_name3 = "hello", "world" -``` - -This is especially useful when declaring what will be externally visible in a -module: - -```moon --- my_module.moon -module "my_module", package.seeall -export print_result - -length = (x, y) -> math.sqrt x*x + y*y - -print_result = (x, y) -> - print "Length is ", length x, y - --- main.moon -require "my_module" - -my_module.print_result 4, 5 -- prints the result - -print my_module.length 6, 7 -- errors, `length` not visible -``` - -Assignment can be combined with the export keyword to assign to global -variables directly: - -```moon -export some_number, message_str = 100, "hello world" -``` - -Additionally, a class declaration can be prefixed with the export keyword in -order to export it. - -Export will have no effect if there is already a local variable of the same -name in scope. - -### Export All & Export Proper - -The `export` statement can also take special symbols `*` and `^`. - -`export *` will cause any name declared after the statement to be exported in the -current scope. `export ^` will export all proper names, names that begin with a -capital letter. - -## Local Statement - -Sometimes you want to declare a variable name before the first time you assign -it. The `local` statement can be used to do that. - -In this example we declare the variable `a` in the outer scope so its value -can be accessed after the `if` statement. If there was no `local` statement then -`a` would only be accessible inside the `if` statement. - -```moon -local a -if something - a = 1 -print a -``` - -`local` can also be used to shadow existing variables for the rest of a scope. - -```moon -x = 10 -if something - local x - x = 12 -print x -- prints 10 -``` - -When you have one function that calls another, you typically order them such -that the second function can access the first. If both functions happen to -call each other, then you must forward declare the names: - -```moon -local first, second - -first = -> - second! - -second = -> - first! -``` - -The same problem occurs with declaring classes and regular values too. - -Because forward declaring is often better than manually ordering your assigns, -a special form of `local` is provided: - -```moon -local * - -first = -> - print data - second! - -second = -> - first! - -data = {} -``` - -`local *` will forward declare all names below it in the current scope. - -Similarly to [`export`](#export_all_and_export_proper) one more special form is -provided, `local ^`. This will forward declare all names that begin with a -capital letter. - -## Import Statement - -Often you want to bring some values from a table into the current scope as -local variables by their name. The import statement lets us accomplish this: - -```moon -import insert from table -``` - -The multiple names can be given, each separated by a comma: - -```moon -import C, Ct, Cmt from lpeg -``` - -Sometimes a function requires that the table be sent in as the first argument -(when using the \\ syntax). As a shortcut, we can prefix the name -with a \\ to bind it to that table: - -```moon --- some object -my_module = - state: 100 - add: (value) => - self.state + value - -import \add from my_module - -print add 22 -- equivalent to calling my_module\add 22 -``` - -When handing multiple imports you can substitute the comma with a newline and -any amount of whitespace. When working with a lot of imports you might write -something like this: - -```moon -import - assert_csrf - assert_timezone - not_found - require_login - from require "helpers" -``` - -## With Statement - -A common pattern involving the creation of an object is calling a series of -functions and setting a series of properties immediately after creating it. - -This results in repeating the name of the object multiple times in code, adding -unnecessary noise. A common solution to this is to pass a table in as an -argument which contains a collection of keys and values to overwrite. The -downside to this is that the constructor of this object must support this form. - -The `with` block helps to alleviate this. Within a `with` block we can use a -special statements that begin with either `.` or \\ which represent -those operations applied to the object we are using `with` on. - -For example, we work with a newly created object: - -```moon -with Person! - .name = "Oswald" - \add_relative my_dad - \save! - print .name -``` - -The `with` statement can also be used as an expression which returns the value -it has been giving access to. - -```moon -file = with File "favorite_foods.txt" - \set_encoding "utf8" -``` - -Or... - -```moon -create_person = (name, relatives) -> - with Person! - .name = name - \add_relative relative for relative in *relatives - -me = create_person "Leaf", {dad, mother, sister} -``` -In this usage, `with` can be seen as a special form of the K combinator. - -The expression in the `with` statement can also be an assignment, if you want -to give a name to the expression. - -```moon -with str = "Hello" - print "original:", str - print "upper:", \upper! -``` - -## Do - -When used as a statement, `do` works just like it does in Lua. - -```moon -do - var = "hello" - print var -print var -- nil here -``` - -MoonScript's `do` can also be used an expression . Allowing you to combine -multiple lines into one. The result of the `do` expression is the last -statement in its body. - - -```moon -counter = do - i = 0 - -> - i += 1 - i - -print counter! -print counter! -``` - -```moon -tbl = { - key: do - print "assigning key!" - 1234 -} -``` - -## Destructuring Assignment - -Destructuring assignment is a way to quickly extract values from a table by -their name or position in array based tables. - -Typically when you see a table literal, `{1,2,3}`, it is on the right hand side -of an assignment because it is a value. Destructuring assignment swaps the role -of the table literal, and puts it on the left hand side of an assign -statement. - -This is best explained with examples. Here is how you would unpack the first -two values from a table: - -```moon -thing = {1,2} - -{a,b} = thing -print a,b -``` - -In the destructuring table literal, the key represents the key to read from the -right hand side, and the value represents the name the read value will be -assigned to. - -```moon -obj = { - hello: "world" - day: "tuesday" - length: 20 -} - -{hello: hello, day: the_day} = obj -print hello, the_day -``` - -This also works with nested data structures as well: - -```moon -obj2 = { - numbers: {1,2,3,4} - properties: { - color: "green" - height: 13.5 - } -} - -{numbers: {first, second}} = obj2 -print first, second, color -``` -If the destructuring statement is complicated, feel free to spread it out over -a few lines. A slightly more complicated example: - -```moon -{ - numbers: { first, second } - properties: { - color: color - } -} = obj2 -``` - -It's common to extract values from at table and assign them the local variables -that have the same name as the key. In order to avoid repetition we can use the -`:` prefix operator: - -```moon -{:concat, :insert} = table -``` - -This is effectively the same as import, but we can rename fields we want to -extract by mixing the syntax: - -```moon -{:mix, :max, random: rand } = math -``` - -### Destructuring In Other Places - -Destructuring can also show up in places where an assignment implicitly takes -place. An example of this is a `for` loop: - - -```moon -tuples = { - {"hello", "world"} - {"egg", "head"} -} - -for {left, right} in *tuples - print left, right -``` - -We know each element in the array table is a two item tuple, so we can unpack -it directly in the names clause of the for statement using a destructure. - - -## Function Stubs - -It is common to pass a function from an object around as a value, for example, -passing an instance method into a function as a callback. If the function -expects the object it is operating on as the first argument then you must -somehow bundle that object with the function so it can be called properly. - -The function stub syntax is a shorthand for creating a new closure function -that bundles both the object and function. This new function calls the wrapped -function in the correct context of the object. - -Its syntax is the same as calling an instance method with the \\ operator but -with no argument list provided. - -```moon -my_object = { - value: 1000 - write: => print "the value:", @value -} - -run_callback = (func) -> - print "running callback..." - func! - --- this will not work: --- the function has to no reference to my_object -run_callback my_object.write - --- function stub syntax --- lets us bundle the object into a new function -run_callback my_object\write -``` - -## The Using Clause; Controlling Destructive Assignment - -While lexical scoping can be a great help in reducing the complexity of the -code we write, things can get unwieldy as the code size increases. Consider -the following snippet: - -```moon -i = 100 - --- many lines of code... - -my_func = -> - i = 10 - while i > 0 - print i - i -= 1 - -my_func! - -print i -- will print 0 -``` - - -In `my_func`, we've overwritten the value of `i` mistakenly. In this example it -is quite obvious, but consider a large, or foreign code base where it isn't -clear what names have already been declared. - -It would be helpful to say which variables from the enclosing scope we intend -on change, in order to prevent us from changing others by accident. - -The `using` keyword lets us do that. `using nil` makes sure that no closed -variables are overwritten in assignment. The `using` clause is placed after the -argument list in a function, or in place of it if there are no arguments. - -```moon -i = 100 - -my_func = (using nil) -> - i = "hello" -- a new local variable is created here - -my_func! -print i -- prints 100, i is unaffected -``` - - -Multiple names can be separated by commas. Closure values can still be -accessed, they just cant be modified: - -```moon -tmp = 1213 -i, k = 100, 50 - -my_func = (add using k,i) -> - tmp = tmp + add -- a new local tmp is created - i += tmp - k += tmp - -my_func(22) -print i,k -- these have been updated -``` - -## Misc. - -### Implicit Returns on Files - -By default, a file will also implicitly return like a function. This is useful -for writing modules, where you can put your module's table as the last -statement in the file so it is returned when loaded with `require`. - -### Writing Modules - -Lua 5.2 has removed the `module` function for creating modules. It is -recommended to return a table instead when defining a module. - -We can cleanly define modules by using the shorthand hash table key/value -syntax: - -```moonret - -MY_CONSTANT = "hello" - -my_function = -> print "the function" -my_second_function = -> print "another function" - -{ :my_function, :my_second_function, :MY_CONSTANT} -``` - -If you need to forward declare your values so you can access them regardless of -their written order you can add `local *` to the top of your file. - -# License (MIT) - - Copyright (C) 2020 by Leaf Corcoran - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - diff --git a/docs/standard_lib.md b/docs/standard_lib.md deleted file mode 100644 index 3a86a7b8..00000000 --- a/docs/standard_lib.md +++ /dev/null @@ -1,216 +0,0 @@ -{ - target: "reference/standard_lib" - template: "reference" - title: "Standard Library" - short_name: "stdlib" -} - -The MoonScript installation comes with a small kernel of functions that can be -used to perform various common things. - -The entire library is currently contained in a single object. We can bring this -`moon` object into scope by requiring `"moon"`. - -```moon -moon = require "moon" --- `moon.p` is the debug printer -moon.p { hello: "world" } -``` - -If you prefer to just inject all of the functions into the current scope, you -can require `"moon.all"` instead. The following has the same effect as above: - -```moon -require "moon.all" -p { hello: "world" } -``` - -All of the functions are compatible with Lua in addition to MoonScript, but -some of them only make sense in the context of MoonScript. - - -# MoonScript Standard Library - -This is an overview of all the included functions. -All of the examples assume that the standard library has been included with -`require "moon.all"`. - -## Printing Functions - -### `p(arg)` - -Prints a formatted version of an object. Excellent for inspecting the contents -of a table. - - -## Table Functions - -### `run_with_scope(fn, scope, [args...])` - -Mutates the environment of function `fn` and runs the function with any extra -arguments in `args...`. Returns the result of the function. - -The environment of the function is set to a new table whose metatable will use -`scope` to look up values. `scope` must be a table. If `scope` does not have an -entry for a value, it will fall back on the original environment. - -```moon -my_env = { - secret_function: -> print "shhh this is secret" - say_hi: -> print "hi there!" -} - -say_hi = -> print "I am a closure" - -fn = -> - secret_function! - say_hi! - -run_with_scope fn, my_env -``` - - -Note that any closure values will always take precedence against global name -lookups in the environment. In the example above, the `say_hi` in the -environment has been shadowed by the local variable `say_hi`. - -### `defaultbl([tbl,] fn)` - -Sets the `__index` of table `tbl` to use the function `fn` to generate table -values when a missing key is looked up. - -### `extend(arg1, arg2, [rest...])` - -Chains together a series of tables by their metatable's `__index` property. -Overwrites the metatable of all objects except for the last with a new table -whose `__index` is set to the next table. - -Returns the first argument. - -```moon -a = { hello: "world" } -b = { okay: "sure" } - -extend a, b - -print a.okay -``` - -### `copy(tbl)` - -Creates a shallow copy of a table, equivalent to: - -```moon -copy = (arg) -> {k,v for k,v in pairs self} -``` - -## Class/Object Functions - -### `is_object(value)` - -Returns true if `value` is an instance of a MoonScript class, false otherwise. - -### `type(value)` - -If `value` is an instance of a MoonScript class, then return it's class object. -Otherwise, return the result of calling Lua's type method. - -```moon -class MyClass - nil - -x = MyClass! -assert type(x) == MyClass -``` - -### `bind_methods(obj)` - -Takes an instance of an object, returns a proxy to the object whose methods can -be called without providing self as the first argument. - -```moon -obj = SomeClass! - -bound_obj = bind_methods obj - --- following have the same effect -obj\hello! -bound_obj.hello! -``` - -It lazily creates and stores in the proxy table the bound methods when they -are first called. - -### `mixin(obj, class, [args...])` - -Copies the methods of a class `cls` into the table `obj`, then calls the -constructor of the class with the `obj` as the receiver. - -In this example we add the functionality of `First` to an instance of `Second` -without ever instancing `First`. - -```moon -class First - new: (@var) => - show_var: => print "var is:", @var - -class Second - new: => - mixin self, First, "hi" - -a = Second! -a\show_var! -``` - -Be weary of name collisions when mixing in other classes, names will be -overwritten. - -### `mixin_object(obj, other_obj, method_names)` - -Inserts into `obj` methods from `other_obj` whose names are listed in -`method_names`. The inserted methods are bound methods that will run with -`other_obj` as the receiver. - -```moon -class List - add: (item) => print "adding to", self - remove: (item) => print "removing from", self - -class Encapsulation - new: => - @list = List! - mixin_object self, @list, {"add", "remove"} - -e = Encapsulation! -e.add "something" -``` - -### `mixin_table(a, b, [names])` - -Copies the elements of table `b` into table `a`. If names is provided, then -only those names are copied. - -## Misc Functions - -### `fold(items, fn)` - -Calls function `fn` repeatedly with the accumulated value and the current value -by iterating over `items`. The accumulated value is the result of the last call -to `fn`, or, in the base case, the first value. The current value is the value -being iterated over starting with the second item. - -`items` is a normal array table. - -For example, to sum all numbers in a list: - -```moon -numbers = {4,3,5,6,7,2,3} -sum = fold numbers, (a,b) -> a + b -``` - -## Debug Functions - -### `debug.upvalue(fn, key[, value])` - -Gets or sets the value of an upvalue for a function by name. - diff --git a/gen_rockspec.sh b/gen_rockspec.sh deleted file mode 100755 index b4faabd0..00000000 --- a/gen_rockspec.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -for file in $(find moonscript moon | grep 'lua$'); do - MODULE=$(echo $file | sed -e 's/\.lua$//' -e 's/\//./g' -e 's/\.init$//') - echo "[\"$MODULE\"] = \"$file\"," -done - diff --git a/lpeg/.deps/.dirstamp b/lpeg/.deps/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lpeg/.deps/lpeg.Po b/lpeg/.deps/lpeg.Po new file mode 100644 index 00000000..240259bf --- /dev/null +++ b/lpeg/.deps/lpeg.Po @@ -0,0 +1,96 @@ +libraries/lpeg/liblpeg/lpeg.o: libraries/lpeg/liblpeg/lpeg.c \ + /usr/include/assert.h /usr/include/features.h /usr/include/sys/cdefs.h \ + /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h \ + /usr/include/gnu/stubs-64.h /usr/include/ctype.h \ + /usr/include/bits/types.h /usr/include/bits/typesizes.h \ + /usr/include/endian.h /usr/include/bits/endian.h \ + /usr/include/bits/byteswap.h /usr/include/xlocale.h \ + /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include-fixed/limits.h \ + /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include-fixed/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/stdio.h \ + /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include/stddef.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h /usr/include/string.h \ + /usr/include/bits/string.h /usr/include/bits/string2.h \ + /usr/include/stdlib.h /usr/include/lua.h /usr/include/luaconf.h \ + /usr/include/lauxlib.h /usr/include/lua.h libraries/lpeg/liblpeg/lpeg.h + +/usr/include/assert.h: + +/usr/include/features.h: + +/usr/include/sys/cdefs.h: + +/usr/include/bits/wordsize.h: + +/usr/include/gnu/stubs.h: + +/usr/include/gnu/stubs-64.h: + +/usr/include/ctype.h: + +/usr/include/bits/types.h: + +/usr/include/bits/typesizes.h: + +/usr/include/endian.h: + +/usr/include/bits/endian.h: + +/usr/include/bits/byteswap.h: + +/usr/include/xlocale.h: + +/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include-fixed/limits.h: + +/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include-fixed/syslimits.h: + +/usr/include/limits.h: + +/usr/include/bits/posix1_lim.h: + +/usr/include/bits/local_lim.h: + +/usr/include/linux/limits.h: + +/usr/include/bits/posix2_lim.h: + +/usr/include/stdio.h: + +/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include/stddef.h: + +/usr/include/libio.h: + +/usr/include/_G_config.h: + +/usr/include/wchar.h: + +/usr/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/include/stdarg.h: + +/usr/include/bits/stdio_lim.h: + +/usr/include/bits/sys_errlist.h: + +/usr/include/bits/stdio.h: + +/usr/include/string.h: + +/usr/include/bits/string.h: + +/usr/include/bits/string2.h: + +/usr/include/stdlib.h: + +/usr/include/lua.h: + +/usr/include/luaconf.h: + +/usr/include/lauxlib.h: + +/usr/include/lua.h: + +libraries/lpeg/liblpeg/lpeg.h: diff --git a/lpeg/.dirstamp b/lpeg/.dirstamp new file mode 100644 index 00000000..e69de29b diff --git a/lpeg/HISTORY b/lpeg/HISTORY new file mode 100644 index 00000000..0b8b7577 --- /dev/null +++ b/lpeg/HISTORY @@ -0,0 +1,77 @@ +HISTORY for LPeg 0.10 + +* Changes from version 0.9 to 0.10 + ------------------------------- + + backtrack stack has configurable size + + better error messages + + Notation for non-terminals in 're' back to A instead o + + experimental look-behind pattern + + support for external extensions + + works with Lua 5.2 + + consumes less C stack + + - "and" predicates do not keep captures + +* Changes from version 0.8 to 0.9 + ------------------------------- + + The accumulator capture was replaced by a fold capture; + programs that used the old 'lpeg.Ca' will need small changes. + + Some support for character classes from old C locales. + + A new named-group capture. + +* Changes from version 0.7 to 0.8 + ------------------------------- + + New "match-time" capture. + + New "argument capture" that allows passing arguments into the pattern. + + Better documentation for 're'. + + Several small improvements for 're'. + + The 're' module has an incompatibility with previous versions: + now, any use of a non-terminal must be enclosed in angle brackets + (like ). + +* Changes from version 0.6 to 0.7 + ------------------------------- + + Several improvements in module 're': + - better documentation; + - support for most captures (all but accumulator); + - limited repetitions p{n,m}. + + Small improvements in efficiency. + + Several small bugs corrected (special thanks to Hans Hagen + and Taco Hoekwater). + +* Changes from version 0.5 to 0.6 + ------------------------------- + + Support for non-numeric indices in grammars. + + Some bug fixes (thanks to the luatex team). + + Some new optimizations; (thanks to Mike Pall). + + A new page layout (thanks to Andre Carregal). + + Minimal documentation for module 're'. + +* Changes from version 0.4 to 0.5 + ------------------------------- + + Several optimizations. + + lpeg.P now accepts booleans. + + Some new examples. + + A proper license. + + Several small improvements. + +* Changes from version 0.3 to 0.4 + ------------------------------- + + Static check for loops in repetitions and grammars. + + Removed label option in captures. + + The implementation of captures uses less memory. + +* Changes from version 0.2 to 0.3 + ------------------------------- + + User-defined patterns in Lua. + + Several new captures. + +* Changes from version 0.1 to 0.2 + ------------------------------- + + Several small corrections. + + Handles embedded zeros like any other character. + + Capture "name" can be any Lua value. + + Unlimited number of captures. + + Match gets an optional initial position. + +(end of HISTORY) diff --git a/lpeg/lpeg-128.gif b/lpeg/lpeg-128.gif new file mode 100644 index 00000000..bbf5e78b Binary files /dev/null and b/lpeg/lpeg-128.gif differ diff --git a/lpeg/lpeg.c b/lpeg/lpeg.c new file mode 100644 index 00000000..d46d4638 --- /dev/null +++ b/lpeg/lpeg.c @@ -0,0 +1,2405 @@ +/* +** $Id: lpeg.c,v 1.114 2011/02/16 15:02:20 roberto Exp $ +** LPeg - PEG pattern matching for Lua +** Copyright 2007, Lua.org & PUC-Rio (see 'lpeg.html' for license) +** written by Roberto Ierusalimschy +*/ + + +#include +#include +#include +#include +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "lpeg.h" + + +#define VERSION "0.10" +#define PATTERN_T "lpeg-pattern" +#define MAXSTACKIDX "lpeg-maxstack" + + +/* +** compatibility with Lua 5.2 +*/ +#if (LUA_VERSION_NUM == 502) + +#undef lua_equal +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) + +#undef lua_getfenv +#define lua_getfenv lua_getuservalue +#undef lua_setfenv +#define lua_setfenv lua_setuservalue + +#undef lua_objlen +#define lua_objlen lua_rawlen + +#undef luaL_register +#define luaL_register(L,n,f) \ + { if ((n) == NULL) luaL_setfuncs(L,f,0); else luaL_newlib(L,f); } + +#endif + + + +/* initial size for call/backtrack stack */ +#define INITBACK 100 + +/* default maximum size for call/backtrack stack */ +#define MAXBACK INITBACK + +/* size for call/backtrack stack for verifier */ +#define MAXBACKVER 200 + +/* initial size for capture's list */ +#define INITCAPSIZE 32 + + +/* index, on Lua stack, for subject */ +#define SUBJIDX 2 + +/* number of fixed arguments to 'match' (before capture arguments) */ +#define FIXEDARGS 3 + +/* index, on Lua stack, for substitution value cache */ +#define subscache(cs) ((cs)->ptop + 1) + +/* index, on Lua stack, for capture list */ +#define caplistidx(ptop) ((ptop) + 2) + +/* index, on Lua stack, for pattern's fenv */ +#define penvidx(ptop) ((ptop) + 3) + +/* index, on Lua stack, for backtracking stack */ +#define stackidx(ptop) ((ptop) + 4) + + + +typedef unsigned char byte; + + +#define CHARSETSIZE ((UCHAR_MAX/CHAR_BIT) + 1) + + +typedef byte Charset[CHARSETSIZE]; + + +/* Virtual Machine's instructions */ +typedef enum Opcode { + IAny, IChar, ISet, ISpan, + IBack, + IRet, IEnd, + IChoice, IJmp, ICall, IOpenCall, + ICommit, IPartialCommit, IBackCommit, IFailTwice, IFail, IGiveup, + IFunc, + IFullCapture, IEmptyCapture, IEmptyCaptureIdx, + IOpenCapture, ICloseCapture, ICloseRunTime +} Opcode; + + +#define ISJMP 0x1 +#define ISCHECK 0x2 +#define ISFIXCHECK 0x4 +#define ISNOFAIL 0x8 +#define ISCAPTURE 0x10 +#define ISMOVABLE 0x20 +#define ISFENVOFF 0x40 + +static const int opproperties[] = { + /* IAny */ ISCHECK | ISFIXCHECK | ISJMP, + /* IChar */ ISCHECK | ISFIXCHECK | ISJMP, + /* ISet */ ISCHECK | ISFIXCHECK | ISJMP, + /* ISpan */ ISNOFAIL, + /* IBack */ 0, + /* IRet */ 0, + /* IEnd */ 0, + /* IChoice */ ISJMP, + /* IJmp */ ISJMP | ISNOFAIL, + /* ICall */ ISJMP, + /* IOpenCall */ ISFENVOFF, + /* ICommit */ ISJMP, + /* IPartialCommit */ ISJMP, + /* IBackCommit */ ISJMP, + /* IFailTwice */ 0, + /* IFail */ 0, + /* IGiveup */ 0, + /* IFunc */ ISCHECK | ISJMP, + /* IFullCapture */ ISCAPTURE | ISNOFAIL | ISFENVOFF, + /* IEmptyCapture */ ISCAPTURE | ISNOFAIL | ISMOVABLE, + /* IEmptyCaptureIdx */ISCAPTURE | ISNOFAIL | ISMOVABLE | ISFENVOFF, + /* IOpenCapture */ ISCAPTURE | ISNOFAIL | ISMOVABLE | ISFENVOFF, + /* ICloseCapture */ ISCAPTURE | ISNOFAIL | ISMOVABLE | ISFENVOFF, + /* ICloseRunTime */ ISCAPTURE | ISFENVOFF +}; + + +typedef union Instruction { + struct Inst { + byte code; + byte aux; + short offset; + } i; + PattFunc f; + int iv; + byte buff[1]; +} Instruction; + +static const Instruction giveup = {{IGiveup, 0, 0}}; + +#define getkind(op) ((op)->i.aux & 0xF) +#define getoff(op) (((op)->i.aux >> 4) & 0xF) + +#define dest(p,x) ((x) + ((p)+(x))->i.offset) + +#define MAXOFF 0xF +#define MAXAUX 0xFF + +/* maximum size (in elements) for a pattern */ +#define MAXPATTSIZE (SHRT_MAX - 10) + + +#define isprop(op,p) (opproperties[(op)->i.code] & (p)) +#define isjmp(op) (isprop(op, ISJMP) && (op)->i.offset != 0) +#define iscapture(op) isprop(op, ISCAPTURE) +#define ischeck(op) (isprop(op, ISCHECK) && (op)->i.offset == 0) +#define isfixcheck(op) (isprop(op, ISFIXCHECK) && (op)->i.offset == 0) +#define istest(op) (isprop(op, ISCHECK) && (op)->i.offset != 0) +#define isnofail(op) isprop(op, ISNOFAIL) +#define ismovable(op) isprop(op, ISMOVABLE) +#define isfenvoff(op) isprop(op, ISFENVOFF) + + +/* kinds of captures */ +typedef enum CapKind { + Cclose, Cposition, Cconst, Cbackref, Carg, Csimple, Ctable, Cfunction, + Cquery, Cstring, Csubst, Cfold, Cruntime, Cgroup +} CapKind; + +#define iscapnosize(k) ((k) == Cposition || (k) == Cconst) + + +typedef struct Capture { + const char *s; /* position */ + short idx; + byte kind; + byte siz; +} Capture; + + +/* size (in elements) for an instruction plus extra l bytes */ +#define instsize(l) (((l) + sizeof(Instruction) - 1)/sizeof(Instruction) + 1) + + +/* size (in elements) for a ISet instruction */ +#define CHARSETINSTSIZE instsize(CHARSETSIZE) + +/* size (in elements) for a IFunc instruction */ +#define funcinstsize(p) ((p)->i.aux + 2) + + +#define loopset(v,b) { int v; for (v = 0; v < CHARSETSIZE; v++) b; } + + +#define testchar(st,c) (((int)(st)[((c) >> 3)] & (1 << ((c) & 7)))) +#define setchar(st,c) ((st)[(c) >> 3] |= (1 << ((c) & 7))) + + +static int target (Instruction *p, int i); + + +static int sizei (const Instruction *i) { + switch((Opcode)i->i.code) { + case ISet: case ISpan: return CHARSETINSTSIZE; + case IFunc: return funcinstsize(i); + default: return 1; + } +} + + +static const char *val2str (lua_State *L, int idx) { + const char *k = lua_tostring(L, idx); + if (k != NULL) + return lua_pushfstring(L, "rule '%s'", k); + else + return lua_pushfstring(L, "rule ", luaL_typename(L, idx)); +} + + +static int getposition (lua_State *L, int t, int i) { + int res; + lua_getfenv(L, -1); + lua_rawgeti(L, -1, i); /* get key from pattern's environment */ + lua_gettable(L, t); /* get position from positions table */ + res = lua_tointeger(L, -1); + if (res == 0) { /* key has no registered position? */ + lua_rawgeti(L, -2, i); /* get key again */ + return luaL_error(L, "%s is not defined in given grammar", val2str(L, -1)); + } + lua_pop(L, 2); /* remove environment and position */ + return res; +} + + +/* +** {====================================================== +** Printing patterns (for debugging) +** ======================================================= +*/ + + +static void printcharset (const Charset st) { + int i; + printf("["); + for (i = 0; i <= UCHAR_MAX; i++) { + int first = i; + while (testchar(st, i) && i <= UCHAR_MAX) i++; + if (i - 1 == first) /* unary range? */ + printf("(%02x)", first); + else if (i - 1 > first) /* non-empty range? */ + printf("(%02x-%02x)", first, i - 1); + } + printf("]"); +} + + +static void printcapkind (int kind) { + const char *const modes[] = { + "close", "position", "constant", "backref", + "argument", "simple", "table", "function", + "query", "string", "substitution", "fold", + "runtime", "group"}; + printf("%s", modes[kind]); +} + + +static void printjmp (const Instruction *op, const Instruction *p) { + printf("-> "); + if (p->i.offset == 0) printf("FAIL"); + else printf("%d", (int)(dest(0, p) - op)); +} + + +static void printinst (const Instruction *op, const Instruction *p) { + const char *const names[] = { + "any", "char", "set", "span", "back", + "ret", "end", + "choice", "jmp", "call", "open_call", + "commit", "partial_commit", "back_commit", "failtwice", "fail", "giveup", + "func", + "fullcapture", "emptycapture", "emptycaptureidx", "opencapture", + "closecapture", "closeruntime" + }; + printf("%02ld: %s ", (long)(p - op), names[p->i.code]); + switch ((Opcode)p->i.code) { + case IChar: { + printf("'%c'", p->i.aux); + printjmp(op, p); + break; + } + case IAny: { + printf("* %d", p->i.aux); + printjmp(op, p); + break; + } + case IFullCapture: case IOpenCapture: + case IEmptyCapture: case IEmptyCaptureIdx: + case ICloseCapture: case ICloseRunTime: { + printcapkind(getkind(p)); + printf("(n = %d) (off = %d)", getoff(p), p->i.offset); + break; + } + case ISet: { + printcharset((p+1)->buff); + printjmp(op, p); + break; + } + case ISpan: { + printcharset((p+1)->buff); + break; + } + case IOpenCall: { + printf("-> %d", p->i.offset); + break; + } + case IChoice: { + printjmp(op, p); + printf(" (%d)", p->i.aux); + break; + } + case IJmp: case ICall: case ICommit: + case IPartialCommit: case IBackCommit: { + printjmp(op, p); + break; + } + default: break; + } + printf("\n"); +} + + +static void printpatt (Instruction *p) { + Instruction *op = p; + for (;;) { + printinst(op, p); + if ((Opcode)p->i.code == IEnd) break; + p += sizei(p); + } +} + + +#if 0 +static void printcap (Capture *cap) { + printcapkind(cap->kind); + printf(" (idx: %d - size: %d) -> %p\n", cap->idx, cap->siz, cap->s); +} + + +static void printcaplist (Capture *cap) { + for (; cap->s; cap++) printcap(cap); +} +#endif + +/* }====================================================== */ + + +/* +** {====================================================== +** Virtual Machine +** ======================================================= +*/ + + +typedef struct Stack { + const char *s; + const Instruction *p; + int caplevel; +} Stack; + + +#define getstackbase(L, ptop) ((Stack *)lua_touserdata(L, stackidx(ptop))) + + +static int runtimecap (lua_State *L, Capture *close, Capture *ocap, + const char *o, const char *s, int ptop); + + +static Capture *doublecap (lua_State *L, Capture *cap, int captop, int ptop) { + Capture *newc; + if (captop >= INT_MAX/((int)sizeof(Capture) * 2)) + luaL_error(L, "too many captures"); + newc = (Capture *)lua_newuserdata(L, captop * 2 * sizeof(Capture)); + memcpy(newc, cap, captop * sizeof(Capture)); + lua_replace(L, caplistidx(ptop)); + return newc; +} + + +static Stack *doublestack (lua_State *L, Stack **stacklimit, int ptop) { + Stack *stack = getstackbase(L, ptop); + Stack *newstack; + int n = *stacklimit - stack; + int max, newn; + lua_getfield(L, LUA_REGISTRYINDEX, MAXSTACKIDX); + max = lua_tointeger(L, -1); + lua_pop(L, 1); + if (n >= max) + luaL_error(L, "too many pending calls/choices"); + newn = 2*n; if (newn > max) newn = max; + newstack = (Stack *)lua_newuserdata(L, newn * sizeof(Stack)); + memcpy(newstack, stack, n * sizeof(Stack)); + lua_replace(L, stackidx(ptop)); + *stacklimit = newstack + newn; + return newstack + n; + +} + + +static void adddyncaptures (const char *s, Capture *base, int n, int fd) { + int i; + assert(base[0].kind == Cruntime && base[0].siz == 0); + base[0].idx = fd; /* first returned capture */ + for (i = 1; i < n; i++) { /* add extra captures */ + base[i].siz = 1; /* mark it as closed */ + base[i].s = s; + base[i].kind = Cruntime; + base[i].idx = fd + i; /* stack index */ + } + base[n].kind = Cclose; /* add closing entry */ + base[n].siz = 1; + base[n].s = s; +} + + +#define condfailed(p) { int f = p->i.offset; if (f) p+=f; else goto fail; } + +static const char *match (lua_State *L, + const char *o, const char *s, const char *e, + Instruction *op, Capture *capture, int ptop) { + Stack stackbase[INITBACK]; + Stack *stacklimit = stackbase + INITBACK; + Stack *stack = stackbase; /* point to first empty slot in stack */ + int capsize = INITCAPSIZE; + int captop = 0; /* point to first empty slot in captures */ + const Instruction *p = op; + stack->p = &giveup; stack->s = s; stack->caplevel = 0; stack++; + lua_pushlightuserdata(L, stackbase); + for (;;) { +#if defined(DEBUG) + printf("s: |%s| stck: %d c: %d ", + s, stack - getstackbase(L, ptop), captop); + printinst(op, p); +#endif + switch ((Opcode)p->i.code) { + case IEnd: { + assert(stack == getstackbase(L, ptop) + 1); + capture[captop].kind = Cclose; + capture[captop].s = NULL; + return s; + } + case IGiveup: { + assert(stack == getstackbase(L, ptop)); + return NULL; + } + case IRet: { + assert(stack > getstackbase(L, ptop) && (stack - 1)->s == NULL); + p = (--stack)->p; + continue; + } + case IAny: { + int n = p->i.aux; + if (n <= e - s) { p++; s += n; } + else condfailed(p); + continue; + } + case IChar: { + if ((byte)*s == p->i.aux && s < e) { p++; s++; } + else condfailed(p); + continue; + } + case ISet: { + int c = (byte)*s; + if (testchar((p+1)->buff, c) && s < e) + { p += CHARSETINSTSIZE; s++; } + else condfailed(p); + continue; + } + case IBack: { + int n = p->i.aux; + if (n > s - o) goto fail; + s -= n; p++; + continue; + } + case ISpan: { + for (; s < e; s++) { + int c = (byte)*s; + if (!testchar((p+1)->buff, c)) break; + } + p += CHARSETINSTSIZE; + continue; + } + case IFunc: { + const char *r = (p+1)->f(s, e, o, (p+2)->buff); + if (r != NULL) { s = r; p += funcinstsize(p); } + else condfailed(p); + continue; + } + case IJmp: { + p += p->i.offset; + continue; + } + case IChoice: { + if (stack == stacklimit) + stack = doublestack(L, &stacklimit, ptop); + stack->p = dest(0, p); + stack->s = s - p->i.aux; + stack->caplevel = captop; + stack++; + p++; + continue; + } + case ICall: { + if (stack == stacklimit) + stack = doublestack(L, &stacklimit, ptop); + stack->s = NULL; + stack->p = p + 1; /* save return address */ + stack++; + p += p->i.offset; + continue; + } + case ICommit: { + assert(stack > getstackbase(L, ptop) && (stack - 1)->s != NULL); + stack--; + p += p->i.offset; + continue; + } + case IPartialCommit: { + assert(stack > getstackbase(L, ptop) && (stack - 1)->s != NULL); + (stack - 1)->s = s; + (stack - 1)->caplevel = captop; + p += p->i.offset; + continue; + } + case IBackCommit: { + assert(stack > getstackbase(L, ptop) && (stack - 1)->s != NULL); + s = (--stack)->s; + captop = stack->caplevel; + p += p->i.offset; + continue; + } + case IFailTwice: + assert(stack > getstackbase(L, ptop)); + stack--; + /* go through */ + case IFail: + fail: { /* pattern failed: try to backtrack */ + do { /* remove pending calls */ + assert(stack > getstackbase(L, ptop)); + s = (--stack)->s; + } while (s == NULL); + captop = stack->caplevel; + p = stack->p; + continue; + } + case ICloseRunTime: { + int fr = lua_gettop(L) + 1; /* stack index of first result */ + int ncap = runtimecap(L, capture + captop, capture, o, s, ptop); + lua_Integer res = lua_tointeger(L, fr) - 1; /* offset */ + int n = lua_gettop(L) - fr; /* number of new captures */ + if (res == -1) { /* may not be a number */ + if (!lua_toboolean(L, fr)) { /* false value? */ + lua_settop(L, fr - 1); /* remove results */ + goto fail; /* and fail */ + } + else if (lua_isboolean(L, fr)) /* true? */ + res = s - o; /* keep current position */ + } + if (res < s - o || res > e - o) + luaL_error(L, "invalid position returned by match-time capture"); + s = o + res; /* update current position */ + captop -= ncap; /* remove nested captures */ + lua_remove(L, fr); /* remove first result (offset) */ + if (n > 0) { /* captures? */ + if ((captop += n + 1) >= capsize) { + capture = doublecap(L, capture, captop, ptop); + capsize = 2 * captop; + } + adddyncaptures(s, capture + captop - n - 1, n, fr); + } + p++; + continue; + } + case ICloseCapture: { + const char *s1 = s - getoff(p); + assert(captop > 0); + if (capture[captop - 1].siz == 0 && + s1 - capture[captop - 1].s < UCHAR_MAX) { + capture[captop - 1].siz = s1 - capture[captop - 1].s + 1; + p++; + continue; + } + else { + capture[captop].siz = 1; /* mark entry as closed */ + goto capture; + } + } + case IEmptyCapture: case IEmptyCaptureIdx: + capture[captop].siz = 1; /* mark entry as closed */ + goto capture; + case IOpenCapture: + capture[captop].siz = 0; /* mark entry as open */ + goto capture; + case IFullCapture: + capture[captop].siz = getoff(p) + 1; /* save capture size */ + capture: { + capture[captop].s = s - getoff(p); + capture[captop].idx = p->i.offset; + capture[captop].kind = getkind(p); + if (++captop >= capsize) { + capture = doublecap(L, capture, captop, ptop); + capsize = 2 * captop; + } + p++; + continue; + } + case IOpenCall: { + lua_rawgeti(L, penvidx(ptop), p->i.offset); + luaL_error(L, "reference to %s outside a grammar", val2str(L, -1)); + } + default: assert(0); return NULL; + } + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Verifier +** ======================================================= +*/ + + +/* +** check whether pattern may go from 'p' to 'e' without consuming any +** input. Raises an error if it detects a left recursion. 'op' points +** the beginning of the pattern. If pattern belongs to a grammar, +** 'rule' is the stack index where is its corresponding key (only for +** error messages) and 'posttable' is the stack index with a table +** mapping rule keys to the position of their code in the pattern. +*/ +static int verify (lua_State *L, Instruction *op, const Instruction *p, + Instruction *e, int postable, int rule) { + static const char dummy[] = ""; + Stack back[MAXBACKVER]; + int backtop = 0; /* point to first empty slot in back */ + while (p != e) { + switch ((Opcode)p->i.code) { + case IRet: { + p = back[--backtop].p; + continue; + } + case IChoice: { + if (backtop >= MAXBACKVER) + return luaL_error(L, "too many pending calls/choices"); + back[backtop].p = dest(0, p); + back[backtop++].s = dummy; + p++; + continue; + } + case ICall: { + assert((p + 1)->i.code != IRet); /* no tail call */ + if (backtop >= MAXBACKVER) + return luaL_error(L, "too many pending calls/choices"); + back[backtop].s = NULL; + back[backtop++].p = p + 1; + goto dojmp; + } + case IOpenCall: { + int i; + if (postable == 0) /* grammar still not fixed? */ + goto fail; /* to be verified later */ + for (i = 0; i < backtop; i++) { + if (back[i].s == NULL && back[i].p == p + 1) + return luaL_error(L, "%s is left recursive", val2str(L, rule)); + } + if (backtop >= MAXBACKVER) + return luaL_error(L, "too many pending calls/choices"); + back[backtop].s = NULL; + back[backtop++].p = p + 1; + p = op + getposition(L, postable, p->i.offset); + continue; + } + case IBackCommit: + case ICommit: { + assert(backtop > 0 && p->i.offset > 0); + backtop--; + goto dojmp; + } + case IPartialCommit: { + assert(backtop > 0); + if (p->i.offset > 0) goto dojmp; /* forward jump */ + else { /* loop will be detected when checking corresponding rule */ + assert(postable != 0); + backtop--; + p++; /* just go on now */ + continue; + } + } + case IBack: { + if (p->i.aux == 1 && isfixcheck(p + 1)) { /* char test? */ + p++; /* skip back instruction */ + p += sizei(p); /* skip char test */ + } + else { /* standard lookbehind code */ + assert((Opcode)(p - 1)->i.code == IChoice); /* look behind */ + backtop--; + p += (p - 1)->i.offset; + assert((Opcode)(p - 1)->i.code == IFail); /* look behind */ + } + continue; + } + case IAny: + case IChar: + case ISet: { + const Instruction *next = p + sizei(p); + if ((Opcode)next->i.code == IBack) + p = next + 1; /* continue after the back instruction */ + else if (p->i.offset == 0) goto fail; + else /* jump */ + p += p->i.offset; + continue; + } + case IJmp: + dojmp: { + p += p->i.offset; + continue; + } + case IFailTwice: /* 'not' predicate */ + goto fail; /* body could have failed; try to backtrack it */ + case IFail: { + if (p > op && (p - 1)->i.code == IBackCommit) { /* 'and' predicate? */ + p++; /* pretend it succeeded and go ahead */ + continue; + } + /* else failed: go through */ + } + fail: { /* pattern failed: try to backtrack */ + do { + if (backtop-- == 0) + return 1; /* no more backtracking */ + } while (back[backtop].s == NULL); + p = back[backtop].p; + continue; + } + case ISpan: + case IOpenCapture: case ICloseCapture: + case IEmptyCapture: case IEmptyCaptureIdx: + case IFullCapture: { + p += sizei(p); + continue; + } + case ICloseRunTime: { + goto fail; /* be liberal in this case */ + } + case IFunc: { + const char *r = (p+1)->f(dummy, dummy, dummy, (p+2)->buff); + if (r != NULL) { p += funcinstsize(p); } + else condfailed(p); + continue; + } + case IEnd: /* cannot happen (should stop before it) */ + default: assert(0); return 0; + } + } + assert(backtop == 0); + return 0; +} + + +static void checkrule (lua_State *L, Instruction *op, int from, int to, + int postable, int rule) { + int i; + int lastopen = 0; /* more recent OpenCall seen in the code */ + for (i = from; i < to; i += sizei(op + i)) { + if (op[i].i.code == IPartialCommit && op[i].i.offset < 0) { /* loop? */ + int start = dest(op, i); + assert(op[start - 1].i.code == IChoice && + dest(op, start - 1) == target(op, i + 1)); + if (start <= lastopen) { /* loop does contain an open call? */ + if (!verify(L, op, op + start, op + i, postable, rule)) /* check body */ + luaL_error(L, "possible infinite loop in %s", val2str(L, rule)); + } + } + else if (op[i].i.code == IOpenCall) + lastopen = i; + } + assert(op[i - 1].i.code == IRet); + verify(L, op, op + from, op + to - 1, postable, rule); +} + + + + +/* }====================================================== */ + + +/* +** {====================================================== +** Building Patterns +** ======================================================= +*/ + +enum charsetanswer { NOINFO, ISCHARSET, VALIDSTARTS }; + +typedef struct CharsetTag { + enum charsetanswer tag; + Charset cs; +} CharsetTag; + + +static Instruction *getpatt (lua_State *L, int idx, int *size); + + +static void check2test (Instruction *p, int n) { + assert(ischeck(p) && n != 0); + p->i.offset = n; +} + + +/* +** invert array slice p[0]-p[e] (both inclusive) +*/ +static void invert (Instruction *p, int e) { + int i; + for (i = 0; i < e; i++, e--) { + Instruction temp = p[i]; + p[i] = p[e]; + p[e] = temp; + } +} + + +/* +** rotate array slice p[0]-p[e] (both inclusive) 'n' steps +** to the 'left' +*/ +static void rotate (Instruction *p, int e, int n) { + invert(p, n - 1); + invert(p + n, e - n); + invert(p, e); +} + + +#define op_step(p) ((p)->i.code == IAny ? (p)->i.aux : 1) + + +static int skipchecks (Instruction *p, int up, int *pn) { + int i, n = 0; + for (i = 0; isfixcheck(p + i); i += sizei(p + i)) { + int st = op_step(p + i); + if (n + st > MAXOFF - up) break; + n += st; + } + *pn = n; + return i; +} + + +#define ismovablecap(op) (ismovable(op) && getoff(op) < MAXOFF) + +static void optimizecaptures (Instruction *p) { + int i; + int limit = 0; + for (i = 0; p[i].i.code != IEnd; i += sizei(p + i)) { + if (isjmp(p + i) && dest(p, i) >= limit) + limit = dest(p, i) + 1; /* do not optimize jump targets */ + else if (i >= limit && ismovablecap(p + i) && isfixcheck(p + i + 1)) { + int end, n, j; /* found a border capture|check */ + int maxoff = getoff(p + i); + int start = i; + /* find first capture in the group */ + while (start > limit && ismovablecap(p + start - 1)) { + start--; + if (getoff(p + start) > maxoff) maxoff = getoff(p + start); + } + end = skipchecks(p + i + 1, maxoff, &n) + i; /* find last check */ + if (n == 0) continue; /* first check is too big to move across */ + assert(n <= MAXOFF && start <= i && i < end); + for (j = start; j <= i; j++) + p[j].i.aux += (n << 4); /* correct offset of captures to be moved */ + rotate(p + start, end - start, i - start + 1); /* move them up */ + i = end; + assert(isfixcheck(p + start) && iscapture(p + i)); + } + } +} + + +static int target (Instruction *p, int i) { + while (p[i].i.code == IJmp) i += p[i].i.offset; + return i; +} + + +static void optimizejumps (Instruction *p) { + int i; + for (i = 0; p[i].i.code != IEnd; i += sizei(p + i)) { + if (isjmp(p + i)) + p[i].i.offset = target(p, dest(p, i)) - i; + } +} + + +static void optimizechoice (Instruction *p) { + assert(p->i.code == IChoice); + if (isfixcheck(p + 1)) { + int lc = sizei(p + 1); + rotate(p, lc, 1); + assert(isfixcheck(p) && (p + lc)->i.code == IChoice); + (p + lc)->i.aux = op_step(p); + check2test(p, (p + lc)->i.offset); + (p + lc)->i.offset -= lc; + } +} + + +/* +** A 'headfail' pattern is a pattern that can only fails in its first +** instruction, which must be a check. +*/ +static int isheadfail (Instruction *p) { + if (!ischeck(p)) return 0; + /* check that other operations cannot fail */ + for (p += sizei(p); p->i.code != IEnd; p += sizei(p)) + if (!isnofail(p)) return 0; + return 1; +} + + +#define checkpattern(L, idx) ((Instruction *)luaL_checkudata(L, idx, PATTERN_T)) + + +/* +** Return the number of elements in the ktable of a pattern. +** in Lua 5.2, default "environment" for patterns is nil, not +** a table. Treat it as an empty table. +*/ +static int ktablelen (lua_State *L, int idx) { + if (!lua_istable(L, idx)) return 0; + else return lua_objlen(L, idx); +} + + +/* +** join the elements of the ktable from pattern 'p1' into the ktable of +** the pattern at the top of the stack ('p'). If 'p1' has no elements, +** 'p' keeps its original ktable. If 'p' has no elements, it shares +** 'p1' ktable. Otherwise, this function creates a new ktable for 'p'. +** Return the offset of original 'p' elements in the new ktable. +*/ +static int jointable (lua_State *L, int p1) { + int n, n1, i; + lua_getfenv(L, p1); + n1 = ktablelen(L, -1); /* number of elements in p1's env */ + lua_getfenv(L, -2); + if (n1 == 0 || lua_equal(L, -2, -1)) { + lua_pop(L, 2); + return 0; /* no need to change anything */ + } + n = ktablelen(L, -1); /* number of elements in p's env */ + if (n == 0) { + lua_pop(L, 1); /* removes p env */ + lua_setfenv(L, -2); /* p now shares p1's env */ + return 0; /* no need to correct anything */ + } + lua_createtable(L, n + n1, 0); + /* stack: p; p1 env; p env; new p env */ + for (i = 1; i <= n; i++) { + lua_rawgeti(L, -2, i); + lua_rawseti(L, -2, i); + } + for (i = 1; i <= n1; i++) { + lua_rawgeti(L, -3, i); + lua_rawseti(L, -2, n + i); + } + lua_setfenv(L, -4); /* new table becomes p env */ + lua_pop(L, 2); /* remove p1 env and old p env */ + return n; +} + + +#define copypatt(p1,p2,sz) memcpy(p1, p2, (sz) * sizeof(Instruction)); + +#define pattsize(L,idx) (lua_objlen(L, idx)/sizeof(Instruction) - 1) + + +static int addpatt (lua_State *L, Instruction *p, int p1idx) { + Instruction *p1 = (Instruction *)lua_touserdata(L, p1idx); + int sz = pattsize(L, p1idx); + int corr = jointable(L, p1idx); + copypatt(p, p1, sz + 1); + if (corr != 0) { + Instruction *px; + for (px = p; px < p + sz; px += sizei(px)) { + if (isfenvoff(px) && px->i.offset != 0) + px->i.offset += corr; + } + } + return sz; +} + + +static void setinstaux (Instruction *i, Opcode op, int offset, int aux) { + assert(aux <= MAXAUX); + i->i.code = op; + i->i.offset = offset; + i->i.aux = aux; +} + +#define setinst(i,op,off) setinstaux(i,op,off,0) + +#define setinstcap(i,op,idx,k,n) setinstaux(i,op,idx,((k) | ((n) << 4))) + + +/* +** create a new ktable for pattern at the stack top, mapping +** '1' to the value at stack position 'vidx'. +*/ +static int value2fenv (lua_State *L, int vidx) { + lua_createtable(L, 1, 0); + lua_pushvalue(L, vidx); + lua_rawseti(L, -2, 1); + lua_setfenv(L, -2); + return 1; +} + + +static Instruction *newpatt (lua_State *L, size_t n) { + Instruction *p; + if (n >= MAXPATTSIZE - 1) + luaL_error(L, "pattern too big"); + p = (Instruction *)lua_newuserdata(L, (n + 1) * sizeof(Instruction)); + luaL_getmetatable(L, PATTERN_T); + lua_setmetatable(L, -2); + setinst(p + n, IEnd, 0); + return p; +} + + +static void fillcharset (Instruction *p, Charset cs) { + switch (p[0].i.code) { + case ISet: { + loopset(i, cs[i] = p[1].buff[i]); + break; + } + case IChar: { + loopset(i, cs[i] = 0); + setchar(cs, p[0].i.aux); + break; + } + default: { /* any char may start unhandled instructions */ + loopset(i, cs[i] = 0xff); + break; + } + } +} + + +/* +** Function 'tocharset' gets information about which chars may be a +** valid start for a pattern. +*/ + +static enum charsetanswer tocharset (Instruction *p, CharsetTag *c) { + if (isfixcheck(p)) { + fillcharset(p, c->cs); + if ((p + sizei(p))->i.code == IEnd && op_step(p) == 1) + c->tag = ISCHARSET; + else + c->tag = VALIDSTARTS; + } + else + c->tag = NOINFO; + return c->tag; +} + + +static int exclusiveset (Charset c1, Charset c2) { + /* non-empty intersection? */ + loopset(i, {if ((c1[i] & c2[i]) != 0) return 0;}); + return 1; /* no intersection */ +} + + +static int exclusive (CharsetTag *c1, CharsetTag *c2) { + if (c1->tag == NOINFO || c2->tag == NOINFO) + return 0; /* one of them is not filled */ + else return exclusiveset(c1->cs, c2->cs); +} + + +static Instruction *newcharset (lua_State *L) { + Instruction *p = newpatt(L, CHARSETINSTSIZE); + p[0].i.code = ISet; + p[0].i.offset = 0; + loopset(i, p[1].buff[i] = 0); + return p; +} + + +static int set_l (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + if (l == 1) + getpatt(L, 1, NULL); /* a unit set is equivalent to a literal */ + else { + Instruction *p = newcharset(L); + while (l--) { + setchar(p[1].buff, (byte)(*s)); + s++; + } + } + return 1; +} + + +static int range_l (lua_State *L) { + int arg; + int top = lua_gettop(L); + Instruction *p = newcharset(L); + for (arg = 1; arg <= top; arg++) { + int c; + size_t l; + const char *r = luaL_checklstring(L, arg, &l); + luaL_argcheck(L, l == 2, arg, "range must have two characters"); + for (c = (byte)r[0]; c <= (byte)r[1]; c++) + setchar(p[1].buff, c); + } + return 1; +} + + +static int nter_l (lua_State *L) { + Instruction *p; + luaL_argcheck(L, !lua_isnoneornil(L, 1), 1, "non-nil value expected"); + p = newpatt(L, 1); + setinst(p, IOpenCall, value2fenv(L, 1)); + return 1; +} + + + +static int testpattern (lua_State *L, int idx) { + if (lua_touserdata(L, idx)) { /* value is a userdata? */ + if (lua_getmetatable(L, idx)) { /* does it have a metatable? */ + luaL_getmetatable(L, PATTERN_T); + if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ + lua_pop(L, 2); /* remove both metatables */ + return 1; + } + } + } + return 0; +} + + +static Instruction *fix_l (lua_State *L, int t) { + Instruction *p; + int i; + int totalsize = 2; /* include initial call and jump */ + int n = 0; /* number of rules */ + int base = lua_gettop(L); + lua_newtable(L); /* to store relative positions of each rule */ + lua_pushinteger(L, 1); /* default initial rule */ + /* collect patterns and compute sizes */ + lua_pushnil(L); + while (lua_next(L, t) != 0) { + int l; + if (lua_tonumber(L, -2) == 1 && lua_isstring(L, -1)) { + lua_replace(L, base + 2); /* use this value as initial rule */ + continue; + } + if (!testpattern(L, -1)) + luaL_error(L, "%s is not a pattern", val2str(L, -2)); + l = pattsize(L, -1) + 1; /* space for pattern + ret */ + if (totalsize >= MAXPATTSIZE - l) + luaL_error(L, "grammar too large"); + luaL_checkstack(L, LUA_MINSTACK, "grammar has too many rules"); + lua_insert(L, -2); /* put key on top */ + lua_pushvalue(L, -1); /* duplicate key (for lua_next) */ + lua_pushvalue(L, -1); /* duplicate key (to index positions table)) */ + lua_pushinteger(L, totalsize); /* position for this rule */ + lua_settable(L, base + 1); /* store key=>position in positions table */ + totalsize += l; + n++; + } + luaL_argcheck(L, n > 0, t, "empty grammar"); + p = newpatt(L, totalsize); /* create new pattern */ + p++; /* save space for call */ + setinst(p++, IJmp, totalsize - 1); /* after call, jumps to the end */ + for (i = 1; i <= n; i++) { /* copy all rules into new pattern */ + p += addpatt(L, p, base + 1 + i*2); + setinst(p++, IRet, 0); + } + p -= totalsize; /* back to first position */ + totalsize = 2; /* go through each rule's position */ + for (i = 1; i <= n; i++) { /* check all rules */ + int l = pattsize(L, base + 1 + i*2) + 1; + checkrule(L, p, totalsize, totalsize + l, base + 1, base + 2 + i*2); + totalsize += l; + } + lua_pushvalue(L, base + 2); /* get initial rule */ + lua_gettable(L, base + 1); /* get its position in postions table */ + i = lua_tonumber(L, -1); /* convert to number */ + lua_pop(L, 1); + if (i == 0) /* is it defined? */ + luaL_error(L, "initial rule not defined in given grammar"); + setinst(p, ICall, i); /* first instruction calls initial rule */ + /* correct calls */ + for (i = 0; i < totalsize; i += sizei(p + i)) { + if (p[i].i.code == IOpenCall) { + int pos = getposition(L, base + 1, p[i].i.offset); + p[i].i.code = (p[target(p, i + 1)].i.code == IRet) ? IJmp : ICall; + p[i].i.offset = pos - i; + } + } + optimizejumps(p); + lua_replace(L, t); /* put new pattern in old's position */ + lua_settop(L, base); /* remove rules and positions table */ + return p; +} + + +static Instruction *any (lua_State *L, int n, int extra, int *offsetp) { + int offset = offsetp ? *offsetp : 0; + Instruction *p = newpatt(L, (n - 1)/UCHAR_MAX + extra + 1); + Instruction *p1 = p + offset; + for (; n > UCHAR_MAX; n -= UCHAR_MAX) + setinstaux(p1++, IAny, 0, UCHAR_MAX); + setinstaux(p1++, IAny, 0, n); + if (offsetp) *offsetp = p1 - p; + return p; +} + + +static Instruction *getpatt (lua_State *L, int idx, int *size) { + Instruction *p; + switch (lua_type(L, idx)) { + case LUA_TSTRING: { + size_t i, len; + const char *s = lua_tolstring(L, idx, &len); + p = newpatt(L, len); + for (i = 0; i < len; i++) + setinstaux(p + i, IChar, 0, (byte)s[i]); + lua_replace(L, idx); + break; + } + case LUA_TNUMBER: { + int n = lua_tointeger(L, idx); + if (n == 0) /* empty pattern? */ + p = newpatt(L, 0); + else if (n > 0) + p = any(L, n, 0, NULL); + else if (-n <= UCHAR_MAX) { + p = newpatt(L, 2); + setinstaux(p, IAny, 2, -n); + setinst(p + 1, IFail, 0); + } + else { + int offset = 2; /* space for ITestAny & IChoice */ + p = any(L, -n - UCHAR_MAX, 3, &offset); + setinstaux(p, IAny, offset + 1, UCHAR_MAX); + setinstaux(p + 1, IChoice, offset, UCHAR_MAX); + setinst(p + offset, IFailTwice, 0); + } + lua_replace(L, idx); + break; + } + case LUA_TBOOLEAN: { + if (lua_toboolean(L, idx)) /* true? */ + p = newpatt(L, 0); /* empty pattern (always succeeds) */ + else { + p = newpatt(L, 1); + setinst(p, IFail, 0); + } + lua_replace(L, idx); + break; + } + case LUA_TTABLE: { + p = fix_l(L, idx); + break; + } + case LUA_TFUNCTION: { + p = newpatt(L, 2); + setinstcap(p, IOpenCapture, value2fenv(L, idx), Cruntime, 0); + setinstcap(p + 1, ICloseRunTime, 0, Cclose, 0); + lua_replace(L, idx); + break; + } + default: { + p = checkpattern(L, idx); + break; + } + } + if (size) *size = pattsize(L, idx); + return p; +} + + +static int getpattl (lua_State *L, int idx) { + int size; + getpatt(L, idx, &size); + return size; +} + + +static int pattern_l (lua_State *L) { + lua_settop(L, 1); + getpatt(L, 1, NULL); + return 1; +} + + +#define isany(p) ((p)->i.code == IAny && ((p) + 1)->i.code == IEnd) +#define isfail(p) ((p)->i.code == IFail) +#define issucc(p) ((p)->i.code == IEnd) + +static int concat_l (lua_State *L) { + /* p1; p2; */ + int l1, l2; + Instruction *p1 = getpatt(L, 1, &l1); + Instruction *p2 = getpatt(L, 2, &l2); + if (isfail(p1) || issucc(p2)) + lua_pushvalue(L, 1); /* fail * x == fail; x * true == x */ + else if (isfail(p2) || issucc(p1)) + lua_pushvalue(L, 2); /* x * fail == fail; true * x == x */ + else if (isany(p1) && isany(p2)) + any(L, p1->i.aux + p2->i.aux, 0, NULL); + else { + Instruction *op = newpatt(L, l1 + l2); + Instruction *p = op + addpatt(L, op, 1); + addpatt(L, p, 2); + optimizecaptures(op); + } + return 1; +} + + +static int diff_l (lua_State *L) { + int l1, l2; + Instruction *p1 = getpatt(L, 1, &l1); + Instruction *p2 = getpatt(L, 2, &l2); + CharsetTag st1, st2; + if (tocharset(p1, &st1) == ISCHARSET && tocharset(p2, &st2) == ISCHARSET) { + Instruction *p = newcharset(L); + loopset(i, p[1].buff[i] = st1.cs[i] & ~st2.cs[i]); + } + else if (isheadfail(p2)) { + Instruction *p = newpatt(L, l2 + 1 + l1); + p += addpatt(L, p, 2); + check2test(p - l2, l2 + 1); + setinst(p++, IFail, 0); + addpatt(L, p, 1); + } + else { /* !e2 . e1 */ + /* !e -> choice L1; e; failtwice; L1: ... */ + Instruction *p = newpatt(L, 1 + l2 + 1 + l1); + Instruction *pi = p; + setinst(p++, IChoice, 1 + l2 + 1); + p += addpatt(L, p, 2); + setinst(p++, IFailTwice, 0); + addpatt(L, p, 1); + optimizechoice(pi); + } + return 1; +} + + +static int unm_l (lua_State *L) { + Instruction *p = getpatt(L, 1, NULL); + if (isfail(p)) { /* -false? */ + newpatt(L, 0); /* true */ + return 1; + } + else if (issucc(p)) { /* -true? */ + Instruction *p1 = newpatt(L, 1); /* false */ + setinst(p1, IFail, 0); + return 1; + } + else { /* -A == '' - A */ + lua_pushliteral(L, ""); + lua_insert(L, 1); + return diff_l(L); + } +} + + +static int pattand_l (lua_State *L) { + int l1; + CharsetTag st1; + Instruction *p1 = getpatt(L, 1, &l1); + if (isfail(p1) || issucc(p1)) + lua_pushvalue(L, 1); /* &fail == fail; &true == true */ + else if (tocharset(p1, &st1) == ISCHARSET) { + Instruction *p = newpatt(L, l1 + 1); + copypatt(p, p1, l1); p += l1; + setinstaux(p, IBack, 0, 1); + } + else { /* Choice L1; p1; BackCommit L2; L1: Fail; L2: */ + Instruction *p = newpatt(L, 1 + l1 + 2); + setinst(p++, IChoice, 1 + l1 + 1); + p += addpatt(L, p, 1); + setinst(p++, IBackCommit, 2); + setinst(p, IFail, 0); + } + return 1; +} + + +static int nocalls (const Instruction *p) { + for (; (Opcode)p->i.code != IEnd; p += sizei(p)) + if ((Opcode)p->i.code == IOpenCall) return 0; + return 1; +} + + +static int pattbehind (lua_State *L) { + int l1; + CharsetTag st1; + Instruction *p1 = getpatt(L, 1, &l1); + int n = luaL_optint(L, 2, 1); + luaL_argcheck(L, n <= MAXAUX, 2, "lookbehind delta too large"); + if (!nocalls(p1)) + luaL_error(L, "lookbehind pattern cannot contain non terminals"); + if (isfail(p1) || issucc(p1)) + lua_pushvalue(L, 1); /* tag == NOINFO) return 1; + assert(p1->i.offset != 0); + switch (p1->i.code) { + case IChar: return testchar(st2->cs, p1->i.aux); + case ISet: return !exclusiveset(st2->cs, (p1 + 1)->buff); + default: assert(p1->i.code == IAny); return 1; + } +} + + +static Instruction *basicUnion (lua_State *L, Instruction *p1, int l1, + int l2, int *size, CharsetTag *st2) { + Instruction *op; + CharsetTag st1; + tocharset(p1, &st1); + if (st1.tag == ISCHARSET && st2->tag == ISCHARSET) { + Instruction *p = auxnew(L, &op, size, CHARSETINSTSIZE); + setinst(p, ISet, 0); + loopset(i, p[1].buff[i] = st1.cs[i] | st2->cs[i]); + } + else if (exclusive(&st1, st2) || isheadfail(p1)) { + Instruction *p = auxnew(L, &op, size, l1 + 1 + l2); + copypatt(p, p1, l1); + check2test(p, l1 + 1); + p += l1; + setinst(p++, IJmp, l2 + 1); + addpatt(L, p, 2); + } + else { + /* choice L1; e1; commit L2; L1: e2; L2: ... */ + Instruction *p = auxnew(L, &op, size, 1 + l1 + 1 + l2); + setinst(p++, IChoice, 1 + l1 + 1); + copypatt(p, p1, l1); p += l1; + setinst(p++, ICommit, 1 + l2); + addpatt(L, p, 2); + optimizechoice(p - (1 + l1 + 1)); + } + return op; +} + + +static Instruction *separateparts (lua_State *L, Instruction *p1, int l1, + int l2, int *size, CharsetTag *st2) { + int sp = firstpart(p1, l1); + if (sp == 0) /* first part is entire p1? */ + return basicUnion(L, p1, l1, l2, size, st2); + else if ((p1 + sp - 1)->i.code == ICommit || !interfere(p1, sp, st2)) { + Instruction *p; + int init = *size; + int end = init + sp; + *size = end; + p = separateparts(L, p1 + sp, l1 - sp, l2, size, st2); + copypatt(p + init, p1, sp); + (p + end - 1)->i.offset = *size - (end - 1); + return p; + } + else { /* must change back to non-optimized choice */ + Instruction *p; + int init = *size; + int end = init + sp + 1; /* needs one extra instruction (choice) */ + int sizefirst = sizei(p1); /* size of p1's first instruction (the test) */ + *size = end; + p = separateparts(L, p1 + sp, l1 - sp, l2, size, st2); + copypatt(p + init, p1, sizefirst); /* copy the test */ + (p + init)->i.offset++; /* correct jump (because of new instruction) */ + init += sizefirst; + setinstaux(p + init, IChoice, sp - sizefirst + 1, 1); init++; + copypatt(p + init, p1 + sizefirst, sp - sizefirst - 1); + init += sp - sizefirst - 1; + setinst(p + init, ICommit, *size - (end - 1)); + return p; + } +} + + +static int union_l (lua_State *L) { + int l1, l2; + int size = 0; + Instruction *p1 = getpatt(L, 1, &l1); + Instruction *p2 = getpatt(L, 2, &l2); + CharsetTag st2; + if (isfail(p1)) /* check for simple identities */ + lua_pushvalue(L, 2); /* fail / a == a */ + else if (isfail(p2) || issucc(p1)) + lua_pushvalue(L, 1); /* a / fail == a; true / a == true */ + else { + tocharset(p2, &st2); + separateparts(L, p1, l1, l2, &size, &st2); + } + return 1; +} + + +static int repeatcharset (lua_State *L, Charset cs, int l1, int n) { + /* e; ...; e; span; */ + int i; + Instruction *p = newpatt(L, n*l1 + CHARSETINSTSIZE); + for (i = 0; i < n; i++) { + p += addpatt(L, p, 1); + } + setinst(p, ISpan, 0); + loopset(k, p[1].buff[k] = cs[k]); + return 1; +} + + +static Instruction *repeatheadfail (lua_State *L, int l1, int n) { + /* e; ...; e; L2: e'(L1); jump L2; L1: ... */ + int i; + Instruction *p = newpatt(L, (n + 1)*l1 + 1); + Instruction *op = p; + for (i = 0; i < n; i++) { + p += addpatt(L, p, 1); + } + p += addpatt(L, p, 1); + check2test(p - l1, l1 + 1); + setinst(p, IJmp, -l1); + return op; +} + + +static Instruction *repeats (lua_State *L, Instruction *p1, int l1, int n) { + /* e; ...; e; choice L1; L2: e; partialcommit L2; L1: ... */ + int i; + Instruction *op = newpatt(L, (n + 1)*l1 + 2); + Instruction *p = op; + if (!verify(L, p1, p1, p1 + l1, 0, 0)) + luaL_error(L, "loop body may accept empty string"); + for (i = 0; i < n; i++) { + p += addpatt(L, p, 1); + } + setinst(p++, IChoice, 1 + l1 + 1); + p += addpatt(L, p, 1); + setinst(p, IPartialCommit, -l1); + return op; +} + + +static void optionalheadfail (lua_State *L, int l1, int n) { + Instruction *op = newpatt(L, n * l1); + Instruction *p = op; + int i; + for (i = 0; i < n; i++) { + p += addpatt(L, p, 1); + check2test(p - l1, (n - i)*l1); + } +} + + +static void optionals (lua_State *L, int l1, int n) { + /* choice L1; e; partialcommit L2; L2: ... e; L1: commit L3; L3: ... */ + int i; + Instruction *op = newpatt(L, n*(l1 + 1) + 1); + Instruction *p = op; + setinst(p++, IChoice, 1 + n*(l1 + 1)); + for (i = 0; i < n; i++) { + p += addpatt(L, p, 1); + setinst(p++, IPartialCommit, 1); + } + setinst(p - 1, ICommit, 1); /* correct last commit */ + optimizechoice(op); +} + + +static int star_l (lua_State *L) { + int l1; + int n = luaL_checkint(L, 2); + Instruction *p1 = getpatt(L, 1, &l1); + if (n >= 0) { + CharsetTag st; + Instruction *op; + if (tocharset(p1, &st) == ISCHARSET) + return repeatcharset(L, st.cs, l1, n); + if (isheadfail(p1)) + op = repeatheadfail(L, l1, n); + else + op = repeats(L, p1, l1, n); + optimizecaptures(op); + optimizejumps(op); + } + else { + if (isheadfail(p1)) + optionalheadfail(L, l1, -n); + else + optionals(L, l1, -n); + } + return 1; +} + + +static int getlabel (lua_State *L, int labelidx) { + if (labelidx == 0) return 0; + else return value2fenv(L, labelidx); +} + + +static int capture_aux (lua_State *L, int kind, int labelidx) { + int l1, n; + Instruction *p1 = getpatt(L, 1, &l1); + int lc = skipchecks(p1, 0, &n); + if (lc == l1) { /* got whole pattern? */ + /* may use a IFullCapture instruction at its end */ + Instruction *p = newpatt(L, l1 + 1); + int label = getlabel(L, labelidx); + p += addpatt(L, p, 1); + setinstcap(p, IFullCapture, label, kind, n); + } + else { /* must use open-close pair */ + Instruction *op = newpatt(L, 1 + l1 + 1); + Instruction *p = op; + setinstcap(p++, IOpenCapture, getlabel(L, labelidx), kind, 0); + p += addpatt(L, p, 1); + setinstcap(p, ICloseCapture, 0, Cclose, 0); + optimizecaptures(op); + } + return 1; +} + + +static int capture_l (lua_State *L) { return capture_aux(L, Csimple, 0); } +static int tcapture_l (lua_State *L) { return capture_aux(L, Ctable, 0); } +static int capsubst_l (lua_State *L) { return capture_aux(L, Csubst, 0); } + +static int rcapture_l (lua_State *L) { + switch (lua_type(L, 2)) { + case LUA_TFUNCTION: return capture_aux(L, Cfunction, 2); + case LUA_TTABLE: return capture_aux(L, Cquery, 2); + case LUA_TSTRING: return capture_aux(L, Cstring, 2); + default: return luaL_argerror(L, 2, "invalid replacement value"); + } +} + + +static int fold_l (lua_State *L) { + luaL_checktype(L, 2, LUA_TFUNCTION); + return capture_aux(L, Cfold, 2); +} + + +static int group_l (lua_State *L) { + if (lua_isnoneornil(L, 2)) + return capture_aux(L, Cgroup, 0); + else { + luaL_checkstring(L, 2); + return capture_aux(L, Cgroup, 2); + } +} + + +static int position_l (lua_State *L) { + Instruction *p = newpatt(L, 1); + setinstcap(p, IEmptyCapture, 0, Cposition, 0); + return 1; +} + + +static int backref_l (lua_State *L) { + Instruction *p = newpatt(L, 1); + int n = getlabel(L, 1); + setinstcap(p, IEmptyCaptureIdx, n, Cbackref, 0); + return 1; +} + + +static int argcap_l (lua_State *L) { + int n = luaL_checkint(L, 1); + Instruction *p = newpatt(L, 1); + luaL_argcheck(L, 0 < n && n <= SHRT_MAX, 1, "invalid argument index"); + setinstcap(p, IEmptyCapture, n, Carg, 0); + return 1; +} + + +static int matchtime_l (lua_State *L) { + int l1 = getpattl(L, 1); + Instruction *op = newpatt(L, 1 + l1 + 1); + Instruction *p = op; + luaL_checktype(L, 2, LUA_TFUNCTION); + setinstcap(p++, IOpenCapture, value2fenv(L, 2), Cruntime, 0); + p += addpatt(L, p, 1); + setinstcap(p, ICloseRunTime, 0, Cclose, 0); + optimizecaptures(op); + return 1; +} + + +static int capconst_l (lua_State *L) { + int i, j; + int n = lua_gettop(L); + Instruction *p = newpatt(L, n > 1 ? n + 2 : n); + lua_createtable(L, n, 0); /* new environment for the new pattern */ + if (n > 1) setinstcap(p++, IOpenCapture, 0, Cgroup, 0); + for (i = j = 1; i <= n; i++) { + if (lua_isnil(L, i)) + setinstcap(p++, IEmptyCaptureIdx, 0, Cconst, 0); + else { + setinstcap(p++, IEmptyCaptureIdx, j, Cconst, 0); + lua_pushvalue(L, i); + lua_rawseti(L, -2, j++); + } + } + if (n > 1) setinstcap(p++, ICloseCapture, 0, Cclose, 0); + lua_setfenv(L, -2); /* set environment */ + return 1; +} + + +/* }====================================================== */ + + +/* +** {====================================================== +** User-Defined Patterns +** ======================================================= +*/ + +static void l_newpf (lua_State *L, PattFunc f, const void *ud, size_t l) { + int n = instsize(l) + 1; + Instruction *p = newpatt(L, n); + if (n > MAXAUX) luaL_error(L, "pattern data too long"); + p[0].i.code = IFunc; + p[0].i.aux = n - 2; + p[0].i.offset = 0; + p[1].f = f; + memcpy(p[2].buff, ud, l); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Captures +** ======================================================= +*/ + + +typedef struct CapState { + Capture *cap; /* current capture */ + Capture *ocap; /* (original) capture list */ + lua_State *L; + int ptop; /* index of last argument to 'match' */ + const char *s; /* original string */ + int valuecached; /* value stored in cache slot */ +} CapState; + + +#define captype(cap) ((cap)->kind) + +#define isclosecap(cap) (captype(cap) == Cclose) + +#define closeaddr(c) ((c)->s + (c)->siz - 1) + +#define isfullcap(cap) ((cap)->siz != 0) + +#define getfromenv(cs,v) lua_rawgeti((cs)->L, penvidx((cs)->ptop), v) +#define pushluaval(cs) getfromenv(cs, (cs)->cap->idx) + +#define pushsubject(cs, c) lua_pushlstring((cs)->L, (c)->s, (c)->siz - 1) + + +#define updatecache(cs,v) { if ((v) != (cs)->valuecached) updatecache_(cs,v); } + + +static void updatecache_ (CapState *cs, int v) { + getfromenv(cs, v); + lua_replace(cs->L, subscache(cs)); + cs->valuecached = v; +} + + +static int pushcapture (CapState *cs); + + +static Capture *findopen (Capture *cap) { + int n = 0; + for (;;) { + cap--; + if (isclosecap(cap)) n++; + else if (!isfullcap(cap)) + if (n-- == 0) return cap; + } +} + + +static Capture *nextcap (Capture *cap) { + if (isfullcap(cap)) return cap + 1; + else { + int n = 0; + for (;;) { + cap++; + if (isclosecap(cap)) { + if (n-- == 0) return cap + 1; + } + else if (!isfullcap(cap)) n++; + } + } +} + + +static int pushallvalues (CapState *cs, int addextra) { + Capture *co = cs->cap; + int n = 0; + if (isfullcap(cs->cap++)) { + pushsubject(cs, co); /* push whole match */ + return 1; + } + while (!isclosecap(cs->cap)) + n += pushcapture(cs); + if (addextra || n == 0) { /* need extra? */ + lua_pushlstring(cs->L, co->s, cs->cap->s - co->s); /* push whole match */ + n++; + } + cs->cap++; /* skip close entry */ + return n; +} + + +static Capture *findback (CapState *cs, Capture *cap) { + lua_State *L = cs->L; + for (;;) { + if (cap == cs->ocap) { /* not found */ + const char *s = lua_tostring(L, -1); + if (s == NULL) s = lua_pushfstring(L, "(a %s)", luaL_typename(L, -1)); + luaL_error(L, "back reference '%s' not found", s); + } + cap--; + if (isclosecap(cap)) + cap = findopen(cap); + else if (!isfullcap(cap)) + continue; /* opening an enclosing capture: skip and get previous */ + if (captype(cap) == Cgroup) { + getfromenv(cs, cap->idx); /* get group name */ + if (lua_equal(L, -2, -1)) { /* right group? */ + lua_pop(L, 2); /* remove reference name and group name */ + return cap; + } + else lua_pop(L, 1); /* remove group name */ + } + } +} + + +static int backrefcap (CapState *cs) { + int n; + Capture *curr = cs->cap; + pushluaval(cs); /* reference name */ + cs->cap = findback(cs, curr); + n = pushallvalues(cs, 0); + cs->cap = curr + 1; + return n; +} + + +static int tablecap (CapState *cs) { + lua_State *L = cs->L; + int n = 0; + lua_newtable(L); + if (isfullcap(cs->cap++)) + return 1; /* table is empty */ + while (!isclosecap(cs->cap)) { + if (captype(cs->cap) == Cgroup && cs->cap->idx != 0) { /* named group? */ + int k; + pushluaval(cs); /* push group name */ + k = pushallvalues(cs, 0); + if (k == 0) { /* no value? */ + lua_pop(L, 1); /* remove group name */ + continue; /* and go on */ + } + else if (k > 1) + lua_pop(L, k - 1); /* keep just one value */ + lua_settable(L, -3); + } + else { + int i; + int k = pushcapture(cs); + for (i = k; i > 0; i--) + lua_rawseti(L, -(i + 1), n + i); + n += k; + } + } + cs->cap++; /* skip close entry */ + return 1; +} + + +static int querycap (CapState *cs) { + int idx = cs->cap->idx; + int n = pushallvalues(cs, 0); + if (n > 1) /* extra captures? */ + lua_pop(cs->L, n - 1); /* throw them away */ + updatecache(cs, idx); + lua_gettable(cs->L, subscache(cs)); + if (!lua_isnil(cs->L, -1)) + return 1; + else { + lua_pop(cs->L, 1); /* remove value */ + return 0; + } +} + + +static int foldcap (CapState *cs) { + int n; + lua_State *L = cs->L; + int idx = cs->cap->idx; + if (isfullcap(cs->cap++) || isclosecap(cs->cap) || (n = pushcapture(cs)) == 0) + return luaL_error(L, "no initial value for fold capture"); + if (n > 1) + lua_pop(L, n - 1); /* leave only one result */ + while (!isclosecap(cs->cap)) { + updatecache(cs, idx); + lua_pushvalue(L, subscache(cs)); /* get folding function */ + lua_insert(L, -2); /* put it before accumulator */ + n = pushcapture(cs); /* get other captures */ + lua_call(L, n + 1, 1); /* call folding function */ + } + cs->cap++; /* skip close entry */ + return 1; +} + + +static int functioncap (CapState *cs) { + int n; + int top = lua_gettop(cs->L); + pushluaval(cs); + n = pushallvalues(cs, 0); + lua_call(cs->L, n, LUA_MULTRET); + return lua_gettop(cs->L) - top; +} + + +static int runtimecap (lua_State *L, Capture *close, Capture *ocap, + const char *o, const char *s, int ptop) { + CapState cs; + int n; + Capture *open = findopen(close); + assert(captype(open) == Cruntime); + close->kind = Cclose; + close->s = s; + cs.ocap = ocap; cs.cap = open; cs.L = L; + cs.s = o; cs.valuecached = 0; cs.ptop = ptop; + luaL_checkstack(L, 4, "too many runtime captures"); + pushluaval(&cs); + lua_pushvalue(L, SUBJIDX); /* push original subject */ + lua_pushinteger(L, s - o + 1); /* current position */ + n = pushallvalues(&cs, 0); + lua_call(L, n + 2, LUA_MULTRET); + return close - open; +} + + + +typedef struct StrAux { + int isstring; + union { + Capture *cp; + struct { + const char *s; + const char *e; + } s; + } u; +} StrAux; + +#define MAXSTRCAPS 10 + +static int getstrcaps (CapState *cs, StrAux *cps, int n) { + int k = n++; + cps[k].isstring = 1; + cps[k].u.s.s = cs->cap->s; + if (!isfullcap(cs->cap++)) { + while (!isclosecap(cs->cap)) { + if (n >= MAXSTRCAPS) /* too many captures? */ + cs->cap = nextcap(cs->cap); /* skip it */ + else if (captype(cs->cap) == Csimple) + n = getstrcaps(cs, cps, n); + else { + cps[n].isstring = 0; + cps[n].u.cp = cs->cap; + cs->cap = nextcap(cs->cap); + n++; + } + } + cs->cap++; /* skip close */ + } + cps[k].u.s.e = closeaddr(cs->cap - 1); + return n; +} + + +/* +** add next capture (which should be a string) to buffer +*/ +static int addonestring (luaL_Buffer *b, CapState *cs, const char *what); + + +static void stringcap (luaL_Buffer *b, CapState *cs) { + StrAux cps[MAXSTRCAPS]; + int n; + size_t len, i; + const char *c; + updatecache(cs, cs->cap->idx); + c = lua_tolstring(cs->L, subscache(cs), &len); + n = getstrcaps(cs, cps, 0) - 1; + for (i = 0; i < len; i++) { + if (c[i] != '%' || c[++i] < '0' || c[i] > '9') + luaL_addchar(b, c[i]); + else { + int l = c[i] - '0'; + if (l > n) + luaL_error(cs->L, "invalid capture index (%d)", l); + else if (cps[l].isstring) + luaL_addlstring(b, cps[l].u.s.s, cps[l].u.s.e - cps[l].u.s.s); + else { + Capture *curr = cs->cap; + cs->cap = cps[l].u.cp; + if (addonestring(b, cs, "capture") == 0) + luaL_error(cs->L, "no values in capture index %d", l); + cs->cap = curr; + } + } + } +} + + +static void substcap (luaL_Buffer *b, CapState *cs) { + const char *curr = cs->cap->s; + if (isfullcap(cs->cap)) /* no nested captures? */ + luaL_addlstring(b, curr, cs->cap->siz - 1); /* keep original text */ + else { + cs->cap++; + while (!isclosecap(cs->cap)) { + const char *next = cs->cap->s; + luaL_addlstring(b, curr, next - curr); /* add text up to capture */ + if (addonestring(b, cs, "replacement") == 0) /* no capture value? */ + curr = next; /* keep original text in final result */ + else + curr = closeaddr(cs->cap - 1); /* continue after match */ + } + luaL_addlstring(b, curr, cs->cap->s - curr); /* add last piece of text */ + } + cs->cap++; /* go to next capture */ +} + + +static int addonestring (luaL_Buffer *b, CapState *cs, const char *what) { + switch (captype(cs->cap)) { + case Cstring: + stringcap(b, cs); /* add capture directly to buffer */ + return 1; + case Csubst: + substcap(b, cs); /* add capture directly to buffer */ + return 1; + default: { + lua_State *L = cs->L; + int n = pushcapture(cs); + if (n > 0) { + if (n > 1) lua_pop(L, n - 1); /* only one result */ + if (!lua_isstring(L, -1)) + luaL_error(L, "invalid %s value (a %s)", what, luaL_typename(L, -1)); + luaL_addvalue(b); + } + return n; + } + } +} + + +static int pushcapture (CapState *cs) { + luaL_checkstack(cs->L, 4, "too many captures"); + switch (captype(cs->cap)) { + case Cposition: { + lua_pushinteger(cs->L, cs->cap->s - cs->s + 1); + cs->cap++; + return 1; + } + case Cconst: { + pushluaval(cs); + cs->cap++; + return 1; + } + case Carg: { + int arg = (cs->cap++)->idx; + if (arg + FIXEDARGS > cs->ptop) + return luaL_error(cs->L, "reference to absent argument #%d", arg); + lua_pushvalue(cs->L, arg + FIXEDARGS); + return 1; + } + case Csimple: { + int k = pushallvalues(cs, 1); + if (k > 1) + lua_insert(cs->L, -k); /* whole match is first result */ + return k; + } + case Cruntime: { + int n = 0; + while (!isclosecap(cs->cap++)) { + luaL_checkstack(cs->L, 4, "too many captures"); + lua_pushvalue(cs->L, (cs->cap - 1)->idx); + n++; + } + return n; + } + case Cstring: { + luaL_Buffer b; + luaL_buffinit(cs->L, &b); + stringcap(&b, cs); + luaL_pushresult(&b); + return 1; + } + case Csubst: { + luaL_Buffer b; + luaL_buffinit(cs->L, &b); + substcap(&b, cs); + luaL_pushresult(&b); + return 1; + } + case Cgroup: { + if (cs->cap->idx == 0) /* anonymous group? */ + return pushallvalues(cs, 0); /* add all nested values */ + else { /* named group: add no values */ + cs->cap = nextcap(cs->cap); /* skip capture */ + return 0; + } + } + case Cbackref: return backrefcap(cs); + case Ctable: return tablecap(cs); + case Cfunction: return functioncap(cs); + case Cquery: return querycap(cs); + case Cfold: return foldcap(cs); + default: assert(0); return 0; + } +} + + +static int getcaptures (lua_State *L, const char *s, const char *r, int ptop) { + Capture *capture = (Capture *)lua_touserdata(L, caplistidx(ptop)); + int n = 0; + if (!isclosecap(capture)) { /* is there any capture? */ + CapState cs; + cs.ocap = cs.cap = capture; cs.L = L; + cs.s = s; cs.valuecached = 0; cs.ptop = ptop; + do { /* collect their values */ + n += pushcapture(&cs); + } while (!isclosecap(cs.cap)); + } + if (n == 0) { /* no capture values? */ + lua_pushinteger(L, r - s + 1); /* return only end position */ + n = 1; + } + return n; +} + +/* }====================================================== */ + + +static int version_l (lua_State *L) { + lua_pushstring(L, VERSION); + return 1; +} + + +static int type_l (lua_State *L) { + if (testpattern(L, 1)) + lua_pushliteral(L, "pattern"); + else + lua_pushnil(L); + return 1; +} + + +static void createcat (lua_State *L, const char *catname, int (catf) (int)) { + Instruction *p = newcharset(L); + int i; + for (i = 0; i < CHAR_MAX; i++) + if (catf(i)) setchar(p[1].buff, i); + lua_setfield(L, -2, catname); +} + + +static int locale_l (lua_State *L) { + if (lua_isnoneornil(L, 1)) { + lua_settop(L, 0); + lua_createtable(L, 0, 12); + } + else { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); + } + createcat(L, "alnum", isalnum); + createcat(L, "alpha", isalpha); + createcat(L, "cntrl", iscntrl); + createcat(L, "digit", isdigit); + createcat(L, "graph", isgraph); + createcat(L, "lower", islower); + createcat(L, "print", isprint); + createcat(L, "punct", ispunct); + createcat(L, "space", isspace); + createcat(L, "upper", isupper); + createcat(L, "xdigit", isxdigit); + return 1; +} + + +static int setmax (lua_State *L) { + luaL_optinteger(L, 1, -1); + lua_settop(L, 1); + lua_setfield(L, LUA_REGISTRYINDEX, MAXSTACKIDX); + return 0; +} + + +static int printpat_l (lua_State *L) { + Instruction *p = getpatt(L, 1, NULL); + int n, i; + lua_getfenv(L, 1); + n = ktablelen(L, -1); + printf("["); + for (i = 1; i <= n; i++) { + printf("%d = ", i); + lua_rawgeti(L, -1, i); + if (lua_isstring(L, -1)) + printf("%s ", lua_tostring(L, -1)); + else + printf("%s ", lua_typename(L, lua_type(L, -1))); + lua_pop(L, 1); + } + printf("]\n"); + printpatt(p); + return 0; +} + + +static int matchl (lua_State *L) { + Capture capture[INITCAPSIZE]; + const char *r; + size_t l; + Instruction *p = getpatt(L, 1, NULL); + const char *s = luaL_checklstring(L, SUBJIDX, &l); + int ptop = lua_gettop(L); + lua_Integer ii = luaL_optinteger(L, 3, 1); + size_t i = (ii > 0) ? + (((size_t)ii <= l) ? (size_t)ii - 1 : l) : + (((size_t)-ii <= l) ? l - ((size_t)-ii) : 0); + lua_pushnil(L); /* subscache */ + lua_pushlightuserdata(L, capture); /* caplistidx */ + lua_getfenv(L, 1); /* penvidx */ + r = match(L, s, s + i, s + l, p, capture, ptop); + if (r == NULL) { + lua_pushnil(L); + return 1; + } + return getcaptures(L, s, r, ptop); +} + + +static struct luaL_Reg pattreg[] = { + {"match", matchl}, + {"print", printpat_l}, + {"locale", locale_l}, + {"setmaxstack", setmax}, + {"B", pattbehind}, + {"C", capture_l}, + {"Cf", fold_l}, + {"Cc", capconst_l}, + {"Cg", group_l}, + {"Cp", position_l}, + {"Cb", backref_l}, + {"Carg", argcap_l}, + {"Cmt", matchtime_l}, + {"Cs", capsubst_l}, + {"Ct", tcapture_l}, + {"P", pattern_l}, + {"R", range_l}, + {"S", set_l}, + {"V", nter_l}, + {"type", type_l}, + {"version", version_l}, + {NULL, NULL} +}; + + +static struct luaL_Reg metapattreg[] = { + {"__add", union_l}, + {"__pow", star_l}, + {"__sub", diff_l}, + {"__mul", concat_l}, + {"__div", rcapture_l}, + {"__unm", unm_l}, + {"__len", pattand_l}, + {NULL, NULL} +}; + + +int luaopen_lpeg (lua_State *L); +int luaopen_lpeg (lua_State *L) { + lua_pushcfunction(L, (lua_CFunction)&l_newpf); /* new-pattern function */ + lua_setfield(L, LUA_REGISTRYINDEX, KEYNEWPATT); /* register it */ + luaL_newmetatable(L, PATTERN_T); + lua_pushnumber(L, MAXBACK); + lua_setfield(L, LUA_REGISTRYINDEX, MAXSTACKIDX); + luaL_register(L, NULL, metapattreg); + luaL_register(L, "lpeg", pattreg); + lua_pushliteral(L, "__index"); + lua_pushvalue(L, -2); + lua_settable(L, -4); + return 1; +} + diff --git a/lpeg/lpeg.h b/lpeg/lpeg.h new file mode 100644 index 00000000..13d7acef --- /dev/null +++ b/lpeg/lpeg.h @@ -0,0 +1,38 @@ +/* +** $Id: lpeg.h,v 1.1 2009/12/23 16:15:36 roberto Exp $ +** LPeg - PEG pattern matching for Lua +** Copyright 2009, Lua.org & PUC-Rio (see 'lpeg.html' for license) +** written by Roberto Ierusalimschy +*/ + +#ifndef lpeg_h +#define lpeg_h + +#include "lua.h" + + +#define KEYNEWPATT "lpeg.newpf" + + +/* +** type of extension functions that define new "patterns" for LPEG +** It should return the new current position or NULL if match fails +*/ +typedef const char *(*PattFunc) (const char *s, /* current position */ + const char *e, /* string end */ + const char *o, /* string start */ + const void *ud); /* user data */ + +/* +** function to create new patterns based on 'PattFunc' functions. +** This function is available at *registry[KEYNEWPATT]. (Notice +** the extra indirection; the userdata at the registry points to +** a variable that points to the function. In ANSI C a void* cannot +** point to a function.) +*/ +typedef void (*Newpf) (lua_State *L, + PattFunc f, /* pattern */ + const void *ud, /* (user) data to be passed to 'f' */ + size_t l); /* size of data to be passed to 'f' */ + +#endif diff --git a/lpeg/lpeg.html b/lpeg/lpeg.html new file mode 100644 index 00000000..bb92b279 --- /dev/null +++ b/lpeg/lpeg.html @@ -0,0 +1,1423 @@ + + + + LPeg - Parsing Expression Grammars For Lua + + + + + + + +
+ +
+ +
LPeg
+
+ Parsing Expression Grammars For Lua, version 0.10 +
+
+ +
+ + + +
+ + +

Introduction

+ +

+LPeg is a new pattern-matching library for Lua, +based on + +Parsing Expression Grammars (PEGs). +This text is a reference manual for the library. +For a more formal treatment of LPeg, +as well as some discussion about its implementation, +see + +A Text Pattern-Matching Tool based on Parsing Expression Grammars. +(You may also be interested in my +talk about LPeg +given at the III Lua Workshop.) +

+ +

+Following the Snobol tradition, +LPeg defines patterns as first-class objects. +That is, patterns are regular Lua values +(represented by userdata). +The library offers several functions to create +and compose patterns. +With the use of metamethods, +several of these functions are provided as infix or prefix +operators. +On the one hand, +the result is usually much more verbose than the typical +encoding of patterns using the so called +regular expressions +(which typically are not regular expressions in the formal sense). +On the other hand, +first-class patterns allow much better documentation +(as it is easy to comment the code, +to break complex definitions in smaller parts, etc.) +and are extensible, +as we can define new functions to create and compose patterns. +

+ +

+For a quick glance of the library, +the following table summarizes its basic operations +for creating patterns: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
OperatorDescription
lpeg.P(string)Matches string literally
lpeg.P(n)Matches exactly n characters
lpeg.S(string)Matches any character in string (Set)
lpeg.R("xy")Matches any character between x and y (Range)
patt^nMatches at least n repetitions of patt
patt^-nMatches at most n repetitions of patt
patt1 * patt2Matches patt1 followed by patt2
patt1 + patt2Matches patt1 or patt2 + (ordered choice)
patt1 - patt2Matches patt1 if patt2 does not match
-pattEquivalent to ("" - patt)
#pattMatches patt but consumes no input
lpeg.B(patt, n)Matches patt n characters behind + the current position, consuming no input
+ +

As a very simple example, +lpeg.R("09")^1 creates a pattern that +matches a non-empty sequence of digits. +As a not so simple example, +-lpeg.P(1) +(which can be written as lpeg.P(-1) +or simply -1 for operations expecting a pattern) +matches an empty string only if it cannot match a single character; +so, it succeeds only at the subject's end. +

+ +

+LPeg also offers the re module, +which implements patterns following a regular-expression style +(e.g., [09]+). +(This module is 250 lines of Lua code, +and of course uses LPeg to parse regular expressions and +translate them to regular LPeg patterns.) +

+ + +

Functions

+ + +

lpeg.match (pattern, subject [, init])

+

+The matching function. +It attempts to match the given pattern against the subject string. +If the match succeeds, +returns the index in the subject of the first character after the match, +or the captured values +(if the pattern captured any value). +

+ +

+An optional numeric argument init makes the match +starts at that position in the subject string. +As usual in Lua libraries, +a negative value counts from the end. +

+ +

+Unlike typical pattern-matching functions, +match works only in anchored mode; +that is, it tries to match the pattern with a prefix of +the given subject string (at position init), +not with an arbitrary substring of the subject. +So, if we want to find a pattern anywhere in a string, +we must either write a loop in Lua or write a pattern that +matches anywhere. +This second approach is easy and quite efficient; +see examples. +

+ +

lpeg.type (value)

+

+If the given value is a pattern, +returns the string "pattern". +Otherwise returns nil. +

+ +

lpeg.version ()

+

+Returns a string with the running version of LPeg. +

+ +

lpeg.setmaxstack (max)

+

+Sets the maximum size for the backtrack stack used by LPeg to +track calls and choices. +Most well-written patterns need little backtrack levels and +therefore you seldom need to change this maximum; +but a few useful patterns may need more space. +Before changing this maximum you should try to rewrite your +pattern to avoid the need for extra space. +

+ + +

Basic Constructions

+ +

+The following operations build patterns. +All operations that expect a pattern as an argument +may receive also strings, tables, numbers, booleans, or functions, +which are translated to patterns according to +the rules of function lpeg.P. +

+ + + +

lpeg.P (value)

+

+Converts the given value into a proper pattern, +according to the following rules: +

+
    + +
  • +If the argument is a pattern, +it is returned unmodified. +

  • + +
  • +If the argument is a string, +it is translated to a pattern that matches literally the string. +

  • + +
  • +If the argument is a non-negative number n, +the result is a pattern that matches exactly n characters. +

  • + +
  • +If the argument is a negative number -n, +the result is a pattern that +succeeds only if the input string does not have n characters: +lpeg.P(-n) +is equivalent to -lpeg.P(n) +(see the unary minus operation). +

  • + +
  • +If the argument is a boolean, +the result is a pattern that always succeeds or always fails +(according to the boolean value), +without consuming any input. +

  • + +
  • +If the argument is a table, +it is interpreted as a grammar +(see Grammars). +

  • + +
  • +If the argument is a function, +returns a pattern equivalent to a +match-time capture over the empty string. +

  • + +
+ + +

lpeg.B(patt [, n])

+

+Returns a pattern that +matches only if the input string matches patt +starting n positions behind the current position. +(The default value for n is 1.) +If the current position is less than or equal to n, +this pattern fails. +

+ +

+Like the and predicate, +this pattern never consumes any input, +independently of success or failure, +and it never produces any capture. +

+ +

+The pattern patt cannot contain any open reference +to grammar rules (see grammars). +

+ +

+(This is an experimental feature. +There is a good chance it will change in future versions.) +

+ + +

lpeg.R ({range})

+

+Returns a pattern that matches any single character +belonging to one of the given ranges. +Each range is a string xy of length 2, +representing all characters with code +between the codes of x and y +(both inclusive). +

+ +

+As an example, the pattern +lpeg.R("09") matches any digit, +and lpeg.R("az", "AZ") matches any ASCII letter. +

+ + +

lpeg.S (string)

+

+Returns a pattern that matches any single character that +appears in the given string. +(The S stands for Set.) +

+ +

+As an example, the pattern +lpeg.S("+-*/") matches any arithmetic operator. +

+ +

+Note that, if s is a character +(that is, a string of length 1), +then lpeg.P(s) is equivalent to lpeg.S(s) +which is equivalent to lpeg.R(s..s). +Note also that both lpeg.S("") and lpeg.R() +are patterns that always fail. +

+ + +

lpeg.V (v)

+

+This operation creates a non-terminal (a variable) +for a grammar. +The created non-terminal refers to the rule indexed by v +in the enclosing grammar. +(See Grammars for details.) +

+ + +

lpeg.locale ([table])

+

+Returns a table with patterns for matching some character classes +according to the current locale. +The table has fields named +alnum, +alpha, +cntrl, +digit, +graph, +lower, +print, +punct, +space, +upper, and +xdigit, +each one containing a correspondent pattern. +Each pattern matches any single character that belongs to its class. +

+ +

+If called with an argument table, +then it creates those fields inside the given table and +returns that table. +

+ + +

#patt

+

+Returns a pattern that +matches only if the input string matches patt, +but without consuming any input, +independently of success or failure. +(This pattern is called an and predicate +and it is equivalent to +&patt in the original PEG notation.) +

+ + +

+This pattern never produces any capture. +

. + + +

-patt

+

+Returns a pattern that +matches only if the input string does not match patt. +It does not consume any input, +independently of success or failure. +(This pattern is equivalent to +!patt in the original PEG notation.) +

+ +

+As an example, the pattern +-lpeg.P(1) matches only the end of string. +

+ +

+This pattern never produces any captures, +because either patt fails +or -patt fails. +(A failing pattern never produces captures.) +

+ + +

patt1 + patt2

+

+Returns a pattern equivalent to an ordered choice +of patt1 and patt2. +(This is denoted by patt1 / patt2 in the original PEG notation, +not to be confused with the / operation in LPeg.) +It matches either patt1 or patt2, +with no backtracking once one of them succeeds. +The identity element for this operation is the pattern +lpeg.P(false), +which always fails. +

+ +

+If both patt1 and patt2 are +character sets, +this operation is equivalent to set union. +

+
+lower = lpeg.R("az")
+upper = lpeg.R("AZ")
+letter = lower + upper
+
+ + +

patt1 - patt2

+

+Returns a pattern equivalent to !patt2 patt1. +This pattern asserts that the input does not match +patt2 and then matches patt1. +

+ +

+When succeeded, +this pattern produces all captures from patt1. +It never produces any capture from patt2 +(as either patt2 fails or +patt1 - patt2 fails). +

+ +

+If both patt1 and patt2 are +character sets, +this operation is equivalent to set difference. +Note that -patt is equivalent to "" - patt +(or 0 - patt). +If patt is a character set, +1 - patt is its complement. +

+ + +

patt1 * patt2

+

+Returns a pattern that matches patt1 +and then matches patt2, +starting where patt1 finished. +The identity element for this operation is the +pattern lpeg.P(true), +which always succeeds. +

+ +

+(LPeg uses the * operator +[instead of the more obvious ..] +both because it has +the right priority and because in formal languages it is +common to use a dot for denoting concatenation.) +

+ + +

patt^n

+

+If n is nonnegative, +this pattern is +equivalent to pattn patt*. +It matches at least n occurrences of patt. +

+ +

+Otherwise, when n is negative, +this pattern is equivalent to (patt?)-n. +That is, it matches at most |n| +occurrences of patt. +

+ +

+In particular, patt^0 is equivalent to patt*, +patt^1 is equivalent to patt+, +and patt^-1 is equivalent to patt? +in the original PEG notation. +

+ +

+In all cases, +the resulting pattern is greedy with no backtracking +(also called a possessive repetition). +That is, it matches only the longest possible sequence +of matches for patt. +

+ + + +

Grammars

+ +

+With the use of Lua variables, +it is possible to define patterns incrementally, +with each new pattern using previously defined ones. +However, this technique does not allow the definition of +recursive patterns. +For recursive patterns, +we need real grammars. +

+ +

+LPeg represents grammars with tables, +where each entry is a rule. +

+ +

+The call lpeg.V(v) +creates a pattern that represents the nonterminal +(or variable) with index v in a grammar. +Because the grammar still does not exist when +this function is evaluated, +the result is an open reference to the respective rule. +

+ +

+A table is fixed when it is converted to a pattern +(either by calling lpeg.P or by using it wherein a +pattern is expected). +Then every open reference created by lpeg.V(v) +is corrected to refer to the rule indexed by v in the table. +

+ +

+When a table is fixed, +the result is a pattern that matches its initial rule. +The entry with index 1 in the table defines its initial rule. +If that entry is a string, +it is assumed to be the name of the initial rule. +Otherwise, LPeg assumes that the entry 1 itself is the initial rule. +

+ +

+As an example, +the following grammar matches strings of a's and b's that +have the same number of a's and b's: +

+
+equalcount = lpeg.P{
+  "S";   -- initial rule name
+  S = "a" * lpeg.V"B" + "b" * lpeg.V"A" + "",
+  A = "a" * lpeg.V"S" + "b" * lpeg.V"A" * lpeg.V"A",
+  B = "b" * lpeg.V"S" + "a" * lpeg.V"B" * lpeg.V"B",
+} * -1
+
+

+It is equivalent to the following grammar in standard PEG notation: +

+
+  S <- 'a' B / 'b' A / ''
+  A <- 'a' S / 'b' A A
+  B <- 'b' S / 'a' B B
+
+ + +

Captures

+ +

+A capture is a pattern that creates values +(the so called semantic information) when it matches. +LPeg offers several kinds of captures, +which produces values based on matches and combine these values to +produce new values. +Each capture may produce zero or more values. +

+ +

+The following table summarizes the basic captures: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OperationWhat it Produces
lpeg.C(patt)the match for patt plus all captures + made by patt
lpeg.Carg(n)the value of the nth extra argument to + lpeg.match (matches the empty string)
lpeg.Cb(name)the values produced by the previous + group capture named name + (matches the empty string)
lpeg.Cc(values)the given values (matches the empty string)
lpeg.Cf(patt, func)a folding of the captures from patt
lpeg.Cg(patt [, name])the values produced by patt, + optionally tagged with name
lpeg.Cp()the current position (matches the empty string)
lpeg.Cs(patt)the match for patt + with the values from nested captures replacing their matches
lpeg.Ct(patt)a table with all captures from patt
patt / stringstring, with some marks replaced by captures + of patt
patt / tabletable[c], where c is the (first) + capture of patt
patt / functionthe returns of function applied to the captures + of patt
lpeg.Cmt(patt, function)the returns of function applied to the captures + of patt; the application is done at match time
+ +

+A capture pattern produces its values every time it succeeds. +For instance, +a capture inside a loop produces as many values as matched by the loop. +A capture produces a value only when it succeeds. +For instance, +the pattern lpeg.C(lpeg.P"a"^-1) +produces the empty string when there is no "a" +(because the pattern "a"? succeeds), +while the pattern lpeg.C("a")^-1 +does not produce any value when there is no "a" +(because the pattern "a" fails). +

+ +

+Usually, +LPeg evaluates all captures only after (and if) the entire match succeeds. +During the match time it only gathers enough information +to produce the capture values later. +As a particularly important consequence, +most captures cannot affect the way a pattern matches a subject. +The only exception to this rule is the +so-called match-time capture. +When a match-time capture matches, +it forces the immediate evaluation of all its nested captures +and then calls its corresponding function, +which tells whether the match succeeds and also +what values are produced. +

+ +

lpeg.C (patt)

+

+Creates a simple capture, +which captures the substring of the subject that matches patt. +The captured value is a string. +If patt has other captures, +their values are returned after this one. +

+ + +

lpeg.Carg (n)

+

+Creates an argument capture. +This pattern matches the empty string and +produces the value given as the nth extra +argument given in the call to lpeg.match. +

+ + +

lpeg.Cb (name)

+

+Creates a back capture. +This pattern matches the empty string and +produces the values produced by the most recent +group capture named name. +

+ +

+Most recent means the last +complete +outermost +group capture with the given name. +A Complete capture means that the entire pattern +corresponding to the capture has matched. +An Outermost capture means that the capture is not inside +another complete capture. +

+ + +

lpeg.Cc ([value, ...])

+

+Creates a constant capture. +This pattern matches the empty string and +produces all given values as its captured values. +

+ + +

lpeg.Cf (patt, func)

+

+Creates a fold capture. +If patt produces a list of captures +C1 C2 ... Cn, +this capture will produce the value +func(...func(func(C1, C2), C3)..., + Cn), +that is, it will fold +(or accumulate, or reduce) +the captures from patt using function func. +

+ +

+This capture assumes that patt should produce +at least one capture with at least one value (of any type), +which becomes the initial value of an accumulator. +(If you need a specific initial value, +you may prefix a constant capture to patt.) +For each subsequent capture +LPeg calls func +with this accumulator as the first argument and all values produced +by the capture as extra arguments; +the value returned by this call +becomes the new value for the accumulator. +The final value of the accumulator becomes the captured value. +

+ +

+As an example, +the following pattern matches a list of numbers separated +by commas and returns their addition: +

+
+-- matches a numeral and captures its value
+number = lpeg.R"09"^1 / tonumber
+
+-- matches a list of numbers, captures their values
+list = number * ("," * number)^0
+
+-- auxiliary function to add two numbers
+function add (acc, newvalue) return acc + newvalue end
+
+-- folds the list of numbers adding them
+sum = lpeg.Cf(list, add)
+
+-- example of use
+print(sum:match("10,30,43"))   --> 83
+
+ + +

lpeg.Cg (patt [, name])

+

+Creates a group capture. +It groups all values returned by patt +into a single capture. +The group may be anonymous (if no name is given) +or named with the given name. +

+ +

+An anonymous group serves to join values from several captures into +a single capture. +A named group has a different behavior. +In most situations, a named group returns no values at all. +Its values are only relevant for a following +back capture or when used +inside a table capture. +

+ + +

lpeg.Cp ()

+

+Creates a position capture. +It matches the empty string and +captures the position in the subject where the match occurs. +The captured value is a number. +

+ + +

lpeg.Cs (patt)

+

+Creates a substitution capture, +which captures the substring of the subject that matches patt, +with substitutions. +For any capture inside patt with a value, +the substring that matched the capture is replaced by the capture value +(which should be a string). +The final captured value is the string resulting from +all replacements. +

+ + +

lpeg.Ct (patt)

+

+Creates a table capture. +This capture creates a table and puts all values from all anonymous captures +made by patt inside this table in successive integer keys, +starting at 1. +Moreover, +for each named capture group created by patt, +the first value of the group is put into the table +with the group name as its key. +The captured value is only the table. +

+ + +

patt / string

+

+Creates a string capture. +It creates a capture string based on string. +The captured value is a copy of string, +except that the character % works as an escape character: +any sequence in string of the form %n, +with n between 1 and 9, +stands for the match of the n-th capture in patt. +The sequence %0 stands for the whole match. +The sequence %% stands for a single %. + + +

patt / table

+

+Creates a query capture. +It indexes the given table using as key the first value captured by +patt, +or the whole match if patt produced no value. +The value at that index is the final value of the capture. +If the table does not have that key, +there is no captured value. +

+ + +

patt / function

+

+Creates a function capture. +It calls the given function passing all captures made by +patt as arguments, +or the whole match if patt made no capture. +The values returned by the function +are the final values of the capture. +In particular, +if function returns no value, +there is no captured value. +

+ + +

lpeg.Cmt(patt, function)

+

+Creates a match-time capture. +Unlike all other captures, +this one is evaluated immediately when a match occurs. +It forces the immediate evaluation of all its nested captures +and then calls function. +

+ +

+The given function gets as arguments the entire subject, +the current position (after the match of patt), +plus any capture values produced by patt. +

+ +

+The first value returned by function +defines how the match happens. +If the call returns a number, +the match succeeds +and the returned number becomes the new current position. +(Assuming a subject s and current position i, +the returned number must be in the range [i, len(s) + 1].) +If the call returns true, +the match succeeds without consuming any input. +(So, to return true is equivalent to return i.) +If the call returns false, nil, or no value, +the match fails. +

+ +

+Any extra values returned by the function become the +values produced by the capture. +

+ + + + +

Some Examples

+ +

Using a Pattern

+

+This example shows a very simple but complete program +that builds and uses a pattern: +

+
+local lpeg = require "lpeg"
+
+-- matches a word followed by end-of-string
+p = lpeg.R"az"^1 * -1
+
+print(p:match("hello"))        --> 6
+print(lpeg.match(p, "hello"))  --> 6
+print(p:match("1 hello"))      --> nil
+
+

+The pattern is simply a sequence of one or more lower-case letters +followed by the end of string (-1). +The program calls match both as a method +and as a function. +In both sucessful cases, +the match returns +the index of the first character after the match, +which is the string length plus one. +

+ + +

Name-value lists

+

+This example parses a list of name-value pairs and returns a table +with those pairs: +

+
+lpeg.locale(lpeg)   -- adds locale entries into 'lpeg' table
+
+local space = lpeg.space^0
+local name = lpeg.C(lpeg.alpha^1) * space
+local sep = lpeg.S(",;") * space
+local pair = lpeg.Cg(name * "=" * space * name) * sep^-1
+local list = lpeg.Cf(lpeg.Ct("") * pair^0, rawset)
+t = list:match("a=b, c = hi; next = pi")  --> { a = "b", c = "hi", next = "pi" }
+
+

+Each pair has the format name = name followed by +an optional separator (a comma or a semicolon). +The pair pattern encloses the pair in a group pattern, +so that the names become the values of a single capture. +The list pattern then folds these captures. +It starts with an empty table, +created by a table capture matching an empty string; +then for each capture (a pair of names) it applies rawset +over the accumulator (the table) and the capture values (the pair of names). +rawset returns the table itself, +so the accumulator is always the table. +

+ +

Splitting a string

+

+The following code builds a pattern that +splits a string using a given pattern +sep as a separator: +

+
+function split (s, sep)
+  sep = lpeg.P(sep)
+  local elem = lpeg.C((1 - sep)^0)
+  local p = elem * (sep * elem)^0
+  return lpeg.match(p, s)
+end
+
+

+First the function ensures that sep is a proper pattern. +The pattern elem is a repetition of zero of more +arbitrary characters as long as there is not a match against +the separator. It also captures its result. +The pattern p matches a list of elements separated +by sep. +

+ +

+If the split results in too many values, +it may overflow the maximum number of values +that can be returned by a Lua function. +In this case, +we should collect these values in a table: +

+
+function split (s, sep)
+  sep = lpeg.P(sep)
+  local elem = lpeg.C((1 - sep)^0)
+  local p = lpeg.Ct(elem * (sep * elem)^0)   -- make a table capture
+  return lpeg.match(p, s)
+end
+
+ + +

Searching for a pattern

+

+The primitive match works only in anchored mode. +If we want to find a pattern anywhere in a string, +we must write a pattern that matches anywhere. +

+ +

+Because patterns are composable, +we can write a function that, +given any arbitrary pattern p, +returns a new pattern that searches for p +anywhere in a string. +There are several ways to do the search. +One way is like this: +

+
+function anywhere (p)
+  return lpeg.P{ p + 1 * lpeg.V(1) }
+end
+
+

+This grammar has a straight reading: +it matches p or skips one character and tries again. +

+ +

+If we want to know where the pattern is in the string +(instead of knowing only that it is there somewhere), +we can add position captures to the pattern: +

+
+local I = lpeg.Cp()
+function anywhere (p)
+  return lpeg.P{ I * p * I + 1 * lpeg.V(1) }
+end
+
+ +

+Another option for the search is like this: +

+
+local I = lpeg.Cp()
+function anywhere (p)
+  return (1 - lpeg.P(p))^0 * I * p * I
+end
+
+

+Again the pattern has a straight reading: +it skips as many characters as possible while not matching p, +and then matches p (plus appropriate captures). +

+ +

+If we want to look for a pattern only at word boundaries, +we can use the following transformer: +

+ +
+local t = lpeg.locale()
+
+function atwordboundary (p)
+  return lpeg.P{
+    [1] = p + t.alpha^0 * (1 - t.alpha)^1 * lpeg.V(1)
+  }
+end
+
+ + +

Balanced parentheses

+

+The following pattern matches only strings with balanced parentheses: +

+
+b = lpeg.P{ "(" * ((1 - lpeg.S"()") + lpeg.V(1))^0 * ")" }
+
+

+Reading the first (and only) rule of the given grammar, +we have that a balanced string is +an open parenthesis, +followed by zero or more repetitions of either +a non-parenthesis character or +a balanced string (lpeg.V(1)), +followed by a closing parenthesis. +

+ + +

Global substitution

+

+The next example does a job somewhat similar to string.gsub. +It receives a pattern and a replacement value, +and substitutes the replacement value for all occurrences of the pattern +in a given string: +

+
+function gsub (s, patt, repl)
+  patt = lpeg.P(patt)
+  patt = lpeg.Cs((patt / repl + 1)^0)
+  return lpeg.match(patt, s)
+end
+
+

+As in string.gsub, +the replacement value can be a string, +a function, or a table. +

+ + +

Comma-Separated Values (CSV)

+

+This example breaks a string into comma-separated values, +returning all fields: +

+
+local field = '"' * lpeg.Cs(((lpeg.P(1) - '"') + lpeg.P'""' / '"')^0) * '"' +
+                    lpeg.C((1 - lpeg.S',\n"')^0)
+
+local record = field * (',' * field)^0 * (lpeg.P'\n' + -1)
+
+function csv (s)
+  return lpeg.match(record, s)
+end
+
+

+A field is either a quoted field +(which may contain any character except an individual quote, +which may be written as two quotes that are replaced by one) +or an unquoted field +(which cannot contain commas, newlines, or quotes). +A record is a list of fields separated by commas, +ending with a newline or the string end (-1). +

+ +

+As it is, +the previous pattern returns each field as a separated result. +If we add a table capture in the definition of record, +the pattern will return instead a single table +containing all fields: +

+
+local record = lpeg.Ct(field * (',' * field)^0) * (lpeg.P'\n' + -1)
+
+ + +

UTF-8 and Latin 1

+

+It is not difficult to use LPeg to convert a string from +UTF-8 encoding to Latin 1 (ISO 8859-1): +

+ +
+-- convert a two-byte UTF-8 sequence to a Latin 1 character
+local function f2 (s)
+  local c1, c2 = string.byte(s, 1, 2)
+  return string.char(c1 * 64 + c2 - 12416)
+end
+
+local utf8 = lpeg.R("\0\127")
+           + lpeg.R("\194\195") * lpeg.R("\128\191") / f2
+
+local decode_pattern = lpeg.Cs(utf8^0) * -1
+
+

+In this code, +the definition of UTF-8 is already restricted to the +Latin 1 range (from 0 to 255). +Any encoding outside this range (as well as any invalid encoding) +will not match that pattern. +

+ +

+As the definition of decode_pattern demands that +the pattern matches the whole input (because of the -1 at its end), +any invalid string will simply fail to match, +without any useful information about the problem. +We can improve this situation redefining decode_pattern +as follows: +

+
+local function er (_, i) error("invalid encoding at position " .. i) end
+
+local decode_pattern = lpeg.Cs(utf8^0) * (-1 + lpeg.P(er))
+
+

+Now, if the pattern utf8^0 stops +before the end of the string, +an appropriate error function is called. +

+ + +

UTF-8 and Unicode

+

+We can extend the previous patterns to handle all Unicode code points. +Of course, +we cannot translate them to Latin 1 or any other one-byte encoding. +Instead, our translation results in a array with the code points +represented as numbers. +The full code is here: +

+
+-- decode a two-byte UTF-8 sequence
+local function f2 (s)
+  local c1, c2 = string.byte(s, 1, 2)
+  return c1 * 64 + c2 - 12416
+end
+
+-- decode a three-byte UTF-8 sequence
+local function f3 (s)
+  local c1, c2, c3 = string.byte(s, 1, 3)
+  return (c1 * 64 + c2) * 64 + c3 - 925824
+end
+
+-- decode a four-byte UTF-8 sequence
+local function f4 (s)
+  local c1, c2, c3, c4 = string.byte(s, 1, 4)
+  return ((c1 * 64 + c2) * 64 + c3) * 64 + c4 - 63447168
+end
+
+local cont = lpeg.R("\128\191")   -- continuation byte
+
+local utf8 = lpeg.R("\0\127") / string.byte
+           + lpeg.R("\194\223") * cont / f2
+           + lpeg.R("\224\239") * cont * cont / f3
+           + lpeg.R("\240\244") * cont * cont * cont / f4
+
+local decode_pattern = lpeg.Ct(utf8^0) * -1
+
+ + +

Lua's long strings

+

+A long string in Lua starts with the pattern [=*[ +and ends at the first occurrence of ]=*] with +exactly the same number of equal signs. +If the opening brackets are followed by a newline, +this newline is discharged +(that is, it is not part of the string). +

+ +

+To match a long string in Lua, +the pattern must capture the first repetition of equal signs and then, +whenever it finds a candidate for closing the string, +check whether it has the same number of equal signs. +

+ +
+equals = lpeg.P"="^0
+open = "[" * lpeg.Cg(equals, "init") * "[" * lpeg.P"\n"^-1
+close = "]" * lpeg.C(equals) * "]"
+closeeq = lpeg.Cmt(close * lpeg.Cb("init"), function (s, i, a, b) return a == b end)
+string = open * lpeg.C((lpeg.P(1) - closeeq)^0) * close /
+  function (s, o) return s end
+
+ +

+The open pattern matches [=*[, +capturing the repetitions of equal signs in a group named init; +it also discharges an optional newline, if present. +The close pattern matches ]=*], +also capturing the repetitions of equal signs. +The closeeq pattern first matches close; +then it uses a back capture to recover the capture made +by the previous open, +which is named init; +finally it uses a match-time capture to check +whether both captures are equal. +The string pattern starts with an open, +then it goes as far as possible until matching closeeq, +and then matches the final close. +The final function capture simply discards +the capture made by close. +

+ + +

Arithmetic expressions

+

+This example is a complete parser and evaluator for simple +arithmetic expressions. +We write it in two styles. +The first approach first builds a syntax tree and then +traverses this tree to compute the expression value: +

+
+-- Lexical Elements
+local Space = lpeg.S(" \n\t")^0
+local Number = lpeg.C(lpeg.P"-"^-1 * lpeg.R("09")^1) * Space
+local FactorOp = lpeg.C(lpeg.S("+-")) * Space
+local TermOp = lpeg.C(lpeg.S("*/")) * Space
+local Open = "(" * Space
+local Close = ")" * Space
+
+-- Grammar
+local Exp, Term, Factor = lpeg.V"Exp", lpeg.V"Term", lpeg.V"Factor"
+G = lpeg.P{ Exp,
+  Exp = lpeg.Ct(Factor * (FactorOp * Factor)^0);
+  Factor = lpeg.Ct(Term * (TermOp * Term)^0);
+  Term = Number + Open * Exp * Close;
+}
+
+G = Space * G * -1
+
+-- Evaluator
+function eval (x)
+  if type(x) == "string" then
+    return tonumber(x)
+  else
+    local op1 = eval(x[1])
+    for i = 2, #x, 2 do
+      local op = x[i]
+      local op2 = eval(x[i + 1])
+      if (op == "+") then op1 = op1 + op2
+      elseif (op == "-") then op1 = op1 - op2
+      elseif (op == "*") then op1 = op1 * op2
+      elseif (op == "/") then op1 = op1 / op2
+      end
+    end
+    return op1
+  end
+end
+
+-- Parser/Evaluator
+function evalExp (s)
+  local t = lpeg.match(G, s)
+  if not t then error("syntax error", 2) end
+  return eval(t)
+end
+
+-- small example
+print(evalExp"3 + 5*9 / (1+1) - 12")   --> 13.5
+
+ +

+The second style computes the expression value on the fly, +without building the syntax tree. +The following grammar takes this approach. +(It assumes the same lexical elements as before.) +

+
+-- Auxiliary function
+function eval (v1, op, v2)
+  if (op == "+") then return v1 + v2
+  elseif (op == "-") then return v1 - v2
+  elseif (op == "*") then return v1 * v2
+  elseif (op == "/") then return v1 / v2
+  end
+end
+
+-- Grammar
+local V = lpeg.V
+G = lpeg.P{ "Exp",
+  Exp = lpeg.Cf(V"Factor" * lpeg.Cg(FactorOp * V"Factor")^0, eval);
+  Factor = lpeg.Cf(V"Term" * lpeg.Cg(TermOp * V"Term")^0, eval);
+  Term = Number / tonumber + Open * V"Exp" * Close;
+}
+
+-- small example
+print(lpeg.match(G, "3 + 5*9 / (1+1) - 12"))   --> 13.5
+
+

+Note the use of the fold (accumulator) capture. +To compute the value of an expression, +the accumulator starts with the value of the first factor, +and then applies eval over +the accumulator, the operator, +and the new factor for each repetition. +

+ + + +

Download

+ +

LPeg +source code.

+ + +

License

+ +

+Copyright © 2008 Lua.org, PUC-Rio. +

+

+Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), +to deal in the Software without restriction, +including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, +and to permit persons to whom the Software is +furnished to do so, +subject to the following conditions: +

+ +

+The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. +

+ +

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

+ +
+ +
+ +
+

+$Id: lpeg.html,v 1.64 2011/02/16 15:01:58 roberto Exp $ +

+
+ +
+ + + diff --git a/lpeg/makefile b/lpeg/makefile new file mode 100644 index 00000000..87169a22 --- /dev/null +++ b/lpeg/makefile @@ -0,0 +1,42 @@ +LIBNAME = lpeg +LUADIR = /usr/include/lua5.1/ + +COPT = -O2 -DNDEBUG + +CWARNS = -Wall -Wextra -pedantic \ + -Waggregate-return \ + -Wbad-function-cast \ + -Wcast-align \ + -Wcast-qual \ + -Wdeclaration-after-statement \ + -Wdisabled-optimization \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wpointer-arith \ + -Wshadow \ + -Wsign-compare \ + -Wstrict-prototypes \ + -Wundef \ + -Wwrite-strings \ + # -Wunreachable-code \ + + +CFLAGS = $(CWARNS) $(COPT) -ansi -I$(LUADIR) +CC = gcc + +# For Linux +DLLFLAGS = -shared -fpic +ENV = + +# For Mac OS +# ENV = MACOSX_DEPLOYMENT_TARGET=10.4 +# DLLFLAGS = -bundle -undefined dynamic_lookup + +lpeg.so: lpeg.o + env $(ENV) $(CC) $(DLLFLAGS) lpeg.o -o lpeg.so + +lpeg.o: makefile lpeg.c lpeg.h + +test: test.lua re.lua lpeg.so + test.lua + diff --git a/lpeg/re.html b/lpeg/re.html new file mode 100644 index 00000000..d67e23a3 --- /dev/null +++ b/lpeg/re.html @@ -0,0 +1,486 @@ + + + + LPeg.re - Regex syntax for LPEG + + + + + + + +
+ +
+ +
LPeg.re
+
+ Regex syntax for LPEG +
+
+ +
+ + + +
+ +

The re Module

+ +

+The re module +(provided by file re.lua in the distribution) +supports a somewhat conventional regex syntax +for pattern usage within LPeg. +

+ +

+The next table summarizes re's syntax. +A p represents an arbitrary pattern; +num represents a number ([0-9]+); +name represents an identifier +([a-zA-Z][a-zA-Z0-9_]*). +Constructions are listed in order of decreasing precedence. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SyntaxDescription
( p ) grouping
'string' literal string
"string" literal string
[class] character class
. any character
%namepattern defs[name] or a pre-defined pattern
namenon terminal
<name>non terminal
{} position capture
{ p } simple capture
{: p :} anonymous group capture
{:name: p :} named group capture
{~ p ~} substitution capture
=name back reference +
p ? optional match
p * zero or more repetitions
p + one or more repetitions
p^num exactly n repetitions
p^+numat least n repetitions
p^-numat most n repetitions
p -> 'string' string capture
p -> "string" string capture
p -> {} table capture
p -> name function/query/string capture +equivalent to p / defs[name]
p => name match-time capture +equivalent to lpeg.Cmt(p, defs[name])
& p and predicate
! p not predicate
p1 p2 concatenation
p1 / p2 ordered choice
(name <- p)+ grammar
+

+Any space appearing in a syntax description can be +replaced by zero or more space characters and Lua-style comments +(-- until end of line). +

+ +

+Character classes define sets of characters. +An initial ^ complements the resulting set. +A range x-y includes in the set +all characters with codes between the codes of x and y. +A pre-defined class %name includes all +characters of that class. +A simple character includes itself in the set. +The only special characters inside a class are ^ +(special only if it is the first character); +] +(can be included in the set as the first character, +after the optional ^); +% (special only if followed by a letter); +and - +(can be included in the set as the first or the last character). +

+ +

+Currently the pre-defined classes are similar to those from the +Lua's string library +(%a for letters, +%A for non letters, etc.). +There is also a class %nl +containing only the newline character, +which is particularly handy for grammars written inside long strings, +as long strings do not interpret escape sequences like \n. +

+ + +

Functions

+ +

re.compile (string, [, defs])

+

+Compiles the given string and +returns an equivalent LPeg pattern. +The given string may define either an expression or a grammar. +The optional defs table provides extra Lua values +to be used by the pattern. +

+ +

re.find (subject, pattern [, init])

+

+Searches the given pattern in the given subject. +If it finds a match, +returns the index where this occurrence starts, +plus the captures made by the pattern (if any). +Otherwise, returns nil. +

+ +

+An optional numeric argument init makes the search +starts at that position in the subject string. +As usual in Lua libraries, +a negative value counts from the end. +

+ +

re.match (subject, pattern)

+

+Matches the given pattern against the given subject. +

+ +

re.updatelocale ()

+

+Updates the pre-defined character classes to the current locale. +

+ + +

Some Examples

+ +

A complete simple program

+

+The next code shows a simple complete Lua program using +the re module: +

+
+local re = require"re"
+
+-- find the position of the first number in a string
+print(re.find("the number 423 is odd", "[0-9]+"))  --> 12
+
+-- similar, but also captures (and returns) the number
+print(re.find("the number 423 is odd", "{[0-9]+}"))  --> 12    423
+
+-- returns all words in a string
+print(re.match("the number 423 is odd", "({%a+} / .)*"))
+--> the    number    is    odd
+
+ + +

Balanced parentheses

+

+The following call will produce the same pattern produced by the +Lua expression in the +balanced parentheses example: +

+
+b = re.compile[[  balanced <- "(" ([^()] / balanced)* ")"  ]]
+
+ +

String reversal

+

+The next example reverses a string: +

+
+rev = re.compile[[ R <- (!.) -> '' / ({.} R) -> '%2%1']]
+print(rev:match"0123456789")   --> 9876543210
+
+ +

CSV decoder

+

+The next example replicates the CSV decoder: +

+
+record = re.compile[[
+  record <- ( field (',' field)* ) -> {} (%nl / !.)
+  field <- escaped / nonescaped
+  nonescaped <- { [^,"%nl]* }
+  escaped <- '"' {~ ([^"] / '""' -> '"')* ~} '"'
+]]
+
+ +

Lua's long strings

+

+The next example matches Lua long strings: +

+
+c = re.compile([[
+  longstring <- ('[' {:eq: '='* :} '[' close) -> void
+  close <- ']' =eq ']' / . close
+]], {void = function () end})
+
+print(c:match'[==[]]===]]]]==]===[]')   --> 17
+
+ +

Abstract Syntax Trees

+

+This example shows a simple way to build an +abstract syntax tree (AST) for a given grammar. +To keep our example simple, +let us consider the following grammar +for lists of names: +

+
+p = re.compile[[
+      listname <- (name s)*
+      name <- [a-z][a-z]*
+      s <- %s*
+]]
+
+

+Now, we will add captures to build a corresponding AST. +As a first step, the pattern will build a table to +represent each non terminal; +terminals will be represented by their corresponding strings: +

+
+c = re.compile[[
+      listname <- (name s)* -> {}
+      name <- {[a-z][a-z]*} -> {}
+      s <- %s*
+]]
+
+

+Now, a match against "hi hello bye" +results in the table +{{"hi"}, {"hello"}, {"bye"}}. +

+

+For such a simple grammar, +this AST is more than enough; +actually, the tables around each single name +are already overkilling. +More complex grammars, +however, may need some more structure. +Specifically, +it would be useful if each table had +a tag field telling what non terminal +that table represents. +We can add such a tag using +named group captures: +

+
+x = re.compile[[
+      listname <- ({:tag: '' -> 'list':} (name s)*) -> {}
+      name <- ({:tag: '' -> 'id':} {[a-z][a-z]*}) -> {}
+      s <- ' '*
+]]
+
+

+With these group captures, +a match against "hi hello bye" +results in the following table: +

+
+{tag="list",
+  {tag="id", "hi"},
+  {tag="id", "hello"},
+  {tag="id", "bye"}
+}
+
+ + +

Indented blocks

+

+This example breaks indented blocks into tables, +respecting the indentation: +

+
+p = re.compile[[
+  block <- ({:ident:' '*:} line
+           ((=ident !' ' line) / &(=ident ' ') block)*) -> {}
+  line <- {[^%nl]*} %nl
+]]
+
+

+As an example, +consider the following text: +

+
+t = p:match[[
+first line
+  subline 1
+  subline 2
+second line
+third line
+  subline 3.1
+    subline 3.1.1
+  subline 3.2
+]]
+
+

+The resulting table t will be like this: +

+
+   {'first line'; {'subline 1'; 'subline 2'; ident = '  '};
+    'second line';
+    'third line'; { 'subline 3.1'; {'subline 3.1.1'; ident = '    '};
+                    'subline 3.2'; ident = '  '};
+    ident = ''}
+
+ +

Macro expander

+

+This example implements a simple macro expander. +Macros must be defined as part of the pattern, +following some simple rules: +

+
+p = re.compile[[
+      text <- {~ item* ~}
+      item <- macro / [^()] / '(' item* ')'
+      arg <- ' '* {~ (!',' item)* ~}
+      args <- '(' arg (',' arg)* ')'
+      -- now we define some macros
+      macro <- ('apply' args) -> '%1(%2)'
+             / ('add' args) -> '%1 + %2'
+             / ('mul' args) -> '%1 * %2'
+]]
+
+print(p:match"add(mul(a,b), apply(f,x))")   --> a * b + f(x)
+
+

+A text is a sequence of items, +wherein we apply a substitution capture to expand any macros. +An item is either a macro, +any character different from parentheses, +or a parenthesized expression. +A macro argument (arg) is a sequence +of items different from a comma. +(Note that a comma may appear inside an item, +e.g., inside a parenthesized expression.) +Again we do a substitution capture to expand any macro +in the argument before expanding the outer macro. +args is a list of arguments separated by commas. +Finally we define the macros. +Each macro is a string substitution; +it replaces the macro name and its arguments by its corresponding string, +with each %n replaced by the n-th argument. +

+ +

Patterns

+

+This example shows the complete syntax +of patterns accepted by re. +

+
+p = [=[
+
+pattern         <- exp !.
+exp             <- S (alternative / grammar)
+
+alternative     <- seq ('/' S seq)*
+seq             <- prefix*
+prefix          <- '&' S prefix / '!' S prefix / suffix
+suffix          <- primary S (([+*?]
+                            / '^' [+-]? num
+                            / '->' S (string / '{}' / name)
+                            / '=>' S name) S)*
+
+primary         <- '(' exp ')' / string / class / defined
+                 / '{:' (name ':')? exp ':}'
+                 / '=' name
+                 / '{}'
+                 / '{~' exp '~}'
+                 / '{' exp '}'
+                 / '.'
+                 / name S !arrow
+                 / '<' name '>'          -- old-style non terminals
+
+grammar         <- definition+
+definition      <- name S arrow exp
+
+class           <- '[' '^'? item (!']' item)* ']'
+item            <- defined / range / .
+range           <- . '-' [^]]
+
+S               <- (%s / '--' [^%nl]*)*   -- spaces and comments
+name            <- [A-Za-z][A-Za-z0-9_]*
+arrow           <- '<-'
+num             <- [0-9]+
+string          <- '"' [^"]* '"' / "'" [^']* "'"
+defined         <- '%' name
+
+]=]
+
+print(re.match(p, p))   -- a self description must match itself
+
+ + + +

License

+ +

+Copyright © 2008-2010 Lua.org, PUC-Rio. +

+

+Permission is hereby granted, free of charge, +to any person obtaining a copy of this software and +associated documentation files (the "Software"), +to deal in the Software without restriction, +including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, +and to permit persons to whom the Software is +furnished to do so, +subject to the following conditions: +

+ +

+The above copyright notice and this permission notice +shall be included in all copies or substantial portions of the Software. +

+ +

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

+ +
+ +
+ +
+

+$Id: re.html,v 1.17 2011/01/10 15:08:06 roberto Exp $ +

+
+ +
+ + + diff --git a/lpeg/re.lua b/lpeg/re.lua new file mode 100644 index 00000000..2320c206 --- /dev/null +++ b/lpeg/re.lua @@ -0,0 +1,248 @@ +-- $Id: re.lua,v 1.39 2010/11/04 19:44:18 roberto Exp $ + +-- imported functions and modules +local tonumber, type, print, error = tonumber, type, print, error +local setmetatable = setmetatable +local m = require"lpeg" + +-- 'm' will be used to parse expressions, and 'mm' will be used to +-- create expressions; that is, 're' runs on 'm', creating patterns +-- on 'mm' +local mm = m + +-- pattern's metatable +local mt = getmetatable(mm.P(0)) + + + +-- No more global accesses after this point +local version = _VERSION +if version == "Lua 5.2" then _ENV = nil end + + +local any = m.P(1) + + +-- Pre-defined names +local Predef = { nl = m.P"\n" } + + +local mem +local fmem +local gmem + + +local function updatelocale () + mm.locale(Predef) + Predef.a = Predef.alpha + Predef.c = Predef.cntrl + Predef.d = Predef.digit + Predef.g = Predef.graph + Predef.l = Predef.lower + Predef.p = Predef.punct + Predef.s = Predef.space + Predef.u = Predef.upper + Predef.w = Predef.alnum + Predef.x = Predef.xdigit + Predef.A = any - Predef.a + Predef.C = any - Predef.c + Predef.D = any - Predef.d + Predef.G = any - Predef.g + Predef.L = any - Predef.l + Predef.P = any - Predef.p + Predef.S = any - Predef.s + Predef.U = any - Predef.u + Predef.W = any - Predef.w + Predef.X = any - Predef.x + mem = {} -- restart memoization + fmem = {} + gmem = {} + local mt = {__mode = "v"} + setmetatable(mem, mt) + setmetatable(fmem, mt) + setmetatable(gmem, mt) +end + + +updatelocale() + + + +local I = m.P(function (s,i) print(i, s:sub(1, i-1)); return i end) + + +local function getdef (id, Defs) + local c = Defs and Defs[id] + if not c then error("undefined name: " .. id) end + return c +end + + +local function patt_error (s, i) + local msg = (#s < i + 20) and s:sub(i) + or s:sub(i,i+20) .. "..." + msg = ("pattern error near '%s'"):format(msg) + error(msg, 2) +end + +local function mult (p, n) + local np = mm.P(true) + while n >= 1 do + if n%2 >= 1 then np = np * p end + p = p * p + n = n/2 + end + return np +end + +local function equalcap (s, i, c) + if type(c) ~= "string" then return nil end + local e = #c + i + if s:sub(i, e - 1) == c then return e else return nil end +end + + +local S = (m.S(" \f\n\r\t\v") + "--" * (any - Predef.nl)^0)^0 + +local name = m.R("AZ", "az") * m.R("AZ", "az", "__", "09")^0 + +local arrow = S * "<-" + +local exp_follow = m.P"/" + ")" + "}" + ":}" + "~}" + (name * arrow) + -1 + +name = m.C(name) + + +-- identifiers only have meaning in a given environment +local Identifier = name * m.Carg(1) + +local num = m.C(m.R"09"^1) * S / tonumber + +local String = "'" * m.C((any - "'")^0) * "'" + + '"' * m.C((any - '"')^0) * '"' + + +local defined = "%" * Identifier / function (c,Defs) + local cat = Defs and Defs[c] or Predef[c] + if not cat then error ("name '" .. c .. "' undefined") end + return cat +end + +local Range = m.Cs(any * (m.P"-"/"") * (any - "]")) / mm.R + +local item = defined + Range + m.C(any) + +local Class = + "[" + * (m.C(m.P"^"^-1)) -- optional complement symbol + * m.Cf(item * (item - "]")^0, mt.__add) / + function (c, p) return c == "^" and any - p or p end + * "]" + +local function adddef (t, k, Defs, exp) + if t[k] then + error("'"..k.."' already defined as a rule") + else + t[k] = exp + end + return t +end + +local function firstdef (n, Defs, r) return adddef({n}, n, Defs, r) end + + + +local exp = m.P{ "Exp", + Exp = S * ( m.V"Grammar" + + m.Cf(m.V"Seq" * ("/" * S * m.V"Seq")^0, mt.__add) ); + Seq = m.Cf(m.Cc(m.P"") * m.V"Prefix"^0 , mt.__mul) + * (#exp_follow + patt_error); + Prefix = "&" * S * m.V"Prefix" / mt.__len + + "!" * S * m.V"Prefix" / mt.__unm + + m.V"Suffix"; + Suffix = m.Cf(m.V"Primary" * S * + ( ( m.P"+" * m.Cc(1, mt.__pow) + + m.P"*" * m.Cc(0, mt.__pow) + + m.P"?" * m.Cc(-1, mt.__pow) + + "^" * ( m.Cg(num * m.Cc(mult)) + + m.Cg(m.C(m.S"+-" * m.R"09"^1) * m.Cc(mt.__pow)) + ) + + "->" * S * ( m.Cg(String * m.Cc(mt.__div)) + + m.P"{}" * m.Cc(nil, m.Ct) + + m.Cg(Identifier / getdef * m.Cc(mt.__div)) + ) + + "=>" * S * m.Cg(Identifier / getdef * m.Cc(m.Cmt)) + ) * S + )^0, function (a,b,f) return f(a,b) end ); + Primary = "(" * m.V"Exp" * ")" + + String / mm.P + + Class + + defined + + "{:" * (name * ":" + m.Cc(nil)) * m.V"Exp" * ":}" / + function (n, p) return mm.Cg(p, n) end + + "=" * name / function (n) return mm.Cmt(mm.Cb(n), equalcap) end + + m.P"{}" / mm.Cp + + "{~" * m.V"Exp" * "~}" / mm.Cs + + "{" * m.V"Exp" * "}" / mm.C + + m.P"." * m.Cc(any) + + name * -arrow / mm.V + + "<" * name * ">" / mm.V; + Definition = Identifier * arrow * m.V"Exp"; + Grammar = m.Cf(m.V"Definition" / firstdef * m.Cg(m.V"Definition")^0, adddef) / + mm.P +} + +local pattern = S * exp / mm.P * (-any + patt_error) + + +local function compile (p, defs) + if mm.type(p) == "pattern" then return p end -- already compiled + local cp = pattern:match(p, 1, defs) + if not cp then error("incorrect pattern", 3) end + return cp +end + +local function match (s, p, i) + local cp = mem[p] + if not cp then + cp = compile(p) + mem[p] = cp + end + return cp:match(s, i or 1) +end + +local function find (s, p, i) + local cp = fmem[p] + if not cp then + cp = compile(p) + cp = mm.P{ mm.Cp() * cp + 1 * mm.V(1) } + fmem[p] = cp + end + return cp:match(s, i or 1) +end + +local function gsub (s, p, rep) + local g = gmem[p] or {} -- ensure gmem[p] is not collected while here + gmem[p] = g + local cp = g[rep] + if not cp then + cp = compile(p) + cp = mm.Cs((cp / rep + 1)^0) + g[rep] = cp + end + return cp:match(s) +end + + +-- exported names +local re = { + compile = compile, + match = match, + find = find, + gsub = gsub, + updatelocale = updatelocale, +} + +if version == "Lua 5.1" then _G.re = re end + +return re diff --git a/lpeg/test.lua b/lpeg/test.lua new file mode 100644 index 00000000..533a6d2d --- /dev/null +++ b/lpeg/test.lua @@ -0,0 +1,1188 @@ +#!/usr/bin/env lua5.1 + +-- $Id: test.lua,v 1.82 2010/12/03 14:49:54 roberto Exp $ + +require"strict" -- just to be pedantic + +local m = require"lpeg" + +local debug = require"debug" + + +-- compatibility with Lua 5.2 +local unpack = table.unpack or unpack + + +-- most tests here do not need much stack space +m.setmaxstack(5) + +any = m.P(1) +space = m.S" \t\n"^0 + +local function checkeq (x, y, p) +if p then print(x,y) end + if type(x) ~= "table" then assert(x == y) + else + for k,v in pairs(x) do checkeq(v, y[k], p) end + for k,v in pairs(y) do checkeq(v, x[k], p) end + end +end + + +mt = getmetatable(m.P(1)) + + +local allchar = {} +for i=0,255 do allchar[i + 1] = i end +allchar = string.char(unpack(allchar)) +assert(#allchar == 256) + +local function cs2str (c) + return m.match(m.Cs((c + m.P(1)/"")^0), allchar) +end + +local function eqcharset (c1, c2) + assert(cs2str(c1) == cs2str(c2)) +end + + +print"General tests for LPeg library" + +assert(type(m.version()) == "string") +print("version " .. m.version()) +assert(m.type("alo") ~= "pattern") +assert(m.type(io.input) ~= "pattern") +assert(m.type(m.P"alo") == "pattern") + +-- tests for some basic optimizations +assert(m.match(m.P(false) + "a", "a") == 2) +assert(m.match(m.P(true) + "a", "a") == 1) +assert(m.match("a" + m.P(false), "b") == nil) +assert(m.match("a" + m.P(true), "b") == 1) + +assert(m.match(m.P(false) * "a", "a") == nil) +assert(m.match(m.P(true) * "a", "a") == 2) +assert(m.match("a" * m.P(false), "a") == nil) +assert(m.match("a" * m.P(true), "a") == 2) + +assert(m.match(#m.P(false) * "a", "a") == nil) +assert(m.match(#m.P(true) * "a", "a") == 2) +assert(m.match("a" * #m.P(false), "a") == nil) +assert(m.match("a" * #m.P(true), "a") == 2) + + +-- tests for locale +do + assert(m.locale(m) == m) + local t = {} + assert(m.locale(t, m) == t) + local x = m.locale() + for n,v in pairs(x) do + assert(type(n) == "string") + eqcharset(v, m[n]) + end +end + + + +assert(m.match(3, "aaaa")) +assert(m.match(4, "aaaa")) +assert(not m.match(5, "aaaa")) +assert(m.match(-3, "aa")) +assert(not m.match(-3, "aaa")) +assert(not m.match(-3, "aaaa")) +assert(not m.match(-4, "aaaa")) +assert(m.P(-5):match"aaaa") + +assert(m.match("a", "alo") == 2) +assert(m.match("al", "alo") == 3) +assert(not m.match("alu", "alo")) +assert(m.match(true, "") == 1) + +digit = m.S"0123456789" +upper = m.S"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +lower = m.S"abcdefghijklmnopqrstuvwxyz" +letter = m.S"" + upper + lower +alpha = letter + digit + m.R() + +eqcharset(m.S"", m.P(false)) +eqcharset(upper, m.R("AZ")) +eqcharset(lower, m.R("az")) +eqcharset(upper + lower, m.R("AZ", "az")) +eqcharset(upper + lower, m.R("AZ", "cz", "aa", "bb", "90")) +eqcharset(digit, m.S"01234567" + "8" + "9") +eqcharset(upper, letter - lower) +eqcharset(m.S(""), m.R()) +assert(cs2str(m.S("")) == "") + +eqcharset(m.S"\0", "\0") +eqcharset(m.S"\1\0\2", m.R"\0\2") +eqcharset(m.S"\1\0\2", m.R"\1\2" + "\0") +eqcharset(m.S"\1\0\2" - "\0", m.R"\1\2") + +word = alpha^1 * (1 - alpha)^0 + +assert((word^0 * -1):match"alo alo") +assert(m.match(word^1 * -1, "alo alo")) +assert(m.match(word^2 * -1, "alo alo")) +assert(not m.match(word^3 * -1, "alo alo")) + +assert(not m.match(word^-1 * -1, "alo alo")) +assert(m.match(word^-2 * -1, "alo alo")) +assert(m.match(word^-3 * -1, "alo alo")) + +eos = m.P(-1) + +assert(m.match(digit^0 * letter * digit * eos, "1298a1")) +assert(not m.match(digit^0 * letter * eos, "1257a1")) + +b = { + [1] = "(" * (((1 - m.S"()") + #m.P"(" * m.V(1))^0) * ")" +} + +assert(m.match(b, "(al())()")) +assert(not m.match(b * eos, "(al())()")) +assert(m.match(b * eos, "((al())()(é))")) +assert(not m.match(b, "(al()()")) + +assert(not m.match(letter^1 - "for", "foreach")) +assert(m.match(letter^1 - ("for" * eos), "foreach")) +assert(not m.match(letter^1 - ("for" * eos), "for")) + +function basiclookfor (p) + return m.P { + [1] = p + (1 * m.V(1)) + } +end + +function caplookfor (p) + return basiclookfor(p:C()) +end + +assert(m.match(caplookfor(letter^1), " 4achou123...") == "achou") +a = {m.match(caplookfor(letter^1)^0, " two words, one more ")} +checkeq(a, {"two", "words", "one", "more"}) + +assert(m.match( basiclookfor((#m.P(b) * 1) * m.Cp()), " ( (a)") == 7) + +a = {m.match(m.C(digit^1 * m.Cc"d") + m.C(letter^1 * m.Cc"l"), "123")} +checkeq(a, {"123", "d"}) + +a = {m.match(m.C(digit^1) * "d" * -1 + m.C(letter^1 * m.Cc"l"), "123d")} +checkeq(a, {"123"}) + +a = {m.match(m.C(digit^1 * m.Cc"d") + m.C(letter^1 * m.Cc"l"), "abcd")} +checkeq(a, {"abcd", "l"}) + +a = {m.match(m.Cc(10,20,30) * 'a' * m.Cp(), 'aaa')} +checkeq(a, {10,20,30,2}) +a = {m.match(m.Cp() * m.Cc(10,20,30) * 'a' * m.Cp(), 'aaa')} +checkeq(a, {1,10,20,30,2}) +a = m.match(m.Ct(m.Cp() * m.Cc(10,20,30) * 'a' * m.Cp()), 'aaa') +checkeq(a, {1,10,20,30,2}) +a = m.match(m.Ct(m.Cp() * m.Cc(7,8) * m.Cc(10,20,30) * 'a' * m.Cp()), 'aaa') +checkeq(a, {1,7,8,10,20,30,2}) +a = {m.match(m.Cc() * m.Cc() * m.Cc(1) * m.Cc(2,3,4) * m.Cc() * 'a', 'aaa')} +checkeq(a, {1,2,3,4}) + +a = {m.match(m.Cp() * letter^1 * m.Cp(), "abcd")} +checkeq(a, {1, 5}) + + +t = {m.match({[1] = m.C(m.C(1) * m.V(1) + -1)}, "abc")} +checkeq(t, {"abc", "a", "bc", "b", "c", "c", ""}) + + +-- test for small capture boundary +for i = 250,260 do + assert(#m.match(m.C(i), string.rep('a', i)) == i) + assert(#m.match(m.C(m.C(i)), string.rep('a', i)) == i) +end + + +-- tests for any*n +for n = 1, 550 do + local x_1 = string.rep('x', n - 1) + local x = x_1 .. 'a' + assert(not m.P(n):match(x_1)) + assert(m.P(n):match(x) == n + 1) + assert(n < 4 or m.match(m.P(n) + "xxx", x_1) == 4) + assert(m.C(n):match(x) == x) + assert(m.C(m.C(n)):match(x) == x) + assert(m.P(-n):match(x_1) == 1) + assert(not m.P(-n):match(x)) + assert(n < 13 or m.match(m.Cc(20) * ((n - 13) * m.P(10)) * 3, x) == 20) + local n3 = math.floor(n/3) + assert(m.match(n3 * m.Cp() * n3 * n3, x) == n3 + 1) +end + +assert(m.P(0):match("x") == 1) +assert(m.P(0):match("") == 1) +assert(m.C(0):match("x") == "") +assert(m.match(m.Cc(0) * m.P(10) + m.Cc(1) * "xuxu", "xuxu") == 1) +assert(m.match(m.Cc(0) * m.P(10) + m.Cc(1) * "xuxu", "xuxuxuxuxu") == 0) +assert(m.match(m.C(m.P(2)^1), "abcde") == "abcd") +p = m.Cc(0) * 1 + m.Cc(1) * 2 + m.Cc(2) * 3 + m.Cc(3) * 4 + + +-- test for alternation optimization +assert(m.match(m.P"a"^1 + "ab" + m.P"x"^0, "ab") == 2) +assert(m.match((m.P"a"^1 + "ab" + m.P"x"^0 * 1)^0, "ab") == 3) +assert(m.match(m.P"ab" + "cd" + "" + "cy" + "ak", "98") == 1) +assert(m.match(m.P"ab" + "cd" + "ax" + "cy", "ax") == 3) +assert(m.match("a" * m.P"b"^0 * "c" + "cd" + "ax" + "cy", "ax") == 3) +assert(m.match((m.P"ab" + "cd" + "ax" + "cy")^0, "ax") == 3) +assert(m.match(m.P(1) * "x" + m.S"" * "xu" + "ay", "ay") == 3) +assert(m.match(m.P"abc" + "cde" + "aka", "aka") == 4) +assert(m.match(m.S"abc" * "x" + "cde" + "aka", "ax") == 3) +assert(m.match(m.S"abc" * "x" + "cde" + "aka", "aka") == 4) +assert(m.match(m.S"abc" * "x" + "cde" + "aka", "cde") == 4) +assert(m.match(m.S"abc" * "x" + "ide" + m.S"ab" * "ka", "aka") == 4) +assert(m.match("ab" + m.S"abc" * m.P"y"^0 * "x" + "cde" + "aka", "ax") == 3) +assert(m.match("ab" + m.S"abc" * m.P"y"^0 * "x" + "cde" + "aka", "aka") == 4) +assert(m.match("ab" + m.S"abc" * m.P"y"^0 * "x" + "cde" + "aka", "cde") == 4) +assert(m.match("ab" + m.S"abc" * m.P"y"^0 * "x" + "ide" + m.S"ab" * "ka", "aka") == 4) +assert(m.match("ab" + m.S"abc" * m.P"y"^0 * "x" + "ide" + m.S"ab" * "ka", "ax") == 3) +assert(m.match(m.P(1) * "x" + "cde" + m.S"ab" * "ka", "aka") == 4) +assert(m.match(m.P(1) * "x" + "cde" + m.P(1) * "ka", "aka") == 4) +assert(m.match(m.P(1) * "x" + "cde" + m.P(1) * "ka", "cde") == 4) +assert(m.match(m.P"eb" + "cd" + m.P"e"^0 + "x", "ee") == 3) +assert(m.match(m.P"ab" + "cd" + m.P"e"^0 + "x", "abcd") == 3) +assert(m.match(m.P"ab" + "cd" + m.P"e"^0 + "x", "eeex") == 4) +assert(m.match(m.P"ab" + "cd" + m.P"e"^0 + "x", "cd") == 3) +assert(m.match(m.P"ab" + "cd" + m.P"e"^0 + "x", "x") == 1) +assert(m.match(m.P"ab" + "cd" + m.P"e"^0 + "x" + "", "zee") == 1) +assert(m.match(m.P"ab" + "cd" + m.P"e"^1 + "x", "abcd") == 3) +assert(m.match(m.P"ab" + "cd" + m.P"e"^1 + "x", "eeex") == 4) +assert(m.match(m.P"ab" + "cd" + m.P"e"^1 + "x", "cd") == 3) +assert(m.match(m.P"ab" + "cd" + m.P"e"^1 + "x", "x") == 2) +assert(m.match(m.P"ab" + "cd" + m.P"e"^1 + "x" + "", "zee") == 1) + +pi = "3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510" +assert(m.match(m.Cs((m.P"1" / "a" + m.P"5" / "b" + m.P"9" / "c" + 1)^0), pi) == + m.match(m.Cs((m.P(1) / {["1"] = "a", ["5"] = "b", ["9"] = "c"})^0), pi)) +print"+" + + +-- tests for capture optimizations +assert(m.match((m.P(3) + 4 * m.Cp()) * "a", "abca") == 5) +t = {m.match(((m.P"a" + m.Cp()) * m.P"x")^0, "axxaxx")} +checkeq(t, {3, 6}) + +-- test for table captures +t = m.match(m.Ct(letter^1), "alo") +checkeq(t, {}) + +t, n = m.match(m.Ct(m.C(letter)^1) * m.Cc"t", "alo") +assert(n == "t" and table.concat(t) == "alo") + +t = m.match(m.Ct(m.C(m.C(letter)^1)), "alo") +assert(table.concat(t, ";") == "alo;a;l;o") + +t = m.match(m.Ct(m.C(m.C(letter)^1)), "alo") +assert(table.concat(t, ";") == "alo;a;l;o") + +t = m.match(m.Ct(m.Ct((m.Cp() * letter * m.Cp())^1)), "alo") +assert(table.concat(t[1], ";") == "1;2;2;3;3;4") + +t = m.match(m.Ct(m.C(m.C(1) * 1 * m.C(1))), "alo") +checkeq(t, {"alo", "a", "o"}) + + +-- tests for groups +p = m.Cg(1) -- no capture +assert(p:match('x') == 'x') +p = m.Cg(m.P(true)/function () end * 1) -- no value +assert(p:match('x') == 'x') +p = m.Cg(m.Cg(m.Cg(m.C(1)))) +assert(p:match('x') == 'x') +p = m.Cg(m.Cg(m.Cg(m.C(1))^0) * m.Cg(m.Cc(1) * m.Cc(2))) +t = {p:match'abc'} +checkeq(t, {'a', 'b', 'c', 1, 2}) + +-- test for non-pattern as arguments to pattern functions + +p = { ('a' * m.V(1))^-1 } * m.P'b' * { 'a' * m.V(2); m.V(1)^-1 } +assert(m.match(p, "aaabaac") == 7) + +-- a large table capture +t = m.match(m.Ct(m.C('a')^0), string.rep("a", 10000)) +assert(#t == 10000 and t[1] == 'a' and t[#t] == 'a') + + +-- test for errors +local function checkerr (msg, ...) + assert(m.match({ m.P(msg) + 1 * m.V(1) }, select(2, pcall(...)))) +end + +-- checkerr("rule '1' is left recursive", m.match, { m.V(1) * 'a' }, "a") +checkerr("rule '1' outside a grammar", m.match, m.V(1), "") +checkerr("rule 'hiii' outside a grammar", m.match, m.V('hiii'), "") +checkerr("rule 'hiii' is not defined", m.match, { m.V('hiii') }, "") +checkerr("rule is not defined", m.match, { m.V{} }, "") + +checkerr("rule 'A' is not a pattern", m.P, { A = {} }) +checkerr("rule is not a pattern", m.P, { [print] = {} }) + +-- test for non-pattern as arguments to pattern functions + +p = { ('a' * m.V(1))^-1 } * m.P'b' * { 'a' * m.V(2); m.V(1)^-1 } +assert(m.match(p, "aaabaac") == 7) + +-- a large table capture +t = m.match(m.Ct(m.C('a')^0), string.rep("a", 10000)) +assert(#t == 10000 and t[1] == 'a' and t[#t] == 'a') + + +-- test for errors +local function checkerr (msg, ...) + assert(m.match({ m.P(msg) + 1 * m.V(1) }, select(2, pcall(...)))) +end + +checkerr("rule '1' is left recursive", m.match, { m.V(1) * 'a' }, "a") +checkerr("rule '1' outside a grammar", m.match, m.V(1), "") +checkerr("rule 'hiii' outside a grammar", m.match, m.V('hiii'), "") +checkerr("rule 'hiii' is not defined", m.match, { m.V('hiii') }, "") +checkerr("rule is not defined", m.match, { m.V({}) }, "") + +print('+') + + +-- bug in 0.10 (rechecking a grammar, after tail-call optimization) +m.P{ m.P { (m.P(3) + "xuxu")^0 * m.V"xuxu", xuxu = m.P(1) } } + +local V = m.V + +local Space = m.S(" \n\t")^0 +local Number = m.C(m.R("09")^1) * Space +local FactorOp = m.C(m.S("+-")) * Space +local TermOp = m.C(m.S("*/")) * Space +local Open = "(" * Space +local Close = ")" * Space + + +local function f_factor (v1, op, v2, d) + assert(d == nil) + if op == "+" then return v1 + v2 + else return v1 - v2 + end +end + + +local function f_term (v1, op, v2, d) + assert(d == nil) + if op == "*" then return v1 * v2 + else return v1 / v2 + end +end + +G = m.P{ "Exp", + Exp = m.Cf(V"Factor" * m.Cg(FactorOp * V"Factor")^0, f_factor); + Factor = m.Cf(V"Term" * m.Cg(TermOp * V"Term")^0, f_term); + Term = Number / tonumber + Open * V"Exp" * Close; +} + +G = Space * G * -1 + +for _, s in ipairs{" 3 + 5*9 / (1+1) ", "3+4/2", "3+3-3- 9*2+3*9/1- 8"} do + assert(m.match(G, s) == loadstring("return "..s)()) +end + + +-- test for grammars (errors deep in calling non-terminals) +g = m.P{ + [1] = m.V(2) + "a", + [2] = "a" * m.V(3) * "x", + [3] = "b" * m.V(3) + "c" +} + +assert(m.match(g, "abbbcx") == 7) +assert(m.match(g, "abbbbx") == 2) + + +-- tests for \0 +assert(m.match(m.R("\0\1")^1, "\0\1\0") == 4) +assert(m.match(m.S("\0\1ab")^1, "\0\1\0a") == 5) +assert(m.match(m.P(1)^3, "\0\1\0a") == 5) +assert(not m.match(-4, "\0\1\0a")) +assert(m.match("\0\1\0a", "\0\1\0a") == 5) +assert(m.match("\0\0\0", "\0\0\0") == 4) +assert(not m.match("\0\0\0", "\0\0")) + + +-- tests for predicates +assert(not m.match(-m.P("a") * 2, "alo")) +assert(m.match(- -m.P("a") * 2, "alo") == 3) +assert(m.match(#m.P("a") * 2, "alo") == 3) +assert(m.match(##m.P("a") * 2, "alo") == 3) +assert(not m.match(##m.P("c") * 2, "alo")) +assert(m.match(m.Cs((##m.P("a") * 1 + m.P(1)/".")^0), "aloal") == "a..a.") +assert(m.match(m.Cs((#((#m.P"a")/"") * 1 + m.P(1)/".")^0), "aloal") == "a..a.") +assert(m.match(m.Cs((- -m.P("a") * 1 + m.P(1)/".")^0), "aloal") == "a..a.") +assert(m.match(m.Cs((-((-m.P"a")/"") * 1 + m.P(1)/".")^0), "aloal") == "a..a.") + + +-- look-behind predicate +assert(not m.match(m.B'a', 'a')) +assert(m.match(1 * m.B'a', 'a') == 2) +assert(not m.match(m.B(1), 'a')) +assert(m.match(1 * m.B(1), 'a') == 2) +assert(m.match(-m.B(1), 'a') == 1) + +B = #letter * -m.B(letter) + -letter * m.B(letter) +x = m.Ct({ (B * m.Cp())^-1 * (1 * m.V(1) + m.P(true)) }) +checkeq(m.match(x, 'ar cal c'), {1,3,4,7,9,10}) +checkeq(m.match(x, ' ar cal '), {2,4,5,8}) +checkeq(m.match(x, ' '), {}) +checkeq(m.match(x, 'aloalo'), {1,7}) + +assert(m.match(B, "a") == 1) +assert(m.match(1 * B, "a") == 2) +assert(not m.B(-letter):match("")) +assert((-m.B(letter)):match("") == 1) + +assert((4 * m.B(letter, 4)):match("aaaaaaaa") == 5) +assert(not (4 * m.B(letter, 5)):match("aaaaaaaa")) +assert((4 * -m.B(letter, 5)):match("aaaaaaaa") == 5) + +assert((3 * m.B(m.C(1))):match("12345") == 4) + + +-- bug in 0.9 +assert(m.match(('a' * #m.P'b'), "ab") == 2) +assert(not m.match(('a' * #m.P'b'), "a")) + +assert(not m.match(#m.S'567', "")) +assert(m.match(#m.S'567' * 1, "6") == 2) + + +-- tests for Tail Calls + +-- create a grammar for a simple DFA for even number of 0s and 1s +-- finished in '$': +-- +-- ->1 <---0---> 2 +-- ^ ^ +-- | | +-- 1 1 +-- | | +-- V V +-- 3 <---0---> 4 +-- +-- this grammar should keep no backtracking information + +p = m.P{ + [1] = '0' * m.V(2) + '1' * m.V(3) + '$', + [2] = '0' * m.V(1) + '1' * m.V(4), + [3] = '0' * m.V(4) + '1' * m.V(1), + [4] = '0' * m.V(3) + '1' * m.V(2), +} + +assert(p:match(string.rep("00", 10000) .. "$")) +assert(p:match(string.rep("01", 10000) .. "$")) +assert(p:match(string.rep("011", 10000) .. "$")) +assert(not p:match(string.rep("011", 10001) .. "$")) + + +-- this grammar does need backtracking info. +local lim = 10000 +p = m.P{ '0' * m.V(1) + '0' } +assert(not pcall(m.match, p, string.rep("0", lim))) +m.setmaxstack(2*lim) +assert(not pcall(m.match, p, string.rep("0", lim))) +m.setmaxstack(2*lim + 2) +assert(pcall(m.match, p, string.rep("0", lim))) + +-- tests for optional start position +assert(m.match("a", "abc", 1)) +assert(m.match("b", "abc", 2)) +assert(m.match("c", "abc", 3)) +assert(not m.match(1, "abc", 4)) +assert(m.match("a", "abc", -3)) +assert(m.match("b", "abc", -2)) +assert(m.match("c", "abc", -1)) +assert(m.match("abc", "abc", -4)) -- truncate to position 1 + +assert(m.match("", "abc", 10)) -- empty string is everywhere! +assert(m.match("", "", 10)) +assert(not m.match(1, "", 1)) +assert(not m.match(1, "", -1)) +assert(not m.match(1, "", 0)) + +print("+") + + +-- tests for argument captures +assert(not pcall(m.Carg, 0)) +assert(not pcall(m.Carg, -1)) +assert(not pcall(m.Carg, 2^18)) +assert(not pcall(m.match, m.Carg(1), 'a', 1)) +assert(m.match(m.Carg(1), 'a', 1, print) == print) +x = {m.match(m.Carg(1) * m.Carg(2), '', 1, 10, 20)} +checkeq(x, {10, 20}) + +assert(m.match(m.Cmt(m.Cg(m.Carg(3), "a") * + m.Cmt(m.Cb("a"), function (s,i,x) + assert(s == "a" and i == 1); + return i, x+1 + end) * + m.Carg(2), function (s,i,a,b,c) + assert(s == "a" and i == 1 and c == nil); + return i, 2*a + 3*b + end) * "a", + "a", 1, false, 100, 1000) == 2*1001 + 3*100) + + +-- tests for Lua functions + +t = {} +s = "" +p = function (s1, i) assert(s == s1); t[#t + 1] = i; return nil end +s = "hi, this is a test" +assert(m.match(((p - m.P(-1)) + 2)^0, s) == string.len(s) + 1) +assert(#t == string.len(s)/2 and t[1] == 1 and t[2] == 3) + +assert(not m.match(p, s)) + +p = mt.__add(function (s, i) return i end, function (s, i) return nil end) +assert(m.match(p, "alo")) + +p = mt.__mul(function (s, i) return i end, function (s, i) return nil end) +assert(not m.match(p, "alo")) + + +t = {} +p = function (s1, i) assert(s == s1); t[#t + 1] = i; return i end +s = "hi, this is a test" +assert(m.match((m.P(1) * p)^0, s) == string.len(s) + 1) +assert(#t == string.len(s) and t[1] == 2 and t[2] == 3) + +t = {} +p = m.P(function (s1, i) assert(s == s1); t[#t + 1] = i; + return i <= s1:len() and i + 1 end) +s = "hi, this is a test" +assert(m.match(p^0, s) == string.len(s) + 1) +assert(#t == string.len(s) + 1 and t[1] == 1 and t[2] == 2) + +p = function (s1, i) return m.match(m.P"a"^1, s1, i) end +assert(m.match(p, "aaaa") == 5) +assert(m.match(p, "abaa") == 2) +assert(not m.match(p, "baaa")) + +assert(not pcall(m.match, function () return 2^20 end, s)) +assert(not pcall(m.match, function () return 0 end, s)) +assert(not pcall(m.match, function (s, i) return i - 1 end, s)) +assert(not pcall(m.match, m.P(1)^0 * function (_, i) return i - 1 end, s)) +assert(m.match(m.P(1)^0 * function (_, i) return i end * -1, s)) +assert(not pcall(m.match, m.P(1)^0 * function (_, i) return i + 1 end, s)) +assert(m.match(m.P(function (s, i) return s:len() + 1 end) * -1, s)) +assert(not pcall(m.match, m.P(function (s, i) return s:len() + 2 end) * -1, s)) +assert(not m.match(m.P(function (s, i) return s:len() end) * -1, s)) +assert(m.match(m.P(1)^0 * function (_, i) return true end, s) == + string.len(s) + 1) +for i = 1, string.len(s) + 1 do + assert(m.match(function (_, _) return i end, s) == i) +end + +p = (m.P(function (s, i) return i%2 == 0 and i + 1 end) + + m.P(function (s, i) return i%2 ~= 0 and i + 2 <= s:len() and i + 3 end))^0 + * -1 +assert(p:match(string.rep('a', 14000))) + +-- tests for Function Replacements +f = function (a, ...) if a ~= "x" then return {a, ...} end end + +t = m.match(m.C(1)^0/f, "abc") +checkeq(t, {"a", "b", "c"}) + +t = m.match(m.C(1)^0/f/f, "abc") +checkeq(t, {{"a", "b", "c"}}) + +t = m.match(m.P(1)^0/f/f, "abc") -- no capture +checkeq(t, {{"abc"}}) + +t = m.match((m.P(1)^0/f * m.Cp())/f, "abc") +checkeq(t, {{"abc"}, 4}) + +t = m.match((m.C(1)^0/f * m.Cp())/f, "abc") +checkeq(t, {{"a", "b", "c"}, 4}) + +t = m.match((m.C(1)^0/f * m.Cp())/f, "xbc") +checkeq(t, {4}) + +t = m.match(m.C(m.C(1)^0)/f, "abc") +checkeq(t, {"abc", "a", "b", "c"}) + +g = function (...) return 1, ... end +t = {m.match(m.C(1)^0/g/g, "abc")} +checkeq(t, {1, 1, "a", "b", "c"}) + +t = {m.match(m.Cc(nil,nil,4) * m.Cc(nil,3) * m.Cc(nil, nil) / g / g, "")} +t1 = {1,1,nil,nil,4,nil,3,nil,nil} +for i=1,10 do assert(t[i] == t1[i]) end + +t = {m.match((m.C(1) / function (x) return x, x.."x" end)^0, "abc")} +checkeq(t, {"a", "ax", "b", "bx", "c", "cx"}) + +t = m.match(m.Ct((m.C(1) / function (x,y) return y, x end * m.Cc(1))^0), "abc") +checkeq(t, {nil, "a", 1, nil, "b", 1, nil, "c", 1}) + +-- tests for Query Replacements + +assert(m.match(m.C(m.C(1)^0)/{abc = 10}, "abc") == 10) +assert(m.match(m.C(1)^0/{a = 10}, "abc") == 10) +assert(m.match(m.S("ba")^0/{ab = 40}, "abc") == 40) +t = m.match(m.Ct((m.S("ba")/{a = 40})^0), "abc") +checkeq(t, {40}) + +assert(m.match(m.Cs((m.C(1)/{a=".", d=".."})^0), "abcdde") == ".bc....e") +assert(m.match(m.Cs((m.C(1)/{f="."})^0), "abcdde") == "abcdde") +assert(m.match(m.Cs((m.C(1)/{d="."})^0), "abcdde") == "abc..e") +assert(m.match(m.Cs((m.C(1)/{e="."})^0), "abcdde") == "abcdd.") +assert(m.match(m.Cs((m.C(1)/{e=".", f="+"})^0), "eefef") == "..+.+") +assert(m.match(m.Cs((m.C(1))^0), "abcdde") == "abcdde") +assert(m.match(m.Cs(m.C(m.C(1)^0)), "abcdde") == "abcdde") +assert(m.match(1 * m.Cs(m.P(1)^0), "abcdde") == "bcdde") +assert(m.match(m.Cs((m.C('0')/'x' + 1)^0), "abcdde") == "abcdde") +assert(m.match(m.Cs((m.C('0')/'x' + 1)^0), "0ab0b0") == "xabxbx") +assert(m.match(m.Cs((m.C('0')/'x' + m.P(1)/{b=3})^0), "b0a0b") == "3xax3") +assert(m.match(m.P(1)/'%0%0'/{aa = -3} * 'x', 'ax') == -3) +assert(m.match(m.C(1)/'%0%1'/{aa = 'z'}/{z = -3} * 'x', 'ax') == -3) + +assert(m.match(m.Cs(m.Cc(0) * (m.P(1)/"")), "4321") == "0") + +assert(m.match(m.Cs((m.P(1) / "%0")^0), "abcd") == "abcd") +assert(m.match(m.Cs((m.P(1) / "%0.%0")^0), "abcd") == "a.ab.bc.cd.d") +assert(m.match(m.Cs((m.P("a") / "%0.%0" + 1)^0), "abcad") == "a.abca.ad") +assert(m.match(m.C("a") / "%1%%%0", "a") == "a%a") +assert(m.match(m.Cs((m.P(1) / ".xx")^0), "abcd") == ".xx.xx.xx.xx") +assert(m.match(m.Cp() * m.P(3) * m.Cp()/"%2%1%1 - %0 ", "abcde") == + "411 - abc ") + +assert(pcall(m.match, m.P(1)/"%0", "abc")) +assert(not pcall(m.match, m.P(1)/"%1", "abc")) -- out of range +assert(not pcall(m.match, m.P(1)/"%9", "abc")) -- out of range + +p = m.C(1) +p = p * p; p = p * p; p = p * p * m.C(1) / "%9 - %1" +assert(p:match("1234567890") == "9 - 1") + +assert(m.match(m.Cc(print), "") == print) + +-- too many captures (just ignore extra ones) +p = m.C(1)^0 / "%2-%9-%0-%9" +assert(p:match"01234567890123456789" == "1-8-01234567890123456789-8") +s = string.rep("12345678901234567890", 20) +assert(m.match(m.C(1)^0 / "%9-%1-%0-%3", s) == "9-1-" .. s .. "-3") + +-- string captures with non-string subcaptures +p = m.Cc('alo') * m.C(1) / "%1 - %2 - %1" +assert(p:match'x' == 'alo - x - alo') + +assert(not pcall(m.match, m.Cc(true) / "%1", "a")) + +-- long strings for string capture +l = 10000 +s = string.rep('a', l) .. string.rep('b', l) .. string.rep('c', l) + +p = (m.C(m.P'a'^1) * m.C(m.P'b'^1) * m.C(m.P'c'^1)) / '%3%2%1' + +assert(p:match(s) == string.rep('c', l) .. + string.rep('b', l) .. + string.rep('a', l)) + +print"+" + +-- accumulator capture +function f (x) return x + 1 end +assert(m.match(m.Cf(m.Cc(0) * m.C(1)^0, f), "alo alo") == 7) + +t = {m.match(m.Cf(m.Cc(1,2,3), error), "")} +checkeq(t, {1}) +p = m.Cf(m.Ct(true) * m.Cg(m.C(m.R"az"^1) * "=" * m.C(m.R"az"^1) * ";")^0, + rawset) +t = p:match("a=b;c=du;xux=yuy;") +checkeq(t, {a="b", c="du", xux="yuy"}) + + +-- tests for loop checker + +local function haveloop (p) + assert(not pcall(function (p) return p^0 end, m.P(p))) +end + +haveloop(m.P("x")^-4) +assert(m.match(((m.P(0) + 1) * m.S"al")^0, "alo") == 3) +assert(m.match((("x" + #m.P(1))^-4 * m.S"al")^0, "alo") == 3) +haveloop("") +haveloop(m.P("x")^0) +haveloop(m.P("x")^-1) +haveloop(m.P("x") + 1 + 2 + m.P("a")^-1) +haveloop(-m.P("ab")) +haveloop(- -m.P("ab")) +haveloop(# #(m.P("ab") + "xy")) +haveloop(- #m.P("ab")^0) +haveloop(# -m.P("ab")^1) +haveloop(#m.V(3)) +haveloop(m.V(3) + m.V(1) + m.P('a')^-1) +haveloop({[1] = m.V(2) * m.V(3), [2] = m.V(3), [3] = m.P(0)}) +assert(m.match(m.P{[1] = m.V(2) * m.V(3), [2] = m.V(3), [3] = m.P(1)}^0, "abc") + == 3) +assert(m.match(m.P""^-3, "a") == 1) + +local function find (p, s) + return m.match(basiclookfor(p), s) +end + + +local function badgrammar (g, exp) + local err, msg = pcall(m.P, g) + assert(not err) + if exp then assert(find(exp, msg)) end +end + +badgrammar({[1] = m.V(1)}, "rule '1'") +badgrammar({[1] = m.V(2)}, "rule '2'") -- invalid non-terminal +badgrammar({[1] = m.V"x"}, "rule 'x'") -- invalid non-terminal +badgrammar({[1] = m.V{}}, "rule ") -- invalid non-terminal +badgrammar({[1] = #m.P("a") * m.V(1)}, "rule '1'") +badgrammar({[1] = -m.P("a") * m.V(1)}, "rule '1'") +badgrammar({[1] = -1 * m.V(1)}, "rule '1'") +badgrammar({[1] = 1 * m.V(2), [2] = m.V(2)}, "rule '2'") +badgrammar({[1] = m.P(0), [2] = 1 * m.V(1)^0}, "loop in rule '2'") +badgrammar({ m.V(2), m.V(3)^0, m.P"" }, "rule '2'") +badgrammar({ m.V(2) * m.V(3)^0, m.V(3)^0, m.P"" }, "rule '1'") +badgrammar({ #(m.V(1) * 'a') }, "rule '1'") +badgrammar({ -(m.V(1) * 'a') }, "rule '1'") + +assert(m.match({'a' * -m.V(1)}, "aaa") == 2) +assert(m.match({'a' * -m.V(1)}, "aaaa") == nil) + + +-- simple tests for maximum sizes: +local p = m.P"a" +for i=1,14 do p = p * p end + +p = {} +for i=1,100 do p[i] = m.P"a" end +p = m.P(p) + + +-- strange values for rule labels + +p = m.P{ "print", + print = m.V(print), + [print] = m.V(_G), + [_G] = m.P"a", + } + +assert(p:match("a")) + +-- initial rule +g = {} +for i = 1, 10 do g["i"..i] = "a" * m.V("i"..i+1) end +g.i11 = m.P"" +for i = 1, 10 do + g[1] = "i"..i + local p = m.P(g) + assert(p:match("aaaaaaaaaaa") == 11 - i + 1) +end + +print"+" + + +-- tests for back references +assert(not pcall(m.match, m.Cb('x'), '')) +assert(not pcall(m.match, m.Cg(1, 'a') * m.Cb('b'), 'a')) + +p = m.Cg(m.C(1) * m.C(1), "k") * m.Ct(m.Cb("k")) +t = p:match("ab") +checkeq(t, {"a", "b"}) + + +t = {} +function foo (p) t[#t + 1] = p; return p .. "x" end + +p = m.Cg(m.C(2) / foo, "x") * m.Cb"x" * + m.Cg(m.Cb('x') / foo, "x") * m.Cb"x" * + m.Cg(m.Cb('x') / foo, "x") * m.Cb"x" * + m.Cg(m.Cb('x') / foo, "x") * m.Cb"x" +x = {p:match'ab'} +checkeq(x, {'abx', 'abxx', 'abxxx', 'abxxxx'}) +checkeq(t, {'ab', + 'ab', 'abx', + 'ab', 'abx', 'abxx', + 'ab', 'abx', 'abxx', 'abxxx'}) + + + +-- tests for match-time captures + +local function id (s, i, ...) + return true, ... +end + +assert(m.Cmt(m.Cs((m.Cmt(m.S'abc' / { a = 'x', c = 'y' }, id) + + m.R'09'^1 / string.char + + m.P(1))^0), id):match"acb98+68c" == "xyb\98+\68y") + +p = m.P{'S', + S = m.V'atom' * space + + m.Cmt(m.Ct("(" * space * (m.Cmt(m.V'S'^1, id) + m.P(true)) * ")" * space), id), + atom = m.Cmt(m.C(m.R("AZ", "az", "09")^1), id) +} +x = p:match"(a g () ((b) c) (d (e)))" +checkeq(x, {'a', 'g', {}, {{'b'}, 'c'}, {'d', {'e'}}}); + +x = {(m.Cmt(1, id)^0):match(string.rep('a', 500))} +assert(#x == 500) + +local function id(s, i, x) + if x == 'a' then return i + 1, 1, 3, 7 + else return nil, 2, 4, 6, 8 + end +end + +p = ((m.P(id) + m.Cmt(2, id) + m.Cmt(1, id)))^0 +assert(table.concat{p:match('abababab')} == string.rep('137', 4)) + +local function ref (s, i, x) + return m.match(x, s, i - x:len()) +end + +assert(m.Cmt(m.P(1)^0, ref):match('alo') == 4) +assert((m.P(1) * m.Cmt(m.P(1)^0, ref)):match('alo') == 4) +assert(not (m.P(1) * m.Cmt(m.C(1)^0, ref)):match('alo')) + +ref = function (s,i,x) return i == tonumber(x) and i, 'xuxu' end + +assert(m.Cmt(1, ref):match'2') +assert(not m.Cmt(1, ref):match'1') +assert(m.Cmt(m.P(1)^0, ref):match'03') + +function ref (s, i, a, b) + if a == b then return i, a:upper() end +end + +p = m.Cmt(m.C(m.R"az"^1) * "-" * m.C(m.R"az"^1), ref) +p = (any - p)^0 * p * any^0 * -1 + +assert(p:match'abbbc-bc ddaa' == 'BC') + + +c = '[' * m.Cg(m.P'='^0, "init") * '[' * + { m.Cmt(']' * m.C(m.P'='^0) * ']' * m.Cb("init"), function (_, _, s1, s2) + return s1 == s2 end) + + 1 * m.V(1) } / function () end + +assert(c:match'[==[]]====]]]]==]===[]' == 18) +assert(c:match'[[]=]====]=]]]==]===[]' == 14) +assert(not c:match'[[]=]====]=]=]==]===[]') + + + +------------------------------------------------------------------- +-- Tests for 're' module +------------------------------------------------------------------- + +local re = require "re" + +local match, compile = re.match, re.compile + + + +assert(match("a", ".") == 2) +assert(match("a", "''") == 1) +assert(match("", " ! . ") == 1) +assert(not match("a", " ! . ")) +assert(match("abcde", " ( . . ) * ") == 5) +assert(match("abbcde", " [a-c] +") == 5) +assert(match("0abbc1de", "'0' [a-c]+ '1'") == 7) +assert(match("0zz1dda", "'0' [^a-c]+ 'a'") == 8) +assert(match("abbc--", " [a-c] + +") == 5) +assert(match("abbc--", " [ac-] +") == 2) +assert(match("abbc--", " [-acb] + ") == 7) +assert(not match("abbcde", " [b-z] + ")) +assert(match("abb\"de", '"abb"["]"de"') == 7) +assert(match("abceeef", "'ac' ? 'ab' * 'c' { 'e' * } / 'abceeef' ") == "eee") +assert(match("abceeef", "'ac'? 'ab'* 'c' { 'f'+ } / 'abceeef' ") == 8) +local t = {match("abceefe", "( ( & 'e' {} ) ? . ) * ")} +checkeq(t, {4, 5, 7}) +local t = {match("abceefe", "((&&'e' {})? .)*")} +checkeq(t, {4, 5, 7}) +local t = {match("abceefe", "( ( ! ! 'e' {} ) ? . ) *")} +checkeq(t, {4, 5, 7}) +local t = {match("abceefe", "(( & ! & ! 'e' {})? .)*")} +checkeq(t, {4, 5, 7}) + +assert(match("cccx" , "'ab'? ('ccc' / ('cde' / 'cd'*)? / 'ccc') 'x'+") == 5) +assert(match("cdx" , "'ab'? ('ccc' / ('cde' / 'cd'*)? / 'ccc') 'x'+") == 4) +assert(match("abcdcdx" , "'ab'? ('ccc' / ('cde' / 'cd'*)? / 'ccc') 'x'+") == 8) + +assert(match("abc", "a <- (. a)?") == 4) +b = "balanced <- '(' ([^()] / balanced)* ')'" +assert(match("(abc)", b)) +assert(match("(a(b)((c) (d)))", b)) +assert(not match("(a(b ((c) (d)))", b)) + +b = compile[[ balanced <- "(" ([^()] / balanced)* ")" ]] +assert(b == m.P(b)) +assert(b:match"((((a))(b)))") + +local g = [[ + S <- "0" B / "1" A / "" -- balanced strings + A <- "0" S / "1" A A -- one more 0 + B <- "1" S / "0" B B -- one more 1 +]] +assert(match("00011011", g) == 9) + +local g = [[ + S <- ("0" B / "1" A)* + A <- "0" / "1" A A + B <- "1" / "0" B B +]] +assert(match("00011011", g) == 9) +assert(match("000110110", g) == 9) +assert(match("011110110", g) == 3) +assert(match("000110010", g) == 1) + +s = "aaaaaaaaaaaaaaaaaaaaaaaa" +assert(match(s, "'a'^3") == 4) +assert(match(s, "'a'^0") == 1) +assert(match(s, "'a'^+3") == s:len() + 1) +assert(not match(s, "'a'^+30")) +assert(match(s, "'a'^-30") == s:len() + 1) +assert(match(s, "'a'^-5") == 6) +for i = 1, s:len() do + assert(match(s, string.format("'a'^+%d", i)) >= i + 1) + assert(match(s, string.format("'a'^-%d", i)) <= i + 1) + assert(match(s, string.format("'a'^%d", i)) == i + 1) +end +assert(match("01234567890123456789", "[0-9]^3+") == 19) + + +assert(match("01234567890123456789", "({....}{...}) -> '%2%1'") == "4560123") +t = match("0123456789", "{.}*->{}") +checkeq(t, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}) +assert(match("012345", "( (..) -> '%0%0' ) -> {}")[1] == "0101") + +eqcharset(compile"[]]", "]") +eqcharset(compile"[][]", m.S"[]") +eqcharset(compile"[]-]", m.S"-]") +eqcharset(compile"[-]", m.S"-") +eqcharset(compile"[az-]", m.S"a-z") +eqcharset(compile"[-az]", m.S"a-z") +eqcharset(compile"[a-z]", m.R"az") +eqcharset(compile"[]['\"]", m.S[[]['"]]) + +eqcharset(compile"[^]]", any - "]") +eqcharset(compile"[^][]", any - m.S"[]") +eqcharset(compile"[^]-]", any - m.S"-]") +eqcharset(compile"[^]-]", any - m.S"-]") +eqcharset(compile"[^-]", any - m.S"-") +eqcharset(compile"[^az-]", any - m.S"a-z") +eqcharset(compile"[^-az]", any - m.S"a-z") +eqcharset(compile"[^a-z]", any - m.R"az") +eqcharset(compile"[^]['\"]", any - m.S[[]['"]]) + +-- tests for comments in 're' +e = compile[[ +A <- B -- \t \n %nl .<> <- -> -- +B <- 'x' --]] +assert(e:match'xy' == 2) + +-- tests for 're' with pre-definitions +defs = {digits = m.R"09", letters = m.R"az"} +e = compile("%letters (%letters / %digits)*", defs) +assert(e:match"x123" == 5) + +e = compile([[ + S <- A+ + A <- %letters+ B + B <- %digits+ +]], defs) + +e = compile("{[0-9]+'.'?[0-9]*} -> sin", math) +assert(e:match("2.34") == math.sin(2.34)) + + +function eq (_, _, a, b) return a == b end + +c = re.compile([[ + longstring <- '[' {:init: '='* :} '[' close + close <- ']' =init ']' / . close +]]) + +assert(c:match'[==[]]===]]]]==]===[]' == 17) +assert(c:match'[[]=]====]=]]]==]===[]' == 14) +assert(not c:match'[[]=]====]=]=]==]===[]') + +c = re.compile" '[' {:init: '='* :} '[' (!(']' =init ']') .)* ']' =init ']' !. " + +assert(c:match'[==[]]===]]]]==]') +assert(c:match'[[]=]====]=][]==]===[]]') +assert(not c:match'[[]=]====]=]=]==]===[]') + +assert(re.find("hi alalo", "{:x:..:} =x") == 4) +assert(re.find("hi alalo", "{:x:..:} =x", 4) == 4) +assert(not re.find("hi alalo", "{:x:..:} =x", 5)) +assert(re.find("hi alalo", "'al'", 5) == 6) +assert(re.find("hi aloalolo", "{:x:..:} =x") == 8) +assert(re.find("alo alohi x x", "{:word:%w+:}%W*(=word)!%w") == 11) + +assert(re.gsub("alo alo", "[abc]", "x") == "xlo xlo") +assert(re.gsub("alo alo", "%w+", ".") == ". .") +assert(re.gsub("hi, how are you", "[aeiou]", string.upper) == + "hI, hOw ArE yOU") + +s = 'hi [[a comment[=]=] ending here]] and [=[another]]=]]' +c = re.compile" '[' {:i: '='* :} '[' (!(']' =i ']') .)* ']' { =i } ']' " +assert(re.gsub(s, c, "%2") == 'hi and =]') +assert(re.gsub(s, c, "%0") == s) +assert(re.gsub('[=[hi]=]', c, "%2") == '=') + +assert(re.find("", "!.") == 1) +assert(re.find("alo", "!.") == 4) + +function addtag (s, i, t, tag) t.tag = tag; return i, t end + +c = re.compile([[ + doc <- block !. + block <- (start (block / { [^<]+ })* -> {} end?) => addtag + start <- '<' {:tag: [a-z]+ :} '>' + end <- '' +]], {addtag = addtag}) + +x = c:match[[ +hihellobuttotheend]] +checkeq(x, {tag='x', 'hi', {tag = 'b', 'hello'}, 'but', + {'totheend'}}) + +assert(not pcall(compile, "x <- 'a' x <- 'b'")) +assert(not pcall(compile, "'x' -> x", {x = 3})) + + +-- tests for look-ahead captures +x = {re.match("alo", "&(&{.}) !{'b'} {&(...)} &{..} {...} {!.}")} +checkeq(x, {"", "alo", ""}) + +assert(re.match("aloalo", + "{~ (((&'al' {.}) -> 'A%1' / (&%l {.}) -> '%1%1') / .)* ~}") + == "AallooAalloo") + +-- bug in 0.9 (and older versions), due to captures in look-aheads +x = re.compile[[ {~ (&(. ([a-z]* -> '*')) ([a-z]+ -> '+') ' '*)* ~} ]] +assert(x:match"alo alo" == "+ +") + +-- valid capture in look-ahead (used inside the look-ahead itself) +x = re.compile[[ + S <- &({:two: .. :} . =two) {[a-z]+} / . S +]] +assert(x:match("hello aloaLo aloalo xuxu") == "aloalo") + + +p = re.compile[[ + block <- ({:ident:' '*:} line + ((=ident !' ' line) / &(=ident ' ') block)*) -> {} + line <- {[^%nl]*} %nl +]] + +t= p:match[[ +1 + 1.1 + 1.2 + 1.2.1 + +2 + 2.1 +]] +checkeq(t, {"1", {"1.1", "1.2", {"1.2.1", "", ident = " "}, ident = " "}, + "2", {"2.1", ident = " "}, ident = ""}) + + +-- nested grammars +p = re.compile[[ + s <- a b !. + b <- ( x <- ('b' x)? ) + a <- ( x <- 'a' x? ) +]] + +assert(p:match'aaabbb') +assert(p:match'aaa') +assert(not p:match'bbb') +assert(not p:match'aaabbba') + +-- testing groups +t = {re.match("abc", "{:S <- {:.:} {S} / '':}")} +checkeq(t, {"a", "bc", "b", "c", "c", ""}) + +t = re.match("1234", "({:a:.:} {:b:.:} {:c:.{.}:}) -> {}") +checkeq(t, {a="1", b="2", c="4"}) +t = re.match("1234", "({:a:.:} {:b:{.}{.}:} {:c:{.}:}) -> {}") +checkeq(t, {a="1", b="2", c="4"}) +t = re.match("12345", "({:.:} {:b:{.}{.}:} {:{.}{.}:}) -> {}") +checkeq(t, {"1", b="2", "4", "5"}) +t = re.match("12345", "({:.:} {:{:b:{.}{.}:}:} {:{.}{.}:}) -> {}") +checkeq(t, {"1", "23", "4", "5"}) +t = re.match("12345", "({:.:} {{:b:{.}{.}:}} {:{.}{.}:}) -> {}") +checkeq(t, {"1", "23", "4", "5"}) + + +-- testing pre-defined names +assert(os.setlocale("C") == "C") + +function eqlpeggsub (p1, p2) + local s1 = cs2str(re.compile(p1)) + local s2 = string.gsub(allchar, "[^" .. p2 .. "]", "") +if s1 ~= s2 then print(s1,s2) end + assert(s1 == s2) +end + + +eqlpeggsub("%w", "%w") +eqlpeggsub("%a", "%a") +eqlpeggsub("%l", "%l") +eqlpeggsub("%u", "%u") +eqlpeggsub("%p", "%p") +eqlpeggsub("%d", "%d") +eqlpeggsub("%x", "%x") +eqlpeggsub("%s", "%s") + +eqlpeggsub("%W", "%W") +eqlpeggsub("%A", "%A") +eqlpeggsub("%L", "%L") +eqlpeggsub("%U", "%U") +eqlpeggsub("%P", "%P") +eqlpeggsub("%D", "%D") +eqlpeggsub("%X", "%X") +eqlpeggsub("%S", "%S") + +eqlpeggsub("[%w]", "%w") +eqlpeggsub("[_%w]", "_%w") +eqlpeggsub("[^%w]", "%W") +eqlpeggsub("[%W%S]", "%W%S") + +re.updatelocale() + + +-- testing nested substitutions x string captures + +p = re.compile[[ + text <- {~ item* ~} + item <- macro / [^()] / '(' item* ')' + arg <- ' '* {~ (!',' item)* ~} + args <- '(' arg (',' arg)* ')' + macro <- ('apply' args) -> '%1(%2)' + / ('add' args) -> '%1 + %2' + / ('mul' args) -> '%1 * %2' +]] + +assert(p:match"add(mul(a,b), apply(f,x))" == "a * b + f(x)") + +rev = re.compile[[ R <- (!.) -> '' / ({.} R) -> '%2%1']] + +assert(rev:match"0123456789" == "9876543210") + +print"OK" + + diff --git a/luafilesystem/Makefile b/luafilesystem/Makefile new file mode 100644 index 00000000..6b54f2c7 --- /dev/null +++ b/luafilesystem/Makefile @@ -0,0 +1,22 @@ +# $Id: Makefile,v 1.36 2009/09/21 17:02:44 mascarenhas Exp $ + +T= lfs + +CONFIG= ./config + +include $(CONFIG) + +SRCS= src/$T.c +OBJS= src/$T.o + +lib: src/lfs.so + +src/lfs.so: $(OBJS) + MACOSX_DEPLOYMENT_TARGET="10.3"; export MACOSX_DEPLOYMENT_TARGET; $(CC) $(CFLAGS) $(LIB_OPTION) -o src/lfs.so $(OBJS) + +install: + mkdir -p $(LUA_LIBDIR) + cp src/lfs.so $(LUA_LIBDIR) + +clean: + rm -f src/lfs.so $(OBJS) diff --git a/luafilesystem/Makefile.win b/luafilesystem/Makefile.win new file mode 100644 index 00000000..65cab812 --- /dev/null +++ b/luafilesystem/Makefile.win @@ -0,0 +1,25 @@ +# $Id: Makefile.win,v 1.11 2008/05/07 19:06:37 carregal Exp $ + +T= lfs + +include config.win + +SRCS= src\$T.c +OBJS= src\$T.obj + +lib: src\lfs.dll + +.c.obj: + $(CC) /c /Fo$@ $(CFLAGS) $< + +src\lfs.dll: $(OBJS) + link /dll /def:src\$T.def /out:src\lfs.dll $(OBJS) "$(LUA_LIB)" + IF EXIST src\lfs.dll.manifest mt -manifest src\lfs.dll.manifest -outputresource:src\lfs.dll;2 + +install: src\lfs.dll + IF NOT EXIST "$(LUA_LIBDIR)" mkdir "$(LUA_LIBDIR)" + copy src\lfs.dll "$(LUA_LIBDIR)" + +clean: + del src\lfs.dll $(OBJS) src\$T.lib src\$T.exp + IF EXIST src\lfs.dll.manifest del src\lfs.dll.manifest \ No newline at end of file diff --git a/luafilesystem/README b/luafilesystem/README new file mode 100644 index 00000000..db679231 --- /dev/null +++ b/luafilesystem/README @@ -0,0 +1,78 @@ +LuaFileSystem - File System Library for Lua +Copyright 2003 Kepler Project +http://www.keplerproject.org/luafilesystem + +Description +----------- +LuaFileSystem is a Lua library developed to complement the set of functions +related to file systems offered by the standard Lua distribution. + +LuaFileSystem offers a portable way to access the underlying directory structure and file attributes. +LuaFileSystem is free software and uses the same license as Lua 5.1 + +LuaRocks Installation +--------------------- +luarocks install luafilesystem + + +Documentation +------------- +Please check the documentation at doc/us/ for more information. + +History +------- + +Version 1.6.2 [??/Oct/2012] + * Full Lua 5.2 compatibility (with Lua 5.1 fallbacks) + +Version 1.6.1 [01/Oct/2012] + * fix build for Lua 5.2 + +Version 1.6.0 [26/Sep/2012] + * getcwd fix for Android + * support for Lua 5.2 + * add lfs.link + * other bug fixes + +Version 1.5.0 [20/Oct/2009] + * added explicit next and close methods to second return value of lfs.dir (the directory object), for explicit iteration or explicit closing. + * added directory locking via lfs.lock_dir function (see the manual). + +Version 1.4.2 [03/Feb/2009] + + * fixed bug [#13198] lfs.attributes(filename, 'size') overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro). + * fixed bug [#39794] Compile error on Solaris 10 (bug report and patch by Aaron B). + * fixed compilation problems with Borland C. + +Version 1.4.1 [07/May/2008] + + * documentation review + * fixed Windows compilation issues + * fixed bug in the Windows tests (patch by Shmuel Zeigerman) + * fixed bug [#2185] lfs.attributes(filename, 'size') overflow on files > 2 Gb + +Version 1.4.0 [13/Feb/2008] + + * added function lfs.setmode (works only in Windows systems). + * lfs.attributes raises an error if attribute does not exist + +Version 1.3.0 [26/Oct/2007] + + * added function lfs.symlinkattributes (works only in non Windows systems). + +Version 1.2.1 [08/May/2007] + + * compatible only with Lua 5.1 (Lua 5.0 support was dropped) + +Version 1.2 [15/Mar/2006] + + * added optional argument to lfs.attributes + * added function lfs.rmdir + * bug correction on lfs.dir + +Version 1.1 [30/May/2005] + + * added function lfs.touch. + +Version 1.0 [21/Jan/2005] +Version 1.0 Beta [10/Nov/2004] diff --git a/luafilesystem/config b/luafilesystem/config new file mode 100644 index 00000000..cfd4c6a6 --- /dev/null +++ b/luafilesystem/config @@ -0,0 +1,24 @@ +# Installation directories + +# Default installation prefix +PREFIX=/usr/local + +# System's libraries directory (where binary libraries are installed) +LUA_LIBDIR= $(PREFIX)/lib/lua/5.1 + +# Lua includes directory +LUA_INC= $(PREFIX)/include + +# OS dependent +LIB_OPTION= -shared #for Linux +#LIB_OPTION= -bundle -undefined dynamic_lookup #for MacOS X + +LIBNAME= $T.so.$V + +# Compilation directives +WARN= -O2 -Wall -fPIC -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings -pedantic +INCS= -I$(LUA_INC) +CFLAGS= $(WARN) $(INCS) +CC= gcc + +# $Id: config,v 1.21 2007/10/27 22:42:32 carregal Exp $ diff --git a/luafilesystem/config.win b/luafilesystem/config.win new file mode 100644 index 00000000..50e81f64 --- /dev/null +++ b/luafilesystem/config.win @@ -0,0 +1,19 @@ +# Installation directories +# System's libraries directory (where binary libraries are installed) +LUA_LIBDIR= "c:\lua5.1" + +# Lua includes directory +LUA_INC= "c:\lua5.1\include" + +# Lua library +LUA_LIB= "c:\lua5.1\lua5.1.lib" + +LIBNAME= $T.dll + +# Compilation directives +WARN= /O2 +INCS= /I$(LUA_INC) +CFLAGS= /MD $(WARN) $(INCS) +CC= cl + +# $Id: config.win,v 1.7 2008/03/25 17:39:29 mascarenhas Exp $ diff --git a/luafilesystem/doc/us/examples.html b/luafilesystem/doc/us/examples.html new file mode 100644 index 00000000..d6d32fcd --- /dev/null +++ b/luafilesystem/doc/us/examples.html @@ -0,0 +1,103 @@ + + + + LuaFileSystem + + + + + + +
+ +
+ +
LuaFileSystem
+
File System Library for the Lua Programming Language
+
+ +
+ + + +
+ +

Examples

+ +

Directory iterator

+ +

The following example iterates over a directory and recursively lists the +attributes for each file inside it.

+ +
+local lfs = require"lfs"
+
+function attrdir (path)
+    for file in lfs.dir(path) do
+        if file ~= "." and file ~= ".." then
+            local f = path..'/'..file
+            print ("\t "..f)
+            local attr = lfs.attributes (f)
+            assert (type(attr) == "table")
+            if attr.mode == "directory" then
+                attrdir (f)
+            else
+                for name, value in pairs(attr) do
+                    print (name, value)
+                end
+            end
+        end
+    end
+end
+
+attrdir (".")
+
+ +
+ +
+ +
+

Valid XHTML 1.0!

+

$Id: examples.html,v 1.8 2007/12/14 15:28:04 carregal Exp $

+
+ +
+ + + diff --git a/luafilesystem/doc/us/index.html b/luafilesystem/doc/us/index.html new file mode 100644 index 00000000..8873222d --- /dev/null +++ b/luafilesystem/doc/us/index.html @@ -0,0 +1,213 @@ + + + + LuaFileSystem + + + + + + +
+ +
+ +
LuaFileSystem
+
File System Library for the Lua Programming Language
+
+ +
+ + + +
+ +

Overview

+ +

LuaFileSystem is a Lua library +developed to complement the set of functions related to file +systems offered by the standard Lua distribution.

+ +

LuaFileSystem offers a portable way to access +the underlying directory structure and file attributes.

+ +

LuaFileSystem is free software and uses the same +license as Lua 5.1.

+ +

Status

+ +

Current version is 1.6.2. It was developed for Lua 5.1 but also + works with Lua 5.2.

+ +

Download

+ +

LuaFileSystem source can be downloaded from its +Github +page.

+ +

History

+ +
+
Version 1.6.2 [??/Oct/2012]
+
    +
  • Full Lua 5.2 compatibility (with Lua 5.1 fallbacks)
  • +
+ +
Version 1.6.1 [01/Oct/2012]
+
    +
  • fix build for Lua 5.2
  • +
+ +
Version 1.6.0 [26/Sep/2012]
+
    +
  • getcwd fix for Android
  • +
  • support for Lua 5.2
  • +
  • add lfs.link
  • +
  • other bug fixes
  • +
+ +
Version 1.5.0 [20/Oct/2009]
+
    +
  • Added explicit next and close methods to second return value of lfs.dir +(the directory object), for explicit iteration or explicit closing.
  • +
  • Added directory locking via lfs.lock_dir function (see the manual).
  • +
+
Version 1.4.2 [03/Feb/2009]
+
+
    +
  • fixed bug [#13198] + lfs.attributes(filename, 'size') overflow on files > 2 Gb again (bug report and patch by KUBO Takehiro).
  • +
  • fixed bug [#39794] + Compile error on Solaris 10 (bug report and patch by Aaron B).
  • +
  • fixed compilation problems with Borland C.
  • +
+
+ +
Version 1.4.1 [07/May/2008]
+
+
    +
  • documentation review
  • +
  • fixed Windows compilation issues
  • +
  • fixed bug in the Windows tests (patch by Shmuel Zeigerman)
  • +
  • fixed bug [#2185] + lfs.attributes(filename, 'size') overflow on files > 2 Gb +
  • +
+
+ +
Version 1.4.0 [13/Feb/2008]
+
+
    +
  • added function + lfs.setmode + (works only in Windows systems).
  • +
  • lfs.attributes + raises an error if attribute does not exist
  • +
+
+ +
Version 1.3.0 [26/Oct/2007]
+
+ +
+ +
Version 1.2.1 [08/May/2007]
+
+
    +
  • compatible only with Lua 5.1 (Lua 5.0 support was dropped)
  • +
+
+ +
Version 1.2 [15/Mar/2006]
+
+ +
+ +
Version 1.1 [30/May/2005]
+
+ +
+ +
Version 1.0 [21/Jan/2005]
+
+ +
Version 1.0 Beta [10/Nov/2004]
+
+
+ +

Credits

+ +

LuaFileSystem was designed by Roberto Ierusalimschy, +André Carregal and Tomás Guisasola as part of the +Kepler Project, +which holds its copyright. LuaFileSystem is currently maintained by Fábio Mascarenhas.

+ +

Contact us

+ +

For more information please +contact us. +Comments are welcome!

+ +

You can also reach other Kepler developers and users on the Kepler Project +mailing list.

+ +
+ +
+ +
+

Valid XHTML 1.0!

+

$Id: index.html,v 1.44 2009/02/04 21:21:33 carregal Exp $

+
+ +
+ + + diff --git a/luafilesystem/doc/us/license.html b/luafilesystem/doc/us/license.html new file mode 100644 index 00000000..e2c422ba --- /dev/null +++ b/luafilesystem/doc/us/license.html @@ -0,0 +1,122 @@ + + + + LuaFileSystem + + + + + + +
+ +
+ +
LuaFileSystem
+
File System Library for the Lua Programming Language
+
+ +
+ + + +
+ +

License

+ +

+LuaFileSystem is free software: it can be used for both academic +and commercial purposes at absolutely no cost. There are no +royalties or GNU-like "copyleft" restrictions. LuaFileSystem +qualifies as +Open Source +software. +Its licenses are compatible with +GPL. +LuaFileSystem is not in the public domain and the +Kepler Project +keep its copyright. +The legal details are below. +

+ +

The spirit of the license is that you are free to use +LuaFileSystem for any purpose at no cost without having to ask us. +The only requirement is that if you do use LuaFileSystem, then you +should give us credit by including the appropriate copyright notice +somewhere in your product or its documentation.

+ +

The LuaFileSystem library is designed and implemented by Roberto +Ierusalimschy, André Carregal and Tomás Guisasola. +The implementation is not derived from licensed software.

+ +
+

Copyright © 2003 Kepler Project.

+ +

Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions:

+ +

The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software.

+ +

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.

+ +
+ +
+ +
+

Valid XHTML 1.0!

+

$Id: license.html,v 1.13 2008/02/11 22:42:21 carregal Exp $

+
+ +
+ + + diff --git a/luafilesystem/doc/us/luafilesystem.png b/luafilesystem/doc/us/luafilesystem.png new file mode 100644 index 00000000..e1dd8c65 Binary files /dev/null and b/luafilesystem/doc/us/luafilesystem.png differ diff --git a/luafilesystem/doc/us/manual.html b/luafilesystem/doc/us/manual.html new file mode 100644 index 00000000..996dc1f1 --- /dev/null +++ b/luafilesystem/doc/us/manual.html @@ -0,0 +1,278 @@ + + + + LuaFileSystem + + + + + + +
+ +
+ +
LuaFileSystem
+
File System Library for the Lua Programming Language
+
+ +
+ + + +
+ +

Introduction

+ +

LuaFileSystem is a Lua library +developed to complement the set of functions related to file +systems offered by the standard Lua distribution.

+ +

LuaFileSystem offers a portable way to access +the underlying directory structure and file attributes.

+ +

Building

+ +

+LuaFileSystem should be built with Lua 5.1 so the language library +and header files for the target version must be installed properly. +

+ +

+LuaFileSystem offers a Makefile and a separate configuration file, +config, +which should be edited to suit your installation before running +make. +The file has some definitions like paths to the external libraries, +compiler options and the like. +

+ +

On Windows, the C runtime used to compile LuaFileSystem must be the same +runtime that Lua uses, or some LuaFileSystem functions will not work.

+ +

Installation

+ +

The easiest way to install LuaFileSystem is to use LuaRocks:

+ +
+luarocks install luafilesystem
+
+ +

If you prefer to install LuaFileSystem manually, the compiled binary should be copied to a directory in your +C path.

+ +

Reference

+ +

+LuaFileSystem offers the following functions: +

+ +
+
lfs.attributes (filepath [, aname])
+
Returns a table with the file attributes corresponding to + filepath (or nil followed by an error message + in case of error). + If the second optional argument is given, then only the value of the + named attribute is returned (this use is equivalent to + lfs.attributes(filepath).aname, but the table is not created + and only one attribute is retrieved from the O.S.). + The attributes are described as follows; + attribute mode is a string, all the others are numbers, + and the time related attributes use the same time reference of + os.time: +
+
dev
+
on Unix systems, this represents the device that the inode resides on. On Windows systems, + represents the drive number of the disk containing the file
+ +
ino
+
on Unix systems, this represents the inode number. On Windows systems this has no meaning
+ +
mode
+
string representing the associated protection mode (the values could be + file, directory, link, socket, + named pipe, char device, block device or + other)
+ +
nlink
+
number of hard links to the file
+ +
uid
+
user-id of owner (Unix only, always 0 on Windows)
+ +
gid
+
group-id of owner (Unix only, always 0 on Windows)
+ +
rdev
+
on Unix systems, represents the device type, for special file inodes. + On Windows systems represents the same as dev
+ +
access
+
time of last access
+ +
modification
+
time of last data modification
+ +
change
+
time of last file status change
+ +
size
+
file size, in bytes
+ +
blocks
+
block allocated for file; (Unix only)
+ +
blksize
+
optimal file system I/O blocksize; (Unix only)
+
+ This function uses stat internally thus if the given + filepath is a symbolic link, it is followed (if it points to + another link the chain is followed recursively) and the information + is about the file it refers to. + To obtain information about the link itself, see function + lfs.symlinkattributes. +
+ +
lfs.chdir (path)
+
Changes the current working directory to the given + path.
+ Returns true in case of success or nil plus an + error string.
+ +
lfs.lock_dir(path, [seconds_stale])
+
Creates a lockfile (called lockfile.lfs) in path if it does not + exist and returns the lock. If the lock already exists checks if + it's stale, using the second parameter (default for the second + parameter is INT_MAX, which in practice means the lock will never + be stale. To free the the lock call lock:free().
+ In case of any errors it returns nil and the error message. In + particular, if the lock exists and is not stale it returns the + "File exists" message.
+ +
lfs.currentdir ()
+
Returns a string with the current working directory or nil + plus an error string.
+ +
iter, dir_obj = lfs.dir (path)
+
+ Lua iterator over the entries of a given directory. + Each time the iterator is called with dir_obj it returns a directory entry's name as a string, or + nil if there are no more entries. You can also iterate by calling dir_obj:next(), and + explicitly close the directory before the iteration finished with dir_obj:close(). + Raises an error if path is not a directory. +
+ +
lfs.lock (filehandle, mode[, start[, length]])
+
Locks a file or a part of it. This function works on open files; the + file handle should be specified as the first argument. + The string mode could be either + r (for a read/shared lock) or w (for a + write/exclusive lock). The optional arguments start + and length can be used to specify a starting point and + its length; both should be numbers.
+ Returns true if the operation was successful; in + case of error, it returns nil plus an error string. +
+ +
lfs.link (old, new[, symlink])
+
Creates a link. The first argument is the object to link to + and the second is the name of the link. If the optional third + argument is true, the link will by a symbolic link (by default, a + hard link is created). +
+ +
lfs.mkdir (dirname)
+
Creates a new directory. The argument is the name of the new + directory.
+ Returns true if the operation was successful; + in case of error, it returns nil plus an error string. +
+ +
lfs.rmdir (dirname)
+
Removes an existing directory. The argument is the name of the directory.
+ Returns true if the operation was successful; + in case of error, it returns nil plus an error string.
+ +
lfs.setmode (file, mode)
+
Sets the writing mode for a file. The mode string can be either binary or text. + Returns the previous mode string for the file. On non-Windows platforms, where the two modes are identical, + setting the mode has no effect, and the mode is always returned as binary. +
+ +
lfs.symlinkattributes (filepath [, aname])
+
Identical to lfs.attributes except that + it obtains information about the link itself (not the file it refers to). + On Windows this function does not yet support links, and is identical to + lfs.attributes. +
+ +
lfs.touch (filepath [, atime [, mtime]])
+
Set access and modification times of a file. This function is + a bind to utime function. The first argument is the + filename, the second argument (atime) is the access time, + and the third argument (mtime) is the modification time. + Both times are provided in seconds (which should be generated with + Lua standard function os.time). + If the modification time is omitted, the access time provided is used; + if both times are omitted, the current time is used.
+ Returns true if the operation was successful; + in case of error, it returns nil plus an error string. +
+ +
lfs.unlock (filehandle[, start[, length]])
+
Unlocks a file or a part of it. This function works on + open files; the file handle should be specified as the first + argument. The optional arguments start and + length can be used to specify a starting point and its + length; both should be numbers.
+ Returns true if the operation was successful; + in case of error, it returns nil plus an error string. +
+
+ +
+ +
+ +
+

Valid XHTML 1.0!

+

$Id: manual.html,v 1.45 2009/06/03 20:53:55 mascarenhas Exp $

+
+ +
+ + + diff --git a/luafilesystem/rockspecs/luafilesystem-1.3.0-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.3.0-1.rockspec new file mode 100644 index 00000000..d4d484f6 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.3.0-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" +version = "1.3.0-1" +source = { + url = "http://luaforge.net/frs/download.php/2679/luafilesystem-1.3.0.tar.gz" +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + type = "make", + build_variables = { + LUA_INC = "$(LUA_INCDIR)", + LIB_OPTION = "$(LIBFLAG)" + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.4.0-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.4.0-1.rockspec new file mode 100644 index 00000000..b6936182 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.4.0-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" +version = "1.4.0-1" +source = { + url = "http://luaforge.net/frs/download.php/3158/luafilesystem-1.4.0.tar.gz" +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + type = "make", + build_variables = { + LUA_INC = "$(LUA_INCDIR)", + LIB_OPTION = "$(LIBFLAG)" + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.4.0-2.rockspec b/luafilesystem/rockspecs/luafilesystem-1.4.0-2.rockspec new file mode 100644 index 00000000..f7ed8715 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.4.0-2.rockspec @@ -0,0 +1,43 @@ +package = "LuaFileSystem" +version = "1.4.0-2" +source = { + url = "http://luaforge.net/frs/download.php/3158/luafilesystem-1.4.0.tar.gz" +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + platforms = { + unix = { + type = "make", + build_variables = { + LIB_OPTION = "$(LIBFLAG)", + CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } + }, + win32 = { + type = "make", + build_variables = { + LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib", + CFLAGS = "/MD $(CFLAGS) /I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)", + LUA_DIR = "$(LUADIR)", + BIN_DIR = "$(BINDIR)" + } + } + } +} \ No newline at end of file diff --git a/luafilesystem/rockspecs/luafilesystem-1.4.1-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.4.1-1.rockspec new file mode 100644 index 00000000..db3a3ebb --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.4.1-1.rockspec @@ -0,0 +1,43 @@ +package = "LuaFileSystem" +version = "1.4.1-1" +source = { + url = "http://luaforge.net/frs/download.php/3345/luafilesystem-1.4.1.tar.gz", +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + platforms = { + unix = { + type = "make", + build_variables = { + LIB_OPTION = "$(LIBFLAG)", + CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR) $(STAT64)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } + }, + win32 = { + type = "make", + build_variables = { + LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib", + CFLAGS = "/MD $(CFLAGS) /I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)", + LUA_DIR = "$(LUADIR)", + BIN_DIR = "$(BINDIR)" + } + } + } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.4.1rc1-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.4.1rc1-1.rockspec new file mode 100644 index 00000000..11947117 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.4.1rc1-1.rockspec @@ -0,0 +1,43 @@ +package = "LuaFileSystem" +version = "1.4.1rc1-1" +source = { + url = "http://luafilesystem.luaforge.net/luafilesystem-1.4.1rc1.tar.gz", +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + platforms = { + unix = { + type = "make", + build_variables = { + LIB_OPTION = "$(LIBFLAG)", + CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR) $(STAT64)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } + }, + win32 = { + type = "make", + build_variables = { + LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib", + CFLAGS = "/MD $(CFLAGS) /I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)", + LUA_DIR = "$(LUADIR)", + BIN_DIR = "$(BINDIR)" + } + } + } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.4.2-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.4.2-1.rockspec new file mode 100644 index 00000000..7cfe92b7 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.4.2-1.rockspec @@ -0,0 +1,26 @@ +package = "LuaFileSystem" + +version = "1.4.2-1" + +source = { + url = "http://luaforge.net/frs/download.php/3931/luafilesystem-1.4.2.tar.gz", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "module", + modules = { lfs = "src/lfs.c" } +} \ No newline at end of file diff --git a/luafilesystem/rockspecs/luafilesystem-1.5.0-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.5.0-1.rockspec new file mode 100644 index 00000000..1170ad25 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.5.0-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" + +version = "1.5.0-1" + +source = { + url = "http://cloud.github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.5.0.tar.gz", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "module", + modules = { lfs = "src/lfs.c" }, + copy_directories = { "doc", "tests" } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.6.0-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.6.0-1.rockspec new file mode 100644 index 00000000..82d349cf --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.6.0-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" + +version = "1.6.0-1" + +source = { + url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.0.tar.gz", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "builtin", + modules = { lfs = "src/lfs.c" }, + copy_directories = { "doc", "tests" } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.6.1-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.6.1-1.rockspec new file mode 100644 index 00000000..7f45e332 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.6.1-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" + +version = "1.6.1-1" + +source = { + url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.1.tar.gz", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "builtin", + modules = { lfs = "src/lfs.c" }, + copy_directories = { "doc", "tests" } +} diff --git a/luafilesystem/rockspecs/luafilesystem-1.6.2-1.rockspec b/luafilesystem/rockspecs/luafilesystem-1.6.2-1.rockspec new file mode 100644 index 00000000..1c11efc8 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-1.6.2-1.rockspec @@ -0,0 +1,27 @@ +package = "LuaFileSystem" + +version = "1.6.2-1" + +source = { + url = "https://github.com/downloads/keplerproject/luafilesystem/luafilesystem-1.6.2.tar.gz", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "builtin", + modules = { lfs = "src/lfs.c" }, + copy_directories = { "doc", "tests" } +} diff --git a/luafilesystem/rockspecs/luafilesystem-cvs-1.rockspec b/luafilesystem/rockspecs/luafilesystem-cvs-1.rockspec new file mode 100644 index 00000000..a02d4f14 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-cvs-1.rockspec @@ -0,0 +1,44 @@ +package = "LuaFileSystem" +version = "cvs-1" +source = { + url = "cvs://:pserver:anonymous:@cvs.luaforge.net:/cvsroot/luafilesystem", + cvs_tag = "HEAD" +} +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} +dependencies = { + "lua >= 5.1" +} +build = { + platforms = { + unix = { + type = "make", + build_variables = { + LIB_OPTION = "$(LIBFLAG)", + CFLAGS = "$(CFLAGS) -I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)" + } + }, + win32 = { + type = "make", + build_variables = { + LUA_LIB = "$(LUA_LIBDIR)\\lua5.1.lib", + CFLAGS = "$(CFLAGS) /I$(LUA_INCDIR)", + }, + install_variables = { + LUA_LIBDIR = "$(LIBDIR)", + LUA_DIR = "$(LUADIR)", + BIN_DIR = "$(BINDIR)" + } + } + } +} diff --git a/luafilesystem/rockspecs/luafilesystem-cvs-2.rockspec b/luafilesystem/rockspecs/luafilesystem-cvs-2.rockspec new file mode 100644 index 00000000..651c7cf1 --- /dev/null +++ b/luafilesystem/rockspecs/luafilesystem-cvs-2.rockspec @@ -0,0 +1,26 @@ +package = "LuaFileSystem" + +version = "cvs-2" + +source = { + url = "git://github.com/keplerproject/luafilesystem.git", +} + +description = { + summary = "File System Library for the Lua Programming Language", + detailed = [[ + LuaFileSystem is a Lua library developed to complement the set of + functions related to file systems offered by the standard Lua + distribution. LuaFileSystem offers a portable way to access the + underlying directory structure and file attributes. + ]] +} + +dependencies = { + "lua >= 5.1" +} + +build = { + type = "module", + modules = { lfs = "src/lfs.c" } +} diff --git a/luafilesystem/src/.gitignore b/luafilesystem/src/.gitignore new file mode 100644 index 00000000..9d22eb46 --- /dev/null +++ b/luafilesystem/src/.gitignore @@ -0,0 +1,2 @@ +*.o +*.so diff --git a/luafilesystem/src/lfs.c b/luafilesystem/src/lfs.c new file mode 100644 index 00000000..b270ee8f --- /dev/null +++ b/luafilesystem/src/lfs.c @@ -0,0 +1,888 @@ +/* +** LuaFileSystem +** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem) +** +** File system manipulation library. +** This library offers these functions: +** lfs.attributes (filepath [, attributename]) +** lfs.chdir (path) +** lfs.currentdir () +** lfs.dir (path) +** lfs.lock (fh, mode) +** lfs.lock_dir (path) +** lfs.mkdir (path) +** lfs.rmdir (path) +** lfs.setmode (filepath, mode) +** lfs.symlinkattributes (filepath [, attributename]) -- thanks to Sam Roberts +** lfs.touch (filepath [, atime [, mtime]]) +** lfs.unlock (fh) +** +** $Id: lfs.c,v 1.61 2009/07/04 02:10:16 mascarenhas Exp $ +*/ + +#ifndef _WIN32 +#ifndef _AIX +#define _FILE_OFFSET_BITS 64 /* Linux, Solaris and HP-UX */ +#else +#define _LARGE_FILES 1 /* AIX */ +#endif +#endif + +#define _LARGEFILE64_SOURCE + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#include +#include +#include +#ifdef __BORLANDC__ + #include +#else + #include +#endif +#include +#else +#include +#include +#include +#include +#include +#endif + +#include +#include +#include + +#include "lfs.h" + +#define LFS_VERSION "1.6.2" +#define LFS_LIBNAME "lfs" + +#if LUA_VERSION_NUM < 502 +# define luaL_newlib(L,l) (lua_newtable(L), luaL_register(L,NULL,l)) +#endif + +/* Define 'strerror' for systems that do not implement it */ +#ifdef NO_STRERROR +#define strerror(_) "System unable to describe the error" +#endif + +/* Define 'getcwd' for systems that do not implement it */ +#ifdef NO_GETCWD +#define getcwd(p,s) NULL +#define getcwd_error "Function 'getcwd' not provided by system" +#else +#define getcwd_error strerror(errno) + #ifdef _WIN32 + /* MAX_PATH seems to be 260. Seems kind of small. Is there a better one? */ + #define LFS_MAXPATHLEN MAX_PATH + #else + /* For MAXPATHLEN: */ + #include + #define LFS_MAXPATHLEN MAXPATHLEN + #endif +#endif + +#define DIR_METATABLE "directory metatable" +typedef struct dir_data { + int closed; +#ifdef _WIN32 + long hFile; + char pattern[MAX_PATH+1]; +#else + DIR *dir; +#endif +} dir_data; + +#define LOCK_METATABLE "lock metatable" + +#ifdef _WIN32 + #ifdef __BORLANDC__ + #define lfs_setmode(L,file,m) ((void)L, setmode(_fileno(file), m)) + #define STAT_STRUCT struct stati64 + #else + #define lfs_setmode(L,file,m) ((void)L, _setmode(_fileno(file), m)) + #define STAT_STRUCT struct _stati64 + #endif +#define STAT_FUNC _stati64 +#define LSTAT_FUNC STAT_FUNC +#else +#define _O_TEXT 0 +#define _O_BINARY 0 +#define lfs_setmode(L,file,m) ((void)L, (void)file, (void)m, 0) +#define STAT_STRUCT struct stat +#define STAT_FUNC stat +#define LSTAT_FUNC lstat +#endif + +/* +** Utility functions +*/ +static int pusherror(lua_State *L, const char *info) +{ + lua_pushnil(L); + if (info==NULL) + lua_pushstring(L, strerror(errno)); + else + lua_pushfstring(L, "%s: %s", info, strerror(errno)); + lua_pushinteger(L, errno); + return 3; +} + +static int pushresult(lua_State *L, int i, const char *info) +{ + if (i==-1) + return pusherror(L, info); + lua_pushinteger(L, i); + return 1; +} + + +/* +** This function changes the working (current) directory +*/ +static int change_dir (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + if (chdir(path)) { + lua_pushnil (L); + lua_pushfstring (L,"Unable to change working directory to '%s'\n%s\n", + path, chdir_error); + return 2; + } else { + lua_pushboolean (L, 1); + return 1; + } +} + +/* +** This function returns the current directory +** If unable to get the current directory, it returns nil +** and a string describing the error +*/ +static int get_dir (lua_State *L) { + char *path; + /* Passing (NULL, 0) is not guaranteed to work. Use a temp buffer and size instead. */ + char buf[LFS_MAXPATHLEN]; + if ((path = getcwd(buf, LFS_MAXPATHLEN)) == NULL) { + lua_pushnil(L); + lua_pushstring(L, getcwd_error); + return 2; + } + else { + lua_pushstring(L, path); + return 1; + } +} + +/* +** Check if the given element on the stack is a file and returns it. +*/ +static FILE *check_file (lua_State *L, int idx, const char *funcname) { + FILE **fh = (FILE **)luaL_checkudata (L, idx, "FILE*"); + if (fh == NULL) { + luaL_error (L, "%s: not a file", funcname); + return 0; + } else if (*fh == NULL) { + luaL_error (L, "%s: closed file", funcname); + return 0; + } else + return *fh; +} + + +/* +** +*/ +static int _file_lock (lua_State *L, FILE *fh, const char *mode, const long start, long len, const char *funcname) { + int code; +#ifdef _WIN32 + /* lkmode valid values are: + LK_LOCK Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error. + LK_NBLCK Locks the specified bytes. If the bytes cannot be locked, the constant returns an error. + LK_NBRLCK Same as _LK_NBLCK. + LK_RLCK Same as _LK_LOCK. + LK_UNLCK Unlocks the specified bytes, which must have been previously locked. + + Regions should be locked only briefly and should be unlocked before closing a file or exiting the program. + + http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__locking.asp + */ + int lkmode; + switch (*mode) { + case 'r': lkmode = LK_NBLCK; break; + case 'w': lkmode = LK_NBLCK; break; + case 'u': lkmode = LK_UNLCK; break; + default : return luaL_error (L, "%s: invalid mode", funcname); + } + if (!len) { + fseek (fh, 0L, SEEK_END); + len = ftell (fh); + } + fseek (fh, start, SEEK_SET); +#ifdef __BORLANDC__ + code = locking (fileno(fh), lkmode, len); +#else + code = _locking (fileno(fh), lkmode, len); +#endif +#else + struct flock f; + switch (*mode) { + case 'w': f.l_type = F_WRLCK; break; + case 'r': f.l_type = F_RDLCK; break; + case 'u': f.l_type = F_UNLCK; break; + default : return luaL_error (L, "%s: invalid mode", funcname); + } + f.l_whence = SEEK_SET; + f.l_start = (off_t)start; + f.l_len = (off_t)len; + code = fcntl (fileno(fh), F_SETLK, &f); +#endif + return (code != -1); +} + +#ifdef _WIN32 +typedef struct lfs_Lock { + HANDLE fd; +} lfs_Lock; +static int lfs_lock_dir(lua_State *L) { + size_t pathl; HANDLE fd; + lfs_Lock *lock; + char *ln; + const char *lockfile = "/lockfile.lfs"; + const char *path = luaL_checklstring(L, 1, &pathl); + ln = (char*)malloc(pathl + strlen(lockfile) + 1); + if(!ln) { + lua_pushnil(L); lua_pushstring(L, strerror(errno)); return 2; + } + strcpy(ln, path); strcat(ln, lockfile); + if((fd = CreateFile(ln, GENERIC_WRITE, 0, NULL, CREATE_NEW, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL)) == INVALID_HANDLE_VALUE) { + int en = GetLastError(); + free(ln); lua_pushnil(L); + if(en == ERROR_FILE_EXISTS || en == ERROR_SHARING_VIOLATION) + lua_pushstring(L, "File exists"); + else + lua_pushstring(L, strerror(en)); + return 2; + } + free(ln); + lock = (lfs_Lock*)lua_newuserdata(L, sizeof(lfs_Lock)); + lock->fd = fd; + luaL_getmetatable (L, LOCK_METATABLE); + lua_setmetatable (L, -2); + return 1; +} +static int lfs_unlock_dir(lua_State *L) { + lfs_Lock *lock = luaL_checkudata(L, 1, LOCK_METATABLE); + CloseHandle(lock->fd); + return 0; +} +#else +typedef struct lfs_Lock { + char *ln; +} lfs_Lock; +static int lfs_lock_dir(lua_State *L) { + lfs_Lock *lock; + size_t pathl; + char *ln; + const char *lockfile = "/lockfile.lfs"; + const char *path = luaL_checklstring(L, 1, &pathl); + lock = (lfs_Lock*)lua_newuserdata(L, sizeof(lfs_Lock)); + ln = (char*)malloc(pathl + strlen(lockfile) + 1); + if(!ln) { + lua_pushnil(L); lua_pushstring(L, strerror(errno)); return 2; + } + strcpy(ln, path); strcat(ln, lockfile); + if(symlink("lock", ln) == -1) { + free(ln); lua_pushnil(L); + lua_pushstring(L, strerror(errno)); return 2; + } + lock->ln = ln; + luaL_getmetatable (L, LOCK_METATABLE); + lua_setmetatable (L, -2); + return 1; +} +static int lfs_unlock_dir(lua_State *L) { + lfs_Lock *lock = luaL_checkudata(L, 1, LOCK_METATABLE); + if(lock->ln) { + unlink(lock->ln); + free(lock->ln); + lock->ln = NULL; + } + return 0; +} +#endif + +static int lfs_g_setmode (lua_State *L, FILE *f, int arg) { + static const int mode[] = {_O_BINARY, _O_TEXT}; + static const char *const modenames[] = {"binary", "text", NULL}; + int op = luaL_checkoption(L, arg, NULL, modenames); + int res = lfs_setmode(L, f, mode[op]); + if (res != -1) { + int i; + lua_pushboolean(L, 1); + for (i = 0; modenames[i] != NULL; i++) { + if (mode[i] == res) { + lua_pushstring(L, modenames[i]); + goto exit; + } + } + lua_pushnil(L); + exit: + return 2; + } else { + int en = errno; + lua_pushnil(L); + lua_pushfstring(L, "%s", strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + +static int lfs_f_setmode(lua_State *L) { + return lfs_g_setmode(L, check_file(L, 1, "setmode"), 2); +} + +/* +** Locks a file. +** @param #1 File handle. +** @param #2 String with lock mode ('w'rite, 'r'ead). +** @param #3 Number with start position (optional). +** @param #4 Number with length (optional). +*/ +static int file_lock (lua_State *L) { + FILE *fh = check_file (L, 1, "lock"); + const char *mode = luaL_checkstring (L, 2); + const long start = luaL_optlong (L, 3, 0); + long len = luaL_optlong (L, 4, 0); + if (_file_lock (L, fh, mode, start, len, "lock")) { + lua_pushboolean (L, 1); + return 1; + } else { + lua_pushnil (L); + lua_pushfstring (L, "%s", strerror(errno)); + return 2; + } +} + + +/* +** Unlocks a file. +** @param #1 File handle. +** @param #2 Number with start position (optional). +** @param #3 Number with length (optional). +*/ +static int file_unlock (lua_State *L) { + FILE *fh = check_file (L, 1, "unlock"); + const long start = luaL_optlong (L, 2, 0); + long len = luaL_optlong (L, 3, 0); + if (_file_lock (L, fh, "u", start, len, "unlock")) { + lua_pushboolean (L, 1); + return 1; + } else { + lua_pushnil (L); + lua_pushfstring (L, "%s", strerror(errno)); + return 2; + } +} + + +/* +** Creates a link. +** @param #1 Object to link to. +** @param #2 Name of link. +** @param #3 True if link is symbolic (optional). +*/ +static int make_link(lua_State *L) +{ +#ifndef _WIN32 + const char *oldpath = luaL_checkstring(L, 1); + const char *newpath = luaL_checkstring(L, 2); + return pushresult(L, + (lua_toboolean(L,3) ? symlink : link)(oldpath, newpath), NULL); +#else + pusherror(L, "make_link is not supported on Windows"); +#endif +} + + +/* +** Creates a directory. +** @param #1 Directory path. +*/ +static int make_dir (lua_State *L) { + const char *path = luaL_checkstring (L, 1); + int fail; +#ifdef _WIN32 + fail = _mkdir (path); +#else + fail = mkdir (path, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | + S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH ); +#endif + if (fail) { + lua_pushnil (L); + lua_pushfstring (L, "%s", strerror(errno)); + return 2; + } + lua_pushboolean (L, 1); + return 1; +} + +/* +** Removes a directory. +** @param #1 Directory path. +*/ +static int remove_dir (lua_State *L) { + const char *path = luaL_checkstring (L, 1); + int fail; + + fail = rmdir (path); + + if (fail) { + lua_pushnil (L); + lua_pushfstring (L, "%s", strerror(errno)); + return 2; + } + lua_pushboolean (L, 1); + return 1; +} + +/* +** Directory iterator +*/ +static int dir_iter (lua_State *L) { +#ifdef _WIN32 + struct _finddata_t c_file; +#else + struct dirent *entry; +#endif + dir_data *d = (dir_data *)luaL_checkudata (L, 1, DIR_METATABLE); + luaL_argcheck (L, d->closed == 0, 1, "closed directory"); +#ifdef _WIN32 + if (d->hFile == 0L) { /* first entry */ + if ((d->hFile = _findfirst (d->pattern, &c_file)) == -1L) { + lua_pushnil (L); + lua_pushstring (L, strerror (errno)); + d->closed = 1; + return 2; + } else { + lua_pushstring (L, c_file.name); + return 1; + } + } else { /* next entry */ + if (_findnext (d->hFile, &c_file) == -1L) { + /* no more entries => close directory */ + _findclose (d->hFile); + d->closed = 1; + return 0; + } else { + lua_pushstring (L, c_file.name); + return 1; + } + } +#else + if ((entry = readdir (d->dir)) != NULL) { + lua_pushstring (L, entry->d_name); + return 1; + } else { + /* no more entries => close directory */ + closedir (d->dir); + d->closed = 1; + return 0; + } +#endif +} + + +/* +** Closes directory iterators +*/ +static int dir_close (lua_State *L) { + dir_data *d = (dir_data *)lua_touserdata (L, 1); +#ifdef _WIN32 + if (!d->closed && d->hFile) { + _findclose (d->hFile); + } +#else + if (!d->closed && d->dir) { + closedir (d->dir); + } +#endif + d->closed = 1; + return 0; +} + + +/* +** Factory of directory iterators +*/ +static int dir_iter_factory (lua_State *L) { + const char *path = luaL_checkstring (L, 1); + dir_data *d; + lua_pushcfunction (L, dir_iter); + d = (dir_data *) lua_newuserdata (L, sizeof(dir_data)); + luaL_getmetatable (L, DIR_METATABLE); + lua_setmetatable (L, -2); + d->closed = 0; +#ifdef _WIN32 + d->hFile = 0L; + if (strlen(path) > MAX_PATH-2) + luaL_error (L, "path too long: %s", path); + else + sprintf (d->pattern, "%s/*", path); +#else + d->dir = opendir (path); + if (d->dir == NULL) + luaL_error (L, "cannot open %s: %s", path, strerror (errno)); +#endif + return 2; +} + + +/* +** Creates directory metatable. +*/ +static int dir_create_meta (lua_State *L) { + luaL_newmetatable (L, DIR_METATABLE); + + /* Method table */ + lua_newtable(L); + lua_pushcfunction (L, dir_iter); + lua_setfield(L, -2, "next"); + lua_pushcfunction (L, dir_close); + lua_setfield(L, -2, "close"); + + /* Metamethods */ + lua_setfield(L, -2, "__index"); + lua_pushcfunction (L, dir_close); + lua_setfield (L, -2, "__gc"); + return 1; +} + +/* +** Creates lock metatable. +*/ +static int lock_create_meta (lua_State *L) { + luaL_newmetatable (L, LOCK_METATABLE); + + /* Method table */ + lua_newtable(L); + lua_pushcfunction(L, lfs_unlock_dir); + lua_setfield(L, -2, "free"); + + /* Metamethods */ + lua_setfield(L, -2, "__index"); + lua_pushcfunction(L, lfs_unlock_dir); + lua_setfield(L, -2, "__gc"); + return 1; +} + + +#ifdef _WIN32 + #ifndef S_ISDIR + #define S_ISDIR(mode) (mode&_S_IFDIR) + #endif + #ifndef S_ISREG + #define S_ISREG(mode) (mode&_S_IFREG) + #endif + #ifndef S_ISLNK + #define S_ISLNK(mode) (0) + #endif + #ifndef S_ISSOCK + #define S_ISSOCK(mode) (0) + #endif + #ifndef S_ISFIFO + #define S_ISFIFO(mode) (0) + #endif + #ifndef S_ISCHR + #define S_ISCHR(mode) (mode&_S_IFCHR) + #endif + #ifndef S_ISBLK + #define S_ISBLK(mode) (0) + #endif +#endif +/* +** Convert the inode protection mode to a string. +*/ +#ifdef _WIN32 +static const char *mode2string (unsigned short mode) { +#else +static const char *mode2string (mode_t mode) { +#endif + if ( S_ISREG(mode) ) + return "file"; + else if ( S_ISDIR(mode) ) + return "directory"; + else if ( S_ISLNK(mode) ) + return "link"; + else if ( S_ISSOCK(mode) ) + return "socket"; + else if ( S_ISFIFO(mode) ) + return "named pipe"; + else if ( S_ISCHR(mode) ) + return "char device"; + else if ( S_ISBLK(mode) ) + return "block device"; + else + return "other"; +} + + +/* +** Set access time and modification values for file +*/ +static int file_utime (lua_State *L) { + const char *file = luaL_checkstring (L, 1); + struct utimbuf utb, *buf; + + if (lua_gettop (L) == 1) /* set to current date/time */ + buf = NULL; + else { + utb.actime = (time_t)luaL_optnumber (L, 2, 0); + utb.modtime = (time_t)luaL_optnumber (L, 3, utb.actime); + buf = &utb; + } + if (utime (file, buf)) { + lua_pushnil (L); + lua_pushfstring (L, "%s", strerror (errno)); + return 2; + } + lua_pushboolean (L, 1); + return 1; +} + + +/* inode protection mode */ +static void push_st_mode (lua_State *L, STAT_STRUCT *info) { + lua_pushstring (L, mode2string (info->st_mode)); +} +/* device inode resides on */ +static void push_st_dev (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_dev); +} +/* inode's number */ +static void push_st_ino (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_ino); +} +/* number of hard links to the file */ +static void push_st_nlink (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_nlink); +} +/* user-id of owner */ +static void push_st_uid (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_uid); +} +/* group-id of owner */ +static void push_st_gid (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_gid); +} +/* device type, for special file inode */ +static void push_st_rdev (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_rdev); +} +/* time of last access */ +static void push_st_atime (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, info->st_atime); +} +/* time of last data modification */ +static void push_st_mtime (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, info->st_mtime); +} +/* time of last file status change */ +static void push_st_ctime (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, info->st_ctime); +} +/* file size, in bytes */ +static void push_st_size (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_size); +} +#ifndef _WIN32 +/* blocks allocated for file */ +static void push_st_blocks (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_blocks); +} +/* optimal file system I/O blocksize */ +static void push_st_blksize (lua_State *L, STAT_STRUCT *info) { + lua_pushnumber (L, (lua_Number)info->st_blksize); +} +#endif +static void push_invalid (lua_State *L, STAT_STRUCT *info) { + luaL_error(L, "invalid attribute name"); +#ifndef _WIN32 + info->st_blksize = 0; /* never reached */ +#endif +} + + /* +** Convert the inode protection mode to a permission list. +*/ + +#ifdef _WIN32 +static const char *perm2string (unsigned short mode) { + static char perms[10] = "---------\0"; + int i; + for (i=0;i<9;i++) perms[i]='-'; + if (mode & _S_IREAD) + { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; } + if (mode & _S_IWRITE) + { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; } + if (mode & _S_IEXEC) + { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; } + return perms; +} +#else +static const char *perm2string (mode_t mode) { + static char perms[10] = "---------\0"; + int i; + for (i=0;i<9;i++) perms[i]='-'; + if (mode & S_IRUSR) perms[0] = 'r'; + if (mode & S_IWUSR) perms[1] = 'w'; + if (mode & S_IXUSR) perms[2] = 'x'; + if (mode & S_IRGRP) perms[3] = 'r'; + if (mode & S_IWGRP) perms[4] = 'w'; + if (mode & S_IXGRP) perms[5] = 'x'; + if (mode & S_IROTH) perms[6] = 'r'; + if (mode & S_IWOTH) perms[7] = 'w'; + if (mode & S_IXOTH) perms[8] = 'x'; + return perms; +} +#endif + +/* permssions string */ +static void push_st_perm (lua_State *L, STAT_STRUCT *info) { + lua_pushstring (L, perm2string (info->st_mode)); +} + +typedef void (*_push_function) (lua_State *L, STAT_STRUCT *info); + +struct _stat_members { + const char *name; + _push_function push; +}; + +struct _stat_members members[] = { + { "mode", push_st_mode }, + { "dev", push_st_dev }, + { "ino", push_st_ino }, + { "nlink", push_st_nlink }, + { "uid", push_st_uid }, + { "gid", push_st_gid }, + { "rdev", push_st_rdev }, + { "access", push_st_atime }, + { "modification", push_st_mtime }, + { "change", push_st_ctime }, + { "size", push_st_size }, + { "permissions", push_st_perm }, +#ifndef _WIN32 + { "blocks", push_st_blocks }, + { "blksize", push_st_blksize }, +#endif + { NULL, push_invalid } +}; + +/* +** Get file or symbolic link information +*/ +static int _file_info_ (lua_State *L, int (*st)(const char*, STAT_STRUCT*)) { + int i; + STAT_STRUCT info; + const char *file = luaL_checkstring (L, 1); + + if (st(file, &info)) { + lua_pushnil (L); + lua_pushfstring (L, "cannot obtain information from file `%s'", file); + return 2; + } + if (lua_isstring (L, 2)) { + int v; + const char *member = lua_tostring (L, 2); + if (strcmp (member, "mode") == 0) v = 0; +#ifndef _WIN32 + else if (strcmp (member, "blocks") == 0) v = 11; + else if (strcmp (member, "blksize") == 0) v = 12; +#endif + else /* look for member */ + for (v = 1; members[v].name; v++) + if (*members[v].name == *member) + break; + /* push member value and return */ + members[v].push (L, &info); + return 1; + } else if (!lua_istable (L, 2)) + /* creates a table if none is given */ + lua_newtable (L); + /* stores all members in table on top of the stack */ + for (i = 0; members[i].name; i++) { + lua_pushstring (L, members[i].name); + members[i].push (L, &info); + lua_rawset (L, -3); + } + return 1; +} + + +/* +** Get file information using stat. +*/ +static int file_info (lua_State *L) { + return _file_info_ (L, STAT_FUNC); +} + + +/* +** Get symbolic link information using lstat. +*/ +static int link_info (lua_State *L) { + return _file_info_ (L, LSTAT_FUNC); +} + + +/* +** Assumes the table is on top of the stack. +*/ +static void set_info (lua_State *L) { + lua_pushliteral (L, "_COPYRIGHT"); + lua_pushliteral (L, "Copyright (C) 2003-2012 Kepler Project"); + lua_settable (L, -3); + lua_pushliteral (L, "_DESCRIPTION"); + lua_pushliteral (L, "LuaFileSystem is a Lua library developed to complement the set of functions related to file systems offered by the standard Lua distribution"); + lua_settable (L, -3); + lua_pushliteral (L, "_VERSION"); + lua_pushliteral (L, "LuaFileSystem "LFS_VERSION); + lua_settable (L, -3); +} + + +static const struct luaL_Reg fslib[] = { + {"attributes", file_info}, + {"chdir", change_dir}, + {"currentdir", get_dir}, + {"dir", dir_iter_factory}, + {"link", make_link}, + {"lock", file_lock}, + {"mkdir", make_dir}, + {"rmdir", remove_dir}, + {"symlinkattributes", link_info}, + {"setmode", lfs_f_setmode}, + {"touch", file_utime}, + {"unlock", file_unlock}, + {"lock_dir", lfs_lock_dir}, + {NULL, NULL}, +}; + +int luaopen_lfs (lua_State *L) { + dir_create_meta (L); + lock_create_meta (L); + luaL_newlib (L, fslib); + lua_pushvalue(L, -1); + lua_setglobal(L, LFS_LIBNAME); + set_info (L); + return 1; +} diff --git a/luafilesystem/src/lfs.def b/luafilesystem/src/lfs.def new file mode 100644 index 00000000..7aa7a35b --- /dev/null +++ b/luafilesystem/src/lfs.def @@ -0,0 +1,5 @@ +LIBRARY lfs.dll +DESCRIPTION "LuaFileSystem" +VERSION 1.5.0 +EXPORTS +luaopen_lfs diff --git a/luafilesystem/src/lfs.h b/luafilesystem/src/lfs.h new file mode 100644 index 00000000..4b52780b --- /dev/null +++ b/luafilesystem/src/lfs.h @@ -0,0 +1,17 @@ +/* +** LuaFileSystem +** Copyright Kepler Project 2003 (http://www.keplerproject.org/luafilesystem) +** +** $Id: lfs.h,v 1.5 2008/02/19 20:08:23 mascarenhas Exp $ +*/ + +/* Define 'chdir' for systems that do not implement it */ +#ifdef NO_CHDIR +#define chdir(p) (-1) +#define chdir_error "Function 'chdir' not provided by system" +#else +#define chdir_error strerror(errno) +#endif + + +int luaopen_lfs (lua_State *L); diff --git a/luafilesystem/tests/test.lua b/luafilesystem/tests/test.lua new file mode 100644 index 00000000..4990aec1 --- /dev/null +++ b/luafilesystem/tests/test.lua @@ -0,0 +1,168 @@ +#!/usr/bin/env lua5.1 + +local tmp = "/tmp" +local sep = string.match (package.config, "[^\n]+") +local upper = ".." + +local lfs = require"lfs" +print (lfs._VERSION) + +io.write(".") +io.flush() + +function attrdir (path) + for file in lfs.dir(path) do + if file ~= "." and file ~= ".." then + local f = path..sep..file + print ("\t=> "..f.." <=") + local attr = lfs.attributes (f) + assert (type(attr) == "table") + if attr.mode == "directory" then + attrdir (f) + else + for name, value in pairs(attr) do + print (name, value) + end + end + end + end +end + +-- Checking changing directories +local current = assert (lfs.currentdir()) +local reldir = string.gsub (current, "^.*%"..sep.."([^"..sep.."])$", "%1") +assert (lfs.chdir (upper), "could not change to upper directory") +assert (lfs.chdir (reldir), "could not change back to current directory") +assert (lfs.currentdir() == current, "error trying to change directories") +assert (lfs.chdir ("this couldn't be an actual directory") == nil, "could change to a non-existent directory") + +io.write(".") +io.flush() + +-- Changing creating and removing directories +local tmpdir = current..sep.."lfs_tmp_dir" +local tmpfile = tmpdir..sep.."tmp_file" +-- Test for existence of a previous lfs_tmp_dir +-- that may have resulted from an interrupted test execution and remove it +if lfs.chdir (tmpdir) then + assert (lfs.chdir (upper), "could not change to upper directory") + assert (os.remove (tmpfile), "could not remove file from previous test") + assert (lfs.rmdir (tmpdir), "could not remove directory from previous test") +end + +io.write(".") +io.flush() + +-- tries to create a directory +assert (lfs.mkdir (tmpdir), "could not make a new directory") +local attrib, errmsg = lfs.attributes (tmpdir) +if not attrib then + error ("could not get attributes of file `"..tmpdir.."':\n"..errmsg) +end +local f = io.open(tmpfile, "w") +f:close() + +io.write(".") +io.flush() + +-- Change access time +local testdate = os.time({ year = 2007, day = 10, month = 2, hour=0}) +assert (lfs.touch (tmpfile, testdate)) +local new_att = assert (lfs.attributes (tmpfile)) +assert (new_att.access == testdate, "could not set access time") +assert (new_att.modification == testdate, "could not set modification time") + +io.write(".") +io.flush() + +-- Change access and modification time +local testdate1 = os.time({ year = 2007, day = 10, month = 2, hour=0}) +local testdate2 = os.time({ year = 2007, day = 11, month = 2, hour=0}) + +assert (lfs.touch (tmpfile, testdate2, testdate1)) +local new_att = assert (lfs.attributes (tmpfile)) +assert (new_att.access == testdate2, "could not set access time") +assert (new_att.modification == testdate1, "could not set modification time") + +io.write(".") +io.flush() + +-- Checking link (does not work on Windows) +if lfs.link (tmpfile, "_a_link_for_test_", true) then + assert (lfs.attributes"_a_link_for_test_".mode == "file") + assert (lfs.symlinkattributes"_a_link_for_test_".mode == "link") + assert (lfs.link (tmpfile, "_a_hard_link_for_test_")) + assert (lfs.attributes (tmpfile, "nlink") == 2) + assert (os.remove"_a_link_for_test_") + assert (os.remove"_a_hard_link_for_test_") +end + +io.write(".") +io.flush() + +-- Checking text/binary modes (only has an effect in Windows) +local f = io.open(tmpfile, "w") +local result, mode = lfs.setmode(f, "binary") +assert(result) -- on non-Windows platforms, mode is always returned as "binary" +result, mode = lfs.setmode(f, "text") +assert(result and mode == "binary") +f:close() + +io.write(".") +io.flush() + +-- Restore access time to current value +assert (lfs.touch (tmpfile, attrib.access, attrib.modification)) +new_att = assert (lfs.attributes (tmpfile)) +assert (new_att.access == attrib.access) +assert (new_att.modification == attrib.modification) + +io.write(".") +io.flush() + +-- Remove new file and directory +assert (os.remove (tmpfile), "could not remove new file") +assert (lfs.rmdir (tmpdir), "could not remove new directory") +assert (lfs.mkdir (tmpdir..sep.."lfs_tmp_dir") == nil, "could create a directory inside a non-existent one") + +io.write(".") +io.flush() + +-- Trying to get attributes of a non-existent file +assert (lfs.attributes ("this couldn't be an actual file") == nil, "could get attributes of a non-existent file") +assert (type(lfs.attributes (upper)) == "table", "couldn't get attributes of upper directory") + +io.write(".") +io.flush() + +-- Stressing directory iterator +count = 0 +for i = 1, 4000 do + for file in lfs.dir (tmp) do + count = count + 1 + end +end + +io.write(".") +io.flush() + +-- Stressing directory iterator, explicit version +count = 0 +for i = 1, 4000 do + local iter, dir = lfs.dir(tmp) + local file = dir:next() + while file do + count = count + 1 + file = dir:next() + end + assert(not pcall(dir.next, dir)) +end + +io.write(".") +io.flush() + +-- directory explicit close +local iter, dir = lfs.dir(tmp) +dir:close() +assert(not pcall(dir.next, dir)) +print"Ok!" diff --git a/luafilesystem/vc6/lfs.def b/luafilesystem/vc6/lfs.def new file mode 100644 index 00000000..55ec688d --- /dev/null +++ b/luafilesystem/vc6/lfs.def @@ -0,0 +1,5 @@ +LIBRARY lfs.dll +DESCRIPTION "LuaFileSystem" +VERSION 1.2 +EXPORTS +luaopen_lfs diff --git a/luafilesystem/vc6/luafilesystem.dsw b/luafilesystem/vc6/luafilesystem.dsw new file mode 100644 index 00000000..b4bb4b31 --- /dev/null +++ b/luafilesystem/vc6/luafilesystem.dsw @@ -0,0 +1,33 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "luafilesystem_dll"=.\luafilesystem_dll.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + luafilesystem + .. + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/luafilesystem/vc6/luafilesystem_dll.dsp b/luafilesystem/vc6/luafilesystem_dll.dsp new file mode 100644 index 00000000..efe6c720 --- /dev/null +++ b/luafilesystem/vc6/luafilesystem_dll.dsp @@ -0,0 +1,127 @@ +# Microsoft Developer Studio Project File - Name="luafilesystem_dll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=luafilesystem_dll - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "luafilesystem_dll.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "luafilesystem_dll.mak" CFG="luafilesystem_dll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "luafilesystem_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "luafilesystem_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "luafilesystem_dll" +# PROP Scc_LocalPath ".." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "luafilesystem_dll - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../lib/vc6" +# PROP Intermediate_Dir "luafilesystem_dll/Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../external-src/lua50/include" /I "../../compat/src" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x416 /d "NDEBUG" +# ADD RSC /l 0x416 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 lua50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../bin/vc6/lfs.dll" /libpath:"../../external-src/lua50/lib/dll" +# Begin Special Build Tool +SOURCE="$(InputPath)" +PostBuild_Cmds=cd ../bin/vc6 zip.exe luafilesystem-1.2-win32.zip lfs.dll +# End Special Build Tool + +!ELSEIF "$(CFG)" == "luafilesystem_dll - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../lib/vc6" +# PROP Intermediate_Dir "luafilesystem_dll/Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../external-src/lua50/include" /I "../../compat/src" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LUAFILESYSTEM_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x416 /d "_DEBUG" +# ADD RSC /l 0x416 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 lua50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"../bin/vc6/lfsd.dll" /pdbtype:sept /libpath:"../../external-src/lua50/lib/dll" + +!ENDIF + +# Begin Target + +# Name "luafilesystem_dll - Win32 Release" +# Name "luafilesystem_dll - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE="..\..\compat\src\compat-5.1.c" +# End Source File +# Begin Source File + +SOURCE=..\src\lfs.c +# End Source File +# Begin Source File + +SOURCE=.\lfs.def +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE="..\..\compat\src\compat-5.1.h" +# End Source File +# Begin Source File + +SOURCE=..\src\lfs.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/moon.c b/moon.c new file mode 100644 index 00000000..975b5871 --- /dev/null +++ b/moon.c @@ -0,0 +1,71 @@ + +#include +#include +#include + +#include "moonscript.h" +#include "moon.h" +#include "alt_getopt.h" + +#include + +#include "luafilesystem/src/lfs.h" + +// put whatever is on top of stack into package.loaded under name something is +// already there +void setloaded(lua_State* l, char* name) { + int top = lua_gettop(l); + lua_getglobal(l, "package"); + lua_getfield(l, -1, "loaded"); + lua_getfield(l, -1, name); + if (lua_isnil(l, -1)) { + lua_pop(l, 1); + lua_pushvalue(l, top); + lua_setfield(l, -2, name); + } + + lua_settop(l, top); +} + +int main(int argc, char **argv) { + lua_State *l = luaL_newstate(); + luaL_openlibs(l); + + luaopen_lpeg(l); + setloaded(l, "lpeg"); + luaopen_lfs(l); + setloaded(l, "lfs"); + + if (!luaL_loadbuffer(l, (const char *)moonscript_lua, moonscript_lua_len, "moonscript.lua") == 0) { + fprintf(stderr, "Failed to load moonscript.lua\n"); + return 1; + } + lua_call(l, 0, 0); + + if (!luaL_loadbuffer(l, (const char *)alt_getopt_lua, alt_getopt_lua_len, "alt_getopt.lua") == 0) { + fprintf(stderr, "Failed to load alt_getopt.lua\n"); + return 1; + } + lua_call(l, 0, 0); + + int i; + lua_newtable(l); + + lua_pushstring(l, "moon"); + lua_rawseti(l, -2, -1); + + for (i = 0; i < argc; i++) { + lua_pushstring(l, argv[i]); + lua_rawseti(l, -2, i); + } + lua_setglobal(l, "arg"); + + if (!luaL_loadbuffer(l, (const char *)moon_lua, moon_lua_len, "moon") == 0) { + fprintf(stderr, "Failed to load moon\n"); + return 1; + } + lua_call(l, 0, 0); + + return 0; +} + diff --git a/moon.h b/moon.h new file mode 100644 index 00000000..692fbfc4 --- /dev/null +++ b/moon.h @@ -0,0 +1,241 @@ +unsigned char moon_lua[] = { + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, + 0x74, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x6f, + 0x70, 0x74, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x22, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x20, 0x3d, 0x20, + 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x6f, 0x70, 0x74, 0x2e, 0x67, + 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x61, 0x72, 0x67, 0x2c, + 0x20, 0x22, 0x63, 0x76, 0x68, 0x64, 0x22, 0x2c, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, + 0x76, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x3d, + 0x20, 0x22, 0x68, 0x22, 0x0a, 0x7d, 0x29, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x5b, 0x3d, 0x5b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x25, 0x73, 0x20, 0x5b, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5d, 0x20, 0x5b, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x20, 0x5b, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x5d, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x2d, 0x64, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, + 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x63, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x0a, 0x5d, 0x3d, 0x5d, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x0a, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, + 0x67, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, + 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x2c, 0x20, + 0x22, 0x5c, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x6d, 0x73, 0x67, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, + 0x68, 0x65, 0x6c, 0x70, 0x0a, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x68, + 0x65, 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x68, 0x65, + 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x5b, 0x30, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x5f, 0x65, 0x72, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x28, + 0x68, 0x65, 0x6c, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x68, + 0x65, 0x6c, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x73, 0x2e, 0x65, + 0x78, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x75, 0x6e, 0x0a, 0x72, 0x75, 0x6e, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x68, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2e, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x66, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5b, 0x69, + 0x6e, 0x64, 0x5d, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x28, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x28, + 0x22, 0x72, 0x65, 0x70, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x79, 0x65, + 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x72, 0x67, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x2d, 0x31, 0x5d, + 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5b, 0x30, 0x5d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, + 0x5b, 0x69, 0x6e, 0x64, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x69, 0x6e, 0x64, 0x20, 0x2b, 0x20, + 0x31, 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, + 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x2c, 0x20, 0x6c, 0x75, + 0x61, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x6f, 0x61, 0x64, + 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, + 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x70, 0x61, + 0x73, 0x73, 0x65, 0x64, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, + 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x73, + 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x28, 0x6c, 0x75, 0x61, 0x5f, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, + 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x5f, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, + 0x2e, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, + 0x5f, 0x61, 0x72, 0x67, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x0a, 0x20, + 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, + 0x65, 0x77, 0x5f, 0x61, 0x72, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, + 0x74, 0x73, 0x2e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x75, 0x6e, + 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, + 0x72, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x63, + 0x6f, 0x76, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x63, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x76, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x6f, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x76, 0x3a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x78, 0x70, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x72, 0x75, 0x6e, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x5f, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, + 0x28, 0x22, 0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2e, 0x74, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x62, 0x61, 0x63, 0x6b, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x74, 0x72, + 0x69, 0x6d, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x2e, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x28, 0x72, + 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x65, 0x72, 0x72, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x74, + 0x72, 0x69, 0x6d, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x6f, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x76, 0x3a, 0x73, 0x74, 0x6f, 0x70, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x76, 0x3a, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x75, 0x6e, 0x28, 0x29, 0x0a, 0x2d, 0x2d, 0x20, 0x76, 0x69, + 0x6d, 0x3a, 0x20, 0x73, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x74, + 0x79, 0x70, 0x65, 0x3d, 0x6c, 0x75, 0x61, 0x3a, 0x0a +}; +unsigned int moon_lua_len = 2853; diff --git a/moon/all.lua b/moon/all.lua deleted file mode 100644 index 945576d1..00000000 --- a/moon/all.lua +++ /dev/null @@ -1,5 +0,0 @@ -local moon = require("moon") -for k, v in pairs(moon) do - _G[k] = v -end -return moon diff --git a/moon/all.moon b/moon/all.moon deleted file mode 100644 index cb773c70..00000000 --- a/moon/all.moon +++ /dev/null @@ -1,6 +0,0 @@ --- install moon into global scope -moon = require "moon" -for k,v in pairs moon - _G[k] = v -moon - diff --git a/moon/init.lua b/moon/init.lua deleted file mode 100644 index 52ead55d..00000000 --- a/moon/init.lua +++ /dev/null @@ -1,178 +0,0 @@ -local lua = { - debug = debug, - type = type -} -local getfenv, setfenv, dump -do - local _obj_0 = require("moonscript.util") - getfenv, setfenv, dump = _obj_0.getfenv, _obj_0.setfenv, _obj_0.dump -end -local p, is_object, type, debug, run_with_scope, bind_methods, defaultbl, extend, copy, mixin, mixin_object, mixin_table, fold -p = function(o, ...) - print(dump(o)) - if select("#", ...) > 0 then - return p(...) - end -end -is_object = function(value) - return lua.type(value) == "table" and value.__class -end -type = function(value) - local base_type = lua.type(value) - if base_type == "table" then - local cls = value.__class - if cls then - return cls - end - end - return base_type -end -debug = setmetatable({ - upvalue = function(fn, k, v) - local upvalues = { } - local i = 1 - while true do - local name = lua.debug.getupvalue(fn, i) - if name == nil then - break - end - upvalues[name] = i - i = i + 1 - end - if not upvalues[k] then - error("Failed to find upvalue: " .. tostring(k)) - end - if not v then - local _, value = lua.debug.getupvalue(fn, upvalues[k]) - return value - else - return lua.debug.setupvalue(fn, upvalues[k], v) - end - end -}, { - __index = lua.debug -}) -run_with_scope = function(fn, scope, ...) - local old_env = getfenv(fn) - local env = setmetatable({ }, { - __index = function(self, name) - local val = scope[name] - if val ~= nil then - return val - else - return old_env[name] - end - end - }) - setfenv(fn, env) - return fn(...) -end -bind_methods = function(obj) - return setmetatable({ }, { - __index = function(self, name) - local val = obj[name] - if val and lua.type(val) == "function" then - local bound - bound = function(...) - return val(obj, ...) - end - self[name] = bound - return bound - else - return val - end - end - }) -end -defaultbl = function(t, fn) - if not fn then - fn = t - t = { } - end - return setmetatable(t, { - __index = function(self, name) - local val = fn(self, name) - rawset(self, name, val) - return val - end - }) -end -extend = function(...) - local tbls = { - ... - } - if #tbls < 2 then - return - end - for i = 1, #tbls - 1 do - local a = tbls[i] - local b = tbls[i + 1] - setmetatable(a, { - __index = b - }) - end - return tbls[1] -end -copy = function(self) - local _tbl_0 = { } - for key, val in pairs(self) do - _tbl_0[key] = val - end - return _tbl_0 -end -mixin = function(self, cls, ...) - for key, val in pairs(cls.__base) do - if not key:match("^__") then - self[key] = val - end - end - return cls.__init(self, ...) -end -mixin_object = function(self, object, methods) - for _index_0 = 1, #methods do - local name = methods[_index_0] - self[name] = function(parent, ...) - return object[name](object, ...) - end - end -end -mixin_table = function(self, tbl, keys) - if keys then - for _index_0 = 1, #keys do - local key = keys[_index_0] - self[key] = tbl[key] - end - else - for key, val in pairs(tbl) do - self[key] = val - end - end -end -fold = function(items, fn) - local len = #items - if len > 1 then - local accum = fn(items[1], items[2]) - for i = 3, len do - accum = fn(accum, items[i]) - end - return accum - else - return items[1] - end -end -return { - dump = dump, - p = p, - is_object = is_object, - type = type, - debug = debug, - run_with_scope = run_with_scope, - bind_methods = bind_methods, - defaultbl = defaultbl, - extend = extend, - copy = copy, - mixin = mixin, - mixin_object = mixin_object, - mixin_table = mixin_table, - fold = fold -} diff --git a/moon/init.moon b/moon/init.moon deleted file mode 100644 index 57325eea..00000000 --- a/moon/init.moon +++ /dev/null @@ -1,135 +0,0 @@ - -lua = { :debug, :type } -import getfenv, setfenv, dump from require "moonscript.util" - -local * - -p = (o, ...) -> - print dump o - if select("#", ...) > 0 - p ... - -is_object = (value) -> -- is a moonscript object - lua.type(value) == "table" and value.__class - -type = (value) -> -- class aware type - base_type = lua.type value - if base_type == "table" - cls = value.__class - return cls if cls - base_type - -debug = setmetatable { - upvalue: (fn, k, v) -> - upvalues = {} - i = 1 - while true - name = lua.debug.getupvalue(fn, i) - break if name == nil - upvalues[name] = i - i += 1 - - if not upvalues[k] - error "Failed to find upvalue: " .. tostring k - - if not v - _, value = lua.debug.getupvalue fn, upvalues[k] - value - else - lua.debug.setupvalue fn, upvalues[k], v -}, __index: lua.debug - --- run a function with scope injected before its function environment -run_with_scope = (fn, scope, ...) -> - old_env = getfenv fn - env = setmetatable {}, { - __index: (name) => - val = scope[name] - if val != nil - val - else - old_env[name] - } - setfenv fn, env - fn ... - --- wrap obj such that calls to methods do not need a reference to self -bind_methods = (obj) -> - setmetatable {}, { - __index: (name) => - val = obj[name] - if val and lua.type(val) == "function" - bound = (...) -> val obj, ... - self[name] = bound - bound - else - val - } - --- use a function to provide default values to table --- optionally specify a starting table --- fibanocci table: --- t = defaultbl {[0]: 0, [1]: 1}, (i) -> self[i - 1] + self[i - 2] -defaultbl = (t, fn) -> - if not fn - fn = t - t = {} - setmetatable t, { - __index: (name) => - val = fn self, name - rawset self, name, val - val - } - --- chain together tables by __index metatables -extend = (...) -> - tbls = {...} - return if #tbls < 2 - - for i = 1, #tbls - 1 - a = tbls[i] - b = tbls[i + 1] - - setmetatable a, __index: b - - tbls[1] - --- shallow copy -copy = => - {key,val for key,val in pairs self} - --- mixin class properties into self, call new -mixin = (cls, ...) => - for key, val in pairs cls.__base - self[key] = val if not key\match"^__" - cls.__init self, ... - --- mixin methods from an object into self -mixin_object = (object, methods) => - for name in *methods - self[name] = (parent, ...) -> - object[name](object, ...) - --- mixin table values into self -mixin_table = (tbl, keys) => - if keys - for key in *keys - self[key] = tbl[key] - else - for key, val in pairs tbl - self[key] = val - -fold = (items, fn)-> - len = #items - if len > 1 - accum = fn items[1], items[2] - for i=3,len - accum = fn accum, items[i] - accum - else - items[1] - -{ - :dump, :p, :is_object, :type, :debug, :run_with_scope, :bind_methods, - :defaultbl, :extend, :copy, :mixin, :mixin_object, :mixin_table, :fold -} diff --git a/moonc.c b/moonc.c new file mode 100644 index 00000000..10ab8cf8 --- /dev/null +++ b/moonc.c @@ -0,0 +1,91 @@ +#include +#include +#include + +#include "moonscript.h" +#include "moonc.h" +#include "alt_getopt.h" + +#include + +#include "luafilesystem/src/lfs.h" + +#ifdef _WIN32 +#include + +int _l_sleep(lua_State *l) { + double time = luaL_checknumber(l, -1); + Sleep((int)(time*1000)); + return 0; +} + +#endif + +// put whatever is on top of stack into package.loaded under name something is +// already there +void setloaded(lua_State* l, char* name) { + int top = lua_gettop(l); + lua_getglobal(l, "package"); + lua_getfield(l, -1, "loaded"); + lua_getfield(l, -1, name); + if (lua_isnil(l, -1)) { + lua_pop(l, 1); + lua_pushvalue(l, top); + lua_setfield(l, -2, name); + } + + lua_settop(l, top); +} + +int main(int argc, char **argv) { + lua_State *l = luaL_newstate(); + luaL_openlibs(l); + + luaopen_lpeg(l); + setloaded(l, "lpeg"); + luaopen_lfs(l); + setloaded(l, "lfs"); + + if (!luaL_loadbuffer(l, (const char *)moonscript_lua, moonscript_lua_len, "moonscript.lua") == 0) { + fprintf(stderr, "Failed to load moonscript.lua\n"); + return 1; + } + lua_call(l, 0, 0); + + // add sleep method +#ifdef _WIN32 + lua_getglobal(l, "require"); + lua_pushstring(l, "moonscript"); + lua_call(l, 1, 1); + lua_pushcfunction(l, _l_sleep); + lua_setfield(l, -2, "_sleep"); + lua_pop(l, 1); +#endif + + if (!luaL_loadbuffer(l, (const char *)alt_getopt_lua, alt_getopt_lua_len, "alt_getopt.lua") == 0) { + fprintf(stderr, "Failed to load alt_getopt.lua\n"); + return 1; + } + lua_call(l, 0, 0); + + int i; + lua_newtable(l); + + lua_pushstring(l, "moon"); + lua_rawseti(l, -2, -1); + + for (i = 0; i < argc; i++) { + lua_pushstring(l, argv[i]); + lua_rawseti(l, -2, i); + } + lua_setglobal(l, "arg"); + + if (!luaL_loadbuffer(l, (const char *)moonc_lua, moonc_lua_len, "moon") == 0) { + fprintf(stderr, "Failed to load moon\n"); + return 1; + } + lua_call(l, 0, 0); + + return 0; +} + diff --git a/moonc.h b/moonc.h new file mode 100644 index 00000000..5b35ad7f --- /dev/null +++ b/moonc.h @@ -0,0 +1,480 @@ +unsigned char moonc_lua[] = { + 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x6c, 0x74, 0x5f, 0x67, + 0x65, 0x74, 0x6f, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x20, 0x22, 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, 0x74, + 0x6f, 0x70, 0x74, 0x22, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x66, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x20, 0x22, 0x6c, 0x66, 0x73, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x61, 0x6c, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x6f, 0x70, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x28, 0x61, 0x72, + 0x67, 0x2c, 0x20, 0x22, 0x6c, 0x76, 0x68, 0x77, 0x74, 0x3a, 0x6f, 0x3a, + 0x70, 0x54, 0x58, 0x62, 0x22, 0x2c, 0x20, 0x7b, 0x0a, 0x09, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x70, 0x22, 0x2c, 0x20, 0x74, + 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x54, 0x22, 0x2c, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x76, 0x22, + 0x2c, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x68, 0x22, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x22, + 0x0a, 0x7d, 0x29, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x20, 0x3d, 0x20, + 0x61, 0x72, 0x67, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2d, + 0x2d, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, + 0x6c, 0x70, 0x20, 0x3d, 0x20, 0x5b, 0x5b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x3a, 0x20, 0x25, 0x73, 0x20, 0x5b, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x5d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x2e, 0x2e, 0x0a, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x68, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x2d, 0x77, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x2f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, + 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, + 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x2d, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, + 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x54, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x74, 0x72, 0x65, + 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x74, 0x6f, 0x20, 0x73, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x58, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x72, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x20, 0x69, 0x6e, 0x73, + 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x28, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x6c, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x69, + 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x62, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x75, 0x6d, 0x70, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x28, + 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x2d, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x20, 0x69, 0x6e, 0x2c, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, + 0x64, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x4d, + 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x5d, 0x5d, 0x0a, 0x0a, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x0a, 0x09, 0x76, 0x2e, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x0a, 0x09, 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x29, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, + 0x70, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x6d, 0x73, 0x67, 0x20, 0x3d, + 0x20, 0x68, 0x65, 0x6c, 0x70, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x61, 0x72, 0x67, 0x5b, 0x30, 0x5d, 0x29, 0x0a, 0x0a, 0x09, 0x69, + 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x28, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, + 0x20, 0x22, 0x2e, 0x2e, 0x20, 0x65, 0x72, 0x72, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, + 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, + 0x68, 0x65, 0x6c, 0x70, 0x5f, 0x6d, 0x73, 0x67, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x6f, 0x73, 0x2e, 0x65, + 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x09, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x68, 0x65, 0x6c, + 0x70, 0x5f, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x09, 0x09, 0x6f, 0x73, 0x2e, + 0x65, 0x78, 0x69, 0x74, 0x28, 0x30, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x2e, 0x2e, 0x2e, 0x7d, + 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, + 0x63, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x63, 0x6d, 0x64, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x22, 0x29, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, + 0x6c, 0x22, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6b, 0x64, + 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x2e, 0x6d, + 0x6b, 0x64, 0x69, 0x72, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x69, 0x72, + 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x2e, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x0a, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x64, + 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x0a, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x2e, 0x70, 0x61, + 0x72, 0x73, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6d, + 0x6f, 0x6f, 0x6e, 0x63, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x0a, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, + 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x6f, + 0x6f, 0x6e, 0x63, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, + 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x09, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x64, + 0x69, 0x72, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, + 0x2e, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x2e, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, + 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x73, 0x28, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x73, + 0x63, 0x61, 0x6e, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x28, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, + 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x29, 0x0a, + 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, + 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x24, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x64, 0x75, 0x70, + 0x73, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x66, + 0x6e, 0x29, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, + 0x73, 0x68, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x7b, + 0x7d, 0x0a, 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x76, + 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x74, + 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x20, 0x3d, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6e, 0x28, 0x76, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x76, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x68, 0x61, 0x73, 0x68, 0x5b, 0x64, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, + 0x69, 0x6e, 0x61, 0x6c, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x09, 0x09, 0x09, + 0x68, 0x61, 0x73, 0x68, 0x5b, 0x64, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x09, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x73, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x66, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, 0x0a, 0x09, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x7b, 0x7d, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6c, + 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x6d, 0x6f, + 0x64, 0x65, 0x22, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x73, 0x75, + 0x62, 0x5f, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x28, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x09, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x7b, 0x0a, 0x09, 0x09, 0x09, + 0x09, 0x73, 0x75, 0x62, 0x5f, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, + 0x09, 0x09, 0x09, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x73, 0x75, 0x62, 0x5f, 0x66, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, + 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x09, + 0x7d, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x09, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, + 0x20, 0x7b, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x0a, 0x09, 0x09, 0x09, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x74, 0x29, 0x0a, 0x09, 0x09, + 0x7d, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x28, 0x29, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x74, + 0x64, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x22, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x20, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, + 0x0a, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x69, 0x6e, + 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x65, 0x78, 0x74, + 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x74, + 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x65, 0x65, + 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, 0x29, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x09, 0x6f, 0x73, 0x2e, 0x65, + 0x78, 0x69, 0x74, 0x28, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x64, 0x2c, 0x20, 0x23, 0x61, 0x72, 0x67, 0x20, 0x64, + 0x6f, 0x0a, 0x09, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x69, 0x66, 0x20, 0x23, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, 0x70, 0x28, 0x22, 0x4e, + 0x6f, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, + 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x5f, 0x64, 0x75, 0x70, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x29, + 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x5b, 0x32, + 0x5d, 0x0a, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x0a, 0x69, 0x66, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x23, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x6c, + 0x70, 0x28, 0x22, 0x2d, 0x6f, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x20, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, + 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x2d, 0x2d, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, + 0x65, 0x65, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x0a, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, + 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x77, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x73, 0x22, 0x29, 0x0a, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x77, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2e, 0x49, 0x6e, 0x6f, 0x74, + 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, 0x68, 0x65, 0x72, 0x3a, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2e, 0x49, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, 0x68, 0x65, 0x72, 0x28, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x29, 0x3a, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x28, 0x29, 0x0a, 0x09, 0x65, 0x6e, 0x64, + 0x0a, 0x0a, 0x09, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x6c, 0x65, 0x65, 0x70, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x29, 0x3a, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x28, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x69, 0x66, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x77, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, + 0x74, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x20, 0x69, 0x6e, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x6c, 0x69, 0x6e, 0x74, 0x22, 0x0a, 0x09, 0x09, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, + 0x6e, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x0a, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x09, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x77, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x29, 0x0a, 0x09, 0x2d, 0x2d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x74, + 0x6c, 0x2d, 0x63, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x09, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x2c, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x28, 0x29, + 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x09, 0x09, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, + 0x65, 0x64, 0x21, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x29, + 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, + 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x74, 0x29, 0x0a, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, + 0x73, 0x2e, 0x6f, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, + 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x66, 0x20, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x09, 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, 0x6e, + 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x09, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x09, 0x09, + 0x09, 0x09, 0x22, 0x22, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x22, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x65, 0x72, + 0x72, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x22, 0x5c, 0x6e, 0x22, 0x2c, + 0x0a, 0x09, 0x09, 0x09, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, + 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6d, 0x73, 0x67, 0x28, 0x22, 0x42, + 0x75, 0x69, 0x6c, 0x74, 0x22, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x22, 0x2d, 0x3e, 0x22, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x22, 0x5c, 0x6e, + 0x51, 0x75, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, 0x69, + 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x3b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x20, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x22, + 0x0a, 0x09, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x0a, 0x09, + 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x2e, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x68, 0x61, 0x73, + 0x5f, 0x6c, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x72, 0x65, 0x73, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x09, 0x09, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x68, 0x61, 0x73, + 0x5f, 0x6c, 0x69, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x5c, + 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, + 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6c, + 0x69, 0x6e, 0x74, 0x65, 0x64, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, + 0x6f, 0x73, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0x0a, 0x09, + 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x09, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x2c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x09, 0x09, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x29, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x6f, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x6f, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x09, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x2c, 0x20, 0x7b, 0x0a, 0x09, 0x09, 0x09, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, + 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x62, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x6f, + 0x70, 0x74, 0x73, 0x2e, 0x62, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x73, 0x68, + 0x6f, 0x77, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, + 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x58, 0x2c, 0x0a, 0x09, 0x09, 0x09, 0x73, + 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x72, + 0x65, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x54, 0x2c, + 0x0a, 0x09, 0x09, 0x7d, 0x29, 0x0a, 0x0a, 0x09, 0x09, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x69, 0x6f, 0x2e, 0x73, + 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x74, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x65, 0x72, 0x72, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x09, 0x09, 0x09, 0x6f, 0x73, 0x2e, + 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x6c, 0x6f, 0x67, 0x5f, + 0x6d, 0x73, 0x67, 0x28, 0x22, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x22, 0x2c, + 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x09, 0x09, 0x65, 0x6e, + 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, + 0x0a +}; +unsigned int moonc_lua_len = 5713; diff --git a/moonscript b/moonscript new file mode 160000 index 00000000..c3f4e511 --- /dev/null +++ b/moonscript @@ -0,0 +1 @@ +Subproject commit c3f4e511c21afa7d2f9b6257f9d3805da65b0313 diff --git a/moonscript-dev-1.rockspec b/moonscript-dev-1.rockspec deleted file mode 100644 index b094bfaf..00000000 --- a/moonscript-dev-1.rockspec +++ /dev/null @@ -1,63 +0,0 @@ -package = "moonscript" -version = "dev-1" - -source = { - url = "git://github.com/leafo/moonscript.git" -} - -description = { - summary = "A programmer friendly language that compiles to Lua", - detailed = "A programmer friendly language that compiles to Lua", - homepage = "http://moonscript.org", - maintainer = "Leaf Corcoran ", - license = "MIT" -} - -dependencies = { - "lua >= 5.1", - "lpeg >= 0.10, ~= 0.11", - "argparse >= 0.7", - "luafilesystem >= 1.5" -} - -build = { - type = "builtin", - modules = { - ["moon"] = "moon/init.lua", - ["moon.all"] = "moon/all.lua", - ["moonscript"] = "moonscript/init.lua", - ["moonscript.base"] = "moonscript/base.lua", - ["moonscript.cmd.coverage"] = "moonscript/cmd/coverage.lua", - ["moonscript.cmd.lint"] = "moonscript/cmd/lint.lua", - ["moonscript.cmd.moonc"] = "moonscript/cmd/moonc.lua", - ["moonscript.cmd.watchers"] = "moonscript/cmd/watchers.lua", - ["moonscript.compile"] = "moonscript/compile.lua", - ["moonscript.compile.statement"] = "moonscript/compile/statement.lua", - ["moonscript.compile.value"] = "moonscript/compile/value.lua", - ["moonscript.data"] = "moonscript/data.lua", - ["moonscript.dump"] = "moonscript/dump.lua", - ["moonscript.errors"] = "moonscript/errors.lua", - ["moonscript.line_tables"] = "moonscript/line_tables.lua", - ["moonscript.parse"] = "moonscript/parse.lua", - ["moonscript.parse.env"] = "moonscript/parse/env.lua", - ["moonscript.parse.literals"] = "moonscript/parse/literals.lua", - ["moonscript.parse.util"] = "moonscript/parse/util.lua", - ["moonscript.transform"] = "moonscript/transform.lua", - ["moonscript.transform.accumulator"] = "moonscript/transform/accumulator.lua", - ["moonscript.transform.class"] = "moonscript/transform/class.lua", - ["moonscript.transform.comprehension"] = "moonscript/transform/comprehension.lua", - ["moonscript.transform.destructure"] = "moonscript/transform/destructure.lua", - ["moonscript.transform.names"] = "moonscript/transform/names.lua", - ["moonscript.transform.statement"] = "moonscript/transform/statement.lua", - ["moonscript.transform.statements"] = "moonscript/transform/statements.lua", - ["moonscript.transform.transformer"] = "moonscript/transform/transformer.lua", - ["moonscript.transform.value"] = "moonscript/transform/value.lua", - ["moonscript.types"] = "moonscript/types.lua", - ["moonscript.util"] = "moonscript/util.lua", - ["moonscript.version"] = "moonscript/version.lua", - }, - install = { - bin = { "bin/moon", "bin/moonc" } - } -} - diff --git a/bin/binaries/moonscript.c b/moonscript.c similarity index 70% rename from bin/binaries/moonscript.c rename to moonscript.c index 606242dd..3566fa58 100644 --- a/bin/binaries/moonscript.c +++ b/moonscript.c @@ -1,14 +1,16 @@ + #include #include #include -#include #include "moonscript.h" -#include "argparse.h" -// put whatever is on top of stack into package.loaded under name if something -// is not already there -void setloaded(lua_State* l, const char* name) { +#include + + +// put whatever is on top of stack into package.loaded under name something is +// already there +void setloaded(lua_State* l, char* name) { int top = lua_gettop(l); lua_getglobal(l, "package"); lua_getfield(l, -1, "loaded"); @@ -28,14 +30,10 @@ LUALIB_API int luaopen_moonscript(lua_State *l) { luaopen_lpeg(l); setloaded(l, "lpeg"); - // Load argparse (splat output sets up package.preload) - if (luaL_loadbuffer(l, (const char *)argparse_lua, argparse_lua_len, "argparse.lua") == 0) { - lua_call(l, 0, 0); - } - if (luaL_loadbuffer(l, (const char *)moonscript_lua, moonscript_lua_len, "moonscript.lua") == 0) { lua_call(l, 0, 1); return 1; } return 0; -} +}; + diff --git a/moonscript.h b/moonscript.h new file mode 100644 index 00000000..546f558f --- /dev/null +++ b/moonscript.h @@ -0,0 +1,14398 @@ +unsigned char moonscript_lua[] = { + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x30, 0x2e, + 0x35, 0x2e, 0x30, 0x22, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x4d, 0x6f, 0x6f, 0x6e, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, + 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, + 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x70, 0x65, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x2c, 0x20, + 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x2c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x70, 0x6f, 0x73, 0x5f, 0x74, + 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, + 0x72, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5b, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x72, 0x65, 0x61, + 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x28, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5b, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, + 0x20, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x69, + 0x5d, 0x2c, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x22, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, + 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x20, 0x3d, 0x20, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x23, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5b, 0x73, 0x74, 0x6f, + 0x70, 0x5d, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x6f, 0x70, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x2d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, + 0x30, 0x20, 0x3c, 0x20, 0x30, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x23, 0x74, + 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x2b, 0x20, 0x5f, + 0x6d, 0x61, 0x78, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5b, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, + 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x27, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x27, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5b, 0x23, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5b, 0x23, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x5d, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, + 0x72, 0x65, 0x70, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, + 0x6b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x65, 0x78, + 0x74, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x56, 0x2c, 0x20, 0x53, 0x2c, 0x20, 0x43, 0x74, + 0x2c, 0x20, 0x43, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x56, 0x2c, 0x20, 0x53, + 0x2c, 0x20, 0x43, 0x74, 0x2c, 0x20, 0x43, 0x20, 0x3d, 0x20, 0x6c, 0x70, + 0x65, 0x67, 0x2e, 0x56, 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x53, + 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x43, 0x74, 0x2c, 0x20, 0x6c, + 0x70, 0x65, 0x67, 0x2e, 0x43, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x3a, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x48, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x56, 0x28, 0x22, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x29, 0x2c, 0x20, 0x56, 0x28, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, + 0x53, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x70, + 0x65, 0x67, 0x2e, 0x50, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, + 0x2a, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x43, 0x74, + 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x5e, 0x20, 0x31, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x22, 0x5c, 0x74, 0x22, 0x20, 0x2a, 0x20, 0x43, 0x28, 0x28, 0x31, + 0x20, 0x2d, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x29, 0x20, 0x5e, 0x20, + 0x30, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x2b, 0x20, 0x2d, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x27, 0x5e, 0x28, 0x2e, + 0x2d, 0x29, 0x3a, 0x28, 0x25, 0x64, 0x2b, 0x29, 0x3a, 0x20, 0x28, 0x2e, + 0x2a, 0x29, 0x24, 0x27, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, + 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3a, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x63, 0x61, 0x63, 0x68, 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3a, 0x20, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x28, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x29, 0x20, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x67, + 0x6c, 0x65, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0x3d, 0x20, 0x67, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x63, 0x65, 0x20, 0x69, 0x6e, + 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x28, 0x74, 0x72, 0x61, 0x63, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x65, 0x72, 0x72, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x5c, 0x74, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2c, 0x20, 0x22, + 0x5c, 0x6e, 0x5c, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, + 0x61, 0x63, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, + 0x6d, 0x64, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x66, 0x73, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, + 0x66, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x73, 0x70, 0x6c, + 0x69, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, + 0x72, 0x73, 0x65, 0x70, 0x2c, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, + 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2c, 0x20, 0x6d, 0x6b, 0x64, 0x69, + 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x74, + 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x62, + 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, + 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x5f, 0x63, + 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x2f, 0x22, + 0x0a, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, + 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, + 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, + 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x5b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, 0x69, 0x72, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x28, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6c, 0x66, 0x73, 0x2e, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x65, 0x73, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x22, + 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x2e, + 0x2d, 0x29, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x5f, + 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, + 0x2a, 0x24, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x22, 0x5e, 0x28, 0x2e, 0x2d, 0x29, 0x5b, 0x5e, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, + 0x69, 0x72, 0x73, 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x5e, 0x2e, 0x2d, 0x28, 0x5b, 0x5e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5d, 0x2a, 0x29, 0x24, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, + 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x2e, 0x6d, 0x6f, + 0x6f, 0x6e, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x2e, 0x6c, 0x75, 0x61, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x77, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x6c, 0x75, + 0x61, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, + 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x22, 0x25, 0x2e, 0x33, + 0x66, 0x6d, 0x73, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x28, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x31, 0x30, 0x30, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, + 0x74, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, + 0x2e, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x4c, 0x75, 0x61, 0x53, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x65, + 0x78, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x62, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x67, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20, 0x2d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x5f, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x75, 0x6d, 0x70, + 0x2e, 0x74, 0x72, 0x65, 0x65, 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2e, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x5f, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x65, 0x65, + 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x70, 0x6f, 0x73, + 0x6d, 0x61, 0x70, 0x5f, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, + 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x20, 0x2d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x70, + 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, + 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x28, 0x22, 0x50, 0x6f, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x4c, 0x75, 0x61, + 0x22, 0x2c, 0x20, 0x22, 0x3e, 0x3e, 0x22, 0x2c, 0x20, 0x22, 0x4d, 0x6f, + 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, + 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, + 0x5f, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, + 0x62, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, + 0x72, 0x73, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x20, 0x5c, 0x74, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x5c, 0x74, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, + 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6b, 0x64, + 0x69, 0x72, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x72, + 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x77, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, + 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x66, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x63, 0x6f, 0x64, + 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x66, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x3a, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x22, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, 0x3d, 0x20, + 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x73, 0x72, 0x63, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x22, 0x43, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x66, 0x69, + 0x6e, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, + 0x22, 0x2a, 0x61, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x28, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, + 0x64, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x61, + 0x62, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, + 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x2f, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x70, + 0x61, 0x74, 0x68, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x32, 0x2c, 0x20, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x3a, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, + 0x69, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x64, 0x69, + 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, + 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x64, 0x69, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x64, 0x69, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x5e, 0x28, 0x2e, 0x2d, 0x29, 0x5b, 0x5e, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, 0x69, 0x72, + 0x73, 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x5d, 0x2a, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x5d, 0x3f, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, + 0x73, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 0x68, 0x65, 0x61, 0x64, 0x2c, + 0x20, 0x31, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, 0x6f, 0x70, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x64, 0x69, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x62, + 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x20, + 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x6b, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x6d, 0x6b, + 0x64, 0x69, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, + 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x5f, 0x64, + 0x69, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x64, 0x69, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, + 0x72, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x74, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, + 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, + 0x6e, 0x64, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x61, 0x72, 0x67, 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, + 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, 0x70, + 0x65, 0x63, 0x0a, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, + 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x73, 0x70, + 0x65, 0x63, 0x29, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x2c, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x22, 0x6e, 0x6f, + 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x66, + 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x22, 0x25, 0x77, 0x3a, 0x3f, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x3a, 0x24, 0x22, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x70, 0x61, 0x72, 0x74, 0x3a, 0x73, + 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x70, 0x61, + 0x72, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x0a, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x28, 0x73, 0x70, 0x65, 0x63, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, + 0x6c, 0x61, 0x67, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x61, 0x72, 0x67, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x61, 0x72, + 0x67, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x66, 0x6c, 0x61, 0x67, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2d, 0x28, 0x25, 0x77, 0x2b, 0x29, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x5b, 0x66, 0x6c, 0x61, 0x67, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x69, 0x6e, 0x20, + 0x66, 0x6c, 0x61, 0x67, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x22, 0x2e, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x63, 0x68, 0x61, 0x72, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x77, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x73, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x5f, 0x64, 0x75, 0x70, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x64, 0x75, 0x70, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x65, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x5f, + 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, + 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x6e, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x65, 0x6e, + 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x70, 0x6c, 0x75, 0x72, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x77, 0x6f, 0x72, 0x64, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x20, 0x77, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x20, 0x28, 0x43, 0x74, 0x72, 0x6c, 0x2d, 0x43, 0x20, 0x74, + 0x6f, 0x20, 0x65, 0x78, 0x69, 0x74, 0x29, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x6d, 0x69, 0x73, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x6d, 0x73, 0x67, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x20, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x69, 0x73, 0x63, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, + 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x49, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, + 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x6d, 0x6f, 0x6f, 0x6e, 0x63, 0x22, 0x29, 0x2e, 0x70, 0x61, 0x72, 0x73, + 0x65, 0x5f, 0x64, 0x69, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x64, 0x65, 0x73, + 0x5f, 0x30, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x69, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x2e, 0x2f, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x69, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x5f, 0x64, 0x75, 0x70, 0x65, 0x73, 0x28, 0x64, 0x69, 0x72, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, + 0x77, 0x72, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x67, 0x65, 0x74, 0x5f, + 0x64, 0x69, 0x72, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x22, 0x69, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x22, 0x2c, 0x20, 0x70, 0x6c, 0x75, + 0x72, 0x61, 0x6c, 0x28, 0x23, 0x64, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x22, + 0x64, 0x69, 0x72, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, + 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x69, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x69, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x64, 0x69, 0x72, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, + 0x72, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x3a, 0x61, 0x64, 0x64, 0x77, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, + 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x49, + 0x4e, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x57, 0x52, 0x49, 0x54, + 0x45, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x2e, 0x49, + 0x4e, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x5f, 0x54, 0x4f, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x77, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x77, 0x64, 0x5d, + 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, + 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x76, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x65, 0x76, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x24, 0x22, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x77, 0x64, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x65, 0x76, 0x2e, 0x77, 0x64, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x69, 0x72, 0x20, + 0x7e, 0x3d, 0x20, 0x22, 0x2e, 0x2f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x2e, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x28, 0x66, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x30, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x49, 0x6e, 0x6f, + 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, 0x68, 0x65, 0x72, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, + 0x67, 0x65, 0x74, 0x28, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x72, + 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x22, + 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x69, + 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, + 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x68, 0x65, + 0x72, 0x69, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, + 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x57, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x73, + 0x6c, 0x65, 0x65, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, + 0x65, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x29, 0x2e, + 0x73, 0x6c, 0x65, 0x65, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, + 0x6c, 0x65, 0x65, 0x70, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x22, 0x29, 0x2e, 0x5f, 0x73, 0x6c, 0x65, 0x65, 0x70, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x6f, 0x63, + 0x6b, 0x65, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6c, 0x65, + 0x65, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x61, 0x63, 0x68, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, + 0x65, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x66, + 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6c, 0x66, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x6c, 0x65, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x67, 0x65, 0x74, 0x5f, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x5f, 0x66, 0x75, + 0x6e, 0x63, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x28, 0x22, 0x70, 0x6f, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x20, 0x70, 0x6c, 0x75, 0x72, 0x61, + 0x6c, 0x28, 0x23, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x22, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x22, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x66, 0x73, 0x2e, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x28, 0x66, + 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5b, 0x66, 0x69, 0x6c, + 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x5d, 0x20, + 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x69, 0x6d, 0x65, 0x20, 0x3e, 0x20, 0x6d, 0x6f, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x69, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x79, 0x69, + 0x65, 0x6c, 0x64, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x65, 0x65, 0x70, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x63, 0x6c, 0x73, + 0x2c, 0x20, 0x22, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, + 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x65, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, + 0x6f, 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, 0x68, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x49, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x57, 0x61, 0x63, + 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, + 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x67, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, + 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x73, 0x74, + 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, + 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, + 0x69, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, + 0x2e, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x68, 0x61, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, + 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, + 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5e, 0x40, 0x22, 0x2c, 0x20, + 0x22, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x61, + 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, + 0x7c, 0x20, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x69, 0x6e, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x3a, 0x67, 0x6d, 0x61, + 0x74, 0x63, 0x68, 0x28, 0x22, 0x28, 0x2e, 0x2d, 0x29, 0x5c, 0x6e, 0x22, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x61, 0x6d, 0x74, 0x74, + 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x25, 0x20, + 0x35, 0x64, 0x22, 0x29, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, + 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x2a, + 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6f, 0x72, + 0x61, 0x6d, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x7c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6c, 0x6f, 0x67, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x6f, 0x64, + 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x73, 0x65, + 0x74, 0x68, 0x6f, 0x6f, 0x6b, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x66, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x31, 0x2e, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x66, 0x6e, 0x5f, 0x30, 0x28, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x31, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, + 0x2c, 0x20, 0x22, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x73, 0x65, 0x74, 0x68, 0x6f, + 0x6f, 0x6b, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, + 0x69, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x5f, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x6f, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x32, 0x2c, + 0x20, 0x22, 0x53, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x5b, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5b, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5d, 0x5b, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x6f, 0x5d, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x66, + 0x69, 0x6c, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x31, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6c, + 0x69, 0x6e, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x5d, + 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x20, 0x3d, + 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5b, 0x66, + 0x69, 0x6c, 0x65, 0x5d, 0x5b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5d, 0x20, 0x2b, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, + 0x20, 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x28, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x70, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x72, 0x65, 0x73, 0x65, 0x74, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x20, 0x3d, 0x20, 0x43, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6d, 0x64, 0x2e, + 0x6c, 0x69, 0x6e, 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x74, 0x0a, 0x20, + 0x20, 0x53, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x2e, 0x53, 0x65, + 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x2e, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, + 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, + 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x65, 0x74, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x5f, 0x47, 0x27, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x27, 0x5f, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x61, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x62, 0x69, + 0x74, 0x33, 0x32, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, + 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x6f, 0x72, + 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x27, 0x64, 0x65, 0x62, 0x75, 0x67, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, + 0x76, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x67, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x69, 0x6f, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x6c, 0x6f, 0x61, 0x64, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x6c, 0x6f, 0x61, 0x64, 0x66, 0x69, 0x6c, + 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x6d, 0x61, 0x74, 0x68, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x6e, 0x65, 0x78, 0x74, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x6f, 0x73, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x70, 0x61, 0x69, 0x72, 0x73, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x70, 0x63, 0x61, 0x6c, 0x6c, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x72, 0x61, 0x77, + 0x65, 0x71, 0x75, 0x61, 0x6c, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x27, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x72, 0x61, 0x77, 0x6c, 0x65, 0x6e, 0x27, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x72, 0x61, 0x77, 0x73, 0x65, 0x74, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, + 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x27, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x27, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x27, 0x74, 0x6f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x79, + 0x70, 0x65, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, + 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, 0x73, 0x65, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, + 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x6c, 0x69, 0x6e, + 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x6e, + 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, + 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, 0x73, + 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x69, 0x6e, + 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x70, + 0x6f, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, + 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5b, + 0x70, 0x6f, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5b, 0x70, 0x6f, 0x73, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5b, 0x70, 0x6f, 0x73, 0x5d, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x6f, 0x73, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, + 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x20, 0x3c, 0x20, + 0x62, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x64, 0x65, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x5b, 0x31, 0x5d, + 0x2c, 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x5b, 0x32, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x67, 0x65, + 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x28, 0x29, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x20, 0x62, 0x75, 0x74, 0x20, 0x75, 0x6e, 0x75, 0x73, + 0x65, 0x64, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x60, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x28, 0x6e, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x60, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, + 0x22, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, + 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x75, 0x73, + 0x65, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x2e, + 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, + 0x6e, 0x75, 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x75, 0x6e, 0x75, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x75, 0x73, 0x65, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x63, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x66, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x68, + 0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x5b, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x69, 0x6e, + 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x60, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x60, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5b, 0x2d, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x63, + 0x2e, 0x72, 0x65, 0x66, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x76, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, + 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x69, + 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x72, + 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x68, + 0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x72, 0x65, 0x61, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, + 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x5f, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, 0x75, + 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, + 0x6e, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x6f, 0x72, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x2e, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x6e, + 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x72, + 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x20, 0x6f, 0x72, 0x20, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x63, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, + 0x65, 0x74, 0x28, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, + 0x77, 0x67, 0x65, 0x74, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x5f, + 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x68, + 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, + 0x74, 0x65, 0x64, 0x28, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x30, 0x2c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x4c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x74, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x70, 0x6f, + 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x5b, 0x31, 0x5d, 0x2c, 0x20, + 0x5f, 0x64, 0x65, 0x73, 0x5f, 0x30, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x6f, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x69, 0x6e, + 0x65, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x73, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x20, 0x3d, 0x20, 0x22, 0x3e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x65, 0x70, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6d, 0x61, + 0x74, 0x68, 0x2e, 0x6d, 0x61, 0x78, 0x28, 0x23, 0x6d, 0x73, 0x67, 0x2c, + 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x28, 0x22, 0x3d, 0x22, 0x29, 0x3a, 0x72, 0x65, 0x70, 0x28, + 0x73, 0x65, 0x70, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x73, 0x67, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, + 0x64, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x22, 0x5c, 0x6e, + 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6c, 0x69, 0x6e, + 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x53, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x29, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x72, + 0x65, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x77, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x6e, + 0x75, 0x73, 0x65, 0x64, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x5f, 0x6c, 0x69, 0x6e, 0x74, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, + 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x2c, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x0a, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, + 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x66, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x64, 0x65, 0x28, 0x66, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x22, + 0x2a, 0x61, 0x22, 0x29, 0x2c, 0x20, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x66, + 0x6f, 0x72, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, + 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, + 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x53, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x53, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, + 0x20, 0x3d, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5f, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x3c, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7b, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x7d, 0x3e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x75, 0x73, 0x68, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x2e, 0x2e, 0x2e, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x3a, 0x70, 0x75, 0x73, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x23, + 0x73, 0x65, 0x6c, 0x66, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x75, + 0x73, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, + 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, + 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, + 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, + 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x65, 0x74, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x61, 0x6e, 0x64, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x64, 0x6f, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x65, 0x6c, 0x73, 0x65, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x65, 0x6e, 0x64, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x66, 0x6f, 0x72, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x69, + 0x66, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x69, 0x6e, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6e, 0x69, 0x6c, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6f, 0x72, 0x27, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x27, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x68, 0x65, 0x6e, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x74, 0x72, 0x75, 0x65, + 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x77, 0x68, 0x69, + 0x6c, 0x65, 0x27, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x53, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x65, 0x74, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x75, + 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, + 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6d, 0x6f, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x73, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x73, 0x5f, 0x61, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, + 0x63, 0x6c, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x3d, + 0x20, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x73, 0x2e, + 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6c, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, + 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x70, + 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, + 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, 0x62, 0x28, + 0x31, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x3a, 0x67, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x72, 0x69, 0x6d, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x22, 0x5e, 0x25, 0x73, 0x2a, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x73, + 0x2a, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x6e, 0x75, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, + 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x28, 0x5b, 0x5e, + 0x5c, 0x6e, 0x5d, 0x2a, 0x29, 0x5c, 0x6e, 0x3f, 0x22, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, + 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, + 0x6d, 0x20, 0x3e, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x0a, 0x20, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, + 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x72, + 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x28, 0x2e, 0x2d, + 0x29, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x64, 0x75, + 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x77, 0x68, 0x61, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x64, 0x75, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x77, + 0x68, 0x61, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x27, 0x22, 0x27, 0x20, 0x2e, 0x2e, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, + 0x2e, 0x2e, 0x20, 0x27, 0x22, 0x5c, 0x6e, 0x27, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x77, 0x68, 0x61, 0x74, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x77, 0x68, 0x61, 0x74, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, + 0x2e, 0x2e, 0x2e, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x6e, 0x5b, 0x77, 0x68, 0x61, 0x74, + 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x77, 0x68, 0x61, 0x74, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, + 0x28, 0x22, 0x20, 0x22, 0x29, 0x3a, 0x72, 0x65, 0x70, 0x28, 0x64, 0x65, + 0x70, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x34, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x5f, 0x64, 0x75, 0x6d, + 0x70, 0x28, 0x76, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, + 0x6e, 0x5b, 0x77, 0x68, 0x61, 0x74, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x5c, 0x6e, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x22, 0x20, + 0x22, 0x29, 0x3a, 0x72, 0x65, 0x70, 0x28, 0x28, 0x64, 0x65, 0x70, 0x74, + 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x29, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x7d, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x77, 0x68, 0x61, 0x74, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x77, 0x68, 0x61, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, + 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x6f, 0x73, 0x6d, + 0x61, 0x70, 0x2c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, + 0x72, 0x73, 0x28, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x73, 0x6f, 0x72, 0x74, 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x73, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x61, 0x2c, 0x20, 0x62, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x5b, 0x31, 0x5d, 0x20, + 0x3c, 0x20, 0x62, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x69, 0x72, 0x20, 0x3d, + 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x70, 0x61, 0x69, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x63, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, + 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x6d, 0x6f, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x70, 0x6f, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, + 0x22, 0x5c, 0x74, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x5b, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x6c, 0x75, 0x61, 0x5f, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x5d, 0x20, + 0x3e, 0x3e, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3a, 0x5b, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x20, 0x5d, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x74, 0x66, + 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, + 0x76, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x75, 0x70, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x69, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x75, + 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x66, + 0x6e, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x6e, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x2c, + 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x6e, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x20, 0x6f, 0x72, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x75, 0x70, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5f, 0x45, 0x4e, 0x56, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x22, + 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x28, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x74, + 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x70, 0x74, 0x73, + 0x2c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x6e, 0x69, 0x6c, 0x2c, + 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, + 0x7d, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, + 0x64, 0x75, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x60, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x65, + 0x79, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x60, 0x20, 0x66, 0x72, 0x6f, + 0x6d, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x5f, + 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x70, 0x6c, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, + 0x3d, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x70, 0x6f, 0x73, + 0x6d, 0x61, 0x70, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, + 0x66, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x66, 0x65, + 0x6e, 0x76, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x66, + 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, + 0x76, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, + 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x22, 0x29, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, + 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, + 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x61, 0x64, 0x64, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x75, 0x6e, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x22, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x64, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x5b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x28, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x64, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x61, + 0x73, 0x5f, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x20, + 0x3c, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x66, 0x6e, + 0x64, 0x65, 0x66, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x5f, + 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x23, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, + 0x20, 0x3d, 0x3d, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x66, + 0x6e, 0x64, 0x65, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x75, + 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x20, 0x3e, 0x20, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x61, 0x64, 0x64, 0x28, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x2c, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, + 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, + 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x22, 0x2c, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, + 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x28, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x22, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5b, 0x22, 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x22, 0x69, 0x66, 0x20, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x2c, + 0x20, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x6f, + 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x5f, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x22, + 0x65, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, + 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x32, + 0x5d, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, + 0x78, 0x74, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x6e, + 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x23, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x28, + 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, + 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x22, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 0x20, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, + 0x29, 0x2c, 0x20, 0x22, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x20, 0x22, 0x2c, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x3d, 0x20, 0x22, 0x2c, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x2c, 0x20, 0x22, 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x6c, 0x6f, 0x6f, 0x70, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, + 0x73, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x70, + 0x73, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x20, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x70, + 0x20, 0x3d, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x6c, 0x6f, 0x6f, 0x70, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x3a, + 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, + 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x6f, 0x70, + 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, 0x20, 0x69, 0x6e, + 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x6f, 0x70, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x65, 0x78, 0x70, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, + 0x70, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x73, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x65, 0x78, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x22, 0x2c, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x6f, 0x70, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x22, + 0x20, 0x64, 0x6f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x2a, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x5e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x64, 0x65, + 0x63, 0x6c, 0x61, 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x3a, 0x63, 0x61, 0x6c, 0x6c, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, + 0x74, 0x6d, 0x73, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, + 0x6d, 0x73, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x61, + 0x74, 0x61, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x2e, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x0a, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x22, 0x29, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, + 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, 0x3d, 0x20, 0x22, 0x2c, 0x22, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x5c, 0x72, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x5c, 0x5c, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x5c, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x5c, 0x5c, 0x6e, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x62, 0x65, 0x66, + 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x61, 0x66, 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x2c, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x34, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x3a, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x20, 0x3d, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x3a, 0x63, + 0x61, 0x6c, 0x6c, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x20, 0x25, 0x20, 0x32, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x21, 0x3d, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x7e, 0x3d, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x76, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3e, + 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x28, 0x69, + 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, + 0x29, 0x2c, 0x20, 0x22, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x32, 0x2c, 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, + 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x22, 0x28, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, + 0x2c, 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x2c, 0x20, 0x69, 0x6e, 0x6e, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x64, + 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, + 0x69, 0x6d, 0x3a, 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x25, 0x5b, 0x22, + 0x2c, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x27, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x69, + 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x22, 0x27, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x3a, + 0x67, 0x73, 0x75, 0x62, 0x28, 0x22, 0x5b, 0x5c, 0x72, 0x5c, 0x6e, 0x5d, + 0x22, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, 0x2e, 0x2e, + 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x2e, 0x2e, 0x20, 0x65, 0x6e, + 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, 0x20, 0x6f, 0x72, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x22, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x2d, 0x64, 0x6f, 0x74, 0x20, 0x73, 0x79, + 0x6e, 0x74, 0x61, 0x78, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5b, 0x32, 0x5d, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x22, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x75, 0x70, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x28, 0x22, 0x2c, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x28, + 0x61, 0x72, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x29, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x5b, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x61, 0x72, 0x67, 0x29, 0x2c, 0x20, 0x22, 0x5d, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x64, + 0x6f, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x2e, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x3a, 0x22, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x75, + 0x62, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x55, 0x6e, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x63, 0x6f, + 0x6c, 0x6f, 0x6e, 0x20, 0x73, 0x74, 0x75, 0x62, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x20, 0x6f, 0x72, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x28, 0x22, 0x2c, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x23, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x28, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x2c, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x2c, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x61, 0x72, 0x67, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x65, 0x6c, 0x66, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x6c, + 0x66, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, + 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x66, 0x61, 0x74, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x77, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3e, 0x20, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x77, + 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x28, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x70, 0x75, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, + 0x23, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x27, 0x69, 0x66, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, + 0x65, 0x78, 0x70, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x27, 0x3d, 0x3d, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x6e, 0x69, + 0x6c, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x27, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x27, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x72, + 0x67, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, + 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x23, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x23, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3e, 0x20, 0x23, + 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, + 0x23, 0x61, 0x72, 0x67, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x61, + 0x72, 0x67, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x2e, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, + 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x22, 0x7b, 0x22, 0x2c, 0x20, 0x22, 0x7d, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x61, 0x74, + 0x61, 0x2e, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, + 0x64, 0x73, 0x5b, 0x6b, 0x65, 0x79, 0x5b, 0x32, 0x5d, 0x5d, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x22, 0x27, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x5b, 0x32, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x5b, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x5b, 0x22, 0x2c, 0x20, 0x5f, 0x77, + 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x6b, 0x65, 0x79, 0x29, 0x2c, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, + 0x28, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x22, 0x20, 0x3d, + 0x20, 0x22, 0x2c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x23, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x69, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, + 0x61, 0x64, 0x64, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, + 0x6e, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, + 0x65, 0x28, 0x22, 0x2d, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, + 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x3a, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x69, 0x74, 0x6e, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x22, 0x7e, 0x22, 0x2c, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x6e, 0x6f, 0x74, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x22, 0x6e, 0x6f, 0x74, 0x20, 0x22, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x2e, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3a, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x66, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x67, 0x65, 0x74, 0x28, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x73, 0x75, 0x70, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x61, 0x77, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, + 0x65, 0x6e, 0x64, 0x28, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x70, 0x2c, 0x20, + 0x64, 0x65, 0x70, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x22, 0x27, 0x20, 0x2e, 0x2e, + 0x20, 0x6f, 0x70, 0x20, 0x2e, 0x2e, 0x20, 0x27, 0x22, 0x27, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x70, 0x29, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x6f, 0x70, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, + 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x7b, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x70, 0x6f, 0x73, 0x20, + 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x20, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x7d, 0x22, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6f, 0x70, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x65, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x66, 0x6c, + 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x65, 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, + 0x22, 0x29, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x2c, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x52, 0x75, 0x6e, 0x2c, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, + 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, + 0x6e, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, + 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, + 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, + 0x52, 0x75, 0x6e, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, + 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, + 0x67, 0x75, 0x6c, 0x61, 0x72, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x2c, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, + 0x67, 0x75, 0x6c, 0x61, 0x72, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x2c, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x20, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x73, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x2c, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x73, 0x5f, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, + 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, + 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x28, 0x22, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x75, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x62, + 0x6f, 0x64, 0x79, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x70, 0x75, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x6e, 0x69, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x73, 0x70, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x65, 0x6e, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x72, 0x75, 0x65, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x6f, 0x75, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x5f, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x23, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x3d, + 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x73, 0x74, + 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x6d, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6d, 0x5b, 0x32, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x5b, 0x32, 0x5d, + 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, + 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, 0x20, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x66, 0x73, 0x74, + 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x23, 0x69, 0x66, 0x73, 0x74, 0x6d, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x69, + 0x66, 0x73, 0x74, 0x6d, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, + 0x61, 0x73, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x63, 0x61, 0x73, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x69, 0x66, + 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x20, 0x2d, 0x20, + 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x5b, + 0x32, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x5b, 0x33, + 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x69, 0x66, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x66, 0x73, 0x74, 0x6d, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x72, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x20, + 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6e, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, + 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x62, + 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x69, + 0x73, 0x74, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x23, 0x72, 0x65, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, + 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5b, 0x72, 0x65, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, + 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x28, 0x72, 0x65, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, + 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x6f, 0x72, + 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x62, 0x6c, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x5f, 0x6f, 0x6e, 0x63, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, + 0x78, 0x70, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x28, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x72, 0x65, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, + 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x5e, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, + 0x66, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x28, 0x73, 0x74, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x75, 0x22, 0x29, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x75, 0x6d, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x3d, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x75, 0x6d, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x5f, 0x6f, 0x6e, 0x63, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, + 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x64, 0x78, 0x20, 0x3d, 0x20, 0x23, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x5b, 0x69, 0x64, 0x78, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x74, 0x62, + 0x6c, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, + 0x68, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x5f, 0x6f, 0x6e, 0x63, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x75, 0x6d, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x73, 0x74, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, + 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, + 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, + 0x72, 0x65, 0x74, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x6f, + 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, + 0x6e, 0x64, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, + 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, + 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x6f, + 0x70, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, 0x74, 0x72, + 0x75, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x3e, 0x20, 0x32, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x61, + 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, + 0x73, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x32, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x2c, 0x20, + 0x65, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, + 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x2e, 0x2b, 0x29, + 0x3d, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, 0x5f, 0x66, 0x69, 0x6e, + 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x6f, 0x70, 0x3a, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x6f, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x28, 0x65, 0x78, 0x70, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x78, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6f, 0x70, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, + 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x2d, 0x31, 0x5d, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x2c, 0x20, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, + 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, + 0x78, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x78, 0x70, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x64, 0x6f, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x72, 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x72, 0x65, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x64, 0x65, + 0x63, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x64, 0x65, 0x63, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x69, 0x66, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x66, 0x61, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x64, + 0x65, 0x63, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x61, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, + 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x61, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x5b, 0x32, + 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, + 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x63, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x64, 0x65, 0x63, 0x5b, 0x31, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6d, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x68, 0x61, 0x73, + 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x28, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x64, 0x65, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x66, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x32, 0x5d, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, + 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x2e, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x28, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x64, 0x65, 0x73, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5b, 0x32, + 0x5d, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x64, 0x6f, + 0x22, 0x5d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5b, 0x33, + 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, + 0x34, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5b, 0x32, 0x5d, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x33, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, + 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x5f, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x27, + 0x74, 0x68, 0x65, 0x6e, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x73, 0x74, 0x6d, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x27, 0x74, 0x68, + 0x65, 0x6e, 0x27, 0x5d, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x69, 0x64, 0x78, 0x20, 0x3d, + 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, + 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x69, 0x64, 0x78, 0x5d, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x63, 0x61, 0x73, 0x65, + 0x5b, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x69, 0x64, 0x78, 0x5d, 0x2c, 0x20, + 0x72, 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x72, 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x2c, 0x20, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x5b, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x65, 0x78, 0x70, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x78, 0x70, 0x2c, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, + 0x66, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x70, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, + 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x28, 0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, + 0x70, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x31, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x69, 0x73, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x65, 0x78, 0x70, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x65, 0x78, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, + 0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x64, 0x6f, 0x22, + 0x5d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x70, 0x29, + 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x4f, + 0x4f, 0x50, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x22, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x22, 0x2c, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, + 0x74, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x28, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x5f, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x69, 0x74, 0x65, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x69, 0x6e, 0x20, + 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x64, 0x65, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x78, + 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x28, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x64, 0x65, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x69, 0x73, + 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x5f, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5b, 0x23, 0x6c, + 0x69, 0x73, 0x74, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x28, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x2c, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x6c, 0x69, + 0x73, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5b, 0x32, + 0x5d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5b, + 0x32, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x5f, + 0x74, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x6d, 0x61, + 0x78, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, + 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6d, 0x61, 0x78, + 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x65, 0x78, 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, + 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x3c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2b, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6d, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, + 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6d, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x31, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x6e, 0x29, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x29, 0x20, 0x6f, + 0x72, 0x20, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x20, 0x6f, 0x72, 0x20, + 0x4e, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x66, + 0x6f, 0x72, 0x22, 0x5d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x28, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, + 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, + 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, + 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, + 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x72, + 0x65, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x2c, 0x20, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x65, 0x78, 0x70, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x76, + 0x65, 0x72, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6f, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x2c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x6f, 0x6e, 0x64, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x61, 0x73, 0x65, 0x22, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x22, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x7e, + 0x3d, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x65, + 0x78, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x2c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, + 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x5f, + 0x65, 0x78, 0x70, 0x2c, 0x20, 0x22, 0x65, 0x78, 0x70, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x2c, 0x20, + 0x22, 0x6f, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x28, + 0x63, 0x61, 0x73, 0x65, 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x3d, 0x3d, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x70, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x61, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x66, 0x5f, + 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x66, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, + 0x63, 0x6f, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x69, 0x66, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, 0x66, + 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x69, 0x66, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, + 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x66, 0x5f, 0x73, 0x74, 0x6d, 0x2c, + 0x20, 0x69, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, + 0x65, 0x78, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, + 0x70, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, + 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x27, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x52, 0x75, 0x6e, 0x0a, 0x20, 0x20, 0x52, 0x75, 0x6e, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x2e, 0x52, 0x75, 0x6e, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x4f, 0x4e, 0x53, + 0x54, 0x52, 0x55, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x41, 0x4d, 0x45, + 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x65, 0x77, 0x22, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, + 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x4e, 0x4f, + 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, + 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, + 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, + 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, + 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x33, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x20, 0x3d, + 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x68, 0x65, + 0x61, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x68, 0x65, 0x61, 0x64, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, + 0x6e, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x67, 0x65, + 0x74, 0x28, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x61, 0x6c, + 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x22, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x69, 0x6e, 0x67, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, + 0x61, 0x69, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x65, 0x6c, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x68, 0x65, 0x61, 0x64, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, + 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x74, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x63, 0x6f, + 0x6c, 0x6f, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x69, + 0x6c, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, + 0x61, 0x6c, 0x6c, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x74, 0x61, 0x69, 0x6c, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x6f, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, + 0x61, 0x69, 0x6c, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x63, 0x61, 0x6c, 0x6c, + 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x74, 0x61, 0x69, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x74, + 0x61, 0x69, 0x6c, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x2c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x0a, 0x20, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x74, + 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x64, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x76, 0x5f, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x67, 0x65, 0x74, 0x28, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x73, 0x65, 0x74, 0x28, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x2c, 0x20, 0x6b, + 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x73, 0x65, 0x74, 0x28, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x2c, + 0x20, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, + 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x73, 0x65, 0x74, 0x28, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x22, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x76, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x74, 0x2c, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, + 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x28, 0x22, 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, + 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6c, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x28, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x22, 0x73, 0x74, 0x6d, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2c, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, + 0x70, 0x72, 0x6f, 0x70, 0x73, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, + 0x23, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x6c, + 0x66, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, + 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x3d, + 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x28, 0x76, 0x2c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6b, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6b, 0x2c, 0x20, 0x76, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2c, + 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6b, 0x65, 0x79, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x43, + 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x70, 0x65, + 0x72, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x72, 0x6f, 0x77, + 0x20, 0x3d, 0x20, 0x22, 0x66, 0x61, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5b, 0x32, 0x5d, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x23, + 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x31, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x22, 0x27, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x31, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6e, 0x69, 0x6c, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, + 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5b, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x64, 0x6f, + 0x6e, 0x27, 0x74, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x68, 0x6f, 0x77, + 0x20, 0x74, 0x6f, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x22, 0x27, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x5f, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x73, 0x75, + 0x70, 0x65, 0x72, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x69, 0x6e, 0x69, + 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, + 0x6f, 0x72, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x69, 0x66, 0x22, + 0x5d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, + 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x3d, 0x3d, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x68, 0x65, + 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x73, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x27, 0x22, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x69, 0x66, 0x22, 0x5d, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x74, 0x68, 0x65, 0x6e, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x66, 0x6e, + 0x64, 0x65, 0x66, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x6c, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x22, 0x29, + 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, + 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, + 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x6d, 0x74, + 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, + 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x6c, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, + 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x7b, 0x7d, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, + 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6c, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x6d, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x75, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, + 0x6c, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, + 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x22, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x29, 0x2c, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, + 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x63, 0x6c, + 0x73, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x22, 0x5f, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x29, 0x2c, 0x20, 0x63, 0x6c, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x29, 0x2c, + 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x69, 0x66, 0x22, 0x5d, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, 0x70, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, + 0x22, 0x5f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, + 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x28, 0x22, 0x5f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, + 0x64, 0x22, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, + 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x73, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, + 0x74, 0x28, 0x63, 0x6c, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x64, + 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x29, 0x28, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, 0x22, 0x64, 0x6f, 0x22, + 0x5d, 0x28, 0x6f, 0x75, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x6d, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, + 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6d, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x29, 0x2e, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, + 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, + 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x22, 0x29, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6a, 0x6f, + 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, + 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x31, 0x2c, + 0x20, 0x23, 0x74, 0x62, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, + 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x64, + 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x2c, 0x20, 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5b, 0x32, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, + 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, + 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x6b, 0x65, 0x79, + 0x5f, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x5b, 0x32, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6f, + 0x6c, 0x6f, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, + 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x6f, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x20, + 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, + 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x72, + 0x65, 0x66, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x20, 0x3d, 0x3d, 0x20, + 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, + 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x2c, 0x20, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x43, 0x61, 0x6e, 0x27, 0x74, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x2c, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x28, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x62, + 0x6a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x3a, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x29, 0x20, 0x6f, 0x72, + 0x20, 0x23, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x62, + 0x6a, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x6f, 0x62, 0x6a, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, + 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x6f, + 0x62, 0x6a, 0x2c, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x62, + 0x6a, 0x20, 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, + 0x23, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x62, 0x6a, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x6f, 0x62, 0x6a, 0x2c, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x6e, + 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x63, 0x6c, + 0x61, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x0a, 0x20, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x23, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x20, 0x3e, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, + 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x70, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x2c, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x2c, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3e, + 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, + 0x3e, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3c, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x69, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, + 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, 0x69, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x2c, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x28, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x73, 0x5f, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, + 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x31, 0x5d, + 0x20, 0x3d, 0x20, 0x22, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, + 0x20, 0x64, 0x6f, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x74, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x6f, + 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x74, 0x5f, 0x70, 0x75, + 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x66, 0x72, 0x65, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x74, 0x5f, 0x70, + 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, + 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x6b, 0x5d, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x28, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x25, 0x73, 0x3e, 0x22, 0x29, + 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x28, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x28, 0x25, 0x73, 0x29, 0x3e, 0x22, 0x29, 0x3a, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, + 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x22, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, + 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, + 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, + 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x0a, + 0x20, 0x20, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x76, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, + 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, + 0x22, 0x29, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, + 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x73, 0x6d, + 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x6d, + 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x29, + 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x41, 0x63, + 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x0a, 0x20, 0x20, 0x6c, 0x75, 0x61, 0x5f, 0x6b, + 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, + 0x2e, 0x6c, 0x75, 0x61, 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x52, 0x75, + 0x6e, 0x2c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, + 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x69, 0x73, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, 0x6e, 0x2c, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, + 0x73, 0x74, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x52, 0x75, 0x6e, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, + 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, + 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x6f, 0x72, + 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, + 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x64, 0x6f, 0x22, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x65, 0x78, 0x70, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, 0x3d, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, + 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x70, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x70, + 0x61, 0x72, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x6e, 0x6f, + 0x64, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x33, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x65, 0x78, + 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x33, 0x5d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x34, 0x2c, 0x20, 0x23, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, + 0x2c, 0x20, 0x22, 0x2e, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x65, + 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x41, 0x63, 0x63, 0x75, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x65, 0x78, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, + 0x3a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x78, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x3a, 0x77, 0x72, 0x61, 0x70, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, + 0x70, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, + 0x5f, 0x65, 0x78, 0x70, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x28, 0x22, 0x74, 0x62, 0x6c, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x64, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x29, 0x2c, 0x20, + 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x76, + 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x78, 0x70, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x64, 0x65, 0x73, 0x74, + 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, + 0x6f, 0x6e, 0x65, 0x28, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x29, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x28, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x69, 0x6d, 0x70, 0x6c, + 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x28, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x73, 0x22, 0x2c, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x20, 0x65, + 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, + 0x22, 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x32, 0x2c, 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x70, 0x61, 0x72, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x64, 0x6f, 0x74, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x75, 0x61, + 0x5f, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x70, 0x61, + 0x72, 0x74, 0x5b, 0x32, 0x5d, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, + 0x22, 0x27, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x74, 0x5b, 0x32, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, + 0x62, 0x61, 0x73, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x66, 0x6e, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x75, 0x70, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x32, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x72, 0x65, 0x66, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x5b, 0x32, 0x5d, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, + 0x70, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x74, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x5b, + 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x66, 0x6e, + 0x64, 0x65, 0x66, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, + 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, + 0x73, 0x75, 0x70, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x73, + 0x65, 0x6c, 0x66, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, + 0x78, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x32, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x72, + 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, + 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x28, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, 0x6e, 0x28, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x28, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, + 0x67, 0x73, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x22, + 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x66, 0x6e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x75, 0x6e, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x28, 0x22, 0x76, 0x61, 0x72, 0x61, 0x72, 0x67, 0x73, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x72, 0x67, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, + 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x2e, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, + 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x4e, 0x4f, 0x4f, + 0x50, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x6e, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x0a, 0x20, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x22, 0x29, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0a, + 0x20, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x23, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7e, 0x3d, 0x20, 0x31, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x6f, 0x64, + 0x79, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x5f, + 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x28, 0x62, 0x6f, 0x64, + 0x79, 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, + 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x69, + 0x64, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x5d, 0x20, 0x3d, + 0x20, 0x34, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, 0x3d, 0x20, + 0x33, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x34, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x69, 0x64, 0x78, 0x5b, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x77, 0x72, + 0x61, 0x70, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, + 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5b, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5d, 0x28, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x29, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x65, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x31, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, + 0x78, 0x70, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x75, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x6d, 0x20, + 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, + 0x72, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x6d, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x73, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x6d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x28, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, + 0x6e, 0x65, 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x6c, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x2b, 0x3d, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x6f, 0x64, 0x79, + 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x28, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x28, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x6c, 0x65, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, + 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x28, 0x22, 0x6c, 0x65, + 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x41, 0x63, 0x63, 0x75, 0x6d, + 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, + 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x41, + 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x29, + 0x3a, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x20, + 0x3d, 0x20, 0x41, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, + 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x22, 0x29, 0x2e, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x23, 0x63, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x2d, + 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x73, 0x5b, 0x69, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x31, + 0x5d, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x32, 0x5d, + 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x33, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x2c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x2c, 0x20, 0x69, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x61, + 0x75, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, + 0x65, 0x5b, 0x33, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x22, 0x77, 0x68, 0x65, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x20, + 0x3d, 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x31, 0x5d, 0x2c, + 0x20, 0x63, 0x6c, 0x61, 0x75, 0x73, 0x65, 0x5b, 0x32, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, + 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x75, + 0x73, 0x65, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x5b, 0x32, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x68, + 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, + 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, + 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x22, 0x29, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6f, 0x6e, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x5b, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x28, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x5b, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x28, 0x73, 0x63, 0x6f, + 0x70, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6e, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x72, 0x73, 0x5b, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, 0x7d, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x6b, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, + 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, + 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, + 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x20, 0x3d, 0x20, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x2c, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, + 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x6d, 0x74, 0x79, + 0x70, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x2c, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x4f, 0x4f, + 0x50, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x68, 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2e, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x52, 0x75, 0x6e, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x6e, 0x28, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x66, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x72, 0x75, 0x6e, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x75, 0x6e, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, + 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, + 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, 0x6e, 0x20, + 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x69, 0x64, 0x20, + 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x23, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x6d, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x6d, + 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x52, 0x75, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x73, 0x74, 0x6d, 0x5b, 0x32, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, + 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x6d, + 0x73, 0x5b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x69, + 0x64, 0x5d, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x66, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x78, 0x2c, 0x20, + 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x74, 0x6d, 0x28, 0x73, 0x74, 0x6d, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, + 0x7e, 0x3d, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x73, 0x74, 0x6d, 0x73, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x69, 0x20, 0x3d, 0x3d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x64, + 0x78, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, + 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x0a, + 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, 0x73, + 0x74, 0x75, 0x62, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x75, 0x62, + 0x20, 0x3d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5b, 0x23, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x75, 0x62, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x75, 0x62, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, + 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x69, 0x6d, + 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x74, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x74, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x63, + 0x6f, 0x70, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x73, 0x74, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, + 0x74, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x5b, 0x74, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x74, 0x6f, + 0x70, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x28, 0x73, 0x74, 0x6d, 0x2c, 0x20, 0x66, 0x6e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, + 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x6e, 0x75, 0x61, + 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5b, 0x74, 0x5d, 0x20, + 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x69, 0x73, 0x5f, 0x74, 0x6f, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x6d, 0x5b, 0x32, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, + 0x74, 0x6d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6e, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x75, 0x6e, + 0x20, 0x3d, 0x20, 0x52, 0x75, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x74, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x75, 0x62, 0x20, + 0x3d, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x73, 0x5f, 0x73, + 0x74, 0x75, 0x62, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6d, 0x70, + 0x6c, 0x69, 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x63, 0x69, + 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x65, 0x6e, 0x76, 0x27, + 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, + 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x66, + 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, + 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x66, + 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x0a, + 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x2c, 0x20, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x56, 0x2c, 0x20, 0x43, 0x6d, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x56, 0x2c, 0x20, 0x43, 0x6d, 0x74, 0x20, 0x3d, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x56, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x43, 0x6d, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x66, 0x65, 0x6e, 0x76, 0x28, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x56, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x70, + 0x72, 0x69, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x70, 0x72, 0x69, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x28, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x61, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, + 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x2e, 0x2e, 0x2e, + 0x29, 0x2c, 0x20, 0x22, 0x2c, 0x20, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x69, 0x6f, 0x2e, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x3a, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x28, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x3a, 0x72, 0x65, 0x70, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, + 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x56, 0x28, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, + 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x22, 0x22, 0x2c, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, + 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, 0x62, 0x28, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x2d, 0x31, 0x29, 0x3a, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 0x2a, + 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x22, 0x2a, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, + 0x20, 0x28, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x72, 0x65, 0x73, 0x74, 0x29, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x29, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x2a, + 0x20, 0x43, 0x6d, 0x74, 0x28, 0x76, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, + 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x2b, + 0x20, 0x43, 0x6d, 0x74, 0x28, 0x22, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x70, 0x72, 0x69, 0x6e, 0x74, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x20, 0x2d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, + 0x76, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, 0x7d, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, + 0x28, 0x22, 0x5e, 0x5b, 0x41, 0x2d, 0x5a, 0x5d, 0x5b, 0x41, 0x2d, 0x5a, + 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x2a, 0x24, 0x22, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x20, 0x3d, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x75, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x64, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x20, + 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, + 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x75, 0x74, 0x69, 0x6c, + 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x50, 0x2c, 0x20, 0x43, 0x2c, 0x20, 0x53, 0x2c, 0x20, 0x43, 0x70, 0x2c, + 0x20, 0x43, 0x6d, 0x74, 0x2c, 0x20, 0x56, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x2c, 0x20, 0x43, 0x2c, 0x20, 0x53, 0x2c, + 0x20, 0x43, 0x70, 0x2c, 0x20, 0x43, 0x6d, 0x74, 0x2c, 0x20, 0x56, 0x20, + 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x50, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x43, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x53, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x43, 0x70, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x43, 0x6d, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x56, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, + 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, + 0x29, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x0a, 0x20, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x69, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x22, 0x29, 0x2e, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x49, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x43, 0x28, 0x53, 0x28, + 0x22, 0x5c, 0x74, 0x20, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x20, + 0x2f, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, 0x5c, + 0x74, 0x20, 0x5d, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x76, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x20, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x6d, 0x20, + 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x5c, 0x74, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x2b, + 0x20, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x75, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x43, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x50, 0x28, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, + 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, + 0x74, 0x74, 0x2c, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x74, 0x74, 0x20, 0x2a, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x6c, 0x79, 0x20, 0x2b, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x6c, 0x79, + 0x20, 0x2a, 0x20, 0x43, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, + 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x28, 0x2e, 0x2d, 0x29, + 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x3a, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x2e, 0x2d, 0x24, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x20, 0x69, 0x6e, 0x20, 0x73, 0x74, + 0x72, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x2e, 0x22, + 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5d, + 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x23, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, + 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x5b, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5d, 0x2c, 0x20, 0x63, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x5b, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x2b, 0x20, + 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, + 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x70, + 0x6f, 0x73, 0x20, 0x2d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x6b, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x3c, 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, + 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, + 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x65, 0x66, 0x74, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0xe2, 0x97, 0x89, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x73, 0x5b, 0x6b, 0x20, 0x2d, 0x20, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x6b, 0x20, + 0x2b, 0x20, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x66, 0x74, 0x65, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x75, + 0x74, 0x2c, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x2d, + 0x20, 0x23, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x6f, 0x75, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x22, 0x2d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6f, + 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x28, 0x6f, 0x75, 0x74, 0x3a, 0x67, 0x73, 0x75, 0x62, + 0x28, 0x22, 0x5c, 0x6e, 0x2a, 0x24, 0x22, 0x2c, 0x20, 0x22, 0x22, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x0a, 0x20, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, + 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, + 0x0a, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x74, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, + 0x43, 0x70, 0x28, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x61, 0x74, 0x74, 0x29, + 0x20, 0x2f, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x67, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x67, 0x6f, + 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x77, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x43, + 0x6d, 0x74, 0x28, 0x22, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, + 0x74, 0x28, 0x22, 0x2b, 0x2b, 0x20, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x77, 0x68, 0x61, 0x74, 0x29, 0x2c, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2e, + 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x73, + 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x6f, + 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x0a, 0x20, 0x20, 0x66, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, + 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x62, + 0x6c, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x22, 0x72, 0x65, 0x66, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, + 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x73, 0x65, 0x6c, 0x66, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x6f, 0x72, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, 0x20, + 0x22, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, + 0x72, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, + 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x29, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, + 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x65, 0x78, + 0x70, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x6c, 0x68, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x73, + 0x2c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, + 0x65, 0x78, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x6c, 0x68, 0x73, 0x5f, + 0x65, 0x78, 0x70, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6c, 0x68, 0x73, 0x5f, 0x65, 0x78, 0x70, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x68, 0x73, 0x5f, + 0x65, 0x78, 0x70, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, + 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x29, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x78, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x68, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x73, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, + 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x69, 0x66, 0x20, 0x22, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x68, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x73, 0x5b, 0x31, + 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6c, 0x68, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x68, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x68, 0x73, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x0a, + 0x20, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x0a, 0x20, 0x20, 0x73, 0x79, + 0x6d, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x64, 0x65, 0x6c, + 0x69, 0x6d, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x22, 0x5c, 0x5c, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x29, 0x20, 0x2b, 0x20, + 0x22, 0x5c, 0x5c, 0x5c, 0x5c, 0x22, 0x20, 0x2b, 0x20, 0x28, 0x31, 0x20, + 0x2d, 0x20, 0x50, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x27, 0x23, + 0x7b, 0x27, 0x29, 0x20, 0x2a, 0x20, 0x56, 0x28, 0x22, 0x45, 0x78, 0x70, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x27, 0x7d, 0x27, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x28, 0x43, 0x28, 0x28, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x20, 0x2d, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x29, 0x20, + 0x5e, 0x20, 0x31, 0x29, 0x20, 0x2b, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x22, 0x29, 0x29, + 0x20, 0x5e, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x43, 0x28, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, + 0x5e, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x43, 0x28, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, + 0x29, 0x29, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x2a, + 0x20, 0x73, 0x79, 0x6d, 0x28, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x20, + 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, 0x0a, 0x20, 0x20, 0x77, + 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x0a, 0x20, + 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x61, 0x72, 0x67, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x72, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x61, 0x6c, 0x6c, + 0x65, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, + 0x6d, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x64, 0x65, 0x63, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x6d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x0a, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6c, 0x75, 0x61, + 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x23, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, + 0x3d, 0x20, 0x23, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x0a, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x2d, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x49, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x43, 0x75, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x65, 0x6e, 0x73, + 0x75, 0x72, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x3d, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x6f, 0x72, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x79, 0x6d, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x79, 0x6d, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x5f, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x20, 0x3d, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x72, 0x61, 0x70, + 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6c, 0x75, + 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6f, 0x74, + 0x20, 0x3d, 0x20, 0x67, 0x6f, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x68, 0x6f, + 0x77, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, + 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, + 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x2e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x73, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x61, 0x66, + 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, + 0x6c, 0x22, 0x29, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x53, 0x2c, 0x20, 0x50, 0x2c, 0x20, 0x52, 0x2c, 0x20, 0x43, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x2c, 0x20, 0x50, 0x2c, + 0x20, 0x52, 0x2c, 0x20, 0x43, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x53, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x50, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x52, + 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x43, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x70, 0x65, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x20, 0x3d, 0x20, + 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x6c, 0x75, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, + 0x4c, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x23, 0x76, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x28, 0x22, 0x20, 0x5c, 0x74, 0x5c, + 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x28, 0x22, 0x20, + 0x5c, 0x74, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x3d, + 0x20, 0x50, 0x28, 0x22, 0x5c, 0x72, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, + 0x31, 0x20, 0x2a, 0x20, 0x50, 0x28, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x6f, 0x70, + 0x20, 0x3d, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2b, 0x20, 0x2d, + 0x31, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x22, 0x2d, + 0x2d, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x20, 0x2d, 0x20, 0x53, + 0x28, 0x22, 0x5c, 0x72, 0x5c, 0x6e, 0x22, 0x29, 0x29, 0x20, 0x5e, 0x20, + 0x30, 0x20, 0x2a, 0x20, 0x4c, 0x28, 0x53, 0x74, 0x6f, 0x70, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x53, 0x6f, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x53, 0x28, 0x22, 0x20, 0x5c, 0x74, 0x22, 0x29, 0x20, + 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x41, 0x6c, 0x70, + 0x68, 0x61, 0x4e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x52, 0x28, 0x22, 0x61, + 0x7a, 0x22, 0x2c, 0x20, 0x22, 0x41, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x30, + 0x39, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, + 0x20, 0x43, 0x28, 0x52, 0x28, 0x22, 0x61, 0x7a, 0x22, 0x2c, 0x20, 0x22, + 0x41, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x5f, 0x5f, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x4e, 0x75, 0x6d, 0x20, 0x5e, 0x20, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, + 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x22, 0x30, 0x78, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x52, 0x28, 0x22, 0x30, 0x39, 0x22, 0x2c, 0x20, 0x22, + 0x61, 0x66, 0x22, 0x2c, 0x20, 0x22, 0x41, 0x46, 0x22, 0x29, 0x20, 0x5e, + 0x20, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x53, 0x28, 0x22, 0x75, 0x55, 0x22, + 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x53, 0x28, 0x22, + 0x6c, 0x4c, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x32, 0x29, 0x20, 0x5e, 0x20, + 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x52, 0x28, 0x22, 0x30, 0x39, 0x22, 0x29, + 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x53, 0x28, 0x22, 0x75, + 0x55, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x53, + 0x28, 0x22, 0x6c, 0x4c, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x32, 0x29, 0x20, + 0x2b, 0x20, 0x28, 0x52, 0x28, 0x22, 0x30, 0x39, 0x22, 0x29, 0x20, 0x5e, + 0x20, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x50, 0x28, 0x22, 0x2e, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x52, 0x28, 0x22, 0x30, 0x39, 0x22, 0x29, 0x20, 0x5e, + 0x20, 0x31, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x50, + 0x28, 0x22, 0x2e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x52, 0x28, 0x22, 0x30, + 0x39, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, + 0x53, 0x28, 0x22, 0x65, 0x45, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x50, 0x28, + 0x22, 0x2d, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, + 0x52, 0x28, 0x22, 0x30, 0x39, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x31, 0x29, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x53, 0x68, 0x65, 0x62, 0x61, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x50, 0x28, 0x22, 0x23, 0x21, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x50, 0x28, + 0x31, 0x20, 0x2d, 0x20, 0x53, 0x74, 0x6f, 0x70, 0x29, 0x20, 0x5e, 0x20, + 0x30, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, + 0x61, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x73, 0x22, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x20, + 0x3d, 0x20, 0x4c, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x20, 0x3d, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x3d, 0x20, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x53, 0x74, 0x6f, 0x70, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x6f, + 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x6f, + 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4c, + 0x69, 0x6e, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6c, 0x70, + 0x68, 0x61, 0x4e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x4e, 0x75, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x4e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x68, 0x65, 0x62, 0x61, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x53, 0x68, 0x65, 0x62, 0x61, 0x6e, 0x67, 0x0a, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x5f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x3d, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6c, 0x70, 0x65, 0x67, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x73, 0x65, 0x74, + 0x6d, 0x61, 0x78, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x31, 0x30, 0x30, + 0x30, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x3a, 0x25, 0x73, 0x5c, 0x6e, 0x20, 0x5b, 0x25, 0x64, 0x5d, + 0x20, 0x3e, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x25, 0x73, 0x22, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x0a, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x29, 0x2e, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x70, 0x6f, + 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x70, 0x6f, 0x73, + 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x67, 0x65, + 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x2e, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x77, + 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, + 0x65, 0x6e, 0x76, 0x22, 0x29, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, + 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x52, + 0x2c, 0x20, 0x53, 0x2c, 0x20, 0x56, 0x2c, 0x20, 0x50, 0x2c, 0x20, 0x43, + 0x2c, 0x20, 0x43, 0x74, 0x2c, 0x20, 0x43, 0x6d, 0x74, 0x2c, 0x20, 0x43, + 0x67, 0x2c, 0x20, 0x43, 0x62, 0x2c, 0x20, 0x43, 0x63, 0x0a, 0x20, 0x20, + 0x52, 0x2c, 0x20, 0x53, 0x2c, 0x20, 0x56, 0x2c, 0x20, 0x50, 0x2c, 0x20, + 0x43, 0x2c, 0x20, 0x43, 0x74, 0x2c, 0x20, 0x43, 0x6d, 0x74, 0x2c, 0x20, + 0x43, 0x67, 0x2c, 0x20, 0x43, 0x62, 0x2c, 0x20, 0x43, 0x63, 0x20, 0x3d, + 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x52, 0x2c, 0x20, 0x6c, 0x70, 0x65, + 0x67, 0x2e, 0x53, 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x56, 0x2c, + 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x50, 0x2c, 0x20, 0x6c, 0x70, 0x65, + 0x67, 0x2e, 0x43, 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x43, 0x74, + 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x43, 0x6d, 0x74, 0x2c, 0x20, + 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x43, 0x67, 0x2c, 0x20, 0x6c, 0x70, 0x65, + 0x67, 0x2e, 0x43, 0x62, 0x2c, 0x20, 0x6c, 0x70, 0x65, 0x67, 0x2e, 0x43, + 0x63, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x2c, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, + 0x53, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x53, 0x6f, + 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x53, + 0x68, 0x65, 0x62, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x4c, 0x2c, 0x20, 0x5f, + 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x2c, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, + 0x53, 0x74, 0x6f, 0x70, 0x2c, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x53, 0x6f, + 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x53, + 0x68, 0x65, 0x62, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x4c, 0x2c, 0x20, 0x5f, + 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x41, 0x6c, 0x70, 0x68, + 0x61, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x4e, 0x75, 0x6d, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x53, 0x68, 0x65, 0x62, 0x61, 0x6e, 0x67, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x4c, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x0a, + 0x20, 0x20, 0x4e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x2a, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x20, 0x2f, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x49, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x43, 0x75, 0x74, 0x2c, 0x20, 0x65, 0x6e, + 0x73, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, + 0x65, 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, + 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x73, 0x79, + 0x6d, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x2c, 0x20, 0x73, 0x69, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, + 0x77, 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, + 0x67, 0x2c, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, + 0x6e, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x2c, 0x20, 0x67, 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, 0x75, 0x74, 0x69, 0x6c, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x43, 0x75, 0x74, 0x2c, 0x20, 0x65, 0x6e, 0x73, 0x75, + 0x72, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x69, 0x73, + 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x73, 0x79, 0x6d, 0x2c, + 0x20, 0x73, 0x79, 0x6d, 0x78, 0x2c, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x77, 0x72, + 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, 0x2c, + 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, + 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6c, + 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, + 0x67, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x43, 0x75, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, + 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x2c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, 0x73, 0x5f, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, + 0x5f, 0x30, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x73, 0x69, 0x6e, + 0x67, 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x79, 0x6d, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x79, 0x6d, 0x78, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x77, + 0x72, 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x67, 0x6f, 0x74, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x6d, 0x6d, + 0x61, 0x72, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x65, 0x6e, + 0x76, 0x28, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x67, 0x72, 0x61, 0x6d, + 0x6d, 0x61, 0x72, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x72, 0x6f, 0x6f, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x64, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x28, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x3a, 0x74, 0x6f, 0x70, 0x28, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x3a, 0x74, 0x6f, 0x70, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x6f, 0x70, 0x20, + 0x7e, 0x3d, 0x20, 0x2d, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3e, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3a, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x69, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3a, 0x70, 0x75, 0x73, 0x68, + 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x70, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x3a, 0x70, 0x6f, 0x70, + 0x28, 0x29, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x20, 0x6f, 0x75, 0x74, 0x64, 0x65, 0x6e, 0x74, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x64, 0x6f, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x64, 0x6f, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, + 0x5f, 0x64, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x74, 0x6f, + 0x70, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, + 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x2c, 0x20, 0x64, 0x6f, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x64, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x70, + 0x75, 0x73, 0x68, 0x28, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, + 0x6f, 0x70, 0x5f, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, + 0x70, 0x5f, 0x64, 0x6f, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x5f, 0x64, 0x6f, 0x5f, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x70, 0x6f, 0x70, 0x28, 0x29, 0x20, 0x7e, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x75, 0x6e, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x20, 0x70, 0x6f, + 0x70, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x6f, 0x20, 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x22, 0x22, 0x2c, 0x20, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x6f, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x50, 0x6f, + 0x70, 0x44, 0x6f, 0x20, 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x22, 0x22, + 0x2c, 0x20, 0x70, 0x6f, 0x70, 0x5f, 0x64, 0x6f, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x77, + 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x68, 0x61, 0x72, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, + 0x77, 0x6f, 0x72, 0x64, 0x73, 0x5b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x5d, + 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x2a, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x2a, + 0x20, 0x2d, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x4e, 0x75, 0x6d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, + 0x74, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, + 0x43, 0x28, 0x63, 0x68, 0x61, 0x72, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x25, 0x77, 0x2a, 0x24, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x5b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, + 0x61, 0x74, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x74, 0x20, 0x2a, + 0x20, 0x2d, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x4e, 0x75, 0x6d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, + 0x74, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x6f, 0x73, + 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x2f, + 0x20, 0x74, 0x72, 0x69, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x6c, 0x66, 0x4e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x22, + 0x40, 0x22, 0x20, 0x2a, 0x20, 0x28, 0x22, 0x40, 0x22, 0x20, 0x2a, 0x20, + 0x28, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x63, 0x28, 0x22, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x29, + 0x29, 0x20, 0x2b, 0x20, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x20, + 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, 0x29, + 0x20, 0x2b, 0x20, 0x43, 0x63, 0x28, 0x22, 0x73, 0x65, 0x6c, 0x66, 0x22, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x53, + 0x65, 0x6c, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x20, 0x53, 0x70, + 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x20, + 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x6b, 0x65, 0x79, 0x5f, + 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x56, 0x61, 0x72, 0x41, + 0x72, 0x67, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, + 0x20, 0x50, 0x28, 0x22, 0x2e, 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x2f, 0x20, + 0x74, 0x72, 0x69, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x67, 0x20, 0x3d, 0x20, 0x50, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x6f, 0x72, + 0x20, 0x46, 0x69, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x68, 0x65, 0x62, + 0x61, 0x6e, 0x67, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x28, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x22, + 0x22, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x43, 0x74, 0x28, 0x4c, 0x69, + 0x6e, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x29, 0x20, + 0x5e, 0x20, 0x30, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x2a, 0x20, 0x4c, 0x28, 0x53, 0x74, 0x6f, 0x70, 0x29, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, + 0x28, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x2b, 0x20, 0x57, 0x68, + 0x69, 0x6c, 0x65, 0x20, 0x2b, 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x2b, + 0x20, 0x46, 0x6f, 0x72, 0x20, 0x2b, 0x20, 0x46, 0x6f, 0x72, 0x45, 0x61, + 0x63, 0x68, 0x20, 0x2b, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, + 0x2b, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2b, 0x20, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x2b, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x20, 0x2b, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x4c, 0x6f, 0x6f, + 0x70, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x45, 0x78, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x20, 0x2b, 0x20, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x20, + 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x29, 0x20, 0x2a, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x69, 0x66, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, + 0x70, 0x20, 0x2a, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x65, 0x6c, + 0x73, 0x65, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, + 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x69, 0x66, 0x22, + 0x29, 0x20, 0x2b, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x75, 0x6e, 0x6c, + 0x65, 0x73, 0x73, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, + 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x75, 0x6e, 0x6c, 0x65, + 0x73, 0x73, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x49, + 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2f, 0x20, 0x77, 0x72, + 0x61, 0x70, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x5e, 0x20, 0x2d, + 0x31, 0x20, 0x2a, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x5e, 0x20, + 0x30, 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x2b, 0x20, 0x43, 0x74, 0x28, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x4c, 0x28, 0x43, + 0x6d, 0x74, 0x28, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, + 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x43, 0x6d, 0x74, 0x28, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x72, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x43, 0x6d, 0x74, 0x28, 0x43, 0x63, 0x28, 0x2d, 0x31, 0x29, 0x2c, 0x20, + 0x70, 0x75, 0x73, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x6f, 0x70, 0x49, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x43, 0x6d, 0x74, 0x28, + 0x22, 0x22, 0x2c, 0x20, 0x70, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, + 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x41, 0x64, 0x76, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x6f, 0x70, 0x28, + 0x22, 0x2a, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x5e, + 0x22, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, + 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x67, 0x6c, 0x6f, 0x62, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x4e, 0x61, 0x6d, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x28, 0x22, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x73, 0x22, 0x29, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x69, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, + 0x28, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, + 0x6b, 0x65, 0x79, 0x28, 0x22, 0x66, 0x72, 0x6f, 0x6d, 0x22, 0x29, 0x20, + 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x28, 0x22, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x5c, 0x5c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x43, + 0x63, 0x28, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, + 0x31, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x4c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x43, 0x74, 0x28, 0x6b, + 0x65, 0x79, 0x28, 0x22, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x29, 0x20, + 0x2f, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x74, + 0x28, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x22, 0x29, 0x20, 0x2f, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x45, 0x78, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x77, 0x20, 0x2f, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x28, 0x22, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x73, 0x74, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x28, 0x22, 0x22, 0x29, 0x29, 0x20, + 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x57, 0x69, 0x74, 0x68, 0x45, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x43, 0x74, + 0x28, 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x2a, 0x20, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2f, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, + 0x69, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x77, + 0x69, 0x74, 0x68, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x6f, 0x20, 0x2a, 0x20, 0x65, 0x6e, 0x73, 0x75, + 0x72, 0x65, 0x28, 0x57, 0x69, 0x74, 0x68, 0x45, 0x78, 0x70, 0x2c, 0x20, + 0x50, 0x6f, 0x70, 0x44, 0x6f, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, + 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2a, 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x28, 0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, + 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, + 0x68, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x6f, 0x20, 0x2a, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, + 0x28, 0x45, 0x78, 0x70, 0x2c, 0x20, 0x50, 0x6f, 0x70, 0x44, 0x6f, 0x29, + 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x42, 0x72, 0x65, + 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, + 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x20, 0x2a, + 0x20, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x31, 0x20, + 0x2a, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, + 0x29, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x42, 0x72, 0x65, + 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x45, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x2d, + 0x31, 0x29, 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x43, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x6b, + 0x65, 0x79, 0x28, 0x22, 0x77, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x43, 0x74, 0x28, 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x29, + 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x74, 0x68, 0x65, 0x6e, + 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x42, 0x6f, + 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x63, + 0x61, 0x73, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x45, 0x6c, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, + 0x29, 0x20, 0x2a, 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x43, 0x6f, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2f, 0x20, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x6c, + 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x45, 0x6c, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x5e, 0x20, 0x30, 0x20, + 0x2a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x20, 0x2a, 0x20, + 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x66, 0x45, 0x6c, 0x73, 0x65, 0x49, 0x66, 0x20, + 0x3d, 0x20, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x5e, 0x20, 0x30, + 0x20, 0x2a, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x6b, + 0x65, 0x79, 0x28, 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x73, 0x28, 0x49, 0x66, 0x43, 0x6f, 0x6e, + 0x64, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x74, 0x68, + 0x65, 0x6e, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, + 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x20, 0x3d, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x69, 0x66, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x49, 0x66, + 0x43, 0x6f, 0x6e, 0x64, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, + 0x74, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2a, 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2a, 0x20, 0x49, 0x66, 0x45, + 0x6c, 0x73, 0x65, 0x49, 0x66, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, + 0x49, 0x66, 0x45, 0x6c, 0x73, 0x65, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x69, 0x66, 0x22, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x55, 0x6e, 0x6c, 0x65, + 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x75, 0x6e, + 0x6c, 0x65, 0x73, 0x73, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x49, 0x66, 0x43, + 0x6f, 0x6e, 0x64, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x74, + 0x68, 0x65, 0x6e, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, + 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2a, 0x20, 0x49, 0x66, 0x45, 0x6c, + 0x73, 0x65, 0x49, 0x66, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x49, + 0x66, 0x45, 0x6c, 0x73, 0x65, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2f, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x75, 0x6e, 0x6c, 0x65, 0x73, + 0x73, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x6f, 0x20, 0x2a, 0x20, 0x65, 0x6e, + 0x73, 0x75, 0x72, 0x65, 0x28, 0x45, 0x78, 0x70, 0x2c, 0x20, 0x50, 0x6f, + 0x70, 0x44, 0x6f, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, + 0x64, 0x6f, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, + 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x6f, 0x20, 0x2a, 0x20, 0x65, + 0x6e, 0x73, 0x75, 0x72, 0x65, 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2a, + 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3d, 0x22, 0x29, 0x20, 0x2a, 0x20, + 0x43, 0x74, 0x28, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, + 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, + 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, + 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, + 0x2c, 0x20, 0x50, 0x6f, 0x70, 0x44, 0x6f, 0x29, 0x20, 0x2a, 0x20, 0x6b, + 0x65, 0x79, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, + 0x31, 0x20, 0x2a, 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, + 0x61, 0x72, 0x6b, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x45, 0x61, 0x63, + 0x68, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x66, 0x6f, 0x72, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x69, + 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x6f, 0x20, 0x2a, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, + 0x28, 0x43, 0x74, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2a, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x28, 0x22, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x29, 0x2c, 0x20, + 0x50, 0x6f, 0x70, 0x44, 0x6f, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, 0x79, + 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2a, 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x22, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x6f, 0x20, 0x3d, + 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x28, 0x22, 0x64, 0x6f, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x5b, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x43, + 0x6f, 0x6d, 0x70, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x5d, 0x22, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x62, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x7b, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, + 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, + 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, 0x5e, + 0x20, 0x2d, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x49, + 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, + 0x7d, 0x22, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, + 0x74, 0x62, 0x6c, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x20, + 0x3d, 0x20, 0x43, 0x74, 0x28, 0x28, 0x43, 0x6f, 0x6d, 0x70, 0x46, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x20, 0x2b, 0x20, 0x43, 0x6f, 0x6d, 0x70, + 0x46, 0x6f, 0x72, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x43, + 0x6c, 0x61, 0x75, 0x73, 0x65, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x46, 0x6f, + 0x72, 0x45, 0x61, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, + 0x22, 0x66, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, + 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x2a, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x69, 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x2a, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, + 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x45, 0x78, 0x70, + 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x66, 0x6f, + 0x72, 0x65, 0x61, 0x63, 0x68, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x46, 0x6f, 0x72, 0x20, 0x3d, + 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x20, 0x2a, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x3d, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x45, 0x78, + 0x70, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, + 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x29, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x43, 0x6c, + 0x61, 0x75, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x46, + 0x6f, 0x72, 0x20, 0x2b, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x46, 0x6f, 0x72, + 0x45, 0x61, 0x63, 0x68, 0x20, 0x2b, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, + 0x77, 0x68, 0x65, 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, + 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x77, 0x68, 0x65, + 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x3d, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x43, 0x74, 0x28, 0x57, + 0x69, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x49, 0x66, 0x20, 0x2b, 0x20, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2b, + 0x20, 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x77, 0x29, + 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x28, + 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2e, 0x2e, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2b, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2d, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2a, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2f, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x25, 0x3d, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x6f, 0x72, 0x3d, 0x22, 0x29, + 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x3d, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x26, 0x3d, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x7c, 0x3d, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3e, 0x3e, + 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3c, + 0x3c, 0x3d, 0x22, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x74, 0x72, 0x69, 0x6d, + 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x61, 0x72, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x43, 0x28, 0x53, 0x28, + 0x22, 0x2b, 0x2d, 0x2a, 0x2f, 0x25, 0x5e, 0x3e, 0x3c, 0x7c, 0x26, 0x22, + 0x29, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x6f, + 0x72, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x20, + 0x3d, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x6f, 0x72, 0x22, 0x29, 0x20, 0x2b, + 0x20, 0x6f, 0x70, 0x28, 0x22, 0x61, 0x6e, 0x64, 0x22, 0x29, 0x20, 0x2b, + 0x20, 0x6f, 0x70, 0x28, 0x22, 0x3c, 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, + 0x6f, 0x70, 0x28, 0x22, 0x3e, 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, + 0x70, 0x28, 0x22, 0x7e, 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, + 0x28, 0x22, 0x21, 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, + 0x22, 0x3d, 0x3d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, + 0x2e, 0x2e, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x3c, + 0x3c, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x3e, 0x3e, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x2f, 0x2f, 0x22, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x69, 0x6e, + 0x61, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, + 0x3d, 0x20, 0x28, 0x57, 0x6f, 0x72, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x73, 0x20, 0x2b, 0x20, 0x43, 0x68, 0x61, 0x72, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x29, 0x20, 0x2a, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, + 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x43, + 0x6d, 0x74, 0x28, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, + 0x20, 0x53, 0x65, 0x6c, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x78, 0x70, 0x20, 0x3d, 0x20, 0x43, + 0x74, 0x28, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x42, + 0x69, 0x6e, 0x61, 0x72, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x20, 0x2a, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x5e, + 0x20, 0x30, 0x29, 0x20, 0x2f, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x65, + 0x78, 0x70, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x49, 0x66, 0x20, 0x2b, 0x20, 0x55, 0x6e, 0x6c, 0x65, 0x73, + 0x73, 0x20, 0x2b, 0x20, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x20, 0x2b, + 0x20, 0x57, 0x69, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x44, 0x65, 0x63, 0x6c, 0x20, 0x2b, 0x20, 0x46, 0x6f, 0x72, 0x45, + 0x61, 0x63, 0x68, 0x20, 0x2b, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x2b, 0x20, + 0x57, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x2b, 0x20, 0x43, 0x6d, 0x74, 0x28, + 0x44, 0x6f, 0x2c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x64, 0x6f, + 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2d, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x2d, 0x53, 0x6f, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x22, 0x29, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x23, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x29, 0x20, 0x2b, 0x20, + 0x73, 0x79, 0x6d, 0x28, 0x22, 0x7e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, + 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x62, + 0x69, 0x74, 0x6e, 0x6f, 0x74, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x6e, 0x6f, 0x74, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, + 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x6e, + 0x6f, 0x74, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x54, 0x62, 0x6c, 0x43, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x2b, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x74, 0x20, 0x2b, + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x68, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x20, 0x2b, 0x20, 0x46, 0x75, 0x6e, 0x4c, 0x69, 0x74, 0x20, + 0x2b, 0x20, 0x4e, 0x75, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, + 0x3d, 0x20, 0x28, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x2b, 0x20, 0x43, + 0x61, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x29, 0x20, 0x2a, 0x20, 0x43, + 0x74, 0x28, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x2f, 0x20, 0x6a, 0x6f, 0x69, + 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x70, + 0x6f, 0x73, 0x28, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x4b, 0x65, 0x79, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x29, 0x20, 0x2f, 0x20, + 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x29, 0x20, 0x2b, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x2b, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x6c, 0x69, 0x63, + 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x78, 0x70, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, + 0x20, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x2b, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x69, 0x6e, 0x67, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x22, 0x27, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x27, 0x22, 0x27, 0x2c, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, + 0x43, 0x67, 0x28, 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, + 0x62, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x42, 0x72, 0x65, 0x61, 0x6b, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x43, 0x28, 0x28, 0x31, + 0x20, 0x2d, 0x20, 0x43, 0x6d, 0x74, 0x28, 0x43, 0x28, 0x4c, 0x75, 0x61, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x29, + 0x20, 0x2a, 0x20, 0x43, 0x62, 0x28, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0x29, 0x2c, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x5f, 0x6c, 0x75, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x29, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, + 0x5b, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x50, 0x28, 0x22, 0x3d, 0x22, 0x29, + 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2f, + 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x5d, 0x22, 0x20, 0x2a, 0x20, + 0x50, 0x28, 0x22, 0x3d, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, + 0x20, 0x22, 0x5d, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x61, 0x6c, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x70, + 0x6f, 0x73, 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x72, 0x65, 0x66, 0x22, 0x29, 0x29, 0x20, 0x2b, + 0x20, 0x53, 0x65, 0x6c, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x20, + 0x56, 0x61, 0x72, 0x41, 0x72, 0x67, 0x20, 0x2b, 0x20, 0x50, 0x61, 0x72, + 0x65, 0x6e, 0x73, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x73, 0x20, 0x3d, + 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x28, 0x22, 0x29, 0x20, 0x2a, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, + 0x20, 0x30, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, + 0x30, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x29, 0x22, 0x29, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6e, 0x41, 0x72, + 0x67, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x22, 0x28, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x43, 0x74, + 0x28, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x78, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, + 0x30, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x29, 0x22, 0x29, + 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x21, 0x22, 0x29, 0x20, + 0x2a, 0x20, 0x2d, 0x50, 0x28, 0x22, 0x3d, 0x22, 0x29, 0x20, 0x2a, 0x20, + 0x43, 0x74, 0x28, 0x22, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x78, 0x70, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, + 0x28, 0x28, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2b, 0x20, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, 0x5e, + 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x43, 0x61, 0x6c, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x20, 0x2b, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x2b, 0x20, 0x2d, 0x53, 0x28, 0x22, 0x2e, 0x5c, 0x5c, 0x22, 0x29, + 0x29, 0x20, 0x2a, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x73, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, + 0x63, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x44, 0x6f, 0x74, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x2a, 0x20, 0x43, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x5e, 0x20, 0x2d, 0x31, + 0x20, 0x2b, 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x3d, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, + 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x6e, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2b, + 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x49, 0x6e, 0x76, 0x6f, 0x6b, + 0x65, 0x20, 0x2b, 0x20, 0x44, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x69, 0x6e, + 0x49, 0x74, 0x65, 0x6d, 0x20, 0x2b, 0x20, 0x53, 0x6c, 0x69, 0x63, 0x65, + 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x22, 0x5b, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, + 0x6b, 0x28, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x5d, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x6f, 0x74, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, + 0x28, 0x22, 0x2e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x64, 0x6f, + 0x74, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, + 0x6f, 0x6c, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x22, 0x5c, 0x5c, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x5f, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2f, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, + 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6f, + 0x6c, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x43, + 0x6f, 0x6c, 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x20, 0x2a, 0x20, 0x28, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x20, + 0x2a, 0x20, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x6c, 0x69, 0x63, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x22, 0x5b, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x28, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x2b, 0x20, 0x43, 0x63, 0x28, 0x31, 0x29, 0x29, 0x20, + 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x2b, 0x20, 0x43, 0x63, 0x28, 0x22, 0x22, 0x29, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x5d, 0x22, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x20, 0x3d, + 0x20, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x73, 0x20, 0x2f, 0x20, 0x6d, 0x61, + 0x72, 0x6b, 0x28, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x29, 0x20, 0x2b, + 0x20, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x2f, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x5f, 0x61, 0x72, 0x67, 0x20, 0x2b, 0x20, 0x44, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x20, 0x77, + 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x5f, 0x61, 0x72, 0x67, + 0x20, 0x2b, 0x20, 0x4c, 0x28, 0x50, 0x28, 0x22, 0x5b, 0x22, 0x29, 0x29, + 0x20, 0x2a, 0x20, 0x4c, 0x75, 0x61, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x20, 0x2f, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x66, 0x75, 0x6e, 0x63, + 0x5f, 0x61, 0x72, 0x67, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2b, 0x20, + 0x43, 0x74, 0x28, 0x45, 0x78, 0x70, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x74, 0x20, + 0x3d, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x7b, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x43, 0x74, 0x28, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, + 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x5e, + 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x53, 0x70, 0x61, 0x63, 0x65, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x4c, 0x69, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x2a, 0x20, 0x28, + 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x5e, 0x20, 0x2d, + 0x31, 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, + 0x61, 0x6b, 0x20, 0x2a, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, + 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, + 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x5e, 0x20, + 0x2d, 0x31, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x2a, 0x20, + 0x57, 0x68, 0x69, 0x74, 0x65, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x7d, 0x22, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x5e, 0x20, + 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x69, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x50, 0x75, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, + 0x20, 0x28, 0x28, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x70, 0x49, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x2b, 0x20, 0x28, 0x50, 0x6f, + 0x70, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, 0x20, 0x43, 0x75, + 0x74, 0x29, 0x29, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x43, 0x74, 0x28, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x53, 0x70, 0x61, 0x63, + 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, + 0x20, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x6e, + 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, + 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x41, 0x64, 0x76, + 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, + 0x65, 0x28, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x2c, 0x20, 0x50, 0x6f, 0x70, 0x49, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x28, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, + 0x63, 0x6c, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x28, 0x22, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x2d, 0x50, 0x28, 0x22, + 0x3a, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x2b, 0x20, 0x43, 0x63, 0x28, 0x6e, + 0x69, 0x6c, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x28, + 0x22, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x73, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x50, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x20, 0x2a, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x28, + 0x45, 0x78, 0x70, 0x2c, 0x20, 0x50, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, + 0x6e, 0x74, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x28, 0x22, 0x22, 0x29, 0x29, + 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2a, 0x20, 0x28, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2b, 0x20, 0x43, 0x74, + 0x28, 0x22, 0x22, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, + 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x29, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, + 0x72, 0x65, 0x61, 0x6b, 0x20, 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x41, + 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x2a, 0x20, + 0x28, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4c, + 0x69, 0x6e, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x29, 0x20, 0x2a, 0x20, + 0x50, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x4c, 0x69, + 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x4b, 0x65, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x2f, 0x20, + 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x22, + 0x29, 0x20, 0x2b, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x73, 0x74, + 0x6d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x45, 0x78, 0x70, 0x20, 0x2f, 0x20, + 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x73, 0x74, 0x6d, 0x22, 0x29, 0x29, + 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, + 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x6b, 0x65, + 0x79, 0x28, 0x22, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x29, 0x20, + 0x2a, 0x20, 0x28, 0x43, 0x63, 0x28, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x44, 0x65, + 0x63, 0x6c, 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x2a, 0x22, 0x29, + 0x20, 0x2b, 0x20, 0x6f, 0x70, 0x28, 0x22, 0x5e, 0x22, 0x29, 0x20, 0x2b, + 0x20, 0x43, 0x74, 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, + 0x29, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3d, 0x22, + 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x45, 0x78, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x4c, 0x6f, 0x77, 0x29, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, + 0x29, 0x20, 0x2f, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3a, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x2d, 0x53, 0x6f, 0x6d, 0x65, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x2a, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2a, 0x20, 0x6c, 0x70, 0x65, + 0x67, 0x2e, 0x43, 0x70, 0x28, 0x29, 0x29, 0x20, 0x2f, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x2b, 0x20, + 0x43, 0x74, 0x28, 0x28, 0x4b, 0x65, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x20, + 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x5b, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, + 0x5d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, + 0x2a, 0x20, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x2b, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, + 0x20, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x29, 0x20, 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x78, 0x28, 0x22, 0x3a, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x45, 0x78, 0x70, 0x20, 0x2b, 0x20, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2b, + 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, + 0x5e, 0x20, 0x31, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x65, 0x79, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x4b, 0x65, + 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x4b, 0x65, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, 0x20, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, + 0x2a, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x5e, + 0x20, 0x2d, 0x31, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, + 0x6e, 0x41, 0x72, 0x67, 0x73, 0x44, 0x65, 0x66, 0x20, 0x3d, 0x20, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x28, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x46, 0x6e, 0x41, + 0x72, 0x67, 0x44, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x5e, 0x20, + 0x2d, 0x31, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x6b, 0x65, 0x79, 0x28, 0x22, + 0x75, 0x73, 0x69, 0x6e, 0x67, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, + 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x2b, 0x20, + 0x53, 0x70, 0x61, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x22, 0x6e, 0x69, 0x6c, + 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x22, 0x22, 0x29, 0x29, + 0x20, 0x2a, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0x20, 0x2a, 0x20, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x29, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x43, 0x74, + 0x28, 0x22, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x22, 0x22, + 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6e, 0x41, + 0x72, 0x67, 0x44, 0x65, 0x66, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, + 0x46, 0x6e, 0x41, 0x72, 0x67, 0x44, 0x65, 0x66, 0x20, 0x2a, 0x20, 0x28, + 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2b, 0x20, + 0x42, 0x72, 0x65, 0x61, 0x6b, 0x29, 0x20, 0x2a, 0x20, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x20, 0x2a, 0x20, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x44, 0x65, + 0x66, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, + 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x42, 0x72, + 0x65, 0x61, 0x6b, 0x29, 0x20, 0x2a, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x20, 0x2a, 0x20, 0x43, 0x74, 0x28, 0x56, 0x61, 0x72, 0x41, 0x72, 0x67, + 0x29, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, + 0x56, 0x61, 0x72, 0x41, 0x72, 0x67, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x44, 0x65, 0x66, 0x20, + 0x3d, 0x20, 0x43, 0x74, 0x28, 0x28, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, + 0x20, 0x53, 0x65, 0x6c, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x2a, + 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3d, 0x22, 0x29, 0x20, 0x2a, + 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x75, 0x6e, 0x4c, 0x69, + 0x74, 0x20, 0x3d, 0x20, 0x46, 0x6e, 0x41, 0x72, 0x67, 0x73, 0x44, 0x65, + 0x66, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2d, 0x3e, + 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x63, 0x28, 0x22, 0x73, 0x6c, 0x69, + 0x6d, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x3d, + 0x3e, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x43, 0x63, 0x28, 0x22, 0x66, 0x61, + 0x74, 0x22, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x42, 0x6f, 0x64, 0x79, + 0x20, 0x2b, 0x20, 0x43, 0x74, 0x28, 0x22, 0x22, 0x29, 0x29, 0x20, 0x2f, + 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x28, 0x22, 0x66, 0x6e, 0x64, 0x65, 0x66, + 0x22, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, + 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x5e, 0x20, + 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x4f, 0x72, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x2b, 0x20, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x74, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x4f, 0x72, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x4e, 0x61, 0x6d, + 0x65, 0x4f, 0x72, 0x44, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x29, 0x20, 0x5e, 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x3d, + 0x20, 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, + 0x5e, 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, + 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x77, 0x20, 0x3d, 0x20, + 0x45, 0x78, 0x70, 0x20, 0x2a, 0x20, 0x28, 0x28, 0x73, 0x79, 0x6d, 0x28, + 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2b, 0x20, 0x73, 0x79, 0x6d, 0x28, 0x22, + 0x3b, 0x22, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x45, 0x78, 0x70, 0x29, 0x20, + 0x5e, 0x20, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, + 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, + 0x2d, 0x50, 0x28, 0x22, 0x2d, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x45, + 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, + 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2b, 0x20, 0x53, + 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x2a, 0x20, + 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x2a, 0x20, 0x41, 0x72, + 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x2a, 0x20, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x5e, 0x20, 0x2d, 0x31, + 0x29, 0x20, 0x2b, 0x20, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x29, 0x20, 0x5e, 0x20, 0x2d, 0x31, 0x20, 0x2b, 0x20, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x29, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x72, 0x67, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x41, 0x72, 0x67, 0x4c, 0x69, 0x6e, 0x65, + 0x20, 0x2a, 0x20, 0x28, 0x73, 0x79, 0x6d, 0x28, 0x22, 0x2c, 0x22, 0x29, + 0x20, 0x2a, 0x20, 0x53, 0x70, 0x61, 0x63, 0x65, 0x42, 0x72, 0x65, 0x61, + 0x6b, 0x20, 0x2a, 0x20, 0x41, 0x72, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x29, + 0x20, 0x5e, 0x20, 0x30, 0x20, 0x2a, 0x20, 0x50, 0x6f, 0x70, 0x49, 0x6e, + 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x41, 0x72, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2a, 0x20, + 0x45, 0x78, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x72, 0x0a, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x67, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x6d, + 0x6d, 0x61, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, + 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x20, 0x2a, 0x20, 0x67, 0x20, 0x2a, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x20, 0x2a, 0x20, 0x2d, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x78, + 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x28, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x3a, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x2c, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x65, 0x72, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, + 0x65, 0x72, 0x72, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x20, + 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, 0x73, 0x67, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x72, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, + 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x5f, 0x70, 0x6f, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x6e, 0x6f, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, + 0x73, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x74, 0x72, 0x65, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x67, + 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x61, 0x72, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, + 0x73, 0x65, 0x72, 0x28, 0x29, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, + 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x27, 0x5d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, + 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x53, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x53, 0x65, 0x74, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x75, 0x6e, 0x70, 0x61, + 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x3d, 0x20, 0x53, 0x65, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, + 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x53, 0x65, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x69, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x53, + 0x65, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x62, 0x72, 0x65, 0x61, 0x6b, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x0a, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x22, 0x6e, 0x69, 0x6c, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, + 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x6d, 0x6f, 0x6f, + 0x6e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, + 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6d, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6d, 0x74, 0x2e, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x5d, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x61, 0x6c, 0x6c, 0x22, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, + 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x74, 0x6d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x69, 0x73, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x73, 0x74, 0x6d, 0x29, 0x20, + 0x6f, 0x72, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x63, 0x61, 0x6e, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x73, 0x74, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x73, + 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x0a, 0x20, 0x20, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, + 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7e, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x65, + 0x78, 0x70, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x73, 0x5f, 0x73, + 0x6c, 0x69, 0x63, 0x65, 0x0a, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x23, 0x6e, + 0x6f, 0x64, 0x65, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x6c, + 0x69, 0x63, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x54, 0x6d, 0x70, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x64, 0x65, + 0x66, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, + 0x72, 0x67, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, + 0x6c, 0x69, 0x6d, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x72, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5b, 0x22, 0x66, 0x6f, 0x72, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5b, 0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, + 0x64, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, + 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5b, 0x22, 0x69, 0x66, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x68, 0x65, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, + 0x69, 0x72, 0x73, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5b, 0x70, 0x72, 0x6f, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, + 0x61, 0x6b, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x0a, + 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x20, 0x3d, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x22, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x6b, 0x6e, + 0x6f, 0x77, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, + 0x61, 0x72, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x6e, + 0x70, 0x61, 0x63, 0x6b, 0x28, 0x61, 0x72, 0x67, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x73, 0x5b, 0x6b, 0x65, 0x79, + 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x70, + 0x72, 0x6f, 0x70, 0x73, 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, + 0x64, 0x65, 0x5b, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5b, + 0x22, 0x64, 0x6f, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x6f, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6f, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x74, 0x62, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, + 0x74, 0x62, 0x6c, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6b, 0x65, 0x79, 0x5f, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, + 0x6c, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5b, 0x31, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x74, 0x62, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x65, 0x78, + 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x62, 0x6f, 0x64, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x65, 0x78, 0x70, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, + 0x72, 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6f, + 0x72, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, + 0x61, 0x73, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x3d, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6e, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x2c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, + 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x6d, 0x61, + 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x74, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6d, 0x61, + 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x6b, 0x65, 0x79, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5b, 0x6b, 0x65, 0x79, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x6b, 0x65, 0x79, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x28, 0x22, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x20, 0x6b, 0x65, 0x79, 0x3a, 0x20, 0x60, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x6b, 0x65, 0x79, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x60, 0x20, 0x6f, 0x6e, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, + 0x60, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x60, 0x22, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5b, + 0x6b, 0x65, 0x79, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6b, 0x65, + 0x79, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5b, 0x6b, 0x65, + 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, + 0x77, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6b, + 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, + 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, + 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x73, 0x6d, + 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6d, 0x74, 0x5b, + 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x5d, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x6f, 0x70, 0x22, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x20, 0x3d, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x20, + 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6e, 0x75, + 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x63, 0x61, 0x73, 0x63, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x69, 0x73, 0x5f, 0x73, 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x73, + 0x69, 0x6e, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, 0x62, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, + 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x3d, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6e, 0x67, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x4f, 0x4f, 0x50, + 0x20, 0x3d, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, + 0x67, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x62, + 0x61, 0x73, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x0a, 0x20, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, + 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x2c, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x70, 0x6c, 0x69, 0x74, 0x2c, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x2c, 0x20, + 0x67, 0x65, 0x74, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x2c, 0x20, + 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x67, 0x65, 0x74, 0x5f, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, + 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x2c, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, + 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x74, 0x6f, 0x5f, 0x6c, + 0x75, 0x61, 0x2c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x66, 0x69, 0x6c, + 0x65, 0x2c, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, + 0x20, 0x3d, 0x20, 0x22, 0x2f, 0x22, 0x0a, 0x20, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, + 0x74, 0x68, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x2c, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x5f, 0x30, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x5e, 0x28, 0x2e, 0x2d, 0x29, 0x25, 0x2e, 0x6c, 0x75, + 0x61, 0x24, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, + 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, + 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x6d, + 0x6f, 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2c, 0x20, 0x22, 0x3b, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x74, + 0x6f, 0x5f, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x7e, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, + 0x65, 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, + 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x67, 0x6f, 0x74, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x29, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, + 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x2e, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x65, 0x78, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x74, 0x72, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, + 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x65, 0x65, 0x28, 0x74, + 0x72, 0x65, 0x65, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x2e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x6c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x70, 0x6f, + 0x73, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x6c, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x25, 0x2e, 0x22, 0x2c, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, + 0x74, 0x68, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5b, + 0x5e, 0x3b, 0x5d, 0x2b, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x67, 0x73, 0x75, + 0x62, 0x28, 0x22, 0x3f, 0x22, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x72, 0x65, + 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, 0x22, 0x40, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x72, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, + 0x20, 0x22, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x65, 0x72, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x43, 0x6f, 0x75, 0x6c, 0x64, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x6f, + 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2c, 0x20, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x3d, 0x28, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x29, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x64, 0x65, + 0x2c, 0x20, 0x6c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x72, 0x5f, + 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6f, 0x5f, 0x6c, 0x75, 0x61, + 0x28, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x6c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5b, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, + 0x20, 0x6c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x72, 0x5f, 0x65, + 0x72, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x6c, + 0x75, 0x61, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x6c, 0x6f, 0x61, + 0x64, 0x29, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x76, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, + 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, + 0x3d, 0x20, 0x69, 0x6f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x66, 0x6e, + 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x29, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, + 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x69, + 0x6c, 0x65, 0x3a, 0x72, 0x65, 0x61, 0x64, 0x28, 0x22, 0x2a, 0x61, 0x22, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x3a, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x74, 0x65, 0x78, 0x74, 0x2c, 0x20, + 0x22, 0x40, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x66, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x20, + 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6c, 0x6f, 0x61, + 0x64, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, + 0x73, 0x20, 0x3d, 0x20, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6d, 0x6f, 0x6f, + 0x6e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, + 0x61, 0x74, 0x68, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6c, 0x6f, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x70, + 0x6f, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x73, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, + 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x28, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x69, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x20, 0x3d, 0x20, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x69, 0x6e, + 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, + 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x5f, 0x6c, 0x75, 0x61, 0x20, 0x3d, + 0x20, 0x74, 0x6f, 0x5f, 0x6c, 0x75, 0x61, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x72, 0x73, + 0x65, 0x70, 0x20, 0x3d, 0x20, 0x64, 0x69, 0x72, 0x73, 0x65, 0x70, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x20, + 0x3d, 0x20, 0x64, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, + 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x66, 0x69, 0x6c, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x6f, 0x6e, 0x70, 0x61, 0x74, 0x68, 0x20, + 0x3d, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x6f, + 0x6e, 0x70, 0x61, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x27, 0x5d, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x30, 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x5f, 0x6c, + 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x75, 0x6d, + 0x70, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x64, 0x75, 0x6d, 0x70, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, + 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, + 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x61, + 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x2c, 0x20, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, + 0x6a, 0x5f, 0x30, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x65, + 0x74, 0x0a, 0x20, 0x20, 0x53, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, + 0x2e, 0x53, 0x65, 0x74, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x2c, + 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, + 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, + 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x29, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, + 0x63, 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, + 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x63, 0x6f, + 0x6e, 0x63, 0x61, 0x74, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, + 0x2e, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, + 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x67, + 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x75, + 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x5f, + 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, + 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x2c, 0x20, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x75, 0x6e, 0x70, + 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x70, + 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x75, + 0x74, 0x69, 0x6c, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x2c, 0x20, 0x75, 0x74, + 0x69, 0x6c, 0x2e, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x20, 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x6d, 0x6f, 0x6f, 0x6e, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x20, 0x3d, 0x20, 0x22, 0x20, 0x20, 0x22, 0x0a, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x4c, + 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x2c, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6e, + 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x23, 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x5b, 0x6c, + 0x69, 0x6e, 0x65, 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x5b, 0x6c, 0x69, 0x6e, + 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x61, 0x64, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x28, 0x69, 0x74, + 0x65, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x65, + 0x6d, 0x3a, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x3a, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x23, + 0x73, 0x65, 0x6c, 0x66, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, 0x3d, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x2c, 0x20, 0x6f, + 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, + 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x2c, 0x20, 0x6c, 0x20, + 0x69, 0x6e, 0x20, 0x69, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6c, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, + 0x20, 0x6f, 0x72, 0x20, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, + 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, + 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, + 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x6d, + 0x61, 0x70, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x20, + 0x69, 0x6e, 0x20, 0x6c, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, + 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x75, 0x74, 0x5b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, + 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x5b, 0x69, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x6f, 0x20, 0x3d, + 0x20, 0x6c, 0x3a, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x70, + 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x6f, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x69, + 0x6e, 0x65, 0x73, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x6c, 0x29, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x2c, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x6e, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, + 0x61, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x69, + 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, + 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x73, 0x65, 0x6c, + 0x66, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6c, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x72, 0x65, 0x6e, 0x64, 0x65, + 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, + 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, + 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, + 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x6c, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x5b, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, + 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x2d, 0x31, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x63, 0x20, 0x3d, + 0x3d, 0x20, 0x22, 0x29, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x6c, 0x63, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x5d, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x3a, + 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d, + 0x20, 0x22, 0x28, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, 0x3b, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, + 0x72, 0x74, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x22, + 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x4c, 0x69, + 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x3a, 0x66, 0x6c, 0x61, + 0x74, 0x74, 0x65, 0x6e, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2e, + 0x2e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x68, 0x61, + 0x72, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x68, 0x61, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x20, 0x69, 0x6e, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x20, 0x22, + 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x28, 0x6c, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, + 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x74, 0x29, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, + 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x20, 0x3d, 0x20, 0x74, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, + 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, + 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x70, 0x28, 0x76, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, + 0x75, 0x6d, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x4c, + 0x69, 0x6e, 0x65, 0x73, 0x3c, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x75, 0x74, 0x69, 0x6c, 0x2e, + 0x64, 0x75, 0x6d, 0x70, 0x28, 0x73, 0x74, 0x72, 0x69, 0x70, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x29, 0x29, 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, + 0x20, 0x2d, 0x32, 0x29, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, + 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, + 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, + 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x23, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6d, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x20, 0x3d, + 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x70, 0x6f, 0x73, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, + 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5b, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x2e, 0x2e, 0x2e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x61, 0x70, 0x70, 0x65, 0x6e, + 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x63, 0x6f, 0x6e, 0x63, + 0x61, 0x74, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x29, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x3a, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x73, + 0x65, 0x6c, 0x66, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, + 0x74, 0x79, 0x70, 0x65, 0x28, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, + 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x3a, 0x72, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x30, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x68, 0x75, 0x6e, + 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x30, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, + 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, + 0x64, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3a, 0x61, + 0x64, 0x64, 0x28, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x64, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x4c, 0x69, 0x6e, 0x65, 0x3c, 0x22, 0x20, 0x2e, 0x2e, 0x20, + 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x75, 0x74, 0x69, + 0x6c, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x3a, 0x73, 0x75, 0x62, 0x28, 0x31, 0x2c, 0x20, 0x2d, 0x32, 0x29, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x4c, + 0x69, 0x6e, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, + 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, + 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, + 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x29, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x70, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x28, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, + 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, + 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, + 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x3d, 0x20, 0x22, 0x64, 0x6f, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x22, 0x65, 0x6e, 0x64, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x68, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x20, + 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3a, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x28, 0x7b, 0x20, 0x7d, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3c, 0x22, 0x20, 0x2e, 0x2e, + 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x68, 0x29, + 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x3e, 0x20, 0x3c, 0x2d, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x65, 0x74, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, + 0x6e, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x61, 0x6d, + 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x6c, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x65, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x69, 0x66, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x3a, 0x67, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x69, + 0x66, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x3d, 0x3d, + 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, + 0x65, 0x66, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x32, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x69, 0x66, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, + 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, + 0x23, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x65, + 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x69, 0x73, 0x5f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x28, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x72, + 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x72, 0x65, 0x61, + 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, + 0x29, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, + 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x75, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x28, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x5b, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x6c, + 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, + 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x74, 0x72, + 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x64, + 0x20, 0x3d, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x65, 0x74, 0x28, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x61, 0x6c, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x28, 0x22, 0x5e, 0x25, 0x75, 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x75, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x28, 0x22, 0x23, 0x22, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x3d, 0x20, 0x6d, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3a, + 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, 0x6e, + 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x2c, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x79, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x79, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x68, 0x61, 0x73, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x74, 0x72, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x79, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x73, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x20, 0x3d, + 0x20, 0x6d, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x4e, 0x61, 0x6d, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x20, 0x3d, 0x3d, + 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x72, 0x65, 0x66, 0x22, + 0x20, 0x6f, 0x72, 0x20, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x31, 0x5d, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x22, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x23, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, + 0x20, 0x32, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x69, 0x73, 0x5f, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x32, + 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x65, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x64, 0x6f, 0x6e, 0x74, 0x5f, 0x70, + 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x20, 0x6f, 0x72, 0x20, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x2c, 0x20, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, + 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, + 0x22, 0x5f, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x6f, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x70, 0x75, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x6e, 0x69, 0x74, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x76, + 0x61, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x66, 0x72, 0x65, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x28, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x3a, 0x73, 0x74, 0x6d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x69, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x69, + 0x74, 0x65, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x6d, + 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x28, 0x70, 0x6f, 0x73, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3a, 0x6d, + 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, + 0x78, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x3a, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, + 0x69, 0x6e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6e, 0x65, 0x78, + 0x74, 0x3a, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x23, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x5b, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5d, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5b, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x20, + 0x3d, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5b, 0x23, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x5d, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x22, 0x20, + 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x28, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, + 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x3a, 0x61, 0x64, 0x64, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, + 0x29, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x3a, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x6f, 0x73, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, + 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x4c, 0x69, + 0x6e, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, + 0x70, 0x70, 0x65, 0x6e, 0x64, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x73, 0x74, 0x6d, 0x20, + 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, + 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x73, 0x5b, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, + 0x65, 0x29, 0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x73, 0x5b, 0x74, 0x5d, 0x20, 0x7e, 0x3d, 0x20, + 0x6e, 0x69, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, + 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x22, 0x72, 0x61, 0x77, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x5b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, + 0x20, 0x28, 0x66, 0x6e, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, + 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x20, + 0x2e, 0x2e, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x2e, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6f, 0x75, 0x74, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x28, 0x6f, 0x75, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, + 0x74, 0x20, 0x3d, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x2e, 0x70, 0x6f, 0x73, 0x20, + 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, + 0x6c, 0x69, 0x6d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x20, + 0x6f, 0x72, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x6e, + 0x65, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x61, 0x70, + 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x28, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x76, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x5f, 0x30, 0x5b, 0x5f, 0x6c, 0x65, + 0x6e, 0x5f, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x6c, 0x65, 0x6e, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x5f, 0x6c, 0x65, 0x6e, + 0x5f, 0x30, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x61, 0x63, 0x63, 0x75, 0x6d, + 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x28, 0x29, 0x2c, 0x20, 0x64, 0x65, 0x6c, + 0x69, 0x6d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x77, 0x69, + 0x74, 0x68, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, + 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, + 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x73, 0x5b, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x66, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, + 0x66, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x5f, + 0x62, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x28, 0x6e, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x6e, 0x6f, + 0x64, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x3a, 0x73, 0x74, 0x6d, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x5f, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x6f, 0x64, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x6e, + 0x6f, 0x64, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x6f, 0x73, + 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5b, 0x2d, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x61, 0x64, 0x64, 0x28, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x74, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x72, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x28, 0x22, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x2c, + 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, + 0x72, 0x6d, 0x65, 0x72, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x5f, 0x69, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x5f, 0x69, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x2c, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x6d, 0x5f, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x6d, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x2c, 0x20, 0x23, 0x73, 0x74, + 0x6d, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x5f, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x74, 0x6d, 0x28, 0x73, 0x74, + 0x6d, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x6d, + 0x5f, 0x69, 0x20, 0x3d, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x6d, 0x5f, 0x69, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, + 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x70, 0x6c, 0x69, 0x63, + 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x66, 0x6e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x66, 0x6e, 0x28, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2c, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x66, 0x6f, 0x6f, + 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x66, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, + 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x7b, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x62, 0x69, 0x6e, 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x3d, + 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x62, 0x69, 0x6e, + 0x64, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x72, 0x6f, + 0x6f, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x2b, 0x20, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, + 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, + 0x66, 0x2e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x5f, 0x6c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x20, + 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, + 0x3d, 0x20, 0x22, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, + 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x73, 0x65, 0x6c, + 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, + 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x7d, 0x2c, 0x20, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, + 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x2c, 0x20, + 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x73, 0x65, 0x6c, + 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x52, + 0x6f, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3c, 0x3e, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x73, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x69, 0x6d, 0x70, 0x6c, 0x69, + 0x63, 0x69, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, + 0x73, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x20, + 0x3d, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x2e, 0x72, + 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x2c, 0x20, 0x73, 0x74, 0x6d, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x3a, 0x73, 0x74, 0x6d, 0x73, 0x28, 0x73, 0x74, + 0x6d, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, + 0x2e, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x74, + 0x74, 0x65, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5b, + 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x5c, 0x6e, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x5b, 0x23, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5d, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x62, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, + 0x65, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, + 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x3d, 0x20, + 0x73, 0x65, 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x73, 0x65, 0x6c, + 0x66, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x22, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x5f, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x63, 0x6c, 0x73, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x5f, 0x30, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x20, 0x3d, 0x20, 0x72, 0x61, 0x77, 0x67, 0x65, 0x74, 0x28, 0x63, + 0x6c, 0x73, 0x2c, 0x20, 0x22, 0x5f, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, + 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x65, + 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, + 0x7d, 0x2c, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, 0x29, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6c, 0x73, 0x2e, + 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x5f, 0x73, 0x65, 0x6c, 0x66, + 0x5f, 0x30, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x30, + 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x5f, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, + 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2e, 0x5f, 0x5f, + 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x65, 0x64, 0x28, 0x5f, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x30, 0x2c, 0x20, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x5f, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x30, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6d, 0x73, 0x67, + 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, + 0x6f, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x2c, + 0x20, 0x70, 0x6f, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, + 0x74, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x5f, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, + 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x73, + 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x72, + 0x20, 0x6f, 0x72, 0x20, 0x22, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x3d, 0x20, 0x28, 0x22, 0x20, 0x5b, 0x25, 0x64, 0x5d, 0x20, + 0x3e, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x25, 0x73, 0x22, 0x29, 0x3a, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x74, 0x72, 0x69, 0x6d, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, + 0x72, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, + 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x6d, + 0x73, 0x67, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, + 0x6e, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x0a, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x52, + 0x6f, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x3a, 0x61, 0x64, 0x64, 0x28, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, + 0x3a, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, + 0x20, 0x3d, 0x20, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x30, 0x3a, 0x72, + 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x74, 0x72, 0x65, + 0x65, 0x0a, 0x20, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x72, 0x65, 0x65, + 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, + 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x22, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72, 0x65, 0x65, + 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, + 0x6f, 0x72, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x29, 0x28, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x72, 0x75, 0x6e, + 0x6e, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, 0x74, + 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x74, + 0x6d, 0x73, 0x28, 0x74, 0x72, 0x65, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, + 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x28, + 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x28, 0x65, 0x72, 0x72, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x5b, 0x31, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x22, + 0x75, 0x73, 0x65, 0x72, 0x2d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x20, + 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, 0x5f, 0x30, 0x20, 0x6f, 0x72, + 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x2d, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x20, 0x3d, 0x3d, 0x20, 0x5f, 0x65, 0x78, 0x70, + 0x5f, 0x30, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, + 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x70, + 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x28, + 0x65, 0x72, 0x72, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, + 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, + 0x22, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, + 0x75, 0x74, 0x69, 0x6c, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x29, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, + 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x6f, + 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x28, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x72, 0x72, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, + 0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x20, 0x22, 0x5c, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x2c, 0x20, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x6f, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x75, 0x61, 0x5f, + 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x3a, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x28, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x6d, + 0x61, 0x70, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2e, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x3a, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x6d, 0x61, 0x70, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x75, + 0x61, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x6d, + 0x61, 0x70, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x64, + 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, + 0x63, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, + 0x28, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x6e, + 0x65, 0x20, 0x3d, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, + 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x65, + 0x20, 0x3d, 0x20, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x4c, 0x69, + 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x72, 0x65, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, + 0x6f, 0x6f, 0x6e, 0x2e, 0x61, 0x6c, 0x6c, 0x27, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, + 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x20, + 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6b, 0x2c, 0x20, 0x76, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x6d, 0x6f, 0x6f, 0x6e, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x47, 0x5b, 0x6b, 0x5d, 0x20, 0x3d, 0x20, 0x76, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x0a, + 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, + 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x27, 0x6d, 0x6f, 0x6f, + 0x6e, 0x27, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x28, 0x29, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x75, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x67, 0x65, 0x74, 0x66, + 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, + 0x2c, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x0a, 0x20, 0x20, 0x64, 0x6f, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x6f, + 0x62, 0x6a, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x28, 0x22, 0x6d, 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x2e, 0x75, 0x74, 0x69, 0x6c, 0x22, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x67, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, + 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x64, 0x75, 0x6d, 0x70, + 0x20, 0x3d, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x67, 0x65, + 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5f, 0x6f, 0x62, 0x6a, 0x5f, + 0x30, 0x2e, 0x73, 0x65, 0x74, 0x66, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x5f, + 0x6f, 0x62, 0x6a, 0x5f, 0x30, 0x2e, 0x64, 0x75, 0x6d, 0x70, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x70, 0x2c, 0x20, 0x69, 0x73, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2c, 0x20, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x62, 0x69, 0x6e, 0x64, + 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x2c, 0x20, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x62, 0x6c, 0x2c, 0x20, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x64, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, + 0x69, 0x78, 0x69, 0x6e, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x6d, 0x69, 0x78, 0x69, + 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6f, 0x6c, + 0x64, 0x0a, 0x20, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x28, 0x64, 0x75, 0x6d, 0x70, 0x28, 0x2e, 0x2e, 0x2e, 0x29, + 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x69, 0x73, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x28, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, + 0x3d, 0x3d, 0x20, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x2e, 0x5f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x63, 0x6c, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6c, 0x73, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x73, 0x65, 0x74, 0x6d, + 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, + 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, + 0x2c, 0x20, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x75, 0x70, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x69, + 0x20, 0x3d, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, + 0x68, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x64, 0x6f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x75, + 0x61, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x75, + 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x69, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x69, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x5b, 0x6b, 0x5d, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x28, 0x22, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x66, 0x69, 0x6e, 0x64, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x20, 0x22, 0x20, 0x2e, 0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x28, 0x6b, 0x29, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x76, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x20, 0x3d, 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x2e, 0x67, 0x65, 0x74, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x28, + 0x66, 0x6e, 0x2c, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x5b, 0x6b, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x64, 0x65, 0x62, 0x75, + 0x67, 0x2e, 0x73, 0x65, 0x74, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x75, 0x70, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x5b, 0x6b, 0x5d, 0x2c, 0x20, 0x76, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, + 0x6c, 0x75, 0x61, 0x2e, 0x64, 0x65, 0x62, 0x75, 0x67, 0x0a, 0x20, 0x20, + 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6f, 0x6c, 0x64, + 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x66, 0x65, + 0x6e, 0x76, 0x28, 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x73, + 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, + 0x7b, 0x20, 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, + 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, + 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x5b, 0x6e, 0x61, + 0x6d, 0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6c, + 0x64, 0x5f, 0x65, 0x6e, 0x76, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, + 0x66, 0x65, 0x6e, 0x76, 0x28, 0x66, 0x6e, 0x2c, 0x20, 0x65, 0x6e, 0x76, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x66, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6f, 0x62, 0x6a, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x7b, 0x20, + 0x7d, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, + 0x3d, 0x20, 0x6f, 0x62, 0x6a, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x76, + 0x61, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x75, 0x61, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x28, 0x76, 0x61, 0x6c, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x74, + 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x28, 0x6f, 0x62, 0x6a, + 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, + 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, + 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x29, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x62, 0x6c, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x74, 0x2c, 0x20, + 0x66, 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x74, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x74, + 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x74, 0x2c, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, + 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x3d, 0x20, + 0x66, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, + 0x61, 0x77, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, + 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x28, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x74, 0x62, 0x6c, 0x73, 0x20, 0x3d, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x2e, 0x2e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, + 0x23, 0x74, 0x62, 0x6c, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x20, 0x74, 0x68, + 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x74, 0x62, 0x6c, 0x73, 0x20, 0x2d, 0x20, + 0x31, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, + 0x73, 0x5b, 0x69, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x62, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, + 0x73, 0x5b, 0x69, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x28, 0x61, 0x2c, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x20, 0x3d, 0x20, 0x62, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x62, 0x6c, + 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, + 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x29, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x5f, 0x74, 0x62, + 0x6c, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, + 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x5b, 0x6b, 0x65, + 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x5f, 0x74, 0x62, 0x6c, 0x5f, 0x30, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, + 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x63, 0x6c, 0x73, 0x2c, 0x20, 0x2e, + 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, + 0x70, 0x61, 0x69, 0x72, 0x73, 0x28, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, + 0x62, 0x61, 0x73, 0x65, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6b, 0x65, + 0x79, 0x3a, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x22, 0x5e, 0x5f, 0x5f, + 0x22, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x6b, 0x65, 0x79, + 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, + 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x63, 0x6c, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x28, + 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, + 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, + 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x6d, 0x65, 0x74, + 0x68, 0x6f, 0x64, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, + 0x20, 0x31, 0x2c, 0x20, 0x23, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, + 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x5b, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x65, 0x6c, 0x66, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5b, 0x6e, 0x61, 0x6d, 0x65, + 0x5d, 0x28, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x2e, 0x2e, + 0x2e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x62, + 0x6c, 0x2c, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x29, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x20, 0x3d, 0x20, 0x31, + 0x2c, 0x20, 0x23, 0x6b, 0x65, 0x79, 0x73, 0x20, 0x64, 0x6f, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x3d, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x5b, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x30, 0x5d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x6b, + 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x62, 0x6c, 0x5b, 0x6b, 0x65, + 0x79, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6b, 0x65, 0x79, 0x2c, + 0x20, 0x76, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 0x72, + 0x73, 0x28, 0x74, 0x62, 0x6c, 0x29, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x5b, 0x6b, + 0x65, 0x79, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, + 0x66, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x28, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2c, 0x20, 0x66, + 0x6e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x23, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x65, 0x6e, + 0x20, 0x3e, 0x20, 0x31, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x61, 0x63, + 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x28, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x2c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x5b, 0x32, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x33, 0x2c, 0x20, 0x6c, 0x65, + 0x6e, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x28, + 0x61, 0x63, 0x63, 0x75, 0x6d, 0x2c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x5b, 0x69, 0x5d, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, + 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x74, 0x65, 0x6d, + 0x73, 0x5b, 0x31, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, + 0x0a, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x75, + 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x73, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x75, + 0x6e, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x6e, + 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x62, 0x6c, + 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x62, 0x6c, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, + 0x70, 0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x69, + 0x6e, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x69, 0x6e, 0x5f, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x20, + 0x3d, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x2e, 0x70, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5b, 0x22, 0x6d, + 0x6f, 0x6f, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x5d, 0x28, + 0x29, 0x0a +}; +unsigned int moonscript_lua_len = 172730; diff --git a/moonscript/base.lua b/moonscript/base.lua deleted file mode 100644 index 6bc0d49e..00000000 --- a/moonscript/base.lua +++ /dev/null @@ -1,153 +0,0 @@ -local compile = require("moonscript.compile") -local parse = require("moonscript.parse") -local concat, insert, remove -do - local _obj_0 = table - concat, insert, remove = _obj_0.concat, _obj_0.insert, _obj_0.remove -end -local split, dump, get_options, unpack -do - local _obj_0 = require("moonscript.util") - split, dump, get_options, unpack = _obj_0.split, _obj_0.dump, _obj_0.get_options, _obj_0.unpack -end -local lua = { - loadstring = loadstring, - load = load -} -local dirsep, line_tables, create_moonpath, to_lua, moon_loader, loadstring, loadfile, dofile, insert_loader, remove_loader -dirsep = "/" -line_tables = require("moonscript.line_tables") -create_moonpath = function(package_path) - local moonpaths - do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = split(package_path, ";") - for _index_0 = 1, #_list_0 do - local _continue_0 = false - repeat - local path = _list_0[_index_0] - local prefix = path:match("^(.-)%.lua$") - if not (prefix) then - _continue_0 = true - break - end - local _value_0 = prefix .. ".moon" - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - moonpaths = _accum_0 - end - return concat(moonpaths, ";") -end -to_lua = function(text, options) - if options == nil then - options = { } - end - if "string" ~= type(text) then - local t = type(text) - return nil, "expecting string (got " .. t .. ")" - end - local tree, err = parse.string(text) - if not tree then - return nil, err - end - local code, ltable, pos = compile.tree(tree, options) - if not code then - return nil, compile.format_error(ltable, pos, text) - end - return code, ltable -end -moon_loader = function(name) - local name_path = name:gsub("%.", dirsep) - local file, file_path - for path in package.moonpath:gmatch("[^;]+") do - file_path = path:gsub("?", name_path) - file = io.open(file_path) - if file then - break - end - end - if file then - local text = file:read("*a") - file:close() - local res, err = loadstring(text, "@" .. tostring(file_path)) - if not res then - error(file_path .. ": " .. err) - end - return res - end - return nil, "Could not find moon file" -end -loadstring = function(...) - local options, str, chunk_name, mode, env = get_options(...) - chunk_name = chunk_name or "=(moonscript.loadstring)" - local code, ltable_or_err = to_lua(str, options) - if not (code) then - return nil, ltable_or_err - end - if chunk_name then - line_tables[chunk_name] = ltable_or_err - end - return (lua.loadstring or lua.load)(code, chunk_name, unpack({ - mode, - env - })) -end -loadfile = function(fname, ...) - local file, err = io.open(fname) - if not (file) then - return nil, err - end - local text = assert(file:read("*a")) - file:close() - return loadstring(text, "@" .. tostring(fname), ...) -end -dofile = function(...) - local f = assert(loadfile(...)) - return f() -end -insert_loader = function(pos) - if pos == nil then - pos = 2 - end - if not package.moonpath then - package.moonpath = create_moonpath(package.path) - end - local loaders = package.loaders or package.searchers - for _index_0 = 1, #loaders do - local loader = loaders[_index_0] - if loader == moon_loader then - return false - end - end - insert(loaders, pos, moon_loader) - return true -end -remove_loader = function() - local loaders = package.loaders or package.searchers - for i, loader in ipairs(loaders) do - if loader == moon_loader then - remove(loaders, i) - return true - end - end - return false -end -return { - _NAME = "moonscript", - insert_loader = insert_loader, - remove_loader = remove_loader, - to_lua = to_lua, - moon_loader = moon_loader, - dirsep = dirsep, - dofile = dofile, - loadfile = loadfile, - loadstring = loadstring, - create_moonpath = create_moonpath -} diff --git a/moonscript/base.moon b/moonscript/base.moon deleted file mode 100644 index 3a4502d4..00000000 --- a/moonscript/base.moon +++ /dev/null @@ -1,108 +0,0 @@ -compile = require "moonscript.compile" -parse = require "moonscript.parse" - -import concat, insert, remove from table -import split, dump, get_options, unpack from require "moonscript.util" - -lua = :loadstring, :load - -local * - -dirsep = "/" -line_tables = require "moonscript.line_tables" - --- create moon path package from lua package path -create_moonpath = (package_path) -> - moonpaths = for path in *split package_path, ";" - prefix = path\match "^(.-)%.lua$" - continue unless prefix - prefix .. ".moon" - concat moonpaths, ";" - -to_lua = (text, options={}) -> - if "string" != type text - t = type text - return nil, "expecting string (got ".. t ..")" - - tree, err = parse.string text - if not tree - return nil, err - - code, ltable, pos = compile.tree tree, options - if not code - return nil, compile.format_error(ltable, pos, text) - - code, ltable - -moon_loader = (name) -> - name_path = name\gsub "%.", dirsep - - local file, file_path - for path in package.moonpath\gmatch "[^;]+" - file_path = path\gsub "?", name_path - file = io.open file_path - break if file - - if file - text = file\read "*a" - file\close! - res, err = loadstring text, "@#{file_path}" - if not res - error file_path .. ": " .. err - - return res - - return nil, "Could not find moon file" - - -loadstring = (...) -> - options, str, chunk_name, mode, env = get_options ... - chunk_name or= "=(moonscript.loadstring)" - - code, ltable_or_err = to_lua str, options - unless code - return nil, ltable_or_err - - line_tables[chunk_name] = ltable_or_err if chunk_name - -- the unpack prevents us from passing nil - (lua.loadstring or lua.load) code, chunk_name, unpack { mode, env } - -loadfile = (fname, ...) -> - file, err = io.open fname - return nil, err unless file - text = assert file\read "*a" - file\close! - loadstring text, "@#{fname}", ... - --- throws errros -dofile = (...) -> - f = assert loadfile ... - f! - -insert_loader = (pos=2) -> - if not package.moonpath - package.moonpath = create_moonpath package.path - - loaders = package.loaders or package.searchers - for loader in *loaders - return false if loader == moon_loader - - insert loaders, pos, moon_loader - true - -remove_loader = -> - loaders = package.loaders or package.searchers - - for i, loader in ipairs loaders - if loader == moon_loader - remove loaders, i - return true - - false - -{ - _NAME: "moonscript" - :insert_loader, :remove_loader, :to_lua, :moon_loader, :dirsep, - :dofile, :loadfile, :loadstring, :create_moonpath -} - diff --git a/moonscript/cmd/args.lua b/moonscript/cmd/args.lua deleted file mode 100644 index 68b06fdc..00000000 --- a/moonscript/cmd/args.lua +++ /dev/null @@ -1,69 +0,0 @@ -local unpack -unpack = require("moonscript.util").unpack -local parse_spec -parse_spec = function(spec) - local flags, words - if type(spec) == "table" then - flags, words = unpack(spec), spec - else - flags, words = spec, { } - end - assert("no flags for arguments") - local out = { } - for part in flags:gmatch("%w:?") do - if part:match(":$") then - out[part:sub(1, 1)] = { - value = true - } - else - out[part] = { } - end - end - return out -end -local parse_arguments -parse_arguments = function(spec, args) - spec = parse_spec(spec) - local out = { } - local remaining = { } - local last_flag = nil - for _index_0 = 1, #args do - local _continue_0 = false - repeat - local arg = args[_index_0] - local group = { } - if last_flag then - out[last_flag] = arg - _continue_0 = true - break - end - do - local flag = arg:match("-(%w+)") - if flag then - do - local short_name = spec[flag] - if short_name then - out[short_name] = true - else - for char in flag:gmatch(".") do - out[char] = true - end - end - end - _continue_0 = true - break - end - end - table.insert(remaining, arg) - _continue_0 = true - until true - if not _continue_0 then - break - end - end - return out, remaining -end -return { - parse_arguments = parse_arguments, - parse_spec = parse_spec -} diff --git a/moonscript/cmd/args.moon b/moonscript/cmd/args.moon deleted file mode 100644 index ac65c0e3..00000000 --- a/moonscript/cmd/args.moon +++ /dev/null @@ -1,47 +0,0 @@ -import unpack from require "moonscript.util" -parse_spec = (spec) -> - flags, words = if type(spec) == "table" - unpack(spec), spec - else - spec, {} - - assert "no flags for arguments" - - out = {} - for part in flags\gmatch "%w:?" - if part\match ":$" - out[part\sub 1,1] = { value: true } - else - out[part] = {} - - out - -parse_arguments = (spec, args) -> - spec = parse_spec spec - - out = {} - - remaining = {} - last_flag = nil - - for arg in *args - group = {} - if last_flag - out[last_flag] = arg - continue - - if flag = arg\match "-(%w+)" - if short_name = spec[flag] - out[short_name] = true - else - for char in flag\gmatch "." - out[char] = true - continue - - table.insert remaining, arg - - out, remaining - - - -{ :parse_arguments, :parse_spec } diff --git a/moonscript/cmd/coverage.lua b/moonscript/cmd/coverage.lua deleted file mode 100644 index 43456301..00000000 --- a/moonscript/cmd/coverage.lua +++ /dev/null @@ -1,146 +0,0 @@ -local log -log = function(str) - if str == nil then - str = "" - end - return io.stderr:write(str .. "\n") -end -local create_counter -create_counter = function() - return setmetatable({ }, { - __index = function(self, name) - do - local tbl = setmetatable({ }, { - __index = function(self) - return 0 - end - }) - self[name] = tbl - return tbl - end - end - }) -end -local position_to_lines -position_to_lines = function(file_content, positions) - local lines = { } - local current_pos = 0 - local line_no = 1 - for char in file_content:gmatch(".") do - do - local count = rawget(positions, current_pos) - if count then - lines[line_no] = count - end - end - if char == "\n" then - line_no = line_no + 1 - end - current_pos = current_pos + 1 - end - return lines -end -local format_file -format_file = function(fname, positions) - fname = fname:gsub("^@", "") - local file = assert(io.open(fname)) - local content = file:read("*a") - file:close() - local lines = position_to_lines(content, positions) - log("------| @" .. tostring(fname)) - local line_no = 1 - for line in (content .. "\n"):gmatch("(.-)\n") do - local foramtted_no = ("% 5d"):format(line_no) - local sym = lines[line_no] and "*" or " " - log(tostring(sym) .. tostring(foramtted_no) .. "| " .. tostring(line)) - line_no = line_no + 1 - end - return log() -end -local CodeCoverage -do - local _class_0 - local _base_0 = { - reset = function(self) - self.line_counts = create_counter() - end, - start = function(self) - return debug.sethook((function() - local _base_1 = self - local _fn_0 = _base_1.process_line - return function(...) - return _fn_0(_base_1, ...) - end - end)(), "l") - end, - stop = function(self) - return debug.sethook() - end, - print_results = function(self) - return self:format_results() - end, - process_line = function(self, _, line_no) - local debug_data = debug.getinfo(2, "S") - local source = debug_data.source - local _update_0, _update_1 = source, line_no - self.line_counts[_update_0][_update_1] = self.line_counts[_update_0][_update_1] + 1 - end, - format_results = function(self) - local line_table = require("moonscript.line_tables") - local positions = create_counter() - for file, lines in pairs(self.line_counts) do - local _continue_0 = false - repeat - local file_table = line_table[file] - if not (file_table) then - _continue_0 = true - break - end - for line, count in pairs(lines) do - local _continue_1 = false - repeat - local position = file_table[line] - if not (position) then - _continue_1 = true - break - end - local _update_0, _update_1 = file, position - positions[_update_0][_update_1] = positions[_update_0][_update_1] + count - _continue_1 = true - until true - if not _continue_1 then - break - end - end - _continue_0 = true - until true - if not _continue_0 then - break - end - end - for file, ps in pairs(positions) do - format_file(file, ps) - end - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - return self:reset() - end, - __base = _base_0, - __name = "CodeCoverage" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - CodeCoverage = _class_0 -end -return { - CodeCoverage = CodeCoverage -} diff --git a/moonscript/cmd/coverage.moon b/moonscript/cmd/coverage.moon deleted file mode 100644 index 281c12aa..00000000 --- a/moonscript/cmd/coverage.moon +++ /dev/null @@ -1,82 +0,0 @@ - -log = (str="") -> - io.stderr\write str .. "\n" - -create_counter = -> - setmetatable {}, __index: (name) => - with tbl = setmetatable {}, __index: => 0 - @[name] = tbl - -position_to_lines = (file_content, positions) -> - lines = {} - current_pos = 0 - line_no = 1 - for char in file_content\gmatch "." - if count = rawget positions, current_pos - lines[line_no] = count - - if char == "\n" - line_no += 1 - - current_pos += 1 - - lines - -format_file = (fname, positions) -> - -- sources have @ in front of file names - fname = fname\gsub "^@", "" - - file = assert io.open fname - content = file\read "*a" - file\close! - - lines = position_to_lines content, positions - log "------| @#{fname}" - line_no = 1 - for line in (content .. "\n")\gmatch "(.-)\n" - foramtted_no = "% 5d"\format(line_no) - sym = lines[line_no] and "*" or " " - log "#{sym}#{foramtted_no}| #{line}" - line_no += 1 - - log! - - -class CodeCoverage - new: => - @reset! - - reset: => - @line_counts = create_counter! - - start: => - debug.sethook @\process_line, "l" - - stop: => - debug.sethook! - - print_results: => - @format_results! - - process_line: (_, line_no) => - debug_data = debug.getinfo 2, "S" - source = debug_data.source - @line_counts[source][line_no] += 1 - - format_results: => - line_table = require "moonscript.line_tables" - positions = create_counter! - - for file, lines in pairs @line_counts - file_table = line_table[file] - continue unless file_table - - for line, count in pairs lines - position = file_table[line] - continue unless position - positions[file][position] += count - - for file, ps in pairs positions - format_file file, ps - -{ :CodeCoverage } diff --git a/moonscript/cmd/lint.lua b/moonscript/cmd/lint.lua deleted file mode 100644 index 68053ca5..00000000 --- a/moonscript/cmd/lint.lua +++ /dev/null @@ -1,324 +0,0 @@ -local insert -insert = table.insert -local Set -Set = require("moonscript.data").Set -local Block -Block = require("moonscript.compile").Block -local mtype -mtype = require("moonscript.util").moon.type -local default_whitelist = Set({ - '_G', - '_VERSION', - 'assert', - 'bit32', - 'collectgarbage', - 'coroutine', - 'debug', - 'dofile', - 'error', - 'getfenv', - 'getmetatable', - 'io', - 'ipairs', - 'load', - 'loadfile', - 'loadstring', - 'math', - 'module', - 'next', - 'os', - 'package', - 'pairs', - 'pcall', - 'print', - 'rawequal', - 'rawget', - 'rawlen', - 'rawset', - 'require', - 'select', - 'setfenv', - 'setmetatable', - 'string', - 'table', - 'tonumber', - 'tostring', - 'type', - 'unpack', - 'xpcall', - "nil", - "true", - "false" -}) -local LinterBlock -do - local _class_0 - local _parent_0 = Block - local _base_0 = { - lint_mark_used = function(self, name) - if self.lint_unused_names and self.lint_unused_names[name] then - self.lint_unused_names[name] = false - return - end - if self.parent then - return self.parent:lint_mark_used(name) - end - end, - lint_check_unused = function(self) - if not (self.lint_unused_names and next(self.lint_unused_names)) then - return - end - local names_by_position = { } - for name, pos in pairs(self.lint_unused_names) do - local _continue_0 = false - repeat - if not (pos) then - _continue_0 = true - break - end - local _update_0 = pos - names_by_position[_update_0] = names_by_position[_update_0] or { } - insert(names_by_position[pos], name) - _continue_0 = true - until true - if not _continue_0 then - break - end - end - local tuples - do - local _accum_0 = { } - local _len_0 = 1 - for pos, names in pairs(names_by_position) do - _accum_0[_len_0] = { - pos, - names - } - _len_0 = _len_0 + 1 - end - tuples = _accum_0 - end - table.sort(tuples, function(a, b) - return a[1] < b[1] - end) - for _index_0 = 1, #tuples do - local _des_0 = tuples[_index_0] - local pos, names - pos, names = _des_0[1], _des_0[2] - insert(self:get_root_block().lint_errors, { - "assigned but unused " .. tostring(table.concat((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_1 = 1, #names do - local n = names[_index_1] - _accum_0[_len_0] = "`" .. tostring(n) .. "`" - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ")), - pos - }) - end - end, - render = function(self, ...) - self:lint_check_unused() - return _class_0.__parent.__base.render(self, ...) - end, - block = function(self, ...) - do - local _with_0 = _class_0.__parent.__base.block(self, ...) - _with_0.block = self.block - _with_0.render = self.render - _with_0.get_root_block = self.get_root_block - _with_0.lint_check_unused = self.lint_check_unused - _with_0.lint_mark_used = self.lint_mark_used - _with_0.value_compilers = self.value_compilers - _with_0.statement_compilers = self.statement_compilers - return _with_0 - end - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, whitelist_globals, ...) - if whitelist_globals == nil then - whitelist_globals = default_whitelist - end - _class_0.__parent.__init(self, ...) - self.get_root_block = function() - return self - end - self.lint_errors = { } - local vc = self.value_compilers - self.value_compilers = setmetatable({ - ref = function(block, val) - local name = val[2] - if not (block:has_name(name) or whitelist_globals[name] or name:match("%.")) then - insert(self.lint_errors, { - "accessing global `" .. tostring(name) .. "`", - val[-1] - }) - end - block:lint_mark_used(name) - return vc.ref(block, val) - end - }, { - __index = vc - }) - local sc = self.statement_compilers - self.statement_compilers = setmetatable({ - assign = function(block, node) - local names = node[2] - for _index_0 = 1, #names do - local _continue_0 = false - repeat - local name = names[_index_0] - if type(name) == "table" and name[1] == "temp_name" then - _continue_0 = true - break - end - local real_name, is_local = block:extract_assign_name(name) - if not (is_local or real_name and not block:has_name(real_name, true)) then - _continue_0 = true - break - end - if real_name == "_" then - _continue_0 = true - break - end - block.lint_unused_names = block.lint_unused_names or { } - block.lint_unused_names[real_name] = node[-1] or 0 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - return sc.assign(block, node) - end - }, { - __index = sc - }) - end, - __base = _base_0, - __name = "LinterBlock", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - LinterBlock = _class_0 -end -local format_lint -format_lint = function(errors, code, header) - if not (next(errors)) then - return - end - local pos_to_line, get_line - do - local _obj_0 = require("moonscript.util") - pos_to_line, get_line = _obj_0.pos_to_line, _obj_0.get_line - end - local formatted - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #errors do - local _des_0 = errors[_index_0] - local msg, pos - msg, pos = _des_0[1], _des_0[2] - if pos then - local line = pos_to_line(code, pos) - msg = "line " .. tostring(line) .. ": " .. tostring(msg) - local line_text = "> " .. get_line(code, line) - local sep_len = math.max(#msg, #line_text) - _accum_0[_len_0] = table.concat({ - msg, - ("="):rep(sep_len), - line_text - }, "\n") - else - _accum_0[_len_0] = msg - end - _len_0 = _len_0 + 1 - end - formatted = _accum_0 - end - if header then - table.insert(formatted, 1, header) - end - return table.concat(formatted, "\n\n") -end -local whitelist_for_file -do - local lint_config - whitelist_for_file = function(fname) - if not (lint_config) then - lint_config = { } - pcall(function() - lint_config = require("lint_config") - end) - end - if not (lint_config.whitelist_globals) then - return default_whitelist - end - local final_list = { } - for pattern, list in pairs(lint_config.whitelist_globals) do - if fname:match(pattern) then - for _index_0 = 1, #list do - local item = list[_index_0] - insert(final_list, item) - end - end - end - return setmetatable(Set(final_list), { - __index = default_whitelist - }) - end -end -local lint_code -lint_code = function(code, name, whitelist_globals) - if name == nil then - name = "string input" - end - local parse = require("moonscript.parse") - local tree, err = parse.string(code) - if not (tree) then - return nil, err - end - local scope = LinterBlock(whitelist_globals) - scope:stms(tree) - scope:lint_check_unused() - return format_lint(scope.lint_errors, code, name) -end -local lint_file -lint_file = function(fname) - local f, err = io.open(fname) - if not (f) then - return nil, err - end - return lint_code(f:read("*a"), fname, whitelist_for_file(fname)) -end -return { - lint_code = lint_code, - lint_file = lint_file -} diff --git a/moonscript/cmd/lint.moon b/moonscript/cmd/lint.moon deleted file mode 100644 index 103c25ed..00000000 --- a/moonscript/cmd/lint.moon +++ /dev/null @@ -1,204 +0,0 @@ - -import insert from table -import Set from require "moonscript.data" -import Block from require "moonscript.compile" - -{type: mtype} = require("moonscript.util").moon - --- globals allowed to be referenced -default_whitelist = Set { - '_G' - '_VERSION' - 'assert' - 'bit32' - 'collectgarbage' - 'coroutine' - 'debug' - 'dofile' - 'error' - 'getfenv' - 'getmetatable' - 'io' - 'ipairs' - 'load' - 'loadfile' - 'loadstring' - 'math' - 'module' - 'next' - 'os' - 'package' - 'pairs' - 'pcall' - 'print' - 'rawequal' - 'rawget' - 'rawlen' - 'rawset' - 'require' - 'select' - 'setfenv' - 'setmetatable' - 'string' - 'table' - 'tonumber' - 'tostring' - 'type' - 'unpack' - 'xpcall' - - "nil" - "true" - "false" -} - -class LinterBlock extends Block - new: (whitelist_globals=default_whitelist, ...) => - super ... - @get_root_block = -> @ - - @lint_errors = {} - - vc = @value_compilers - @value_compilers = setmetatable { - ref: (block, val) -> - name = val[2] - unless block\has_name(name) or whitelist_globals[name] or name\match "%." - insert @lint_errors, { - "accessing global `#{name}`" - val[-1] - } - - block\lint_mark_used name - vc.ref block, val - }, __index: vc - - sc = @statement_compilers - @statement_compilers = setmetatable { - assign: (block, node) -> - names = node[2] - -- extract the names to be declared - for name in *names - -- don't include autogenerated names - if type(name) == "table" and name[1] == "temp_name" - continue - - real_name, is_local = block\extract_assign_name name - -- already defined in some other scope - unless is_local or real_name and not block\has_name real_name, true - continue - - continue if real_name == "_" - - block.lint_unused_names or= {} - block.lint_unused_names[real_name] = node[-1] or 0 - - sc.assign block, node - }, __index: sc - - lint_mark_used: (name) => - if @lint_unused_names and @lint_unused_names[name] - @lint_unused_names[name] = false - return - - if @parent - @parent\lint_mark_used name - - lint_check_unused: => - return unless @lint_unused_names and next @lint_unused_names - - names_by_position = {} - for name, pos in pairs @lint_unused_names - continue unless pos - names_by_position[pos] or= {} - insert names_by_position[pos], name - - tuples = [{pos, names} for pos,names in pairs names_by_position] - table.sort tuples, (a,b) -> a[1] < b[1] - - for {pos, names} in *tuples - insert @get_root_block!.lint_errors, { - "assigned but unused #{table.concat ["`#{n}`" for n in *names], ", "}" - pos - } - - render: (...) => - @lint_check_unused! - super ... - - block: (...) => - - with super ... - .block = @block - .render = @render - .get_root_block = @get_root_block - .lint_check_unused = @lint_check_unused - .lint_mark_used = @lint_mark_used - .value_compilers = @value_compilers - .statement_compilers = @statement_compilers - -format_lint = (errors, code, header) -> - return unless next errors - - import pos_to_line, get_line from require "moonscript.util" - formatted = for {msg, pos} in *errors - if pos - line = pos_to_line code, pos - msg = "line #{line}: #{msg}" - line_text = "> " .. get_line code, line - - sep_len = math.max #msg, #line_text - table.concat { - msg - "="\rep sep_len - line_text - }, "\n" - - else - msg - - table.insert formatted, 1, header if header - table.concat formatted, "\n\n" - - --- { --- whitelist_globals: { --- ["some_file_pattern"]: { --- "some_var", "another_var" --- } --- } --- } -whitelist_for_file = do - local lint_config - (fname) -> - unless lint_config - lint_config = {} - pcall -> lint_config = require "lint_config" - - return default_whitelist unless lint_config.whitelist_globals - final_list = {} - for pattern, list in pairs lint_config.whitelist_globals - if fname\match(pattern) - for item in *list - insert final_list, item - - setmetatable Set(final_list), __index: default_whitelist - -lint_code = (code, name="string input", whitelist_globals) -> - parse = require "moonscript.parse" - tree, err = parse.string code - return nil, err unless tree - - scope = LinterBlock whitelist_globals - scope\stms tree - scope\lint_check_unused! - - format_lint scope.lint_errors, code, name - -lint_file = (fname) -> - f, err = io.open fname - return nil, err unless f - lint_code f\read("*a"), fname, whitelist_for_file fname - - -{ :lint_code, :lint_file } diff --git a/moonscript/cmd/moonc.lua b/moonscript/cmd/moonc.lua deleted file mode 100644 index e7618ef8..00000000 --- a/moonscript/cmd/moonc.lua +++ /dev/null @@ -1,199 +0,0 @@ -local lfs = require("lfs") -local split -split = require("moonscript.util").split -local dirsep, dirsep_chars, mkdir, normalize_dir, parse_dir, parse_file, convert_path, format_time, gettime, compile_file_text, write_file, compile_and_write, is_abs_path, path_to_target -dirsep = package.config:sub(1, 1) -if dirsep == "\\" then - dirsep_chars = "\\/" -else - dirsep_chars = dirsep -end -mkdir = function(path) - local chunks = split(path, dirsep) - local accum - for _index_0 = 1, #chunks do - local dir = chunks[_index_0] - accum = accum and tostring(accum) .. tostring(dirsep) .. tostring(dir) or dir - lfs.mkdir(accum) - end - return lfs.attributes(path, "mode") -end -normalize_dir = function(path) - return path:match("^(.-)[" .. tostring(dirsep_chars) .. "]*$") .. dirsep -end -parse_dir = function(path) - return (path:match("^(.-)[^" .. tostring(dirsep_chars) .. "]*$")) -end -parse_file = function(path) - return (path:match("^.-([^" .. tostring(dirsep_chars) .. "]*)$")) -end -convert_path = function(path) - local new_path = path:gsub("%.moon$", ".lua") - if new_path == path then - new_path = path .. ".lua" - end - return new_path -end -format_time = function(time) - return ("%.3fms"):format(time * 1000) -end -do - local socket - gettime = function() - if socket == nil then - pcall(function() - socket = require("socket") - end) - if not (socket) then - socket = false - end - end - if socket then - return socket.gettime() - else - return nil, "LuaSocket needed for benchmark" - end - end -end -compile_file_text = function(text, opts) - if opts == nil then - opts = { } - end - local parse = require("moonscript.parse") - local compile = require("moonscript.compile") - local parse_time - if opts.benchmark then - parse_time = assert(gettime()) - end - local tree, err = parse.string(text) - if not (tree) then - return nil, err - end - if parse_time then - parse_time = gettime() - parse_time - end - if opts.show_parse_tree then - local dump = require("moonscript.dump") - print(dump.tree(tree)) - return true - end - local compile_time - if opts.benchmark then - compile_time = gettime() - end - do - local mod = opts.transform_module - if mod then - local file = assert(loadfile(mod)) - local fn = assert(file()) - tree = assert(fn(tree)) - end - end - local code, posmap_or_err, err_pos = compile.tree(tree) - if not (code) then - return nil, compile.format_error(posmap_or_err, err_pos, text) - end - if compile_time then - compile_time = gettime() - compile_time - end - if opts.show_posmap then - local debug_posmap - debug_posmap = require("moonscript.util").debug_posmap - print("Pos", "Lua", ">>", "Moon") - print(debug_posmap(posmap_or_err, text, code)) - return true - end - if opts.benchmark then - print(table.concat({ - opts.fname or "stdin", - "Parse time \t" .. format_time(parse_time), - "Compile time\t" .. format_time(compile_time), - "" - }, "\n")) - return true - end - return code -end -write_file = function(fname, code) - mkdir(parse_dir(fname)) - local f, err = io.open(fname, "w") - if not (f) then - return nil, err - end - assert(f:write(code)) - assert(f:write("\n")) - f:close() - return "build" -end -compile_and_write = function(src, dest, opts) - if opts == nil then - opts = { } - end - local f = io.open(src) - if not (f) then - return nil, "Can't find file" - end - local text = assert(f:read("*a")) - f:close() - local code, err = compile_file_text(text, opts) - if not code then - return nil, err - end - if code == true then - return true - end - if opts.print then - print(code) - return true - end - return write_file(dest, code) -end -is_abs_path = function(path) - local first = path:sub(1, 1) - if dirsep == "\\" then - return first == "/" or first == "\\" or path:sub(2, 1) == ":" - else - return first == dirsep - end -end -path_to_target = function(path, target_dir, base_dir) - if target_dir == nil then - target_dir = nil - end - if base_dir == nil then - base_dir = nil - end - local target = convert_path(path) - if target_dir then - target_dir = normalize_dir(target_dir) - end - if base_dir and target_dir then - local head = base_dir:match("^(.-)[^" .. tostring(dirsep_chars) .. "]*[" .. tostring(dirsep_chars) .. "]?$") - if head then - local start, stop = target:find(head, 1, true) - if start == 1 then - target = target:sub(stop + 1) - end - end - end - if target_dir then - if is_abs_path(target) then - target = parse_file(target) - end - target = target_dir .. target - end - return target -end -return { - dirsep = dirsep, - mkdir = mkdir, - normalize_dir = normalize_dir, - parse_dir = parse_dir, - parse_file = parse_file, - convert_path = convert_path, - gettime = gettime, - format_time = format_time, - path_to_target = path_to_target, - compile_file_text = compile_file_text, - compile_and_write = compile_and_write -} diff --git a/moonscript/cmd/moonc.moon b/moonscript/cmd/moonc.moon deleted file mode 100644 index 3e05bb07..00000000 --- a/moonscript/cmd/moonc.moon +++ /dev/null @@ -1,197 +0,0 @@ --- assorted utilities for moonc command line tool - -lfs = require "lfs" - -import split from require "moonscript.util" - -local * - -dirsep = package.config\sub 1,1 -dirsep_chars = if dirsep == "\\" - "\\/" -- windows -else - dirsep - --- similar to mkdir -p -mkdir = (path) -> - chunks = split path, dirsep - - local accum - for dir in *chunks - accum = accum and "#{accum}#{dirsep}#{dir}" or dir - lfs.mkdir accum - - lfs.attributes path, "mode" - --- strips excess / and ensures path ends with / -normalize_dir = (path) -> - path\match("^(.-)[#{dirsep_chars}]*$") .. dirsep - --- parse the directory out of a path -parse_dir = (path) -> - (path\match "^(.-)[^#{dirsep_chars}]*$") - --- parse the filename out of a path -parse_file = (path) -> - (path\match "^.-([^#{dirsep_chars}]*)$") - --- converts .moon to a .lua path for calcuating compile target -convert_path = (path) -> - new_path = path\gsub "%.moon$", ".lua" - if new_path == path - new_path = path .. ".lua" - new_path - -format_time = (time) -> - "%.3fms"\format time*1000 - -gettime = do - local socket - -> - if socket == nil - pcall -> - socket = require "socket" - - unless socket - socket = false - - if socket - socket.gettime() - else - nil, "LuaSocket needed for benchmark" - --- compiles file to lua, returns lua code --- returns nil, error on error --- returns true if some option handled the output instead -compile_file_text = (text, opts={}) -> - parse = require "moonscript.parse" - compile = require "moonscript.compile" - - parse_time = if opts.benchmark - assert gettime! - - tree, err = parse.string text - return nil, err unless tree - - if parse_time - parse_time = gettime! - parse_time - - if opts.show_parse_tree - dump = require "moonscript.dump" - print dump.tree tree - return true - - compile_time = if opts.benchmark - gettime! - - if mod = opts.transform_module - file = assert loadfile mod - fn = assert file! - tree = assert fn tree - - code, posmap_or_err, err_pos = compile.tree tree - - unless code - return nil, compile.format_error posmap_or_err, err_pos, text - - if compile_time - compile_time = gettime() - compile_time - - if opts.show_posmap - import debug_posmap from require "moonscript.util" - print "Pos", "Lua", ">>", "Moon" - print debug_posmap posmap_or_err, text, code - return true - - if opts.benchmark - print table.concat { - opts.fname or "stdin", - "Parse time \t" .. format_time(parse_time), - "Compile time\t" .. format_time(compile_time), - "" - }, "\n" - return true - - code - -write_file = (fname, code) -> - mkdir parse_dir fname - f, err = io.open fname, "w" - unless f - return nil, err - - assert f\write code - assert f\write "\n" - f\close! - "build" - -compile_and_write = (src, dest, opts={}) -> - f = io.open src - unless f - return nil, "Can't find file" - - text = assert f\read("*a") - f\close! - - code, err = compile_file_text text, opts - - if not code - return nil, err - - if code == true - return true - - if opts.print - print code - return true - - write_file dest, code - -is_abs_path = (path) -> - first = path\sub 1, 1 - if dirsep == "\\" - first == "/" or first == "\\" or path\sub(2,1) == ":" - else - first == dirsep - - --- calcuate where a path should be compiled to --- target_dir: the directory to place the file (optional, from -t flag) --- base_dir: the directory where the file came from when globbing recursively -path_to_target = (path, target_dir=nil, base_dir=nil) -> - target = convert_path path - - if target_dir - target_dir = normalize_dir target_dir - - if base_dir and target_dir - -- one directory back - head = base_dir\match("^(.-)[^#{dirsep_chars}]*[#{dirsep_chars}]?$") - - if head - start, stop = target\find head, 1, true - if start == 1 - target = target\sub(stop + 1) - - if target_dir - if is_abs_path target - target = parse_file target - - target = target_dir .. target - - target - -{ - :dirsep - :mkdir - :normalize_dir - :parse_dir - :parse_file - :convert_path - :gettime - :format_time - :path_to_target - - :compile_file_text - :compile_and_write -} diff --git a/moonscript/cmd/watchers.lua b/moonscript/cmd/watchers.lua deleted file mode 100644 index 7e266b8d..00000000 --- a/moonscript/cmd/watchers.lua +++ /dev/null @@ -1,268 +0,0 @@ -local remove_dupes -remove_dupes = function(list, key_fn) - local seen = { } - return (function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #list do - local _continue_0 = false - repeat - local item = list[_index_0] - local key - if key_fn then - key = key_fn(item) - else - key = item - end - if seen[key] then - _continue_0 = true - break - end - seen[key] = true - local _value_0 = item - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - return _accum_0 - end)() -end -local plural -plural = function(count, word) - return tostring(count) .. " " .. tostring(word) .. tostring(count == 1 and "" or "s") -end -local Watcher -do - local _class_0 - local _base_0 = { - start_msg = "Starting watch loop (Ctrl-C to exit)", - print_start = function(self, mode, misc) - return io.stderr:write(tostring(self.start_msg) .. " with " .. tostring(mode) .. " [" .. tostring(misc) .. "]\n") - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, file_list) - self.file_list = file_list - end, - __base = _base_0, - __name = "Watcher" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Watcher = _class_0 -end -local InotifyWacher -do - local _class_0 - local _parent_0 = Watcher - local _base_0 = { - get_dirs = function(self) - local parse_dir - parse_dir = require("moonscript.cmd.moonc").parse_dir - local dirs - do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = self.file_list - for _index_0 = 1, #_list_0 do - local _des_0 = _list_0[_index_0] - local file_path - file_path = _des_0[1] - local dir = parse_dir(file_path) - if dir == "" then - dir = "./" - end - local _value_0 = dir - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - dirs = _accum_0 - end - return remove_dupes(dirs) - end, - each_update = function(self) - return coroutine.wrap(function() - local dirs = self:get_dirs() - self:print_start("inotify", plural(#dirs, "dir")) - local wd_table = { } - local inotify = require("inotify") - local handle = inotify.init() - for _index_0 = 1, #dirs do - local dir = dirs[_index_0] - local wd = handle:addwatch(dir, inotify.IN_CLOSE_WRITE, inotify.IN_MOVED_TO) - wd_table[wd] = dir - end - while true do - local events = handle:read() - if not (events) then - break - end - for _index_0 = 1, #events do - local _continue_0 = false - repeat - local ev = events[_index_0] - local fname = ev.name - if not (fname:match("%.moon$")) then - _continue_0 = true - break - end - local dir = wd_table[ev.wd] - if dir ~= "./" then - fname = dir .. fname - end - coroutine.yield(fname) - _continue_0 = true - until true - if not _continue_0 then - break - end - end - end - end) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "InotifyWacher", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - self.available = function(self) - return pcall(function() - return require("inotify") - end) - end - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - InotifyWacher = _class_0 -end -local SleepWatcher -do - local _class_0 - local _parent_0 = Watcher - local _base_0 = { - polling_rate = 1.0, - get_sleep_func = function(self) - local sleep - pcall(function() - sleep = require("socket").sleep - end) - sleep = sleep or require("moonscript")._sleep - if not (sleep) then - error("Missing sleep function; install LuaSocket") - end - return sleep - end, - each_update = function(self) - return coroutine.wrap(function() - local lfs = require("lfs") - local sleep = self:get_sleep_func() - self:print_start("polling", plural(#self.file_list, "files")) - local mod_time = { } - while true do - local _list_0 = self.file_list - for _index_0 = 1, #_list_0 do - local _continue_0 = false - repeat - local _des_0 = _list_0[_index_0] - local file - file = _des_0[1] - local time = lfs.attributes(file, "modification") - if not (time) then - mod_time[file] = nil - _continue_0 = true - break - end - if not (mod_time[file]) then - mod_time[file] = time - _continue_0 = true - break - end - if time > mod_time[file] then - mod_time[file] = time - coroutine.yield(file) - end - _continue_0 = true - until true - if not _continue_0 then - break - end - end - sleep(self.polling_rate) - end - end) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "SleepWatcher", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - SleepWatcher = _class_0 -end -return { - Watcher = Watcher, - SleepWatcher = SleepWatcher, - InotifyWacher = InotifyWacher -} diff --git a/moonscript/cmd/watchers.moon b/moonscript/cmd/watchers.moon deleted file mode 100644 index c147fc5e..00000000 --- a/moonscript/cmd/watchers.moon +++ /dev/null @@ -1,103 +0,0 @@ -remove_dupes = (list, key_fn) -> - seen = {} - return for item in *list - key = if key_fn then key_fn item else item - continue if seen[key] - seen[key] = true - item - -plural = (count, word) -> - "#{count} #{word}#{count == 1 and "" or "s"}" - --- files is a list of tuples, {source, target} -class Watcher - start_msg: "Starting watch loop (Ctrl-C to exit)" - new: (@file_list) => - - print_start: (mode, misc) => - io.stderr\write "#{@start_msg} with #{mode} [#{misc}]\n" - -class InotifyWacher extends Watcher - @available: => - pcall -> require "inotify" - - get_dirs: => - import parse_dir from require "moonscript.cmd.moonc" - dirs = for {file_path} in *@file_list - dir = parse_dir file_path - dir = "./" if dir == "" - dir - - remove_dupes dirs - - -- creates an iterator that yields a file every time it's updated - -- TODO: detect when new files are added to directories - each_update: => - coroutine.wrap -> - dirs = @get_dirs! - - @print_start "inotify", plural #dirs, "dir" - - wd_table = {} - - inotify = require "inotify" - handle = inotify.init! - - for dir in *dirs - wd = handle\addwatch dir, inotify.IN_CLOSE_WRITE, inotify.IN_MOVED_TO - wd_table[wd] = dir - - while true - events = handle\read! - break unless events -- error? - - for ev in *events - fname = ev.name - continue unless fname\match "%.moon$" - dir = wd_table[ev.wd] - fname = dir .. fname if dir != "./" - - -- TODO: check to make sure the file was in the original set - coroutine.yield fname - -class SleepWatcher extends Watcher - polling_rate: 1.0 - - -- the windows mooonscript binaries provide their own sleep function - get_sleep_func: => - local sleep - - pcall -> - sleep = require("socket").sleep - - -- TODO: this is also loading moonloader, which isn't intentional - sleep or= require("moonscript")._sleep - error "Missing sleep function; install LuaSocket" unless sleep - sleep - - each_update: => - coroutine.wrap -> - lfs = require "lfs" - sleep = @get_sleep_func! - - @print_start "polling", plural #@file_list, "files" - mod_time = {} - - while true - for {file} in *@file_list - time = lfs.attributes file, "modification" - unless time -- file no longer exists - mod_time[file] = nil - continue - - unless mod_time[file] -- file time scanned - mod_time[file] = time - continue - - if time > mod_time[file] - mod_time[file] = time - coroutine.yield file - - sleep @polling_rate - -{:Watcher, :SleepWatcher, :InotifyWacher} diff --git a/moonscript/compile.lua b/moonscript/compile.lua deleted file mode 100644 index 66f4df59..00000000 --- a/moonscript/compile.lua +++ /dev/null @@ -1,748 +0,0 @@ -local util = require("moonscript.util") -local dump = require("moonscript.dump") -local transform = require("moonscript.transform") -local NameProxy, LocalName -do - local _obj_0 = require("moonscript.transform.names") - NameProxy, LocalName = _obj_0.NameProxy, _obj_0.LocalName -end -local Set -Set = require("moonscript.data").Set -local ntype, value_can_be_statement -do - local _obj_0 = require("moonscript.types") - ntype, value_can_be_statement = _obj_0.ntype, _obj_0.value_can_be_statement -end -local statement_compilers = require("moonscript.compile.statement") -local value_compilers = require("moonscript.compile.value") -local concat, insert -do - local _obj_0 = table - concat, insert = _obj_0.concat, _obj_0.insert -end -local pos_to_line, get_closest_line, trim, unpack -pos_to_line, get_closest_line, trim, unpack = util.pos_to_line, util.get_closest_line, util.trim, util.unpack -local mtype = util.moon.type -local indent_char = " " -local Line, DelayedLine, Lines, Block, RootBlock -do - local _class_0 - local _base_0 = { - mark_pos = function(self, pos, line) - if line == nil then - line = #self - end - if not (self.posmap[line]) then - self.posmap[line] = pos - end - end, - add = function(self, item) - local _exp_0 = mtype(item) - if Line == _exp_0 then - item:render(self) - elseif Block == _exp_0 then - item:render(self) - else - self[#self + 1] = item - end - return self - end, - flatten_posmap = function(self, line_no, out) - if line_no == nil then - line_no = 0 - end - if out == nil then - out = { } - end - local posmap = self.posmap - for i, l in ipairs(self) do - local _exp_0 = mtype(l) - if "string" == _exp_0 or DelayedLine == _exp_0 then - line_no = line_no + 1 - out[line_no] = posmap[i] - for _ in l:gmatch("\n") do - line_no = line_no + 1 - end - out[line_no] = posmap[i] - elseif Lines == _exp_0 then - local _ - _, line_no = l:flatten_posmap(line_no, out) - else - error("Unknown item in Lines: " .. tostring(l)) - end - end - return out, line_no - end, - flatten = function(self, indent, buffer) - if indent == nil then - indent = nil - end - if buffer == nil then - buffer = { } - end - for i = 1, #self do - local l = self[i] - local t = mtype(l) - if t == DelayedLine then - l = l:render() - t = "string" - end - local _exp_0 = t - if "string" == _exp_0 then - if indent then - insert(buffer, indent) - end - insert(buffer, l) - if "string" == type(self[i + 1]) then - if l:sub(-1) ~= ',' and l:sub(-3) ~= 'end' and self[i + 1]:sub(1, 1) == "(" then - insert(buffer, ";") - end - end - insert(buffer, "\n") - elseif Lines == _exp_0 then - l:flatten(indent and indent .. indent_char or indent_char, buffer) - else - error("Unknown item in Lines: " .. tostring(l)) - end - end - return buffer - end, - __tostring = function(self) - local strip - strip = function(t) - if "table" == type(t) then - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #t do - local v = t[_index_0] - _accum_0[_len_0] = strip(v) - _len_0 = _len_0 + 1 - end - return _accum_0 - else - return t - end - end - return "Lines<" .. tostring(util.dump(strip(self)):sub(1, -2)) .. ">" - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - self.posmap = { } - end, - __base = _base_0, - __name = "Lines" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Lines = _class_0 -end -do - local _class_0 - local _base_0 = { - pos = nil, - append_list = function(self, items, delim) - for i = 1, #items do - self:append(items[i]) - if i < #items then - insert(self, delim) - end - end - return nil - end, - append = function(self, first, ...) - if Line == mtype(first) then - if not (self.pos) then - self.pos = first.pos - end - for _index_0 = 1, #first do - local value = first[_index_0] - self:append(value) - end - else - insert(self, first) - end - if ... then - return self:append(...) - end - end, - render = function(self, buffer) - local current = { } - local add_current - add_current = function() - buffer:add(concat(current)) - return buffer:mark_pos(self.pos) - end - for _index_0 = 1, #self do - local chunk = self[_index_0] - local _exp_0 = mtype(chunk) - if Block == _exp_0 then - local _list_0 = chunk:render(Lines()) - for _index_1 = 1, #_list_0 do - local block_chunk = _list_0[_index_1] - if "string" == type(block_chunk) then - insert(current, block_chunk) - else - add_current() - buffer:add(block_chunk) - current = { } - end - end - else - insert(current, chunk) - end - end - if current[1] then - add_current() - end - return buffer - end, - __tostring = function(self) - return "Line<" .. tostring(util.dump(self):sub(1, -2)) .. ">" - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Line" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Line = _class_0 -end -do - local _class_0 - local _base_0 = { - prepare = function() end, - render = function(self) - self:prepare() - return concat(self) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, fn) - self.prepare = fn - end, - __base = _base_0, - __name = "DelayedLine" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - DelayedLine = _class_0 -end -do - local _class_0 - local _base_0 = { - header = "do", - footer = "end", - export_all = false, - export_proper = false, - value_compilers = value_compilers, - statement_compilers = statement_compilers, - __tostring = function(self) - local h - if "string" == type(self.header) then - h = self.header - else - h = unpack(self.header:render({ })) - end - return "Block<" .. tostring(h) .. "> <- " .. tostring(self.parent) - end, - set = function(self, name, value) - self._state[name] = value - end, - get = function(self, name) - return self._state[name] - end, - get_current = function(self, name) - return rawget(self._state, name) - end, - listen = function(self, name, fn) - self._listeners[name] = fn - end, - unlisten = function(self, name) - self._listeners[name] = nil - end, - send = function(self, name, ...) - do - local fn = self._listeners[name] - if fn then - return fn(self, ...) - end - end - end, - extract_assign_name = function(self, node) - local is_local = false - local real_name - local _exp_0 = mtype(node) - if LocalName == _exp_0 then - is_local = true - real_name = node:get_name(self) - elseif NameProxy == _exp_0 then - real_name = node:get_name(self) - elseif "table" == _exp_0 then - real_name = node[1] == "ref" and node[2] - elseif "string" == _exp_0 then - real_name = node - end - return real_name, is_local - end, - declare = function(self, names) - local undeclared - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local _continue_0 = false - repeat - local name = names[_index_0] - local real_name, is_local = self:extract_assign_name(name) - if not (is_local or real_name and not self:has_name(real_name, true)) then - _continue_0 = true - break - end - self:put_name(real_name) - if self:name_exported(real_name) then - _continue_0 = true - break - end - local _value_0 = real_name - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - undeclared = _accum_0 - end - return undeclared - end, - whitelist_names = function(self, names) - self._name_whitelist = Set(names) - end, - name_exported = function(self, name) - if self.export_all then - return true - end - if self.export_proper and name:match("^%u") then - return true - end - end, - put_name = function(self, name, ...) - local value = ... - if select("#", ...) == 0 then - value = true - end - if NameProxy == mtype(name) then - name = name:get_name(self) - end - self._names[name] = value - end, - has_name = function(self, name, skip_exports) - if not skip_exports and self:name_exported(name) then - return true - end - local yes = self._names[name] - if yes == nil and self.parent then - if not self._name_whitelist or self._name_whitelist[name] then - return self.parent:has_name(name, true) - end - else - return yes - end - end, - is_local = function(self, node) - local t = mtype(node) - if t == "string" then - return self:has_name(node, false) - end - if t == NameProxy or t == LocalName then - return true - end - if t == "table" then - if node[1] == "ref" or (node[1] == "chain" and #node == 2) then - return self:is_local(node[2]) - end - end - return false - end, - free_name = function(self, prefix, dont_put) - prefix = prefix or "moon" - local searching = true - local name, i = nil, 0 - while searching do - name = concat({ - "", - prefix, - i - }, "_") - i = i + 1 - searching = self:has_name(name, true) - end - if not dont_put then - self:put_name(name) - end - return name - end, - init_free_var = function(self, prefix, value) - local name = self:free_name(prefix, true) - self:stm({ - "assign", - { - name - }, - { - value - } - }) - return name - end, - add = function(self, item, pos) - do - local _with_0 = self._lines - _with_0:add(item) - if pos then - _with_0:mark_pos(pos) - end - end - return item - end, - render = function(self, buffer) - buffer:add(self.header) - buffer:mark_pos(self.pos) - if self.next then - buffer:add(self._lines) - self.next:render(buffer) - else - if #self._lines == 0 and "string" == type(buffer[#buffer]) then - local _update_0 = #buffer - buffer[_update_0] = buffer[_update_0] .. (" " .. (unpack(Lines():add(self.footer)))) - else - buffer:add(self._lines) - buffer:add(self.footer) - buffer:mark_pos(self.pos) - end - end - return buffer - end, - block = function(self, header, footer) - return Block(self, header, footer) - end, - line = function(self, ...) - do - local _with_0 = Line() - _with_0:append(...) - return _with_0 - end - end, - is_stm = function(self, node) - return self.statement_compilers[ntype(node)] ~= nil - end, - is_value = function(self, node) - local t = ntype(node) - return self.value_compilers[t] ~= nil or t == "value" - end, - name = function(self, node, ...) - if type(node) == "string" then - return node - else - return self:value(node, ...) - end - end, - value = function(self, node, ...) - node = self.transform.value(node) - local action - if type(node) ~= "table" then - action = "raw_value" - else - action = node[1] - end - local fn = self.value_compilers[action] - if not (fn) then - error({ - "compile-error", - "Failed to find value compiler for: " .. dump.value(node), - node[-1] - }) - end - local out = fn(self, node, ...) - if type(node) == "table" and node[-1] then - if type(out) == "string" then - do - local _with_0 = Line() - _with_0:append(out) - out = _with_0 - end - end - out.pos = node[-1] - end - return out - end, - values = function(self, values, delim) - delim = delim or ', ' - do - local _with_0 = Line() - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #values do - local v = values[_index_0] - _accum_0[_len_0] = self:value(v) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), delim) - return _with_0 - end - end, - stm = function(self, node, ...) - if not node then - return - end - node = self.transform.statement(node) - local result - do - local fn = self.statement_compilers[ntype(node)] - if fn then - result = fn(self, node, ...) - else - if value_can_be_statement(node) then - result = self:value(node) - else - result = self:stm({ - "assign", - { - "_" - }, - { - node - } - }) - end - end - end - if result then - if type(node) == "table" and type(result) == "table" and node[-1] then - result.pos = node[-1] - end - self:add(result) - end - return nil - end, - stms = function(self, stms, ret) - if ret then - error("deprecated stms call, use transformer") - end - local current_stms, current_stm_i - current_stms, current_stm_i = self.current_stms, self.current_stm_i - self.current_stms = stms - for i = 1, #stms do - self.current_stm_i = i - self:stm(stms[i]) - end - self.current_stms = current_stms - self.current_stm_i = current_stm_i - return nil - end, - splice = function(self, fn) - local lines = { - "lines", - self._lines - } - self._lines = Lines() - return self:stms(fn(lines)) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, parent, header, footer) - self.parent, self.header, self.footer = parent, header, footer - self._lines = Lines() - self._names = { } - self._state = { } - self._listeners = { } - do - self.transform = { - value = transform.Value:bind(self), - statement = transform.Statement:bind(self) - } - end - if self.parent then - self.root = self.parent.root - self.indent = self.parent.indent + 1 - setmetatable(self._state, { - __index = self.parent._state - }) - return setmetatable(self._listeners, { - __index = self.parent._listeners - }) - else - self.indent = 0 - end - end, - __base = _base_0, - __name = "Block" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Block = _class_0 -end -do - local _class_0 - local _parent_0 = Block - local _base_0 = { - __tostring = function(self) - return "RootBlock<>" - end, - root_stms = function(self, stms) - if not (self.options.implicitly_return_root == false) then - stms = transform.Statement.transformers.root_stms(self, stms) - end - return self:stms(stms) - end, - render = function(self) - local buffer = self._lines:flatten() - if buffer[#buffer] == "\n" then - buffer[#buffer] = nil - end - return table.concat(buffer) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, options) - self.options = options - self.root = self - return _class_0.__parent.__init(self) - end, - __base = _base_0, - __name = "RootBlock", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - RootBlock = _class_0 -end -local format_error -format_error = function(msg, pos, file_str) - local line_message - if pos then - local line = pos_to_line(file_str, pos) - local line_str - line_str, line = get_closest_line(file_str, line) - line_str = line_str or "" - line_message = (" [%d] >> %s"):format(line, trim(line_str)) - end - return concat({ - "Compile error: " .. msg, - line_message - }, "\n") -end -local value -value = function(value) - local out = nil - do - local _with_0 = RootBlock() - _with_0:add(_with_0:value(value)) - out = _with_0:render() - end - return out -end -local tree -tree = function(tree, options) - if options == nil then - options = { } - end - assert(tree, "missing tree") - local scope = (options.scope or RootBlock)(options) - local runner = coroutine.create(function() - return scope:root_stms(tree) - end) - local success, err = coroutine.resume(runner) - if not (success) then - local error_msg, error_pos - if type(err) == "table" then - local _exp_0 = err[1] - if "user-error" == _exp_0 or "compile-error" == _exp_0 then - error_msg, error_pos = unpack(err, 2) - else - error_msg, error_pos = error("Unknown error thrown", util.dump(error_msg)) - end - else - error_msg, error_pos = concat({ - err, - debug.traceback(runner) - }, "\n") - end - return nil, error_msg, error_pos or scope.last_pos - end - local lua_code = scope:render() - local posmap = scope._lines:flatten_posmap() - return lua_code, posmap -end -do - local data = require("moonscript.data") - for name, cls in pairs({ - Line = Line, - Lines = Lines, - DelayedLine = DelayedLine - }) do - data[name] = cls - end -end -return { - tree = tree, - value = value, - format_error = format_error, - Block = Block, - RootBlock = RootBlock -} diff --git a/moonscript/compile.moon b/moonscript/compile.moon deleted file mode 100644 index 716c2c4e..00000000 --- a/moonscript/compile.moon +++ /dev/null @@ -1,484 +0,0 @@ - -util = require "moonscript.util" -dump = require "moonscript.dump" -transform = require "moonscript.transform" - -import NameProxy, LocalName from require "moonscript.transform.names" -import Set from require "moonscript.data" -import ntype, value_can_be_statement from require "moonscript.types" - -statement_compilers = require "moonscript.compile.statement" -value_compilers = require "moonscript.compile.value" - -import concat, insert from table -import pos_to_line, get_closest_line, trim, unpack from util - -mtype = util.moon.type - -indent_char = " " - -local Line, DelayedLine, Lines, Block, RootBlock - --- a buffer for building up lines -class Lines - new: => - @posmap = {} - - mark_pos: (pos, line=#@) => - @posmap[line] = pos unless @posmap[line] - - -- append a line or lines to the buffer - add: (item) => - switch mtype item - when Line - item\render self - when Block - item\render self - else -- also captures DelayedLine - @[#@ + 1] = item - @ - - flatten_posmap: (line_no=0, out={}) => - posmap = @posmap - for i, l in ipairs @ - switch mtype l - when "string", DelayedLine - line_no += 1 - out[line_no] = posmap[i] - - line_no += 1 for _ in l\gmatch"\n" - out[line_no] = posmap[i] - when Lines - _, line_no = l\flatten_posmap line_no, out - else - error "Unknown item in Lines: #{l}" - - out, line_no - - flatten: (indent=nil, buffer={}) => - for i = 1, #@ - l = @[i] - t = mtype l - - if t == DelayedLine - l = l\render! - t = "string" - - switch t - when "string" - insert buffer, indent if indent - insert buffer, l - - -- insert breaks between ambiguous statements - if "string" == type @[i + 1] - if l\sub(-1)!=',' and l\sub(-3)!='end' and @[i + 1]\sub(1,1) == "(" - insert buffer, ";" - - insert buffer, "\n" - when Lines - l\flatten indent and indent .. indent_char or indent_char, buffer - else - error "Unknown item in Lines: #{l}" - buffer - - __tostring: => - -- strip non-array elements - strip = (t) -> - if "table" == type t - [strip v for v in *t] - else - t - - "Lines<#{util.dump(strip @)\sub 1, -2}>" - --- Buffer for building up a line --- A plain old table holding either strings or Block objects. --- Adding a line to a line will cause that line to be merged in. -class Line - pos: nil - - append_list: (items, delim) => - for i = 1,#items - @append items[i] - if i < #items then insert self, delim - nil - - append: (first, ...) => - if Line == mtype first - -- print "appending line to line", first.pos, first - @pos = first.pos unless @pos -- bubble pos if there isn't one - @append value for value in *first - else - insert self, first - - if ... - @append ... - - -- todo: try to remove concats from here - render: (buffer) => - current = {} - - add_current = -> - buffer\add concat current - buffer\mark_pos @pos - - for chunk in *@ - switch mtype chunk - when Block - for block_chunk in *chunk\render Lines! - if "string" == type block_chunk - insert current, block_chunk - else - add_current! - buffer\add block_chunk - current = {} - else - insert current, chunk - - if current[1] - add_current! - - buffer - - __tostring: => - "Line<#{util.dump(@)\sub 1, -2}>" - -class DelayedLine - new: (fn) => - @prepare = fn - - prepare: -> - - render: => - @prepare! - concat @ - -class Block - header: "do" - footer: "end" - - export_all: false - export_proper: false - - value_compilers: value_compilers - statement_compilers: statement_compilers - - __tostring: => - h = if "string" == type @header - @header - else - unpack @header\render {} - - "Block<#{h}> <- " .. tostring @parent - - new: (@parent, @header, @footer) => - @_lines = Lines! - - @_names = {} - @_state = {} - @_listeners = {} - - with transform - @transform = { - value: .Value\bind self - statement: .Statement\bind self - } - - if @parent - @root = @parent.root - @indent = @parent.indent + 1 - setmetatable @_state, { __index: @parent._state } - setmetatable @_listeners, { __index: @parent._listeners } - else - @indent = 0 - - set: (name, value) => - @_state[name] = value - - get: (name) => - @_state[name] - - get_current: (name) => - rawget @_state, name - - listen: (name, fn) => - @_listeners[name] = fn - - unlisten: (name) => - @_listeners[name] = nil - - send: (name, ...) => - if fn = @_listeners[name] - fn self, ... - - extract_assign_name: (node) => - is_local = false - real_name = switch mtype node - when LocalName - is_local = true - node\get_name self - when NameProxy - node\get_name self - when "table" - node[1] == "ref" and node[2] - when "string" - -- TOOD: some legacy transfomers might use string for ref - node - - real_name, is_local - - declare: (names) => - undeclared = for name in *names - real_name, is_local = @extract_assign_name name - continue unless is_local or real_name and not @has_name real_name, true - -- this also puts exported names so they can be assigned a new value in - -- deeper scope - @put_name real_name - continue if @name_exported real_name - real_name - - undeclared - - whitelist_names: (names) => - @_name_whitelist = Set names - - name_exported: (name) => - return true if @export_all - return true if @export_proper and name\match"^%u" - - put_name: (name, ...) => - value = ... - value = true if select("#", ...) == 0 - - name = name\get_name self if NameProxy == mtype name - @_names[name] = value - - -- Check if a name is defined in the current or any enclosing scope - -- skip_exports: ignore names that have been exported using `export` - has_name: (name, skip_exports) => - return true if not skip_exports and @name_exported name - - yes = @_names[name] - if yes == nil and @parent - if not @_name_whitelist or @_name_whitelist[name] - @parent\has_name name, true - else - yes - - is_local: (node) => - t = mtype node - - return @has_name(node, false) if t == "string" - return true if t == NameProxy or t == LocalName - - if t == "table" - if node[1] == "ref" or (node[1] == "chain" and #node == 2) - return @is_local node[2] - - false - - free_name: (prefix, dont_put) => - prefix = prefix or "moon" - searching = true - name, i = nil, 0 - while searching - name = concat {"", prefix, i}, "_" - i = i + 1 - searching = @has_name name, true - - @put_name name if not dont_put - name - - init_free_var: (prefix, value) => - name = @free_name prefix, true - @stm {"assign", {name}, {value}} - name - - -- add something to the line buffer - add: (item, pos) => - with @_lines - \add item - \mark_pos pos if pos - item - - -- todo: pass in buffer as argument - render: (buffer) => - buffer\add @header - buffer\mark_pos @pos - - if @next - buffer\add @_lines - @next\render buffer - else - -- join an empty block into a single line - if #@_lines == 0 and "string" == type buffer[#buffer] - buffer[#buffer] ..= " " .. (unpack Lines!\add @footer) - else - buffer\add @_lines - buffer\add @footer - buffer\mark_pos @pos - - buffer - - block: (header, footer) => - Block self, header, footer - - line: (...) => - with Line! - \append ... - - is_stm: (node) => - @statement_compilers[ntype node] != nil - - is_value: (node) => - t = ntype node - @value_compilers[t] != nil or t == "value" - - -- compile name for assign - name: (node, ...) => - if type(node) == "string" - node - else - @value node, ... - - value: (node, ...) => - node = @transform.value node - action = if type(node) != "table" - "raw_value" - else - node[1] - - fn = @value_compilers[action] - unless fn - error { - "compile-error" - "Failed to find value compiler for: " .. dump.value node - node[-1] - } - - out = fn self, node, ... - - -- store the pos, creating a line if necessary - if type(node) == "table" and node[-1] - if type(out) == "string" - out = with Line! do \append out - out.pos = node[-1] - - out - - values: (values, delim) => - delim = delim or ', ' - with Line! - \append_list [@value v for v in *values], delim - - stm: (node, ...) => - return if not node -- skip blank statements - node = @transform.statement node - - result = if fn = @statement_compilers[ntype(node)] - fn @, node, ... - else - if value_can_be_statement node - @value node - else - -- coerce value into statement - @stm {"assign", {"_"}, {node}} - - if result - if type(node) == "table" and type(result) == "table" and node[-1] - result.pos = node[-1] - @add result - - nil - - stms: (stms, ret) => - error "deprecated stms call, use transformer" if ret - {:current_stms, :current_stm_i} = @ - - @current_stms = stms - for i=1,#stms - @current_stm_i = i - @stm stms[i] - - @current_stms = current_stms - @current_stm_i = current_stm_i - - nil - - -- takes the existing set of lines and replaces them with the result of - -- calling fn on them - splice: (fn) => - lines = {"lines", @_lines} - @_lines = Lines! - @stms fn lines - -class RootBlock extends Block - new: (@options) => - @root = self - super! - - __tostring: => "RootBlock<>" - - root_stms: (stms) => - unless @options.implicitly_return_root == false - stms = transform.Statement.transformers.root_stms self, stms - @stms stms - - render: => - -- print @_lines - buffer = @_lines\flatten! - buffer[#buffer] = nil if buffer[#buffer] == "\n" - table.concat buffer - -format_error = (msg, pos, file_str) -> - line_message = if pos - line = pos_to_line file_str, pos - line_str, line = get_closest_line file_str, line - line_str = line_str or "" - (" [%d] >> %s")\format line, trim line_str - - concat { - "Compile error: "..msg - line_message - }, "\n" - -value = (value) -> - out = nil - with RootBlock! - \add \value value - out = \render! - out - -tree = (tree, options={}) -> - assert tree, "missing tree" - - scope = (options.scope or RootBlock) options - - runner = coroutine.create -> - scope\root_stms tree - - success, err = coroutine.resume runner - - unless success - error_msg, error_pos = if type(err) == "table" - switch err[1] - when "user-error", "compile-error" - unpack err, 2 - else - -- unknown error, bubble it - error "Unknown error thrown", util.dump error_msg - else - concat {err, debug.traceback runner}, "\n" - - return nil, error_msg, error_pos or scope.last_pos - - lua_code = scope\render! - posmap = scope._lines\flatten_posmap! - lua_code, posmap - --- mmmm -with data = require "moonscript.data" - for name, cls in pairs {:Line, :Lines, :DelayedLine} - data[name] = cls - -{ :tree, :value, :format_error, :Block, :RootBlock } diff --git a/moonscript/compile/statement.lua b/moonscript/compile/statement.lua deleted file mode 100644 index 7f1c9063..00000000 --- a/moonscript/compile/statement.lua +++ /dev/null @@ -1,240 +0,0 @@ -local ntype -ntype = require("moonscript.types").ntype -local concat, insert -do - local _obj_0 = table - concat, insert = _obj_0.concat, _obj_0.insert -end -local unpack -unpack = require("moonscript.util").unpack -return { - raw = function(self, node) - return self:add(node[2]) - end, - lines = function(self, node) - local _list_0 = node[2] - for _index_0 = 1, #_list_0 do - local line = _list_0[_index_0] - self:add(line) - end - end, - declare = function(self, node) - local names = node[2] - local undeclared = self:declare(names) - if #undeclared > 0 then - do - local _with_0 = self:line("local ") - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #undeclared do - local name = undeclared[_index_0] - _accum_0[_len_0] = self:name(name) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - return _with_0 - end - end - end, - declare_with_shadows = function(self, node) - local names = node[2] - self:declare(names) - do - local _with_0 = self:line("local ") - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local name = names[_index_0] - _accum_0[_len_0] = self:name(name) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - return _with_0 - end - end, - assign = function(self, node) - local names, values = unpack(node, 2) - local undeclared = self:declare(names) - local declare = "local " .. concat(undeclared, ", ") - local has_fndef = false - local i = 1 - while i <= #values do - if ntype(values[i]) == "fndef" then - has_fndef = true - end - i = i + 1 - end - do - local _with_0 = self:line() - if #undeclared == #names and not has_fndef then - _with_0:append(declare) - else - if #undeclared > 0 then - self:add(declare, node[-1]) - end - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local name = names[_index_0] - _accum_0[_len_0] = self:value(name) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - end - _with_0:append(" = ") - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #values do - local v = values[_index_0] - _accum_0[_len_0] = self:value(v) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - return _with_0 - end - end, - ["return"] = function(self, node) - return self:line("return ", (function() - if node[2] ~= "" then - return self:value(node[2]) - end - end)()) - end, - ["break"] = function(self, node) - return "break" - end, - ["if"] = function(self, node) - local cond, block = node[2], node[3] - local root - do - local _with_0 = self:block(self:line("if ", self:value(cond), " then")) - _with_0:stms(block) - root = _with_0 - end - local current = root - local add_clause - add_clause = function(clause) - local type = clause[1] - local i = 2 - local next - if type == "else" then - next = self:block("else") - else - i = i + 1 - next = self:block(self:line("elseif ", self:value(clause[2]), " then")) - end - next:stms(clause[i]) - current.next = next - current = next - end - for _index_0 = 4, #node do - local cond = node[_index_0] - add_clause(cond) - end - return root - end, - ["repeat"] = function(self, node) - local cond, block = unpack(node, 2) - do - local _with_0 = self:block("repeat", self:line("until ", self:value(cond))) - _with_0:stms(block) - return _with_0 - end - end, - ["while"] = function(self, node) - local cond, block = unpack(node, 2) - do - local _with_0 = self:block(self:line("while ", self:value(cond), " do")) - _with_0:stms(block) - return _with_0 - end - end, - ["for"] = function(self, node) - local name, bounds, block = unpack(node, 2) - local loop = self:line("for ", self:name(name), " = ", self:value({ - "explist", - unpack(bounds) - }), " do") - do - local _with_0 = self:block(loop) - _with_0:declare({ - name - }) - _with_0:stms(block) - return _with_0 - end - end, - foreach = function(self, node) - local names, exps, block = unpack(node, 2) - local loop - do - local _with_0 = self:line() - _with_0:append("for ") - loop = _with_0 - end - do - local _with_0 = self:block(loop) - loop:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local name = names[_index_0] - _accum_0[_len_0] = _with_0:name(name, false) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - loop:append(" in ") - loop:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #exps do - local exp = exps[_index_0] - _accum_0[_len_0] = self:value(exp) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ",") - loop:append(" do") - _with_0:declare(names) - _with_0:stms(block) - return _with_0 - end - end, - export = function(self, node) - local names = unpack(node, 2) - if type(names) == "string" then - if names == "*" then - self.export_all = true - elseif names == "^" then - self.export_proper = true - end - else - self:declare(names) - end - return nil - end, - run = function(self, code) - code:call(self) - return nil - end, - group = function(self, node) - return self:stms(node[2]) - end, - ["do"] = function(self, node) - do - local _with_0 = self:block() - _with_0:stms(node[2]) - return _with_0 - end - end, - noop = function(self) end -} diff --git a/moonscript/compile/statement.moon b/moonscript/compile/statement.moon deleted file mode 100644 index 25f53fd0..00000000 --- a/moonscript/compile/statement.moon +++ /dev/null @@ -1,137 +0,0 @@ - -import ntype from require "moonscript.types" -import concat, insert from table - -import unpack from require "moonscript.util" - -{ - raw: (node) => @add node[2] - - lines: (node) => - for line in *node[2] - @add line - - declare: (node) => - names = node[2] - undeclared = @declare names - if #undeclared > 0 - with @line "local " - \append_list [@name name for name in *undeclared], ", " - - -- this overrides the existing names with new locals, used for local keyword - declare_with_shadows: (node) => - names = node[2] - @declare names - with @line "local " - \append_list [@name name for name in *names], ", " - - assign: (node) => - names, values = unpack node, 2 - - undeclared = @declare names - declare = "local " .. concat(undeclared, ", ") - - has_fndef = false - i = 1 - while i <= #values - if ntype(values[i]) == "fndef" - has_fndef = true - i = i +1 - - with @line! - if #undeclared == #names and not has_fndef - \append declare - else - @add declare, node[-1] if #undeclared > 0 - \append_list [@value name for name in *names], ", " - - \append " = " - \append_list [@value v for v in *values], ", " - - return: (node) => - @line "return ", if node[2] != "" then @value node[2] - - break: (node) => - "break" - - if: (node) => - cond, block = node[2], node[3] - root = with @block @line "if ", @value(cond), " then" - \stms block - - current = root - add_clause = (clause)-> - type = clause[1] - i = 2 - next = if type == "else" - @block "else" - else - i += 1 - @block @line "elseif ", @value(clause[2]), " then" - - next\stms clause[i] - - current.next = next - current = next - - add_clause cond for cond in *node[4,] - root - - repeat: (node) => - cond, block = unpack node, 2 - with @block "repeat", @line "until ", @value cond - \stms block - - while: (node) => - cond, block = unpack node, 2 - with @block @line "while ", @value(cond), " do" - \stms block - - for: (node) => - name, bounds, block = unpack node, 2 - loop = @line "for ", @name(name), " = ", @value({"explist", unpack bounds}), " do" - with @block loop - \declare {name} - \stms block - - -- for x in y ... - -- {"foreach", {names...}, {exp...}, body} - foreach: (node) => - names, exps, block = unpack node, 2 - - loop = with @line! - \append "for " - - with @block loop - loop\append_list [\name name, false for name in *names], ", " - loop\append " in " - loop\append_list [@value exp for exp in *exps], "," - loop\append " do" - - \declare names - \stms block - - export: (node) => - names = unpack node, 2 - if type(names) == "string" - if names == "*" - @export_all = true - elseif names == "^" - @export_proper = true - else - @declare names - nil - - run: (code) => - code\call self - nil - - group: (node) => - @stms node[2] - - do: (node) => - with @block! - \stms node[2] - - noop: => -- nothing! -} diff --git a/moonscript/compile/value.lua b/moonscript/compile/value.lua deleted file mode 100644 index ca6e5041..00000000 --- a/moonscript/compile/value.lua +++ /dev/null @@ -1,361 +0,0 @@ -local util = require("moonscript.util") -local data = require("moonscript.data") -local ntype -ntype = require("moonscript.types").ntype -local user_error -user_error = require("moonscript.errors").user_error -local concat, insert -do - local _obj_0 = table - concat, insert = _obj_0.concat, _obj_0.insert -end -local unpack -unpack = util.unpack -local table_delim = "," -local string_chars = { - ["\r"] = "\\r", - ["\n"] = "\\n" -} -return { - scoped = function(self, node) - local _, before, value, after - _, before, value, after = node[1], node[2], node[3], node[4] - _ = before and before:call(self) - do - local _with_0 = self:value(value) - _ = after and after:call(self) - return _with_0 - end - end, - exp = function(self, node) - local _comp - _comp = function(i, value) - if i % 2 == 1 and value == "!=" then - value = "~=" - end - return self:value(value) - end - do - local _with_0 = self:line() - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for i, v in ipairs(node) do - if i > 1 then - _accum_0[_len_0] = _comp(i, v) - _len_0 = _len_0 + 1 - end - end - return _accum_0 - end)(), " ") - return _with_0 - end - end, - explist = function(self, node) - do - local _with_0 = self:line() - _with_0:append_list((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 2, #node do - local v = node[_index_0] - _accum_0[_len_0] = self:value(v) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), ", ") - return _with_0 - end - end, - parens = function(self, node) - return self:line("(", self:value(node[2]), ")") - end, - string = function(self, node) - local delim, inner = unpack(node, 2) - local end_delim = delim:gsub("%[", "]") - if delim == "'" or delim == '"' then - inner = inner:gsub("[\r\n]", string_chars) - end - return delim .. inner .. end_delim - end, - chain = function(self, node) - local callee = node[2] - local callee_type = ntype(callee) - local item_offset = 3 - if callee_type == "dot" or callee_type == "colon" or callee_type == "index" then - callee = self:get("scope_var") - if not (callee) then - user_error("Short-dot syntax must be called within a with block") - end - item_offset = 2 - end - if callee_type == "ref" and callee[2] == "super" or callee == "super" then - do - local sup = self:get("super") - if sup then - return self:value(sup(self, node)) - end - end - end - local chain_item - chain_item = function(node) - local t, arg = unpack(node) - if t == "call" then - return "(", self:values(arg), ")" - elseif t == "index" then - return "[", self:value(arg), "]" - elseif t == "dot" then - return ".", tostring(arg) - elseif t == "colon" then - return ":", tostring(arg) - elseif t == "colon_stub" then - return user_error("Uncalled colon stub") - else - return error("Unknown chain action: " .. tostring(t)) - end - end - if (callee_type == "self" or callee_type == "self_class") and node[3] and ntype(node[3]) == "call" then - callee[1] = callee_type .. "_colon" - end - local callee_value = self:value(callee) - if ntype(callee) == "exp" then - callee_value = self:line("(", callee_value, ")") - end - local actions - do - local _with_0 = self:line() - for _index_0 = item_offset, #node do - local action = node[_index_0] - _with_0:append(chain_item(action)) - end - actions = _with_0 - end - return self:line(callee_value, actions) - end, - fndef = function(self, node) - local args, whitelist, arrow, block = unpack(node, 2) - local default_args = { } - local self_args = { } - local arg_names - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #args do - local arg = args[_index_0] - local name, default_value = unpack(arg) - if type(name) == "string" then - name = name - else - if name[1] == "self" or name[1] == "self_class" then - insert(self_args, name) - end - name = name[2] - end - if default_value then - insert(default_args, arg) - end - local _value_0 = name - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - arg_names = _accum_0 - end - if arrow == "fat" then - insert(arg_names, 1, "self") - end - do - local _with_0 = self:block() - if #whitelist > 0 then - _with_0:whitelist_names(whitelist) - end - for _index_0 = 1, #arg_names do - local name = arg_names[_index_0] - _with_0:put_name(name) - end - for _index_0 = 1, #default_args do - local default = default_args[_index_0] - local name, value = unpack(default) - if type(name) == "table" then - name = name[2] - end - _with_0:stm({ - 'if', - { - 'exp', - { - "ref", - name - }, - '==', - 'nil' - }, - { - { - 'assign', - { - name - }, - { - value - } - } - } - }) - end - local self_arg_values - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #self_args do - local arg = self_args[_index_0] - _accum_0[_len_0] = arg[2] - _len_0 = _len_0 + 1 - end - self_arg_values = _accum_0 - end - if #self_args > 0 then - _with_0:stm({ - "assign", - self_args, - self_arg_values - }) - end - _with_0:stms(block) - if #args > #arg_names then - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #args do - local arg = args[_index_0] - _accum_0[_len_0] = arg[1] - _len_0 = _len_0 + 1 - end - arg_names = _accum_0 - end - end - _with_0.header = "function(" .. concat(arg_names, ", ") .. ")" - return _with_0 - end - end, - table = function(self, node) - local items = unpack(node, 2) - do - local _with_0 = self:block("{", "}") - local format_line - format_line = function(tuple) - if #tuple == 2 then - local key, value = unpack(tuple) - if ntype(key) == "key_literal" and data.lua_keywords[key[2]] then - key = { - "string", - '"', - key[2] - } - end - local assign - if ntype(key) == "key_literal" then - assign = key[2] - else - assign = self:line("[", _with_0:value(key), "]") - end - local out = self:line(assign, " = ", _with_0:value(value)) - return out - else - return self:line(_with_0:value(tuple[1])) - end - end - if items then - local count = #items - for i, tuple in ipairs(items) do - local line = format_line(tuple) - if not (count == i) then - line:append(table_delim) - end - _with_0:add(line) - end - end - return _with_0 - end - end, - minus = function(self, node) - return self:line("-", self:value(node[2])) - end, - temp_name = function(self, node, ...) - return node:get_name(self, ...) - end, - number = function(self, node) - return node[2] - end, - bitnot = function(self, node) - return self:line("~", self:value(node[2])) - end, - length = function(self, node) - return self:line("#", self:value(node[2])) - end, - ["not"] = function(self, node) - return self:line("not ", self:value(node[2])) - end, - self = function(self, node) - local field_name = self:name(node[2]) - if data.lua_keywords[field_name] then - return self:value({ - "chain", - "self", - { - "index", - { - "string", - '"', - field_name - } - } - }) - else - return "self." .. tostring(field_name) - end - end, - self_class = function(self, node) - local field_name = self:name(node[2]) - if data.lua_keywords[field_name] then - return self:value({ - "chain", - "self", - { - "dot", - "__class" - }, - { - "index", - { - "string", - '"', - field_name - } - } - }) - else - return "self.__class." .. tostring(field_name) - end - end, - self_colon = function(self, node) - return "self:" .. tostring(self:name(node[2])) - end, - self_class_colon = function(self, node) - return "self.__class:" .. tostring(self:name(node[2])) - end, - ref = function(self, value) - do - local sup = value[2] == "super" and self:get("super") - if sup then - return self:value(sup(self)) - end - end - return tostring(value[2]) - end, - raw_value = function(self, value) - if value == "..." then - self:send("varargs") - end - return tostring(value) - end -} diff --git a/moonscript/compile/value.moon b/moonscript/compile/value.moon deleted file mode 100644 index 1bfa754b..00000000 --- a/moonscript/compile/value.moon +++ /dev/null @@ -1,223 +0,0 @@ - -util = require "moonscript.util" -data = require "moonscript.data" - -import ntype from require "moonscript.types" -import user_error from require "moonscript.errors" -import concat, insert from table -import unpack from util - -table_delim = "," - -string_chars = { - "\r": "\\r" - "\n": "\\n" -} - -{ - scoped: (node) => - {_, before, value, after} = node - before and before\call @ - with @value value - after and after\call @ - - -- list of values separated by binary operators - exp: (node) => - _comp = (i, value) -> - if i % 2 == 1 and value == "!=" - value = "~=" - @value value - - with @line! - \append_list [_comp i,v for i,v in ipairs node when i > 1], " " - - -- list of expressions separated by commas - explist: (node) => - with @line! - \append_list [@value v for v in *node[2,]], ", " - - parens: (node) => - @line "(", @value(node[2]), ")" - - string: (node) => - delim, inner = unpack node, 2 - end_delim = delim\gsub "%[", "]" - if delim == "'" or delim == '"' - inner = inner\gsub "[\r\n]", string_chars - - delim..inner..end_delim - - chain: (node) => - callee = node[2] - callee_type = ntype callee - item_offset = 3 - - if callee_type == "dot" or callee_type == "colon" or callee_type == "index" - callee = @get "scope_var" - unless callee - user_error "Short-dot syntax must be called within a with block" - item_offset = 2 - - -- TODO: don't use string literals as ref - if callee_type == "ref" and callee[2] == "super" or callee == "super" - if sup = @get "super" - return @value sup self, node - - chain_item = (node) -> - t, arg = unpack node - if t == "call" - -- print arg, util.dump arg - "(", @values(arg), ")" - elseif t == "index" - "[", @value(arg), "]" - elseif t == "dot" - ".", tostring arg - elseif t == "colon" - ":", tostring arg - elseif t == "colon_stub" - user_error "Uncalled colon stub" - else - error "Unknown chain action: #{t}" - - if (callee_type == "self" or callee_type == "self_class") and node[3] and ntype(node[3]) == "call" - callee[1] = callee_type.."_colon" - - callee_value = @value callee - callee_value = @line "(", callee_value, ")" if ntype(callee) == "exp" - - actions = with @line! - \append chain_item action for action in *node[item_offset,] - - @line callee_value, actions - - fndef: (node) => - args, whitelist, arrow, block = unpack node, 2 - - default_args = {} - self_args = {} - arg_names = for arg in *args - name, default_value = unpack arg - name = if type(name) == "string" - name - else - if name[1] == "self" or name[1] == "self_class" - insert self_args, name - name[2] - insert default_args, arg if default_value - name - - if arrow == "fat" - insert arg_names, 1, "self" - - with @block! - if #whitelist > 0 - \whitelist_names whitelist - - \put_name name for name in *arg_names - - for default in *default_args - name, value = unpack default - name = name[2] if type(name) == "table" - \stm { - 'if', {'exp', {"ref", name}, '==', 'nil'}, { - {'assign', {name}, {value}} - } - } - - self_arg_values = [arg[2] for arg in *self_args] - \stm {"assign", self_args, self_arg_values} if #self_args > 0 - - \stms block - - -- inject more args if the block manipulated arguments - -- only varargs bubbling does this currently - if #args > #arg_names -- will only work for simple adjustments - arg_names = [arg[1] for arg in *args] - - .header = "function("..concat(arg_names, ", ")..")" - - table: (node) => - items = unpack node, 2 - with @block "{", "}" - format_line = (tuple) -> - if #tuple == 2 - key, value = unpack tuple - - -- escape keys that are lua keywords - if ntype(key) == "key_literal" and data.lua_keywords[key[2]] - key = {"string", '"', key[2]} - - assign = if ntype(key) == "key_literal" - key[2] - else - @line "[", \value(key), "]" - - out = @line assign, " = ", \value(value) - out - else - @line \value tuple[1] - - if items - count = #items - for i, tuple in ipairs items - line = format_line tuple - line\append table_delim unless count == i - \add line - - minus: (node) => - @line "-", @value node[2] - - temp_name: (node, ...) => - node\get_name self, ... - - number: (node) => - node[2] - - bitnot: (node) => - @line "~", @value node[2] - - length: (node) => - @line "#", @value node[2] - - not: (node) => - @line "not ", @value node[2] - - self: (node) => - field_name = @name node[2] - if data.lua_keywords[field_name] - @value {"chain", "self", {"index", { - "string", '"', field_name - }}} - else - "self.#{field_name}" - - self_class: (node) => - field_name = @name node[2] - - if data.lua_keywords[field_name] - @value {"chain", "self", {"dot", "__class"}, {"index", { - "string", '"', field_name - }}} - else - "self.__class.#{field_name}" - - self_colon: (node) => - "self:#{@name node[2]}" - - self_class_colon: (node) => - "self.__class:#{@name node[2]}" - - -- a variable reference - ref: (value) => - if sup = value[2] == "super" and @get "super" - return @value sup @ - - tostring value[2] - - -- catch all pure string values - raw_value: (value) => - if value == "..." - @send "varargs" - - tostring value -} diff --git a/moonscript/data.lua b/moonscript/data.lua deleted file mode 100644 index f33f708d..00000000 --- a/moonscript/data.lua +++ /dev/null @@ -1,83 +0,0 @@ -local concat, remove, insert -do - local _obj_0 = table - concat, remove, insert = _obj_0.concat, _obj_0.remove, _obj_0.insert -end -local Set -Set = function(items) - local _tbl_0 = { } - for _index_0 = 1, #items do - local k = items[_index_0] - _tbl_0[k] = true - end - return _tbl_0 -end -local Stack -do - local _class_0 - local _base_0 = { - __tostring = function(self) - return "" - end, - pop = function(self) - return remove(self) - end, - push = function(self, value, ...) - insert(self, value) - if ... then - return self:push(...) - else - return value - end - end, - top = function(self) - return self[#self] - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, ...) - self:push(...) - return nil - end, - __base = _base_0, - __name = "Stack" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Stack = _class_0 -end -local lua_keywords = Set({ - 'and', - 'break', - 'do', - 'else', - 'elseif', - 'end', - 'false', - 'for', - 'function', - 'if', - 'in', - 'local', - 'nil', - 'not', - 'or', - 'repeat', - 'return', - 'then', - 'true', - 'until', - 'while' -}) -return { - Set = Set, - Stack = Stack, - lua_keywords = lua_keywords -} diff --git a/moonscript/data.moon b/moonscript/data.moon deleted file mode 100644 index 4bb9b4fb..00000000 --- a/moonscript/data.moon +++ /dev/null @@ -1,37 +0,0 @@ --- data structures & static data - -import concat, remove, insert from table - -Set = (items) -> {k,true for k in *items} - -class Stack - __tostring: => "" - - new: (...) => - @push ... - nil - - pop: => - remove @ - - push: (value, ...) => - insert @, value - if ... - @push ... - else - value - - top: => - self[#self] - - -lua_keywords = Set { - 'and', 'break', 'do', 'else', 'elseif', - 'end', 'false', 'for', 'function', 'if', - 'in', 'local', 'nil', 'not', 'or', - 'repeat', 'return', 'then', 'true', - 'until', 'while' -} - -{ :Set, :Stack, :lua_keywords } - diff --git a/moonscript/dump.lua b/moonscript/dump.lua deleted file mode 100644 index 26cdd7a3..00000000 --- a/moonscript/dump.lua +++ /dev/null @@ -1,46 +0,0 @@ -local flat_value -flat_value = function(op, depth) - if depth == nil then - depth = 1 - end - if type(op) == "string" then - return '"' .. op .. '"' - end - if type(op) ~= "table" then - return tostring(op) - end - local items - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #op do - local item = op[_index_0] - _accum_0[_len_0] = flat_value(item, depth + 1) - _len_0 = _len_0 + 1 - end - items = _accum_0 - end - local pos = op[-1] - return "{" .. (pos and "[" .. pos .. "] " or "") .. table.concat(items, ", ") .. "}" -end -local value -value = function(op) - return flat_value(op) -end -local tree -tree = function(block) - return table.concat((function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #block do - local value = block[_index_0] - _accum_0[_len_0] = flat_value(value) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), "\n") -end -return { - value = value, - tree = tree -} diff --git a/moonscript/dump.moon b/moonscript/dump.moon deleted file mode 100644 index 6fbeb375..00000000 --- a/moonscript/dump.moon +++ /dev/null @@ -1,18 +0,0 @@ - -flat_value = (op, depth=1) -> - return '"'..op..'"' if type(op) == "string" - return tostring(op) if type(op) != "table" - - items = [flat_value item, depth + 1 for item in *op] - pos = op[-1] - - "{"..(pos and "["..pos.."] " or "")..table.concat(items, ", ").."}" - -value = (op) -> - flat_value op - -tree = (block) -> - table.concat [flat_value value for value in *block], "\n" - -{ :value, :tree } - diff --git a/moonscript/errors.lua b/moonscript/errors.lua deleted file mode 100644 index d85c3162..00000000 --- a/moonscript/errors.lua +++ /dev/null @@ -1,117 +0,0 @@ -local util = require("moonscript.util") -local lpeg = require("lpeg") -local concat, insert -do - local _obj_0 = table - concat, insert = _obj_0.concat, _obj_0.insert -end -local split, pos_to_line -split, pos_to_line = util.split, util.pos_to_line -local user_error -user_error = function(...) - return error({ - "user-error", - ... - }) -end -local lookup_line -lookup_line = function(fname, pos, cache) - if not cache[fname] then - do - local _with_0 = assert(io.open(fname)) - cache[fname] = _with_0:read("*a") - _with_0:close() - end - end - return pos_to_line(cache[fname], pos) -end -local reverse_line_number -reverse_line_number = function(fname, line_table, line_num, cache) - for i = line_num, 0, -1 do - if line_table[i] then - return lookup_line(fname, line_table[i], cache) - end - end - return "unknown" -end -local truncate_traceback -truncate_traceback = function(traceback, chunk_func) - if chunk_func == nil then - chunk_func = "moonscript_chunk" - end - traceback = split(traceback, "\n") - local stop = #traceback - while stop > 1 do - if traceback[stop]:match(chunk_func) then - break - end - stop = stop - 1 - end - do - local _accum_0 = { } - local _len_0 = 1 - local _max_0 = stop - for _index_0 = 1, _max_0 < 0 and #traceback + _max_0 or _max_0 do - local t = traceback[_index_0] - _accum_0[_len_0] = t - _len_0 = _len_0 + 1 - end - traceback = _accum_0 - end - local rep = "function '" .. chunk_func .. "'" - traceback[#traceback] = traceback[#traceback]:gsub(rep, "main chunk") - return concat(traceback, "\n") -end -local rewrite_traceback -rewrite_traceback = function(text, err) - local line_tables = require("moonscript.line_tables") - local V, S, Ct, C - V, S, Ct, C = lpeg.V, lpeg.S, lpeg.Ct, lpeg.C - local header_text = "stack traceback:" - local Header, Line = V("Header"), V("Line") - local Break = lpeg.S("\n") - local g = lpeg.P({ - Header, - Header = header_text * Break * Ct(Line ^ 1), - Line = "\t" * C((1 - Break) ^ 0) * (Break + -1) - }) - local cache = { } - local rewrite_single - rewrite_single = function(trace) - local fname, line, msg = trace:match('^(.-):(%d+): (.*)$') - local tbl = line_tables["@" .. tostring(fname)] - if fname and tbl then - return concat({ - fname, - ":", - reverse_line_number(fname, tbl, line, cache), - ": ", - "(", - line, - ") ", - msg - }) - else - return trace - end - end - err = rewrite_single(err) - local match = g:match(text) - if not (match) then - return nil - end - for i, trace in ipairs(match) do - match[i] = rewrite_single(trace) - end - return concat({ - "moon: " .. err, - header_text, - "\t" .. concat(match, "\n\t") - }, "\n") -end -return { - rewrite_traceback = rewrite_traceback, - truncate_traceback = truncate_traceback, - user_error = user_error, - reverse_line_number = reverse_line_number -} diff --git a/moonscript/errors.moon b/moonscript/errors.moon deleted file mode 100644 index b04c5671..00000000 --- a/moonscript/errors.moon +++ /dev/null @@ -1,88 +0,0 @@ - -util = require "moonscript.util" - -lpeg = require "lpeg" - -import concat, insert from table -import split, pos_to_line from util - -user_error = (...) -> - error {"user-error", ...} - --- find the line number of `pos` chars into fname -lookup_line = (fname, pos, cache) -> - if not cache[fname] - with assert io.open(fname) - cache[fname] = \read "*a" - \close! - pos_to_line cache[fname], pos - --- reverse the line number in fname using line_table -reverse_line_number = (fname, line_table, line_num, cache) -> - for i = line_num,0,-1 - if line_table[i] - return lookup_line fname, line_table[i], cache - "unknown" - - --- strip traceback lines up to chunk func --- replace reference to chunk_func with "main chunk" -truncate_traceback = (traceback, chunk_func="moonscript_chunk") -> - traceback = split traceback, "\n" - stop = #traceback - while stop > 1 - break if traceback[stop]\match chunk_func - stop -= 1 - - traceback = [t for t in *traceback[1,stop]] - - rep = "function '" .. chunk_func .. "'" - traceback[#traceback] = traceback[#traceback]\gsub rep, "main chunk" - - concat traceback, "\n" - -rewrite_traceback = (text, err) -> - line_tables = require "moonscript.line_tables" - import V, S, Ct, C from lpeg - header_text = "stack traceback:" - - Header, Line = V("Header"), V("Line") - Break = lpeg.S "\n" - g = lpeg.P { - Header - Header: header_text * Break * Ct(Line^1) - Line: "\t" * C((1 - Break)^0) * (Break + -1) - } - - cache = {} -- loaded file cache - rewrite_single = (trace) -> - fname, line, msg = trace\match '^(.-):(%d+): (.*)$' - tbl = line_tables["@#{fname}"] - if fname and tbl - concat { - fname, ":" - reverse_line_number(fname, tbl, line, cache) - ": " - "(", line, ") " - msg - } - else - trace - - err = rewrite_single err - match = g\match text - - return nil unless match - - for i, trace in ipairs match - match[i] = rewrite_single trace - - concat { - "moon: " .. err - header_text - "\t" .. concat match, "\n\t" - }, "\n" - - -{ :rewrite_traceback, :truncate_traceback, :user_error, :reverse_line_number } - diff --git a/moonscript/init.lua b/moonscript/init.lua deleted file mode 100644 index 6de5f120..00000000 --- a/moonscript/init.lua +++ /dev/null @@ -1,5 +0,0 @@ -do - local _with_0 = require("moonscript.base") - _with_0.insert_loader() - return _with_0 -end diff --git a/moonscript/init.moon b/moonscript/init.moon deleted file mode 100644 index 396686d6..00000000 --- a/moonscript/init.moon +++ /dev/null @@ -1,2 +0,0 @@ -with require "moonscript.base" - .insert_loader! diff --git a/moonscript/line_tables.lua b/moonscript/line_tables.lua deleted file mode 100644 index 61388ecb..00000000 --- a/moonscript/line_tables.lua +++ /dev/null @@ -1 +0,0 @@ -return { } diff --git a/moonscript/line_tables.moon b/moonscript/line_tables.moon deleted file mode 100644 index 0967ef42..00000000 --- a/moonscript/line_tables.moon +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/moonscript/parse.lua b/moonscript/parse.lua deleted file mode 100644 index da6731e7..00000000 --- a/moonscript/parse.lua +++ /dev/null @@ -1,245 +0,0 @@ -local debug_grammar = false -local lpeg = require("lpeg") -lpeg.setmaxstack(10000) -local err_msg = "Failed to parse:%s\n [%d] >> %s" -local Stack -Stack = require("moonscript.data").Stack -local trim, pos_to_line, get_line -do - local _obj_0 = require("moonscript.util") - trim, pos_to_line, get_line = _obj_0.trim, _obj_0.pos_to_line, _obj_0.get_line -end -local unpack -unpack = require("moonscript.util").unpack -local wrap_env -wrap_env = require("moonscript.parse.env").wrap_env -local R, S, V, P, C, Ct, Cmt, Cg, Cb, Cc -R, S, V, P, C, Ct, Cmt, Cg, Cb, Cc = lpeg.R, lpeg.S, lpeg.V, lpeg.P, lpeg.C, lpeg.Ct, lpeg.Cmt, lpeg.Cg, lpeg.Cb, lpeg.Cc -local White, Break, Stop, Comment, Space, SomeSpace, SpaceBreak, EmptyLine, AlphaNum, Num, Shebang, L, _Name -do - local _obj_0 = require("moonscript.parse.literals") - White, Break, Stop, Comment, Space, SomeSpace, SpaceBreak, EmptyLine, AlphaNum, Num, Shebang, L, _Name = _obj_0.White, _obj_0.Break, _obj_0.Stop, _obj_0.Comment, _obj_0.Space, _obj_0.SomeSpace, _obj_0.SpaceBreak, _obj_0.EmptyLine, _obj_0.AlphaNum, _obj_0.Num, _obj_0.Shebang, _obj_0.L, _obj_0.Name -end -local SpaceName = Space * _Name -Num = Space * (Num / function(v) - return { - "number", - v - } -end) -local Indent, Cut, ensure, extract_line, mark, pos, flatten_or_mark, is_assignable, check_assignable, format_assign, format_single_assign, sym, symx, simple_string, wrap_func_arg, join_chain, wrap_decorator, check_lua_string, self_assign, got -do - local _obj_0 = require("moonscript.parse.util") - Indent, Cut, ensure, extract_line, mark, pos, flatten_or_mark, is_assignable, check_assignable, format_assign, format_single_assign, sym, symx, simple_string, wrap_func_arg, join_chain, wrap_decorator, check_lua_string, self_assign, got = _obj_0.Indent, _obj_0.Cut, _obj_0.ensure, _obj_0.extract_line, _obj_0.mark, _obj_0.pos, _obj_0.flatten_or_mark, _obj_0.is_assignable, _obj_0.check_assignable, _obj_0.format_assign, _obj_0.format_single_assign, _obj_0.sym, _obj_0.symx, _obj_0.simple_string, _obj_0.wrap_func_arg, _obj_0.join_chain, _obj_0.wrap_decorator, _obj_0.check_lua_string, _obj_0.self_assign, _obj_0.got -end -local build_grammar = wrap_env(debug_grammar, function(root) - local _indent = Stack(0) - local _do_stack = Stack(0) - local state = { - last_pos = 0 - } - local check_indent - check_indent = function(str, pos, indent) - state.last_pos = pos - return _indent:top() == indent - end - local advance_indent - advance_indent = function(str, pos, indent) - local top = _indent:top() - if top ~= -1 and indent > top then - _indent:push(indent) - return true - end - end - local push_indent - push_indent = function(str, pos, indent) - _indent:push(indent) - return true - end - local pop_indent - pop_indent = function() - assert(_indent:pop(), "unexpected outdent") - return true - end - local check_do - check_do = function(str, pos, do_node) - local top = _do_stack:top() - if top == nil or top then - return true, do_node - end - return false - end - local disable_do - disable_do = function() - _do_stack:push(false) - return true - end - local pop_do - pop_do = function() - assert(_do_stack:pop() ~= nil, "unexpected do pop") - return true - end - local DisableDo = Cmt("", disable_do) - local PopDo = Cmt("", pop_do) - local keywords = { } - local key - key = function(chars) - keywords[chars] = true - return Space * chars * -AlphaNum - end - local op - op = function(chars) - local patt = Space * C(chars) - if chars:match("^%w*$") then - keywords[chars] = true - patt = patt * -AlphaNum - end - return patt - end - local Name = Cmt(SpaceName, function(str, pos, name) - if keywords[name] then - return false - end - return true - end) / trim - local SelfName = Space * "@" * ("@" * (_Name / mark("self_class") + Cc("self.__class")) + _Name / mark("self") + Cc("self")) - local KeyName = SelfName + Space * _Name / mark("key_literal") - local VarArg = Space * P("...") / trim - local g = P({ - root or File, - File = Shebang ^ -1 * (Block + Ct("")), - Block = Ct(Line * (Break ^ 1 * Line) ^ 0), - CheckIndent = Cmt(Indent, check_indent), - Line = (CheckIndent * Statement + Space * L(Stop)), - Statement = pos(Import + While + With + For + ForEach + Switch + Return + Local + Export + BreakLoop + Ct(ExpList) * (Update + Assign) ^ -1 / format_assign) * Space * ((key("if") * Exp * (key("else") * Exp) ^ -1 * Space / mark("if") + key("unless") * Exp / mark("unless") + CompInner / mark("comprehension")) * Space) ^ -1 / wrap_decorator, - Body = Space ^ -1 * Break * EmptyLine ^ 0 * InBlock + Ct(Statement), - Advance = L(Cmt(Indent, advance_indent)), - PushIndent = Cmt(Indent, push_indent), - PreventIndent = Cmt(Cc(-1), push_indent), - PopIndent = Cmt("", pop_indent), - InBlock = Advance * Block * PopIndent, - Local = key("local") * ((op("*") + op("^")) / mark("declare_glob") + Ct(NameList) / mark("declare_with_shadows")), - Import = key("import") * Ct(ImportNameList) * SpaceBreak ^ 0 * key("from") * Exp / mark("import"), - ImportName = (sym("\\") * Ct(Cc("colon") * Name) + Name), - ImportNameList = SpaceBreak ^ 0 * ImportName * ((SpaceBreak ^ 1 + sym(",") * SpaceBreak ^ 0) * ImportName) ^ 0, - BreakLoop = Ct(key("break") / trim) + Ct(key("continue") / trim), - Return = key("return") * (ExpListLow / mark("explist") + C("")) / mark("return"), - WithExp = Ct(ExpList) * Assign ^ -1 / format_assign, - With = key("with") * DisableDo * ensure(WithExp, PopDo) * key("do") ^ -1 * Body / mark("with"), - Switch = key("switch") * DisableDo * ensure(Exp, PopDo) * key("do") ^ -1 * Space ^ -1 * Break * SwitchBlock / mark("switch"), - SwitchBlock = EmptyLine ^ 0 * Advance * Ct(SwitchCase * (Break ^ 1 * SwitchCase) ^ 0 * (Break ^ 1 * SwitchElse) ^ -1) * PopIndent, - SwitchCase = key("when") * Ct(ExpList) * key("then") ^ -1 * Body / mark("case"), - SwitchElse = key("else") * Body / mark("else"), - IfCond = Exp * Assign ^ -1 / format_single_assign, - IfElse = (Break * EmptyLine ^ 0 * CheckIndent) ^ -1 * key("else") * Body / mark("else"), - IfElseIf = (Break * EmptyLine ^ 0 * CheckIndent) ^ -1 * key("elseif") * pos(IfCond) * key("then") ^ -1 * Body / mark("elseif"), - If = key("if") * IfCond * key("then") ^ -1 * Body * IfElseIf ^ 0 * IfElse ^ -1 / mark("if"), - Unless = key("unless") * IfCond * key("then") ^ -1 * Body * IfElseIf ^ 0 * IfElse ^ -1 / mark("unless"), - While = key("while") * DisableDo * ensure(Exp, PopDo) * key("do") ^ -1 * Body / mark("while"), - For = key("for") * DisableDo * ensure(Name * sym("=") * Ct(Exp * sym(",") * Exp * (sym(",") * Exp) ^ -1), PopDo) * key("do") ^ -1 * Body / mark("for"), - ForEach = key("for") * Ct(AssignableNameList) * key("in") * DisableDo * ensure(Ct(sym("*") * Exp / mark("unpack") + ExpList), PopDo) * key("do") ^ -1 * Body / mark("foreach"), - Do = key("do") * Body / mark("do"), - Comprehension = sym("[") * Exp * CompInner * sym("]") / mark("comprehension"), - TblComprehension = sym("{") * Ct(Exp * (sym(",") * Exp) ^ -1) * CompInner * sym("}") / mark("tblcomprehension"), - CompInner = Ct((CompForEach + CompFor) * CompClause ^ 0), - CompForEach = key("for") * Ct(AssignableNameList) * key("in") * (sym("*") * Exp / mark("unpack") + Exp) / mark("foreach"), - CompFor = key("for" * Name * sym("=") * Ct(Exp * sym(",") * Exp * (sym(",") * Exp) ^ -1) / mark("for")), - CompClause = CompFor + CompForEach + key("when") * Exp / mark("when"), - Assign = sym("=") * (Ct(With + If + Switch) + Ct(TableBlock + ExpListLow)) / mark("assign"), - Update = ((sym("..=") + sym("+=") + sym("-=") + sym("*=") + sym("/=") + sym("%=") + sym("or=") + sym("and=") + sym("&=") + sym("|=") + sym(">>=") + sym("<<=")) / trim) * Exp / mark("update"), - CharOperators = Space * C(S("+-*/%^><|&")), - WordOperators = op("or") + op("and") + op("<=") + op(">=") + op("~=") + op("!=") + op("==") + op("..") + op("<<") + op(">>") + op("//"), - BinaryOperator = (WordOperators + CharOperators) * SpaceBreak ^ 0, - Assignable = Cmt(Chain, check_assignable) + Name + SelfName, - Exp = Ct(Value * (BinaryOperator * Value) ^ 0) / flatten_or_mark("exp"), - SimpleValue = If + Unless + Switch + With + ClassDecl + ForEach + For + While + Cmt(Do, check_do) + sym("-") * -SomeSpace * Exp / mark("minus") + sym("#") * Exp / mark("length") + sym("~") * Exp / mark("bitnot") + key("not") * Exp / mark("not") + TblComprehension + TableLit + Comprehension + FunLit + Num, - ChainValue = (Chain + Callable) * Ct(InvokeArgs ^ -1) / join_chain, - Value = pos(SimpleValue + Ct(KeyValueList) / mark("table") + ChainValue + String), - SliceValue = Exp, - String = Space * DoubleString + Space * SingleString + LuaString, - SingleString = simple_string("'"), - DoubleString = simple_string('"', true), - LuaString = Cg(LuaStringOpen, "string_open") * Cb("string_open") * Break ^ -1 * C((1 - Cmt(C(LuaStringClose) * Cb("string_open"), check_lua_string)) ^ 0) * LuaStringClose / mark("string"), - LuaStringOpen = sym("[") * P("=") ^ 0 * "[" / trim, - LuaStringClose = "]" * P("=") ^ 0 * "]", - Callable = pos(Name / mark("ref")) + SelfName + VarArg + Parens / mark("parens"), - Parens = sym("(") * SpaceBreak ^ 0 * Exp * SpaceBreak ^ 0 * sym(")"), - FnArgs = symx("(") * SpaceBreak ^ 0 * Ct(FnArgsExpList ^ -1) * SpaceBreak ^ 0 * sym(")") + sym("!") * -P("=") * Ct(""), - FnArgsExpList = Exp * ((Break + sym(",")) * White * Exp) ^ 0, - Chain = (Callable + String + -S(".\\")) * ChainItems / mark("chain") + Space * (DotChainItem * ChainItems ^ -1 + ColonChain) / mark("chain"), - ChainItems = ChainItem ^ 1 * ColonChain ^ -1 + ColonChain, - ChainItem = Invoke + DotChainItem + Slice + symx("[") * Exp / mark("index") * sym("]"), - DotChainItem = symx(".") * _Name / mark("dot"), - ColonChainItem = symx("\\") * _Name / mark("colon"), - ColonChain = ColonChainItem * (Invoke * ChainItems ^ -1) ^ -1, - Slice = symx("[") * (SliceValue + Cc(1)) * sym(",") * (SliceValue + Cc("")) * (sym(",") * SliceValue) ^ -1 * sym("]") / mark("slice"), - Invoke = FnArgs / mark("call") + SingleString / wrap_func_arg + DoubleString / wrap_func_arg + L(P("[")) * LuaString / wrap_func_arg, - TableValue = KeyValue + Ct(Exp), - TableLit = sym("{") * Ct(TableValueList ^ -1 * sym(",") ^ -1 * (SpaceBreak * TableLitLine * (sym(",") ^ -1 * SpaceBreak * TableLitLine) ^ 0 * sym(",") ^ -1) ^ -1) * White * sym("}") / mark("table"), - TableValueList = TableValue * (sym(",") * TableValue) ^ 0, - TableLitLine = PushIndent * ((TableValueList * PopIndent) + (PopIndent * Cut)) + Space, - TableBlockInner = Ct(KeyValueLine * (SpaceBreak ^ 1 * KeyValueLine) ^ 0), - TableBlock = SpaceBreak ^ 1 * Advance * ensure(TableBlockInner, PopIndent) / mark("table"), - ClassDecl = key("class") * -P(":") * (Assignable + Cc(nil)) * (key("extends") * PreventIndent * ensure(Exp, PopIndent) + C("")) ^ -1 * (ClassBlock + Ct("")) / mark("class"), - ClassBlock = SpaceBreak ^ 1 * Advance * Ct(ClassLine * (SpaceBreak ^ 1 * ClassLine) ^ 0) * PopIndent, - ClassLine = CheckIndent * ((KeyValueList / mark("props") + Statement / mark("stm") + Exp / mark("stm")) * sym(",") ^ -1), - Export = key("export") * (Cc("class") * ClassDecl + op("*") + op("^") + Ct(NameList) * (sym("=") * Ct(ExpListLow)) ^ -1) / mark("export"), - KeyValue = (sym(":") * -SomeSpace * Name * lpeg.Cp()) / self_assign + Ct((KeyName + sym("[") * Exp * sym("]") + Space * DoubleString + Space * SingleString) * symx(":") * (Exp + TableBlock + SpaceBreak ^ 1 * Exp)), - KeyValueList = KeyValue * (sym(",") * KeyValue) ^ 0, - KeyValueLine = CheckIndent * KeyValueList * sym(",") ^ -1, - FnArgsDef = sym("(") * White * Ct(FnArgDefList ^ -1) * (key("using") * Ct(NameList + Space * "nil") + Ct("")) * White * sym(")") + Ct("") * Ct(""), - FnArgDefList = FnArgDef * ((sym(",") + Break) * White * FnArgDef) ^ 0 * ((sym(",") + Break) * White * Ct(VarArg)) ^ 0 + Ct(VarArg), - FnArgDef = Ct((Name + SelfName) * (sym("=") * Exp) ^ -1), - FunLit = FnArgsDef * (sym("->") * Cc("slim") + sym("=>") * Cc("fat")) * (Body + Ct("")) / mark("fndef"), - NameList = Name * (sym(",") * Name) ^ 0, - NameOrDestructure = Name + TableLit, - AssignableNameList = NameOrDestructure * (sym(",") * NameOrDestructure) ^ 0, - ExpList = Exp * (sym(",") * Exp) ^ 0, - ExpListLow = Exp * ((sym(",") + sym(";")) * Exp) ^ 0, - InvokeArgs = -P("-") * (ExpList * (sym(",") * (TableBlock + SpaceBreak * Advance * ArgBlock * TableBlock ^ -1) + TableBlock) ^ -1 + TableBlock), - ArgBlock = ArgLine * (sym(",") * SpaceBreak * ArgLine) ^ 0 * PopIndent, - ArgLine = CheckIndent * ExpList - }) - return g, state -end) -local file_parser -file_parser = function() - local g, state = build_grammar() - local file_grammar = White * g * White * -1 - return { - match = function(self, str) - local tree - local _, err = xpcall((function() - tree = file_grammar:match(str) - end), function(err) - return debug.traceback(err, 2) - end) - if type(err) == "string" then - return nil, err - end - if not (tree) then - local msg - local err_pos = state.last_pos - if err then - local node - node, msg = unpack(err) - if msg then - msg = " " .. msg - end - err_pos = node[-1] - end - local line_no = pos_to_line(str, err_pos) - local line_str = get_line(str, line_no) or "" - return nil, err_msg:format(msg or "", line_no, trim(line_str)) - end - return tree - end - } -end -return { - extract_line = extract_line, - build_grammar = build_grammar, - string = function(str) - return file_parser():match(str) - end -} diff --git a/moonscript/parse.moon b/moonscript/parse.moon deleted file mode 100644 index 7fd5de6f..00000000 --- a/moonscript/parse.moon +++ /dev/null @@ -1,361 +0,0 @@ -debug_grammar = false -lpeg = require "lpeg" - -lpeg.setmaxstack 10000 -- whoa - -err_msg = "Failed to parse:%s\n [%d] >> %s" - -import Stack from require "moonscript.data" -import trim, pos_to_line, get_line from require "moonscript.util" -import unpack from require "moonscript.util" -import wrap_env from require "moonscript.parse.env" - -{ - :R, :S, :V, :P, :C, :Ct, :Cmt, :Cg, :Cb, :Cc -} = lpeg - -{ - :White, :Break, :Stop, :Comment, :Space, :SomeSpace, :SpaceBreak, :EmptyLine, - :AlphaNum, :Num, :Shebang, :L - Name: _Name -} = require "moonscript.parse.literals" - -SpaceName = Space * _Name -Num = Space * (Num / (v) -> {"number", v}) - -{ - :Indent, :Cut, :ensure, :extract_line, :mark, :pos, :flatten_or_mark, - :is_assignable, :check_assignable, :format_assign, :format_single_assign, - :sym, :symx, :simple_string, :wrap_func_arg, :join_chain, - :wrap_decorator, :check_lua_string, :self_assign, :got - -} = require "moonscript.parse.util" - - -build_grammar = wrap_env debug_grammar, (root) -> - _indent = Stack 0 - _do_stack = Stack 0 - - state = { - -- last pos we saw, used to report error location - last_pos: 0 - } - - check_indent = (str, pos, indent) -> - state.last_pos = pos - _indent\top! == indent - - advance_indent = (str, pos, indent) -> - top = _indent\top! - if top != -1 and indent > top - _indent\push indent - true - - push_indent = (str, pos, indent) -> - _indent\push indent - true - - pop_indent = -> - assert _indent\pop!, "unexpected outdent" - true - - check_do = (str, pos, do_node) -> - top = _do_stack\top! - if top == nil or top - return true, do_node - false - - disable_do = -> - _do_stack\push false - true - - pop_do = -> - assert _do_stack\pop! != nil, "unexpected do pop" - true - - DisableDo = Cmt "", disable_do - PopDo = Cmt "", pop_do - - keywords = {} - key = (chars) -> - keywords[chars] = true - Space * chars * -AlphaNum - - op = (chars) -> - patt = Space * C chars - -- it's a word, treat like keyword - if chars\match "^%w*$" - keywords[chars] = true - patt *= -AlphaNum - - patt - - Name = Cmt(SpaceName, (str, pos, name) -> - return false if keywords[name] - true - ) / trim - - SelfName = Space * "@" * ( - "@" * (_Name / mark"self_class" + Cc"self.__class") + - _Name / mark"self" + - Cc"self" -- @ by itself - ) - - KeyName = SelfName + Space * _Name / mark"key_literal" - VarArg = Space * P"..." / trim - - g = P { - root or File - File: Shebang^-1 * (Block + Ct"") - Block: Ct(Line * (Break^1 * Line)^0) - CheckIndent: Cmt(Indent, check_indent), -- validates line is in correct indent - Line: (CheckIndent * Statement + Space * L(Stop)) - - Statement: pos( - Import + While + With + For + ForEach + Switch + Return + - Local + Export + BreakLoop + - Ct(ExpList) * (Update + Assign)^-1 / format_assign - ) * Space * (( - -- statement decorators - key"if" * Exp * (key"else" * Exp)^-1 * Space / mark"if" + - key"unless" * Exp / mark"unless" + - CompInner / mark"comprehension" - ) * Space)^-1 / wrap_decorator - - Body: Space^-1 * Break * EmptyLine^0 * InBlock + Ct(Statement) -- either a statement, or an indented block - - Advance: L Cmt(Indent, advance_indent) -- Advances the indent, gives back whitespace for CheckIndent - PushIndent: Cmt(Indent, push_indent) - PreventIndent: Cmt(Cc(-1), push_indent) - PopIndent: Cmt("", pop_indent) - InBlock: Advance * Block * PopIndent - - Local: key"local" * ((op"*" + op"^") / mark"declare_glob" + Ct(NameList) / mark"declare_with_shadows") - - Import: key"import" * Ct(ImportNameList) * SpaceBreak^0 * key"from" * Exp / mark"import" - ImportName: (sym"\\" * Ct(Cc"colon" * Name) + Name) - ImportNameList: SpaceBreak^0 * ImportName * ((SpaceBreak^1 + sym"," * SpaceBreak^0) * ImportName)^0 - - BreakLoop: Ct(key"break"/trim) + Ct(key"continue"/trim) - - Return: key"return" * (ExpListLow/mark"explist" + C"") / mark"return" - - WithExp: Ct(ExpList) * Assign^-1 / format_assign - With: key"with" * DisableDo * ensure(WithExp, PopDo) * key"do"^-1 * Body / mark"with" - - Switch: key"switch" * DisableDo * ensure(Exp, PopDo) * key"do"^-1 * Space^-1 * Break * SwitchBlock / mark"switch" - - SwitchBlock: EmptyLine^0 * Advance * Ct(SwitchCase * (Break^1 * SwitchCase)^0 * (Break^1 * SwitchElse)^-1) * PopIndent - SwitchCase: key"when" * Ct(ExpList) * key"then"^-1 * Body / mark"case" - SwitchElse: key"else" * Body / mark"else" - - IfCond: Exp * Assign^-1 / format_single_assign - - IfElse: (Break * EmptyLine^0 * CheckIndent)^-1 * key"else" * Body / mark"else" - IfElseIf: (Break * EmptyLine^0 * CheckIndent)^-1 * key"elseif" * pos(IfCond) * key"then"^-1 * Body / mark"elseif" - - If: key"if" * IfCond * key"then"^-1 * Body * IfElseIf^0 * IfElse^-1 / mark"if" - Unless: key"unless" * IfCond * key"then"^-1 * Body * IfElseIf^0 * IfElse^-1 / mark"unless" - - While: key"while" * DisableDo * ensure(Exp, PopDo) * key"do"^-1 * Body / mark"while" - - For: key"for" * DisableDo * ensure(Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1), PopDo) * - key"do"^-1 * Body / mark"for" - - ForEach: key"for" * Ct(AssignableNameList) * key"in" * DisableDo * ensure(Ct(sym"*" * Exp / mark"unpack" + ExpList), PopDo) * key"do"^-1 * Body / mark"foreach" - - Do: key"do" * Body / mark"do" - - Comprehension: sym"[" * Exp * CompInner * sym"]" / mark"comprehension" - - TblComprehension: sym"{" * Ct(Exp * (sym"," * Exp)^-1) * CompInner * sym"}" / mark"tblcomprehension" - - CompInner: Ct((CompForEach + CompFor) * CompClause^0) - CompForEach: key"for" * Ct(AssignableNameList) * key"in" * (sym"*" * Exp / mark"unpack" + Exp) / mark"foreach" - CompFor: key "for" * Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1) / mark"for" - CompClause: CompFor + CompForEach + key"when" * Exp / mark"when" - - Assign: sym"=" * (Ct(With + If + Switch) + Ct(TableBlock + ExpListLow)) / mark"assign" - Update: ((sym"..=" + sym"+=" + sym"-=" + sym"*=" + sym"/=" + sym"%=" + sym"or=" + sym"and=" + sym"&=" + sym"|=" + sym">>=" + sym"<<=") / trim) * Exp / mark"update" - - CharOperators: Space * C(S"+-*/%^><|&") - WordOperators: op"or" + op"and" + op"<=" + op">=" + op"~=" + op"!=" + op"==" + op".." + op"<<" + op">>" + op"//" - BinaryOperator: (WordOperators + CharOperators) * SpaceBreak^0 - - Assignable: Cmt(Chain, check_assignable) + Name + SelfName - Exp: Ct(Value * (BinaryOperator * Value)^0) / flatten_or_mark"exp" - - SimpleValue: - If + Unless + - Switch + - With + - ClassDecl + - ForEach + For + While + - Cmt(Do, check_do) + - sym"-" * -SomeSpace * Exp / mark"minus" + - sym"#" * Exp / mark"length" + - sym"~" * Exp / mark"bitnot" + - key"not" * Exp / mark"not" + - TblComprehension + - TableLit + - Comprehension + - FunLit + - Num - - -- a function call or an object access - ChainValue: (Chain + Callable) * Ct(InvokeArgs^-1) / join_chain - - Value: pos( - SimpleValue + - Ct(KeyValueList) / mark"table" + - ChainValue + - String) - - SliceValue: Exp - - String: Space * DoubleString + Space * SingleString + LuaString - SingleString: simple_string("'") - DoubleString: simple_string('"', true) - - LuaString: Cg(LuaStringOpen, "string_open") * Cb"string_open" * Break^-1 * - C((1 - Cmt(C(LuaStringClose) * Cb"string_open", check_lua_string))^0) * - LuaStringClose / mark"string" - - LuaStringOpen: sym"[" * P"="^0 * "[" / trim - LuaStringClose: "]" * P"="^0 * "]" - - Callable: pos(Name / mark"ref") + SelfName + VarArg + Parens / mark"parens" - Parens: sym"(" * SpaceBreak^0 * Exp * SpaceBreak^0 * sym")" - - FnArgs: symx"(" * SpaceBreak^0 * Ct(FnArgsExpList^-1) * SpaceBreak^0 * sym")" + sym"!" * -P"=" * Ct"" - FnArgsExpList: Exp * ((Break + sym",") * White * Exp)^0 - - Chain: (Callable + String + -S".\\") * ChainItems / mark"chain" + - Space * (DotChainItem * ChainItems^-1 + ColonChain) / mark"chain" - - ChainItems: ChainItem^1 * ColonChain^-1 + ColonChain - - ChainItem: - Invoke + - DotChainItem + - Slice + - symx"[" * Exp/mark"index" * sym"]" - - DotChainItem: symx"." * _Name/mark"dot" - ColonChainItem: symx"\\" * _Name / mark"colon" - ColonChain: ColonChainItem * (Invoke * ChainItems^-1)^-1 - - Slice: symx"[" * (SliceValue + Cc(1)) * sym"," * (SliceValue + Cc"") * - (sym"," * SliceValue)^-1 *sym"]" / mark"slice" - - Invoke: FnArgs / mark"call" + - SingleString / wrap_func_arg + - DoubleString / wrap_func_arg + - L(P"[") * LuaString / wrap_func_arg - - TableValue: KeyValue + Ct(Exp) - - TableLit: sym"{" * Ct( - TableValueList^-1 * sym","^-1 * - (SpaceBreak * TableLitLine * (sym","^-1 * SpaceBreak * TableLitLine)^0 * sym","^-1)^-1 - ) * White * sym"}" / mark"table" - - TableValueList: TableValue * (sym"," * TableValue)^0 - TableLitLine: PushIndent * ((TableValueList * PopIndent) + (PopIndent * Cut)) + Space - - -- the unbounded table - TableBlockInner: Ct(KeyValueLine * (SpaceBreak^1 * KeyValueLine)^0) - TableBlock: SpaceBreak^1 * Advance * ensure(TableBlockInner, PopIndent) / mark"table" - - ClassDecl: key"class" * -P":" * (Assignable + Cc(nil)) * (key"extends" * PreventIndent * ensure(Exp, PopIndent) + C"")^-1 * (ClassBlock + Ct("")) / mark"class" - - ClassBlock: SpaceBreak^1 * Advance * - Ct(ClassLine * (SpaceBreak^1 * ClassLine)^0) * PopIndent - ClassLine: CheckIndent * (( - KeyValueList / mark"props" + - Statement / mark"stm" + - Exp / mark"stm" - ) * sym","^-1) - - Export: key"export" * ( - Cc"class" * ClassDecl + - op"*" + op"^" + - Ct(NameList) * (sym"=" * Ct(ExpListLow))^-1) / mark"export" - - KeyValue: (sym":" * -SomeSpace * Name * lpeg.Cp!) / self_assign + - Ct( - (KeyName + sym"[" * Exp * sym"]" +Space * DoubleString + Space * SingleString) * - symx":" * - (Exp + TableBlock + SpaceBreak^1 * Exp) - ) - - KeyValueList: KeyValue * (sym"," * KeyValue)^0 - KeyValueLine: CheckIndent * KeyValueList * sym","^-1 - - FnArgsDef: sym"(" * White * Ct(FnArgDefList^-1) * - (key"using" * Ct(NameList + Space * "nil") + Ct"") * - White * sym")" + Ct"" * Ct"" - - FnArgDefList: FnArgDef * ((sym"," + Break) * White * FnArgDef)^0 * ((sym"," + Break) * White * Ct(VarArg))^0 + Ct(VarArg) - FnArgDef: Ct((Name + SelfName) * (sym"=" * Exp)^-1) - - FunLit: FnArgsDef * - (sym"->" * Cc"slim" + sym"=>" * Cc"fat") * - (Body + Ct"") / mark"fndef" - - NameList: Name * (sym"," * Name)^0 - NameOrDestructure: Name + TableLit - AssignableNameList: NameOrDestructure * (sym"," * NameOrDestructure)^0 - - ExpList: Exp * (sym"," * Exp)^0 - ExpListLow: Exp * ((sym"," + sym";") * Exp)^0 - - -- open args - InvokeArgs: -P"-" * (ExpList * (sym"," * (TableBlock + SpaceBreak * Advance * ArgBlock * TableBlock^-1) + TableBlock)^-1 + TableBlock) - ArgBlock: ArgLine * (sym"," * SpaceBreak * ArgLine)^0 * PopIndent - ArgLine: CheckIndent * ExpList - } - - g, state - -file_parser = -> - g, state = build_grammar! - file_grammar = White * g * White * -1 - - { - match: (str) => - local tree - _, err = xpcall (-> - tree = file_grammar\match str - ), (err) -> - debug.traceback err, 2 - - -- regular error, let it bubble up - if type(err) == "string" - return nil, err - - unless tree - local msg - err_pos = state.last_pos - - if err - node, msg = unpack err - msg = " " .. msg if msg - err_pos = node[-1] - - line_no = pos_to_line str, err_pos - line_str = get_line(str, line_no) or "" - return nil, err_msg\format msg or "", line_no, trim line_str - - tree - } - -{ - :extract_line - :build_grammar - - -- parse a string as a file - -- returns tree, or nil and error message - string: (str) -> file_parser!\match str -} - diff --git a/moonscript/parse/env.lua b/moonscript/parse/env.lua deleted file mode 100644 index f805211b..00000000 --- a/moonscript/parse/env.lua +++ /dev/null @@ -1,70 +0,0 @@ -local getfenv, setfenv -do - local _obj_0 = require("moonscript.util") - getfenv, setfenv = _obj_0.getfenv, _obj_0.setfenv -end -local wrap_env -wrap_env = function(debug, fn) - local V, Cmt - do - local _obj_0 = require("lpeg") - V, Cmt = _obj_0.V, _obj_0.Cmt - end - local env = getfenv(fn) - local wrap_name = V - if debug then - local indent = 0 - local indent_char = " " - local iprint - iprint = function(...) - local args = table.concat((function(...) - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = { - ... - } - for _index_0 = 1, #_list_0 do - local a = _list_0[_index_0] - _accum_0[_len_0] = tostring(a) - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(...), ", ") - return io.stderr:write(tostring(indent_char:rep(indent)) .. tostring(args) .. "\n") - end - wrap_name = function(name) - local v = V(name) - v = Cmt("", function(str, pos) - local rest = str:sub(pos, -1):match("^([^\n]*)") - iprint("* " .. tostring(name) .. " (" .. tostring(rest) .. ")") - indent = indent + 1 - return true - end) * Cmt(v, function(str, pos, ...) - iprint(name, true) - indent = indent - 1 - return true, ... - end) + Cmt("", function() - iprint(name, false) - indent = indent - 1 - return false - end) - return v - end - end - return setfenv(fn, setmetatable({ }, { - __index = function(self, name) - local value = env[name] - if value ~= nil then - return value - end - if name:match("^[A-Z][A-Za-z0-9]*$") then - local v = wrap_name(name) - return v - end - return error("unknown variable referenced: " .. tostring(name)) - end - })) -end -return { - wrap_env = wrap_env -} diff --git a/moonscript/parse/env.moon b/moonscript/parse/env.moon deleted file mode 100644 index ea71c3df..00000000 --- a/moonscript/parse/env.moon +++ /dev/null @@ -1,51 +0,0 @@ - -import getfenv, setfenv from require "moonscript.util" - --- all undefined Proper globals are automaticlly converted into lpeg.V -wrap_env = (debug, fn) -> - import V, Cmt from require "lpeg" - - env = getfenv fn - wrap_name = V - - if debug - indent = 0 - indent_char = " " - - iprint = (...) -> - args = table.concat [tostring a for a in *{...}], ", " - io.stderr\write "#{indent_char\rep(indent)}#{args}\n" - - wrap_name = (name) -> - v = V name - v = Cmt("", (str, pos) -> - rest = str\sub(pos, -1)\match "^([^\n]*)" - - iprint "* #{name} (#{rest})" - indent += 1 - true - ) * Cmt(v, (str, pos, ...) -> - iprint name, true - indent -= 1 - true, ... - ) + Cmt("", -> - iprint name, false - indent -= 1 - false - ) - - v - - setfenv fn, setmetatable {}, { - __index: (name) => - value = env[name] - return value if value != nil - - if name\match"^[A-Z][A-Za-z0-9]*$" - v = wrap_name name - return v - - error "unknown variable referenced: #{name}" - } - -{ :wrap_env } diff --git a/moonscript/parse/literals.lua b/moonscript/parse/literals.lua deleted file mode 100644 index 1ad5aeb5..00000000 --- a/moonscript/parse/literals.lua +++ /dev/null @@ -1,39 +0,0 @@ -local safe_module -safe_module = require("moonscript.util").safe_module -local S, P, R, C -do - local _obj_0 = require("lpeg") - S, P, R, C = _obj_0.S, _obj_0.P, _obj_0.R, _obj_0.C -end -local lpeg = require("lpeg") -local L = lpeg.luversion and lpeg.L or function(v) - return #v -end -local White = S(" \t\r\n") ^ 0 -local plain_space = S(" \t") ^ 0 -local Break = P("\r") ^ -1 * P("\n") -local Stop = Break + -1 -local Comment = P("--") * (1 - S("\r\n")) ^ 0 * L(Stop) -local Space = plain_space * Comment ^ -1 -local SomeSpace = S(" \t") ^ 1 * Comment ^ -1 -local SpaceBreak = Space * Break -local EmptyLine = SpaceBreak -local AlphaNum = R("az", "AZ", "09", "__") -local Name = C(R("az", "AZ", "__") * AlphaNum ^ 0) -local Num = P("0x") * R("09", "af", "AF") ^ 1 * (S("uU") ^ -1 * S("lL") ^ 2) ^ -1 + R("09") ^ 1 * (S("uU") ^ -1 * S("lL") ^ 2) + (R("09") ^ 1 * (P(".") * R("09") ^ 1) ^ -1 + P(".") * R("09") ^ 1) * (S("eE") * P("-") ^ -1 * R("09") ^ 1) ^ -1 -local Shebang = P("#!") * P(1 - Stop) ^ 0 -return safe_module("moonscript.parse.literals", { - L = L, - White = White, - Break = Break, - Stop = Stop, - Comment = Comment, - Space = Space, - SomeSpace = SomeSpace, - SpaceBreak = SpaceBreak, - EmptyLine = EmptyLine, - AlphaNum = AlphaNum, - Name = Name, - Num = Num, - Shebang = Shebang -}) diff --git a/moonscript/parse/literals.moon b/moonscript/parse/literals.moon deleted file mode 100644 index 5a4980f3..00000000 --- a/moonscript/parse/literals.moon +++ /dev/null @@ -1,38 +0,0 @@ --- non-recursive parsers -import safe_module from require "moonscript.util" -import S, P, R, C from require "lpeg" - -lpeg = require "lpeg" -L = lpeg.luversion and lpeg.L or (v) -> #v - -White = S" \t\r\n"^0 -plain_space = S" \t"^0 - -Break = P"\r"^-1 * P"\n" -Stop = Break + -1 - -Comment = P"--" * (1 - S"\r\n")^0 * L(Stop) -Space = plain_space * Comment^-1 -SomeSpace = S" \t"^1 * Comment^-1 - -SpaceBreak = Space * Break -EmptyLine = SpaceBreak - -AlphaNum = R "az", "AZ", "09", "__" - -Name = C R("az", "AZ", "__") * AlphaNum^0 - -Num = P"0x" * R("09", "af", "AF")^1 * (S"uU"^-1 * S"lL"^2)^-1 + - R"09"^1 * (S"uU"^-1 * S"lL"^2) + - ( - R"09"^1 * (P"." * R"09"^1)^-1 + - P"." * R"09"^1 - ) * (S"eE" * P"-"^-1 * R"09"^1)^-1 - -Shebang = P"#!" * P(1 - Stop)^0 - -safe_module "moonscript.parse.literals", { - :L - :White, :Break, :Stop, :Comment, :Space, :SomeSpace, :SpaceBreak, :EmptyLine, - :AlphaNum, :Name, :Num, :Shebang -} diff --git a/moonscript/parse/util.lua b/moonscript/parse/util.lua deleted file mode 100644 index 3f02c8d5..00000000 --- a/moonscript/parse/util.lua +++ /dev/null @@ -1,307 +0,0 @@ -local unpack -unpack = require("moonscript.util").unpack -local P, C, S, Cp, Cmt, V -do - local _obj_0 = require("lpeg") - P, C, S, Cp, Cmt, V = _obj_0.P, _obj_0.C, _obj_0.S, _obj_0.Cp, _obj_0.Cmt, _obj_0.V -end -local ntype -ntype = require("moonscript.types").ntype -local Space -Space = require("moonscript.parse.literals").Space -local Indent = C(S("\t ") ^ 0) / function(str) - do - local sum = 0 - for v in str:gmatch("[\t ]") do - local _exp_0 = v - if " " == _exp_0 then - sum = sum + 1 - elseif "\t" == _exp_0 then - sum = sum + 4 - end - end - return sum - end -end -local Cut = P(function() - return false -end) -local ensure -ensure = function(patt, finally) - return patt * finally + finally * Cut -end -local extract_line -extract_line = function(str, start_pos) - str = str:sub(start_pos) - do - local m = str:match("^(.-)\n") - if m then - return m - end - end - return str:match("^.-$") -end -local show_line_position -show_line_position = function(str, pos, context) - if context == nil then - context = true - end - local lines = { - { } - } - for c in str:gmatch(".") do - local _update_0 = #lines - lines[_update_0] = lines[_update_0] or { } - table.insert(lines[#lines], c) - if c == "\n" then - lines[#lines + 1] = { } - end - end - for i, line in ipairs(lines) do - lines[i] = table.concat(line) - end - local out - local remaining = pos - 1 - for k, line in ipairs(lines) do - if remaining < #line then - local left = line:sub(1, remaining) - local right = line:sub(remaining + 1) - out = { - tostring(left) .. "◉" .. tostring(right) - } - if context then - do - local before = lines[k - 1] - if before then - table.insert(out, 1, before) - end - end - do - local after = lines[k + 1] - if after then - table.insert(out, after) - end - end - end - break - else - remaining = remaining - #line - end - end - if not (out) then - return "-" - end - out = table.concat(out) - return (out:gsub("\n*$", "")) -end -local mark -mark = function(name) - return function(...) - return { - name, - ... - } - end -end -local pos -pos = function(patt) - return (Cp() * patt) / function(pos, value) - if type(value) == "table" then - value[-1] = pos - end - return value - end -end -local got -got = function(what, context) - if context == nil then - context = true - end - return Cmt("", function(str, pos) - print("++ got " .. tostring(what), "[" .. tostring(show_line_position(str, pos, context)) .. "]") - return true - end) -end -local flatten_or_mark -flatten_or_mark = function(name) - return function(tbl) - if #tbl == 1 then - return tbl[1] - end - table.insert(tbl, 1, name) - return tbl - end -end -local is_assignable -do - local chain_assignable = { - index = true, - dot = true, - slice = true - } - is_assignable = function(node) - if node == "..." then - return false - end - local _exp_0 = ntype(node) - if "ref" == _exp_0 or "self" == _exp_0 or "value" == _exp_0 or "self_class" == _exp_0 or "table" == _exp_0 then - return true - elseif "chain" == _exp_0 then - return chain_assignable[ntype(node[#node])] - else - return false - end - end -end -local check_assignable -check_assignable = function(str, pos, value) - if is_assignable(value) then - return true, value - else - return false - end -end -local format_assign -do - local flatten_explist = flatten_or_mark("explist") - format_assign = function(lhs_exps, assign) - if not (assign) then - return flatten_explist(lhs_exps) - end - for _index_0 = 1, #lhs_exps do - local assign_exp = lhs_exps[_index_0] - if not (is_assignable(assign_exp)) then - error({ - assign_exp, - "left hand expression is not assignable" - }) - end - end - local t = ntype(assign) - local _exp_0 = t - if "assign" == _exp_0 then - return { - "assign", - lhs_exps, - unpack(assign, 2) - } - elseif "update" == _exp_0 then - return { - "update", - lhs_exps[1], - unpack(assign, 2) - } - else - return error("unknown assign expression: " .. tostring(t)) - end - end -end -local format_single_assign -format_single_assign = function(lhs, assign) - if assign then - return format_assign({ - lhs - }, assign) - else - return lhs - end -end -local sym -sym = function(chars) - return Space * chars -end -local symx -symx = function(chars) - return chars -end -local simple_string -simple_string = function(delim, allow_interpolation) - local inner = P("\\" .. tostring(delim)) + "\\\\" + (1 - P(delim)) - if allow_interpolation then - local interp = symx('#{') * V("Exp") * sym('}') - inner = (C((inner - interp) ^ 1) + interp / mark("interpolate")) ^ 0 - else - inner = C(inner ^ 0) - end - return C(symx(delim)) * inner * sym(delim) / mark("string") -end -local wrap_func_arg -wrap_func_arg = function(value) - return { - "call", - { - value - } - } -end -local join_chain -join_chain = function(callee, args) - if #args == 0 then - return callee - end - args = { - "call", - args - } - if ntype(callee) == "chain" then - table.insert(callee, args) - return callee - end - return { - "chain", - callee, - args - } -end -local wrap_decorator -wrap_decorator = function(stm, dec) - if not (dec) then - return stm - end - return { - "decorated", - stm, - dec - } -end -local check_lua_string -check_lua_string = function(str, pos, right, left) - return #left == #right -end -local self_assign -self_assign = function(name, pos) - return { - { - "key_literal", - name - }, - { - "ref", - name, - [-1] = pos - } - } -end -return { - Indent = Indent, - Cut = Cut, - ensure = ensure, - extract_line = extract_line, - mark = mark, - pos = pos, - flatten_or_mark = flatten_or_mark, - is_assignable = is_assignable, - check_assignable = check_assignable, - format_assign = format_assign, - format_single_assign = format_single_assign, - sym = sym, - symx = symx, - simple_string = simple_string, - wrap_func_arg = wrap_func_arg, - join_chain = join_chain, - wrap_decorator = wrap_decorator, - check_lua_string = check_lua_string, - self_assign = self_assign, - got = got, - show_line_position = show_line_position -} diff --git a/moonscript/parse/util.moon b/moonscript/parse/util.moon deleted file mode 100644 index 17adf77a..00000000 --- a/moonscript/parse/util.moon +++ /dev/null @@ -1,197 +0,0 @@ - -import unpack from require "moonscript.util" -import P, C, S, Cp, Cmt, V from require "lpeg" -import ntype from require "moonscript.types" -import Space from require "moonscript.parse.literals" - --- captures an indentation, returns indent depth -Indent = C(S"\t "^0) / (str) -> - with sum = 0 - for v in str\gmatch "[\t ]" - switch v - when " " - sum += 1 - when "\t" - sum += 4 - - --- causes pattern in progress to be rejected --- can't have P(false) because it causes preceding patterns not to run -Cut = P -> false - --- ensures finally runs regardless of whether pattern fails or passes -ensure = (patt, finally) -> - patt * finally + finally * Cut - --- take rest of line from pos out of str -extract_line = (str, start_pos) -> - str = str\sub start_pos - if m = str\match "^(.-)\n" - return m - - str\match "^.-$" - --- print the line with a token showing the position -show_line_position = (str, pos, context=true) -> - lines = { {} } - for c in str\gmatch "." - lines[#lines] or= {} - table.insert lines[#lines], c - if c == "\n" - lines[#lines + 1] = {} - - for i, line in ipairs lines - lines[i] = table.concat line - - local out - - remaining = pos - 1 - for k, line in ipairs lines - if remaining < #line - left = line\sub 1, remaining - right = line\sub remaining + 1 - out = { - "#{left}◉#{right}" - } - - if context - if before = lines[k - 1] - table.insert out, 1, before - - if after = lines[k + 1] - table.insert out, after - - break - else - remaining -= #line - - - return "-" unless out - - out = table.concat out - (out\gsub "\n*$", "") - --- used to identify a capture with a label -mark = (name) -> - (...) -> {name, ...} - --- wraps pattern to capture pos into node --- pos is the character offset from the buffer where the node was parsed from. --- Used to generate error messages -pos = (patt) -> - (Cp! * patt) / (pos, value) -> - if type(value) == "table" - value[-1] = pos - value - --- generates a debug pattern that always succeeds and prints out where we are --- in the buffer with a label -got = (what, context=true) -> - Cmt "", (str, pos) -> - print "++ got #{what}", "[#{show_line_position str, pos, context}]" - true - --- converts 1 element array to its value, otherwise marks it -flatten_or_mark = (name) -> - (tbl) -> - return tbl[1] if #tbl == 1 - table.insert tbl, 1, name - tbl - --- determines if node is able to be on left side of assignment -is_assignable = do - chain_assignable = { index: true, dot: true, slice: true } - - (node) -> - return false if node == "..." - switch ntype node - when "ref", "self", "value", "self_class", "table" - true - when "chain" - chain_assignable[ntype node[#node]] - else - false - -check_assignable = (str, pos, value) -> - if is_assignable value - true, value - else - false - --- joins the two parts of an assign parse into a single node -format_assign = do - flatten_explist = flatten_or_mark "explist" - - (lhs_exps, assign) -> - unless assign - return flatten_explist lhs_exps - - for assign_exp in *lhs_exps - unless is_assignable assign_exp - error {assign_exp, "left hand expression is not assignable"} - - t = ntype assign - switch t - when "assign" - {"assign", lhs_exps, unpack assign, 2} - when "update" - {"update", lhs_exps[1], unpack assign, 2} - else - error "unknown assign expression: #{t}" - --- helper for if statement, which only has single lhs -format_single_assign = (lhs, assign) -> - if assign - format_assign {lhs}, assign - else - lhs - - --- a symbol -sym = (chars) -> Space * chars --- a symbol that doesn't accept whitespace before it -symx = (chars) -> chars - --- a constructor for quote delimited strings -simple_string = (delim, allow_interpolation) -> - inner = P("\\#{delim}") + "\\\\" + (1 - P delim) - - inner = if allow_interpolation - interp = symx'#{' * V"Exp" * sym'}' - (C((inner - interp)^1) + interp / mark"interpolate")^0 - else - C inner^0 - - C(symx(delim)) * inner * sym(delim) / mark"string" - --- wraps a single value in format needed to be passed as function arguments -wrap_func_arg = (value) -> {"call", {value}} - --- chains are parsed in two captures, the chain and then the open arguments --- if there are open arguments, then append them to the end of the chain as a call -join_chain = (callee, args) -> - return callee if #args == 0 - args = {"call", args} - - if ntype(callee) == "chain" - table.insert callee, args - return callee - - {"chain", callee, args} - --- constructor for decorator node -wrap_decorator = (stm, dec) -> - return stm unless dec - {"decorated", stm, dec} - -check_lua_string = (str, pos, right, left) -> - #left == #right - --- constructor for :name self assignments in table literals -self_assign = (name, pos) -> - {{"key_literal", name}, {"ref", name, [-1]: pos}} - -{ :Indent, :Cut, :ensure, :extract_line, :mark, :pos, :flatten_or_mark, - :is_assignable, :check_assignable, :format_assign, :format_single_assign, - :sym, :symx, :simple_string, :wrap_func_arg, :join_chain, :wrap_decorator, - :check_lua_string, :self_assign, :got, :show_line_position } diff --git a/moonscript/transform.lua b/moonscript/transform.lua deleted file mode 100644 index c95f14d3..00000000 --- a/moonscript/transform.lua +++ /dev/null @@ -1,4 +0,0 @@ -return { - Statement = require("moonscript.transform.statement"), - Value = require("moonscript.transform.value") -} diff --git a/moonscript/transform.moon b/moonscript/transform.moon deleted file mode 100644 index 29a93ad2..00000000 --- a/moonscript/transform.moon +++ /dev/null @@ -1,5 +0,0 @@ - -{ - Statement: require "moonscript.transform.statement" - Value: require "moonscript.transform.value" -} diff --git a/moonscript/transform/accumulator.lua b/moonscript/transform/accumulator.lua deleted file mode 100644 index 539c65fd..00000000 --- a/moonscript/transform/accumulator.lua +++ /dev/null @@ -1,110 +0,0 @@ -local types = require("moonscript.types") -local build, ntype, NOOP -build, ntype, NOOP = types.build, types.ntype, types.NOOP -local NameProxy -NameProxy = require("moonscript.transform.names").NameProxy -local insert -insert = table.insert -local is_singular -is_singular = function(body) - if #body ~= 1 then - return false - end - if "group" == ntype(body) then - return is_singular(body[2]) - else - return body[1] - end -end -local transform_last_stm -transform_last_stm = require("moonscript.transform.statements").transform_last_stm -local Accumulator -do - local _class_0 - local _base_0 = { - body_idx = { - ["for"] = 4, - ["while"] = 3, - foreach = 4 - }, - convert = function(self, node) - local index = self.body_idx[ntype(node)] - node[index] = self:mutate_body(node[index]) - return self:wrap(node) - end, - wrap = function(self, node, group_type) - if group_type == nil then - group_type = "block_exp" - end - return build[group_type]({ - build.assign_one(self.accum_name, build.table()), - build.assign_one(self.len_name, 1), - node, - group_type == "block_exp" and self.accum_name or NOOP - }) - end, - mutate_body = function(self, body) - local single_stm = is_singular(body) - local val - if single_stm and types.is_value(single_stm) then - body = { } - val = single_stm - else - body = transform_last_stm(body, function(n) - if types.is_value(n) then - return build.assign_one(self.value_name, n) - else - return build.group({ - { - "declare", - { - self.value_name - } - }, - n - }) - end - end) - val = self.value_name - end - local update = { - build.assign_one(NameProxy.index(self.accum_name, self.len_name), val), - { - "update", - self.len_name, - "+=", - 1 - } - } - insert(body, build.group(update)) - return body - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, accum_name) - self.accum_name = NameProxy("accum") - self.value_name = NameProxy("value") - self.len_name = NameProxy("len") - end, - __base = _base_0, - __name = "Accumulator" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Accumulator = _class_0 -end -local default_accumulator -default_accumulator = function(self, node) - return Accumulator():convert(node) -end -return { - Accumulator = Accumulator, - default_accumulator = default_accumulator -} diff --git a/moonscript/transform/accumulator.moon b/moonscript/transform/accumulator.moon deleted file mode 100644 index 62ff015c..00000000 --- a/moonscript/transform/accumulator.moon +++ /dev/null @@ -1,71 +0,0 @@ -types = require "moonscript.types" - -import build, ntype, NOOP from types -import NameProxy from require "moonscript.transform.names" - -import insert from table - --- is a body a single expression/statement -is_singular = (body) -> - return false if #body != 1 - if "group" == ntype body - is_singular body[2] - else - body[1] - -import transform_last_stm from require "moonscript.transform.statements" - -class Accumulator - body_idx: { for: 4, while: 3, foreach: 4 } - - new: (accum_name) => - @accum_name = NameProxy "accum" - @value_name = NameProxy "value" - @len_name = NameProxy "len" - - -- wraps node and mutates body - convert: (node) => - index = @body_idx[ntype node] - node[index] = @mutate_body node[index] - @wrap node - - -- wrap the node into a block_exp - wrap: (node, group_type="block_exp") => - build[group_type] { - build.assign_one @accum_name, build.table! - build.assign_one @len_name, 1 - node - group_type == "block_exp" and @accum_name or NOOP - } - - -- mutates the body of a loop construct to save last value into accumulator - mutate_body: (body) => - -- shortcut to write simpler code if body is a single expression - single_stm = is_singular body - val = if single_stm and types.is_value single_stm - body = {} - single_stm - else - body = transform_last_stm body, (n) -> - if types.is_value n - build.assign_one @value_name, n - else - -- just ignore it - build.group { - {"declare", {@value_name}} - n - } - @value_name - - update = { - build.assign_one NameProxy.index(@accum_name, @len_name), val - {"update", @len_name, "+=", 1} - } - - insert body, build.group update - body - -default_accumulator = (node) => - Accumulator!\convert node - -{ :Accumulator, :default_accumulator } diff --git a/moonscript/transform/class.lua b/moonscript/transform/class.lua deleted file mode 100644 index 74f93c59..00000000 --- a/moonscript/transform/class.lua +++ /dev/null @@ -1,486 +0,0 @@ -local NameProxy, LocalName -do - local _obj_0 = require("moonscript.transform.names") - NameProxy, LocalName = _obj_0.NameProxy, _obj_0.LocalName -end -local Run -Run = require("moonscript.transform.statements").Run -local CONSTRUCTOR_NAME = "new" -local insert -insert = table.insert -local build, ntype, NOOP -do - local _obj_0 = require("moonscript.types") - build, ntype, NOOP = _obj_0.build, _obj_0.ntype, _obj_0.NOOP -end -local unpack -unpack = require("moonscript.util").unpack -local transform_super -transform_super = function(cls_name, on_base, block, chain) - if on_base == nil then - on_base = true - end - local relative_parent = { - "chain", - cls_name, - { - "dot", - "__parent" - } - } - if not (chain) then - return relative_parent - end - local chain_tail = { - unpack(chain, 3) - } - local head = chain_tail[1] - if head == nil then - return relative_parent - end - local new_chain = relative_parent - local _exp_0 = head[1] - if "call" == _exp_0 then - if on_base then - insert(new_chain, { - "dot", - "__base" - }) - end - local calling_name = block:get("current_method") - assert(calling_name, "missing calling name") - chain_tail[1] = { - "call", - { - "self", - unpack(head[2]) - } - } - if ntype(calling_name) == "key_literal" then - insert(new_chain, { - "dot", - calling_name[2] - }) - else - insert(new_chain, { - "index", - calling_name - }) - end - elseif "colon" == _exp_0 then - local call = chain_tail[2] - if call and call[1] == "call" then - chain_tail[1] = { - "dot", - head[2] - } - chain_tail[2] = { - "call", - { - "self", - unpack(call[2]) - } - } - end - end - for _index_0 = 1, #chain_tail do - local item = chain_tail[_index_0] - insert(new_chain, item) - end - return new_chain -end -local super_scope -super_scope = function(value, t, key) - local prev_method - return { - "scoped", - Run(function(self) - prev_method = self:get("current_method") - self:set("current_method", key) - return self:set("super", t) - end), - value, - Run(function(self) - return self:set("current_method", prev_method) - end) - } -end -return function(self, node, ret, parent_assign) - local name, parent_val, body = unpack(node, 2) - if parent_val == "" then - parent_val = nil - end - local parent_cls_name = NameProxy("parent") - local base_name = NameProxy("base") - local self_name = NameProxy("self") - local cls_name = NameProxy("class") - local cls_instance_super - cls_instance_super = function(...) - return transform_super(cls_name, true, ...) - end - local cls_super - cls_super = function(...) - return transform_super(cls_name, false, ...) - end - local statements = { } - local properties = { } - for _index_0 = 1, #body do - local item = body[_index_0] - local _exp_0 = item[1] - if "stm" == _exp_0 then - insert(statements, item[2]) - elseif "props" == _exp_0 then - for _index_1 = 2, #item do - local tuple = item[_index_1] - if ntype(tuple[1]) == "self" then - local k, v - k, v = tuple[1], tuple[2] - v = super_scope(v, cls_super, { - "key_literal", - k[2] - }) - insert(statements, build.assign_one(k, v)) - else - insert(properties, tuple) - end - end - end - end - local constructor - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #properties do - local _continue_0 = false - repeat - local tuple = properties[_index_0] - local key = tuple[1] - local _value_0 - if key[1] == "key_literal" and key[2] == CONSTRUCTOR_NAME then - constructor = tuple[2] - _continue_0 = true - break - else - local val - key, val = tuple[1], tuple[2] - _value_0 = { - key, - super_scope(val, cls_instance_super, key) - } - end - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - properties = _accum_0 - end - if not (constructor) then - if parent_val then - constructor = build.fndef({ - args = { - { - "..." - } - }, - arrow = "fat", - body = { - build.chain({ - base = "super", - { - "call", - { - "..." - } - } - }) - } - }) - else - constructor = build.fndef() - end - end - local real_name = name or parent_assign and parent_assign[2][1] - local _exp_0 = ntype(real_name) - if "chain" == _exp_0 then - local last = real_name[#real_name] - local _exp_1 = ntype(last) - if "dot" == _exp_1 then - real_name = { - "string", - '"', - last[2] - } - elseif "index" == _exp_1 then - real_name = last[2] - else - real_name = "nil" - end - elseif "nil" == _exp_0 then - real_name = "nil" - else - local name_t = type(real_name) - local flattened_name - if name_t == "string" then - flattened_name = real_name - elseif name_t == "table" and real_name[1] == "ref" then - flattened_name = real_name[2] - else - flattened_name = error("don't know how to extract name from " .. tostring(name_t)) - end - real_name = { - "string", - '"', - flattened_name - } - end - local cls = build.table({ - { - "__init", - super_scope(constructor, cls_super, { - "key_literal", - "__init" - }) - }, - { - "__base", - base_name - }, - { - "__name", - real_name - }, - parent_val and { - "__parent", - parent_cls_name - } or nil - }) - local class_index - if parent_val then - local class_lookup = build["if"]({ - cond = { - "exp", - { - "ref", - "val" - }, - "==", - "nil" - }, - ["then"] = { - build.assign_one(LocalName("parent"), build.chain({ - base = "rawget", - { - "call", - { - { - "ref", - "cls" - }, - { - "string", - '"', - "__parent" - } - } - } - })), - build["if"]({ - cond = LocalName("parent"), - ["then"] = { - build.chain({ - base = LocalName("parent"), - { - "index", - "name" - } - }) - } - }) - } - }) - insert(class_lookup, { - "else", - { - "val" - } - }) - class_index = build.fndef({ - args = { - { - "cls" - }, - { - "name" - } - }, - body = { - build.assign_one(LocalName("val"), build.chain({ - base = "rawget", - { - "call", - { - base_name, - { - "ref", - "name" - } - } - } - })), - class_lookup - } - }) - else - class_index = base_name - end - local cls_mt = build.table({ - { - "__index", - class_index - }, - { - "__call", - build.fndef({ - args = { - { - "cls" - }, - { - "..." - } - }, - body = { - build.assign_one(self_name, build.chain({ - base = "setmetatable", - { - "call", - { - "{}", - base_name - } - } - })), - build.chain({ - base = "cls.__init", - { - "call", - { - self_name, - "..." - } - } - }), - self_name - } - }) - } - }) - cls = build.chain({ - base = "setmetatable", - { - "call", - { - cls, - cls_mt - } - } - }) - local value = nil - do - local out_body = { - Run(function(self) - if name then - return self:put_name(name) - end - end), - { - "declare", - { - cls_name - } - }, - { - "declare_glob", - "*" - }, - parent_val and build.assign_one(parent_cls_name, parent_val) or NOOP, - build.assign_one(base_name, { - "table", - properties - }), - build.assign_one(base_name:chain("__index"), base_name), - parent_val and build.chain({ - base = "setmetatable", - { - "call", - { - base_name, - build.chain({ - base = parent_cls_name, - { - "dot", - "__base" - } - }) - } - } - }) or NOOP, - build.assign_one(cls_name, cls), - build.assign_one(base_name:chain("__class"), cls_name), - build.group((function() - if #statements > 0 then - return { - build.assign_one(LocalName("self"), cls_name), - build.group(statements) - } - end - end)()), - parent_val and build["if"]({ - cond = { - "exp", - parent_cls_name:chain("__inherited") - }, - ["then"] = { - parent_cls_name:chain("__inherited", { - "call", - { - parent_cls_name, - cls_name - } - }) - } - }) or NOOP, - build.group((function() - if name then - return { - build.assign_one(name, cls_name) - } - end - end)()), - (function() - if ret then - return ret(cls_name) - end - end)() - } - value = build.group({ - build.group((function() - if ntype(name) == "value" then - return { - build.declare({ - names = { - name - } - }) - } - end - end)()), - build["do"](out_body) - }) - end - return value -end diff --git a/moonscript/transform/class.moon b/moonscript/transform/class.moon deleted file mode 100644 index 7451375b..00000000 --- a/moonscript/transform/class.moon +++ /dev/null @@ -1,285 +0,0 @@ -import NameProxy, LocalName from require "moonscript.transform.names" -import Run from require "moonscript.transform.statements" - -CONSTRUCTOR_NAME = "new" - -import insert from table -import build, ntype, NOOP from require "moonscript.types" -import unpack from require "moonscript.util" - -transform_super = (cls_name, on_base=true, block, chain) -> - relative_parent = { - "chain", - cls_name - {"dot", "__parent"} - } - - return relative_parent unless chain - - chain_tail = { unpack chain, 3 } - head = chain_tail[1] - - if head == nil - return relative_parent - - new_chain = relative_parent - - switch head[1] - -- calling super, inject calling name and self into chain - when "call" - if on_base - insert new_chain, {"dot", "__base"} - - calling_name = block\get "current_method" - assert calling_name, "missing calling name" - chain_tail[1] = {"call", {"self", unpack head[2]}} - - if ntype(calling_name) == "key_literal" - insert new_chain, {"dot", calling_name[2]} - else - insert new_chain, {"index", calling_name} - - -- colon call on super, replace class with self as first arg - when "colon" - call = chain_tail[2] - -- calling chain tail - if call and call[1] == "call" - chain_tail[1] = { - "dot" - head[2] - } - - chain_tail[2] = { - "call" - { - "self" - unpack call[2] - } - } - - insert new_chain, item for item in *chain_tail - new_chain - - -super_scope = (value, t, key) -> - local prev_method - - { - "scoped", - Run => - prev_method = @get "current_method" - @set "current_method", key - @set "super", t - value - Run => - @set "current_method", prev_method - } - -(node, ret, parent_assign) => - name, parent_val, body = unpack node, 2 - parent_val = nil if parent_val == "" - - parent_cls_name = NameProxy "parent" - base_name = NameProxy "base" - self_name = NameProxy "self" - cls_name = NameProxy "class" - - -- super call on instance - cls_instance_super = (...) -> transform_super cls_name, true, ... - - -- super call on parent class - cls_super = (...) -> transform_super cls_name, false, ... - - -- split apart properties and statements - statements = {} - properties = {} - for item in *body - switch item[1] - when "stm" - insert statements, item[2] - when "props" - for tuple in *item[2,] - if ntype(tuple[1]) == "self" - {k,v} = tuple - v = super_scope v, cls_super, {"key_literal", k[2]} - insert statements, build.assign_one k, v - else - insert properties, tuple - - -- find constructor - local constructor - properties = for tuple in *properties - key = tuple[1] - if key[1] == "key_literal" and key[2] == CONSTRUCTOR_NAME - constructor = tuple[2] - continue - else - {key, val} = tuple - {key, super_scope val, cls_instance_super, key} - - - unless constructor - constructor = if parent_val - build.fndef { - args: {{"..."}} - arrow: "fat" - body: { - build.chain { base: "super", {"call", {"..."}} } - } - } - else - build.fndef! - - real_name = name or parent_assign and parent_assign[2][1] - real_name = switch ntype real_name - when "chain" - last = real_name[#real_name] - switch ntype last - when "dot" - {"string", '"', last[2]} - when "index" - last[2] - else - "nil" - when "nil" - "nil" - else - name_t = type real_name - -- TODO: don't use string literal as ref - flattened_name = if name_t == "string" - real_name - elseif name_t == "table" and real_name[1] == "ref" - real_name[2] - else - error "don't know how to extract name from #{name_t}" - - {"string", '"', flattened_name} - - cls = build.table { - {"__init", super_scope constructor, cls_super, {"key_literal", "__init"}} - {"__base", base_name} - {"__name", real_name} -- "quote the string" - parent_val and {"__parent", parent_cls_name} or nil - } - - -- looking up a name in the class object - class_index = if parent_val - class_lookup = build["if"] { - cond: { "exp", {"ref", "val"}, "==", "nil" } - then: { - build.assign_one LocalName"parent", build.chain { - base: "rawget" - { - "call", { - {"ref", "cls"} - {"string", '"', "__parent"} - } - } - } - - build.if { - cond: LocalName "parent" - then: { - build.chain { - base: LocalName "parent" - {"index", "name"} - } - } - } - } - } - insert class_lookup, {"else", {"val"}} - - build.fndef { - args: {{"cls"}, {"name"}} - body: { - build.assign_one LocalName"val", build.chain { - base: "rawget", {"call", {base_name, {"ref", "name"}}} - } - class_lookup - } - } - else - base_name - - cls_mt = build.table { - {"__index", class_index} - {"__call", build.fndef { - args: {{"cls"}, {"..."}} - body: { - build.assign_one self_name, build.chain { - base: "setmetatable" - {"call", {"{}", base_name}} - } - build.chain { - base: "cls.__init" - {"call", {self_name, "..."}} - } - self_name - } - }} - } - - cls = build.chain { - base: "setmetatable" - {"call", {cls, cls_mt}} - } - - value = nil - with build - out_body = { - Run => - -- make sure we don't assign the class to a local inside the do - @put_name name if name - - {"declare", { cls_name }} - {"declare_glob", "*"} - - parent_val and .assign_one(parent_cls_name, parent_val) or NOOP - - .assign_one base_name, {"table", properties} - .assign_one base_name\chain"__index", base_name - - parent_val and .chain({ - base: "setmetatable" - {"call", { - base_name, - .chain { base: parent_cls_name, {"dot", "__base"}} - }} - }) or NOOP - - .assign_one cls_name, cls - .assign_one base_name\chain"__class", cls_name - - .group if #statements > 0 then { - .assign_one LocalName"self", cls_name - .group statements - } - - -- run the inherited callback - parent_val and .if({ - cond: {"exp", parent_cls_name\chain "__inherited" } - then: { - parent_cls_name\chain "__inherited", {"call", { - parent_cls_name, cls_name - }} - } - }) or NOOP - - .group if name then { - .assign_one name, cls_name - } - - if ret - ret cls_name - } - - value = .group { - .group if ntype(name) == "value" then { - .declare names: {name} - } - - .do out_body - } - - value diff --git a/moonscript/transform/comprehension.lua b/moonscript/transform/comprehension.lua deleted file mode 100644 index da33892d..00000000 --- a/moonscript/transform/comprehension.lua +++ /dev/null @@ -1,54 +0,0 @@ -local is_value -is_value = require("moonscript.types").is_value -local construct_comprehension -construct_comprehension = function(inner, clauses) - local current_stms = inner - for i = #clauses, 1, -1 do - local clause = clauses[i] - local t = clause[1] - local _exp_0 = t - if "for" == _exp_0 then - local _, name, bounds - _, name, bounds = clause[1], clause[2], clause[3] - current_stms = { - "for", - name, - bounds, - current_stms - } - elseif "foreach" == _exp_0 then - local _, names, iter - _, names, iter = clause[1], clause[2], clause[3] - current_stms = { - "foreach", - names, - { - iter - }, - current_stms - } - elseif "when" == _exp_0 then - local _, cond - _, cond = clause[1], clause[2] - current_stms = { - "if", - cond, - current_stms - } - else - current_stms = error("Unknown comprehension clause: " .. t) - end - current_stms = { - current_stms - } - end - return current_stms[1] -end -local comprehension_has_value -comprehension_has_value = function(comp) - return is_value(comp[2]) -end -return { - construct_comprehension = construct_comprehension, - comprehension_has_value = comprehension_has_value -} diff --git a/moonscript/transform/comprehension.moon b/moonscript/transform/comprehension.moon deleted file mode 100644 index a181a891..00000000 --- a/moonscript/transform/comprehension.moon +++ /dev/null @@ -1,30 +0,0 @@ - -import is_value from require "moonscript.types" - -construct_comprehension = (inner, clauses) -> - current_stms = inner - for i=#clauses,1,-1 - clause = clauses[i] - t = clause[1] - - current_stms = switch t - when "for" - {_, name, bounds} = clause - {"for", name, bounds, current_stms} - when "foreach" - {_, names, iter} = clause - {"foreach", names, {iter}, current_stms} - when "when" - {_, cond} = clause - {"if", cond, current_stms} - else - error "Unknown comprehension clause: "..t - - current_stms = {current_stms} - - current_stms[1] - -comprehension_has_value = (comp) -> - is_value comp[2] - -{:construct_comprehension, :comprehension_has_value} diff --git a/moonscript/transform/destructure.lua b/moonscript/transform/destructure.lua deleted file mode 100644 index 1e370b7d..00000000 --- a/moonscript/transform/destructure.lua +++ /dev/null @@ -1,234 +0,0 @@ -local ntype, mtype, build -do - local _obj_0 = require("moonscript.types") - ntype, mtype, build = _obj_0.ntype, _obj_0.mtype, _obj_0.build -end -local NameProxy -NameProxy = require("moonscript.transform.names").NameProxy -local insert -insert = table.insert -local unpack -unpack = require("moonscript.util").unpack -local user_error -user_error = require("moonscript.errors").user_error -local join -join = function(...) - do - local out = { } - local i = 1 - local _list_0 = { - ... - } - for _index_0 = 1, #_list_0 do - local tbl = _list_0[_index_0] - for _index_1 = 1, #tbl do - local v = tbl[_index_1] - out[i] = v - i = i + 1 - end - end - return out - end -end -local has_destructure -has_destructure = function(names) - for _index_0 = 1, #names do - local n = names[_index_0] - if ntype(n) == "table" then - return true - end - end - return false -end -local extract_assign_names -extract_assign_names = function(name, accum, prefix) - if accum == nil then - accum = { } - end - if prefix == nil then - prefix = { } - end - local i = 1 - local _list_0 = name[2] - for _index_0 = 1, #_list_0 do - local tuple = _list_0[_index_0] - local value, suffix - if #tuple == 1 then - local s = { - "index", - { - "number", - i - } - } - i = i + 1 - value, suffix = tuple[1], s - else - local key = tuple[1] - local s - if ntype(key) == "key_literal" then - local key_name = key[2] - if ntype(key_name) == "colon" then - s = key_name - else - s = { - "dot", - key_name - } - end - else - s = { - "index", - key - } - end - value, suffix = tuple[2], s - end - suffix = join(prefix, { - suffix - }) - local _exp_0 = ntype(value) - if "value" == _exp_0 or "ref" == _exp_0 or "chain" == _exp_0 or "self" == _exp_0 then - insert(accum, { - value, - suffix - }) - elseif "table" == _exp_0 then - extract_assign_names(value, accum, suffix) - else - user_error("Can't destructure value of type: " .. tostring(ntype(value))) - end - end - return accum -end -local build_assign -build_assign = function(scope, destruct_literal, receiver) - assert(receiver, "attempting to build destructure assign with no receiver") - local extracted_names = extract_assign_names(destruct_literal) - local names = { } - local values = { } - local inner = { - "assign", - names, - values - } - local obj - if scope:is_local(receiver) or #extracted_names == 1 then - obj = receiver - else - do - obj = NameProxy("obj") - inner = build["do"]({ - build.assign_one(obj, receiver), - { - "assign", - names, - values - } - }) - obj = obj - end - end - for _index_0 = 1, #extracted_names do - local tuple = extracted_names[_index_0] - insert(names, tuple[1]) - local chain - if obj then - chain = NameProxy.chain(obj, unpack(tuple[2])) - else - chain = "nil" - end - insert(values, chain) - end - return build.group({ - { - "declare", - names - }, - inner - }) -end -local split_assign -split_assign = function(scope, assign) - local names, values = unpack(assign, 2) - local g = { } - local total_names = #names - local total_values = #values - local start = 1 - for i, n in ipairs(names) do - if ntype(n) == "table" then - if i > start then - local stop = i - 1 - insert(g, { - "assign", - (function() - local _accum_0 = { } - local _len_0 = 1 - for i = start, stop do - _accum_0[_len_0] = names[i] - _len_0 = _len_0 + 1 - end - return _accum_0 - end)(), - (function() - local _accum_0 = { } - local _len_0 = 1 - for i = start, stop do - _accum_0[_len_0] = values[i] - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() - }) - end - insert(g, build_assign(scope, n, values[i])) - start = i + 1 - end - end - if total_names >= start or total_values >= start then - local name_slice - if total_names < start then - name_slice = { - "_" - } - else - do - local _accum_0 = { } - local _len_0 = 1 - for i = start, total_names do - _accum_0[_len_0] = names[i] - _len_0 = _len_0 + 1 - end - name_slice = _accum_0 - end - end - local value_slice - if total_values < start then - value_slice = { - "nil" - } - else - do - local _accum_0 = { } - local _len_0 = 1 - for i = start, total_values do - _accum_0[_len_0] = values[i] - _len_0 = _len_0 + 1 - end - value_slice = _accum_0 - end - end - insert(g, { - "assign", - name_slice, - value_slice - }) - end - return build.group(g) -end -return { - has_destructure = has_destructure, - split_assign = split_assign, - build_assign = build_assign, - extract_assign_names = extract_assign_names -} diff --git a/moonscript/transform/destructure.moon b/moonscript/transform/destructure.moon deleted file mode 100644 index b0413b2d..00000000 --- a/moonscript/transform/destructure.moon +++ /dev/null @@ -1,130 +0,0 @@ - -import ntype, mtype, build from require "moonscript.types" -import NameProxy from require "moonscript.transform.names" -import insert from table -import unpack from require "moonscript.util" - -import user_error from require "moonscript.errors" - -join = (...) -> - with out = {} - i = 1 - for tbl in *{...} - for v in *tbl - out[i] = v - i += 1 - -has_destructure = (names) -> - for n in *names - return true if ntype(n) == "table" - false - -extract_assign_names = (name, accum={}, prefix={}) -> - - i = 1 - for tuple in *name[2] - value, suffix = if #tuple == 1 - s = {"index", {"number", i}} - i += 1 - tuple[1], s - else - key = tuple[1] - - s = if ntype(key) == "key_literal" - key_name = key[2] - if ntype(key_name) == "colon" - key_name - else - {"dot", key_name} - else - {"index", key} - - tuple[2], s - - suffix = join prefix, {suffix} - - switch ntype value - when "value", "ref", "chain", "self" - insert accum, {value, suffix} - when "table" - extract_assign_names value, accum, suffix - else - user_error "Can't destructure value of type: #{ntype value}" - - accum - -build_assign = (scope, destruct_literal, receiver) -> - assert receiver, "attempting to build destructure assign with no receiver" - - extracted_names = extract_assign_names destruct_literal - - names = {} - values = {} - - inner = {"assign", names, values} - - obj = if scope\is_local(receiver) or #extracted_names == 1 - receiver - else - with obj = NameProxy "obj" - inner = build.do { - build.assign_one obj, receiver - {"assign", names, values} - } - - for tuple in *extracted_names - insert names, tuple[1] - chain = if obj - NameProxy.chain obj, unpack tuple[2] - else - "nil" - insert values, chain - - build.group { - {"declare", names} - inner - } - --- applies to destructuring to a assign node -split_assign = (scope, assign) -> - names, values = unpack assign, 2 - - g = {} - total_names = #names - total_values = #values - - -- We have to break apart the assign into groups of regular - -- assigns, and then the destructuring assignments - start = 1 - for i, n in ipairs names - if ntype(n) == "table" - if i > start - stop = i - 1 - insert g, { - "assign" - for i=start,stop - names[i] - for i=start,stop - values[i] - } - - insert g, build_assign scope, n, values[i] - - start = i + 1 - - if total_names >= start or total_values >= start - name_slice = if total_names < start - {"_"} - else - for i=start,total_names do names[i] - - value_slice = if total_values < start - {"nil"} - else - for i=start,total_values do values[i] - - insert g, {"assign", name_slice, value_slice} - - build.group g - -{ :has_destructure, :split_assign, :build_assign, :extract_assign_names } diff --git a/moonscript/transform/names.lua b/moonscript/transform/names.lua deleted file mode 100644 index f6af4c46..00000000 --- a/moonscript/transform/names.lua +++ /dev/null @@ -1,118 +0,0 @@ -local build -build = require("moonscript.types").build -local unpack -unpack = require("moonscript.util").unpack -local LocalName -do - local _class_0 - local _base_0 = { - get_name = function(self) - return self.name - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, name) - self.name = name - self[1] = "temp_name" - end, - __base = _base_0, - __name = "LocalName" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - LocalName = _class_0 -end -local NameProxy -do - local _class_0 - local _base_0 = { - get_name = function(self, scope, dont_put) - if dont_put == nil then - dont_put = true - end - if not self.name then - self.name = scope:free_name(self.prefix, dont_put) - end - return self.name - end, - chain = function(self, ...) - local items = { - base = self, - ... - } - for k, v in ipairs(items) do - if type(v) == "string" then - items[k] = { - "dot", - v - } - else - items[k] = v - end - end - return build.chain(items) - end, - index = function(self, key) - if type(key) == "string" then - key = { - "ref", - key - } - end - return build.chain({ - base = self, - { - "index", - key - } - }) - end, - __tostring = function(self) - if self.name then - return ("name<%s>"):format(self.name) - else - return ("name"):format(self.prefix) - end - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, prefix) - self.prefix = prefix - self[1] = "temp_name" - end, - __base = _base_0, - __name = "NameProxy" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - NameProxy = _class_0 -end -local is_name_proxy -is_name_proxy = function(v) - if not (type(v) == "table") then - return false - end - local _exp_0 = v.__class - if LocalName == _exp_0 or NameProxy == _exp_0 then - return true - end -end -return { - NameProxy = NameProxy, - LocalName = LocalName, - is_name_proxy = is_name_proxy -} diff --git a/moonscript/transform/names.moon b/moonscript/transform/names.moon deleted file mode 100644 index 4af6aa0d..00000000 --- a/moonscript/transform/names.moon +++ /dev/null @@ -1,51 +0,0 @@ - -import build from require "moonscript.types" -import unpack from require "moonscript.util" - --- always declares as local -class LocalName - new: (@name) => self[1] = "temp_name" - get_name: => @name - --- creates a unique name when used -class NameProxy - new: (@prefix) => - self[1] = "temp_name" - - get_name: (scope, dont_put=true) => - if not @name - @name = scope\free_name @prefix, dont_put - @name - - chain: (...) => - items = { base: @, ... } - for k,v in ipairs items - items[k] = if type(v) == "string" - {"dot", v} - else - v - - build.chain items - - index: (key) => - if type(key) == "string" - key = {"ref", key} - - build.chain { - base: self, {"index", key} - } - - __tostring: => - if @name - ("name<%s>")\format @name - else - ("name")\format @prefix - -is_name_proxy = (v) -> - return false unless type(v) == "table" - - switch v.__class - when LocalName, NameProxy - true - -{ :NameProxy, :LocalName, :is_name_proxy } diff --git a/moonscript/transform/statement.lua b/moonscript/transform/statement.lua deleted file mode 100644 index edeab697..00000000 --- a/moonscript/transform/statement.lua +++ /dev/null @@ -1,847 +0,0 @@ -local Transformer -Transformer = require("moonscript.transform.transformer").Transformer -local NameProxy, LocalName, is_name_proxy -do - local _obj_0 = require("moonscript.transform.names") - NameProxy, LocalName, is_name_proxy = _obj_0.NameProxy, _obj_0.LocalName, _obj_0.is_name_proxy -end -local Run, transform_last_stm, implicitly_return, last_stm -do - local _obj_0 = require("moonscript.transform.statements") - Run, transform_last_stm, implicitly_return, last_stm = _obj_0.Run, _obj_0.transform_last_stm, _obj_0.implicitly_return, _obj_0.last_stm -end -local types = require("moonscript.types") -local build, ntype, is_value, smart_node, value_is_singular, is_slice, NOOP -build, ntype, is_value, smart_node, value_is_singular, is_slice, NOOP = types.build, types.ntype, types.is_value, types.smart_node, types.value_is_singular, types.is_slice, types.NOOP -local insert -insert = table.insert -local destructure = require("moonscript.transform.destructure") -local construct_comprehension -construct_comprehension = require("moonscript.transform.comprehension").construct_comprehension -local unpack -unpack = require("moonscript.util").unpack -local with_continue_listener -with_continue_listener = function(body) - local continue_name = nil - return { - Run(function(self) - return self:listen("continue", function() - if not (continue_name) then - continue_name = NameProxy("continue") - self:put_name(continue_name) - end - return continue_name - end) - end), - build.group(body), - Run(function(self) - if not (continue_name) then - return - end - local last = last_stm(body) - local enclose_lines = types.terminating[last and ntype(last)] - self:put_name(continue_name, nil) - return self:splice(function(lines) - if enclose_lines then - lines = { - "do", - { - lines - } - } - end - return { - { - "assign", - { - continue_name - }, - { - "false" - } - }, - { - "repeat", - "true", - { - lines, - { - "assign", - { - continue_name - }, - { - "true" - } - } - } - }, - { - "if", - { - "not", - continue_name - }, - { - { - "break" - } - } - } - } - end) - end) - } -end -local extract_declarations -extract_declarations = function(self, body, start, out) - if body == nil then - body = self.current_stms - end - if start == nil then - start = self.current_stm_i + 1 - end - if out == nil then - out = { } - end - for i = start, #body do - local _continue_0 = false - repeat - local stm = body[i] - if stm == nil then - _continue_0 = true - break - end - stm = self.transform.statement(stm) - body[i] = stm - local _exp_0 = stm[1] - if "assign" == _exp_0 or "declare" == _exp_0 then - local _list_0 = stm[2] - for _index_0 = 1, #_list_0 do - local name = _list_0[_index_0] - if ntype(name) == "ref" then - insert(out, name) - elseif type(name) == "string" then - insert(out, name) - end - end - elseif "group" == _exp_0 then - extract_declarations(self, stm[2], 1, out) - end - _continue_0 = true - until true - if not _continue_0 then - break - end - end - return out -end -local expand_elseif_assign -expand_elseif_assign = function(ifstm) - for i = 4, #ifstm do - local case = ifstm[i] - if ntype(case) == "elseif" and ntype(case[2]) == "assign" then - local split = { - unpack(ifstm, 1, i - 1) - } - insert(split, { - "else", - { - { - "if", - case[2], - case[3], - unpack(ifstm, i + 1) - } - } - }) - return split - end - end - return ifstm -end -return Transformer({ - transform = function(self, tuple) - local _, node, fn - _, node, fn = tuple[1], tuple[2], tuple[3] - return fn(node) - end, - root_stms = function(self, body) - return transform_last_stm(body, implicitly_return(self)) - end, - ["return"] = function(self, node) - local ret_val = node[2] - local ret_val_type = ntype(ret_val) - if ret_val_type == "explist" and #ret_val == 2 then - ret_val = ret_val[2] - ret_val_type = ntype(ret_val) - end - if types.cascading[ret_val_type] then - return implicitly_return(self)(ret_val) - end - if ret_val_type == "chain" or ret_val_type == "comprehension" or ret_val_type == "tblcomprehension" then - local Value = require("moonscript.transform.value") - ret_val = Value:transform_once(self, ret_val) - if ntype(ret_val) == "block_exp" then - return build.group(transform_last_stm(ret_val[2], function(stm) - return { - "return", - stm - } - end)) - end - end - node[2] = ret_val - return node - end, - declare_glob = function(self, node) - local names = extract_declarations(self) - if node[2] == "^" then - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local _continue_0 = false - repeat - local name = names[_index_0] - local str_name - if ntype(name) == "ref" then - str_name = name[2] - else - str_name = name - end - if not (str_name:match("^%u")) then - _continue_0 = true - break - end - local _value_0 = name - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - names = _accum_0 - end - end - return { - "declare", - names - } - end, - assign = function(self, node) - local names, values = unpack(node, 2) - local num_values = #values - local num_names = #values - if num_names == 1 and num_values == 1 then - local first_value = values[1] - local first_name = names[1] - local first_type = ntype(first_value) - if first_type == "chain" then - local Value = require("moonscript.transform.value") - first_value = Value:transform_once(self, first_value) - first_type = ntype(first_value) - end - local _exp_0 = ntype(first_value) - if "block_exp" == _exp_0 then - local block_body = first_value[2] - local idx = #block_body - block_body[idx] = build.assign_one(first_name, block_body[idx]) - return build.group({ - { - "declare", - { - first_name - } - }, - { - "do", - block_body - } - }) - elseif "comprehension" == _exp_0 or "tblcomprehension" == _exp_0 or "foreach" == _exp_0 or "for" == _exp_0 or "while" == _exp_0 then - local Value = require("moonscript.transform.value") - return build.assign_one(first_name, Value:transform_once(self, first_value)) - else - values[1] = first_value - end - end - local transformed - if num_values == 1 then - local value = values[1] - local t = ntype(value) - if t == "decorated" then - value = self.transform.statement(value) - t = ntype(value) - end - if types.cascading[t] then - local ret - ret = function(stm) - if is_value(stm) then - return { - "assign", - names, - { - stm - } - } - else - return stm - end - end - transformed = build.group({ - { - "declare", - names - }, - self.transform.statement(value, ret, node) - }) - end - end - node = transformed or node - if destructure.has_destructure(names) then - return destructure.split_assign(self, node) - end - return node - end, - continue = function(self, node) - local continue_name = self:send("continue") - if not (continue_name) then - error("continue must be inside of a loop") - end - return build.group({ - build.assign_one(continue_name, "true"), - { - "break" - } - }) - end, - export = function(self, node) - if #node > 2 then - if node[2] == "class" then - local cls = smart_node(node[3]) - return build.group({ - { - "export", - { - cls.name - } - }, - cls - }) - else - return build.group({ - { - "export", - node[2] - }, - build.assign({ - names = node[2], - values = node[3] - }) - }) - end - else - return nil - end - end, - update = function(self, node) - local name, op, exp = unpack(node, 2) - local op_final = op:match("^(.+)=$") - if not op_final then - error("Unknown op: " .. op) - end - local lifted - if ntype(name) == "chain" then - lifted = { } - local new_chain - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 3, #name do - local part = name[_index_0] - if ntype(part) == "index" then - local proxy = NameProxy("update") - table.insert(lifted, { - proxy, - part[2] - }) - _accum_0[_len_0] = { - "index", - proxy - } - else - _accum_0[_len_0] = part - end - _len_0 = _len_0 + 1 - end - new_chain = _accum_0 - end - if next(lifted) then - name = { - name[1], - name[2], - unpack(new_chain) - } - end - end - if not (value_is_singular(exp)) then - exp = { - "parens", - exp - } - end - local out = build.assign_one(name, { - "exp", - name, - op_final, - exp - }) - if lifted and next(lifted) then - local names - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #lifted do - local l = lifted[_index_0] - _accum_0[_len_0] = l[1] - _len_0 = _len_0 + 1 - end - names = _accum_0 - end - local values - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #lifted do - local l = lifted[_index_0] - _accum_0[_len_0] = l[2] - _len_0 = _len_0 + 1 - end - values = _accum_0 - end - out = build.group({ - { - "assign", - names, - values - }, - out - }) - end - return out - end, - import = function(self, node) - local names, source = unpack(node, 2) - local table_values - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #names do - local name = names[_index_0] - local dest_name - if ntype(name) == "colon" then - dest_name = name[2] - else - dest_name = name - end - local _value_0 = { - { - "key_literal", - name - }, - dest_name - } - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - table_values = _accum_0 - end - local dest = { - "table", - table_values - } - return { - "assign", - { - dest - }, - { - source - }, - [-1] = node[-1] - } - end, - comprehension = function(self, node, action) - local exp, clauses = unpack(node, 2) - action = action or function(exp) - return { - exp - } - end - return construct_comprehension(action(exp), clauses) - end, - ["do"] = function(self, node, ret) - if ret then - node[2] = transform_last_stm(node[2], ret) - end - return node - end, - decorated = function(self, node) - local stm, dec = unpack(node, 2) - local wrapped - local _exp_0 = dec[1] - if "if" == _exp_0 then - local cond, fail = unpack(dec, 2) - if fail then - fail = { - "else", - { - fail - } - } - end - wrapped = { - "if", - cond, - { - stm - }, - fail - } - elseif "unless" == _exp_0 then - wrapped = { - "unless", - dec[2], - { - stm - } - } - elseif "comprehension" == _exp_0 then - wrapped = { - "comprehension", - stm, - dec[2] - } - else - wrapped = error("Unknown decorator " .. dec[1]) - end - if ntype(stm) == "assign" then - wrapped = build.group({ - build.declare({ - names = (function() - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = stm[2] - for _index_0 = 1, #_list_0 do - local name = _list_0[_index_0] - if ntype(name) == "ref" then - _accum_0[_len_0] = name - _len_0 = _len_0 + 1 - end - end - return _accum_0 - end)() - }), - wrapped - }) - end - return wrapped - end, - unless = function(self, node) - local clause = node[2] - if ntype(clause) == "assign" then - if destructure.has_destructure(clause[2]) then - error("destructure not allowed in unless assignment") - end - return build["do"]({ - clause, - { - "if", - { - "not", - clause[2][1] - }, - unpack(node, 3) - } - }) - else - return { - "if", - { - "not", - { - "parens", - clause - } - }, - unpack(node, 3) - } - end - end, - ["if"] = function(self, node, ret) - if ntype(node[2]) == "assign" then - local assign, body = unpack(node, 2) - if destructure.has_destructure(assign[2]) then - local name = NameProxy("des") - body = { - destructure.build_assign(self, assign[2][1], name), - build.group(node[3]) - } - return build["do"]({ - build.assign_one(name, assign[3][1]), - { - "if", - name, - body, - unpack(node, 4) - } - }) - else - local name = assign[2][1] - return build["do"]({ - assign, - { - "if", - name, - unpack(node, 3) - } - }) - end - end - node = expand_elseif_assign(node) - if ret then - smart_node(node) - node['then'] = transform_last_stm(node['then'], ret) - for i = 4, #node do - local case = node[i] - local body_idx = #node[i] - case[body_idx] = transform_last_stm(case[body_idx], ret) - end - end - return node - end, - with = function(self, node, ret) - local exp, block = unpack(node, 2) - local copy_scope = true - local scope_name, named_assign - do - local last = last_stm(block) - if last then - if types.terminating[ntype(last)] then - ret = false - end - end - end - if ntype(exp) == "assign" then - local names, values = unpack(exp, 2) - local first_name = names[1] - if ntype(first_name) == "ref" then - scope_name = first_name - named_assign = exp - exp = values[1] - copy_scope = false - else - scope_name = NameProxy("with") - exp = values[1] - values[1] = scope_name - named_assign = { - "assign", - names, - values - } - end - elseif self:is_local(exp) then - scope_name = exp - copy_scope = false - end - scope_name = scope_name or NameProxy("with") - local out = build["do"]({ - copy_scope and build.assign_one(scope_name, exp) or NOOP, - named_assign or NOOP, - Run(function(self) - return self:set("scope_var", scope_name) - end), - unpack(block) - }) - if ret then - table.insert(out[2], ret(scope_name)) - end - return out - end, - foreach = function(self, node, _) - smart_node(node) - local source = unpack(node.iter) - local destructures = { } - do - local _accum_0 = { } - local _len_0 = 1 - for i, name in ipairs(node.names) do - if ntype(name) == "table" then - do - local proxy = NameProxy("des") - insert(destructures, destructure.build_assign(self, name, proxy)) - _accum_0[_len_0] = proxy - end - else - _accum_0[_len_0] = name - end - _len_0 = _len_0 + 1 - end - node.names = _accum_0 - end - if next(destructures) then - insert(destructures, build.group(node.body)) - node.body = destructures - end - if ntype(source) == "unpack" then - local list = source[2] - local index_name = NameProxy("index") - local list_name = self:is_local(list) and list or NameProxy("list") - local slice_var = nil - local bounds - if is_slice(list) then - local slice = list[#list] - table.remove(list) - table.remove(slice, 1) - if self:is_local(list) then - list_name = list - end - if slice[2] and slice[2] ~= "" then - local max_tmp_name = NameProxy("max") - slice_var = build.assign_one(max_tmp_name, slice[2]) - slice[2] = { - "exp", - max_tmp_name, - "<", - 0, - "and", - { - "length", - list_name - }, - "+", - max_tmp_name, - "or", - max_tmp_name - } - else - slice[2] = { - "length", - list_name - } - end - bounds = slice - else - bounds = { - 1, - { - "length", - list_name - } - } - end - local names - do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = node.names - for _index_0 = 1, #_list_0 do - local n = _list_0[_index_0] - _accum_0[_len_0] = is_name_proxy(n) and n or LocalName(n) or n - _len_0 = _len_0 + 1 - end - names = _accum_0 - end - return build.group({ - list_name ~= list and build.assign_one(list_name, list) or NOOP, - slice_var or NOOP, - build["for"]({ - name = index_name, - bounds = bounds, - body = { - { - "assign", - names, - { - NameProxy.index(list_name, index_name) - } - }, - build.group(node.body) - } - }) - }) - end - node.body = with_continue_listener(node.body) - end, - ["while"] = function(self, node) - smart_node(node) - node.body = with_continue_listener(node.body) - end, - ["for"] = function(self, node) - smart_node(node) - node.body = with_continue_listener(node.body) - end, - switch = function(self, node, ret) - local exp, conds = unpack(node, 2) - local exp_name = NameProxy("exp") - local convert_cond - convert_cond = function(cond) - local t, case_exps, body = unpack(cond) - local out = { } - insert(out, t == "case" and "elseif" or "else") - if t ~= "else" then - local cond_exp = { } - for i, case in ipairs(case_exps) do - if i == 1 then - insert(cond_exp, "exp") - else - insert(cond_exp, "or") - end - if not (value_is_singular(case)) then - case = { - "parens", - case - } - end - insert(cond_exp, { - "exp", - case, - "==", - exp_name - }) - end - insert(out, cond_exp) - else - body = case_exps - end - if ret then - body = transform_last_stm(body, ret) - end - insert(out, body) - return out - end - local first = true - local if_stm = { - "if" - } - for _index_0 = 1, #conds do - local cond = conds[_index_0] - local if_cond = convert_cond(cond) - if first then - first = false - insert(if_stm, if_cond[2]) - insert(if_stm, if_cond[3]) - else - insert(if_stm, if_cond) - end - end - return build.group({ - build.assign_one(exp_name, exp), - if_stm - }) - end, - class = require("moonscript.transform.class") -}) diff --git a/moonscript/transform/statement.moon b/moonscript/transform/statement.moon deleted file mode 100644 index 2e4b8e83..00000000 --- a/moonscript/transform/statement.moon +++ /dev/null @@ -1,522 +0,0 @@ -import Transformer from require "moonscript.transform.transformer" - -import NameProxy, LocalName, is_name_proxy from require "moonscript.transform.names" - -import Run, transform_last_stm, implicitly_return, last_stm - from require "moonscript.transform.statements" - -types = require "moonscript.types" - -import build, ntype, is_value, smart_node, value_is_singular, is_slice, NOOP - from types - -import insert from table - -destructure = require "moonscript.transform.destructure" -import construct_comprehension from require "moonscript.transform.comprehension" - -import unpack from require "moonscript.util" - -with_continue_listener = (body) -> - continue_name = nil - - { - Run => - @listen "continue", -> - unless continue_name - continue_name = NameProxy"continue" - @put_name continue_name - continue_name - - build.group body - - Run => - return unless continue_name - last = last_stm body - enclose_lines = types.terminating[last and ntype(last)] - - @put_name continue_name, nil - @splice (lines) -> - lines = {"do", {lines}} if enclose_lines - - { - {"assign", {continue_name}, {"false"}} - {"repeat", "true", { - lines - {"assign", {continue_name}, {"true"}} - }} - {"if", {"not", continue_name}, { - {"break"} - }} - } - } - - --- this mutates body searching for assigns -extract_declarations = (body=@current_stms, start=@current_stm_i + 1, out={}) => - for i=start,#body - stm = body[i] - continue if stm == nil - stm = @transform.statement stm - body[i] = stm - switch stm[1] - when "assign", "declare" - for name in *stm[2] - if ntype(name) == "ref" - insert out, name - elseif type(name) == "string" - -- TODO: don't use string literal as ref - insert out, name - when "group" - extract_declarations @, stm[2], 1, out - out - -expand_elseif_assign = (ifstm) -> - for i = 4, #ifstm - case = ifstm[i] - if ntype(case) == "elseif" and ntype(case[2]) == "assign" - split = { unpack ifstm, 1, i - 1 } - insert split, { - "else", { - {"if", case[2], case[3], unpack ifstm, i + 1} - } - } - return split - - ifstm - - -Transformer { - transform: (tuple) => - {_, node, fn} = tuple - fn node - - root_stms: (body) => - transform_last_stm body, implicitly_return @ - - return: (node) => - ret_val = node[2] - ret_val_type = ntype ret_val - - if ret_val_type == "explist" and #ret_val == 2 - ret_val = ret_val[2] - ret_val_type = ntype ret_val - - if types.cascading[ret_val_type] - return implicitly_return(@) ret_val - - -- flatten things that create block exp - if ret_val_type == "chain" or ret_val_type == "comprehension" or ret_val_type == "tblcomprehension" - -- TODO: clean this up - Value = require "moonscript.transform.value" - ret_val = Value\transform_once @, ret_val - if ntype(ret_val) == "block_exp" - return build.group transform_last_stm ret_val[2], (stm)-> - {"return", stm} - - node[2] = ret_val - node - - declare_glob: (node) => - names = extract_declarations @ - - if node[2] == "^" - names = for name in *names - str_name = if ntype(name) == "ref" - name[2] - else - name - - continue unless str_name\match "^%u" - name - - {"declare", names} - - assign: (node) => - names, values = unpack node, 2 - - num_values = #values - num_names = #values - - -- special code simplifications for single assigns - if num_names == 1 and num_values == 1 - first_value = values[1] - first_name = names[1] - first_type = ntype first_value - - -- reduce colon stub chain to block exp - if first_type == "chain" - -- TODO: clean this up - Value = require "moonscript.transform.value" - first_value = Value\transform_once @, first_value - first_type = ntype first_value - - switch ntype first_value - when "block_exp" - block_body = first_value[2] - idx = #block_body - block_body[idx] = build.assign_one first_name, block_body[idx] - - return build.group { - {"declare", {first_name}} - {"do", block_body} - } - - when "comprehension", "tblcomprehension", "foreach", "for", "while" - -- TODO: clean this up - Value = require "moonscript.transform.value" - return build.assign_one first_name, Value\transform_once @, first_value - else - values[1] = first_value - - -- bubble cascading assigns - transformed = if num_values == 1 - value = values[1] - t = ntype value - - if t == "decorated" - value = @transform.statement value - t = ntype value - - if types.cascading[t] - ret = (stm) -> - if is_value stm - {"assign", names, {stm}} - else - stm - - build.group { - {"declare", names} - @transform.statement value, ret, node - } - - node = transformed or node - - if destructure.has_destructure names - return destructure.split_assign @, node - - node - - continue: (node) => - continue_name = @send "continue" - error "continue must be inside of a loop" unless continue_name - build.group { - build.assign_one continue_name, "true" - {"break"} - } - - export: (node) => - -- assign values if they are included - if #node > 2 - if node[2] == "class" - cls = smart_node node[3] - build.group { - {"export", {cls.name}} - cls - } - else - -- pull out vawlues and assign them after the export - build.group { - { "export", node[2] } - build.assign { - names: node[2] - values: node[3] - } - } - else - nil - - update: (node) => - name, op, exp = unpack node, 2 - op_final = op\match "^(.+)=$" - - error "Unknown op: "..op if not op_final - - local lifted - - if ntype(name) == "chain" - lifted = {} - new_chain = for part in *name[3,] - if ntype(part) == "index" - proxy = NameProxy "update" - table.insert lifted, { proxy, part[2] } - { "index", proxy } - else - part - - if next lifted - name = {name[1], name[2], unpack new_chain} - - exp = {"parens", exp} unless value_is_singular exp - out = build.assign_one name, {"exp", name, op_final, exp} - - if lifted and next lifted - names = [l[1] for l in *lifted] - values = [l[2] for l in *lifted] - - out = build.group { - {"assign", names, values} - out - } - - out - - import: (node) => - names, source = unpack node, 2 - table_values = for name in *names - dest_name = if ntype(name) == "colon" - name[2] - else - name - - {{"key_literal", name}, dest_name} - - dest = { "table", table_values } - { "assign", {dest}, {source}, [-1]: node[-1] } - - comprehension: (node, action) => - exp, clauses = unpack node, 2 - - action = action or (exp) -> {exp} - construct_comprehension action(exp), clauses - - do: (node, ret) => - node[2] = transform_last_stm node[2], ret if ret - node - - decorated: (node) => - stm, dec = unpack node, 2 - - wrapped = switch dec[1] - when "if" - cond, fail = unpack dec, 2 - fail = { "else", { fail } } if fail - { "if", cond, { stm }, fail } - when "unless" - { "unless", dec[2], { stm } } - when "comprehension" - { "comprehension", stm, dec[2] } - else - error "Unknown decorator " .. dec[1] - - if ntype(stm) == "assign" - wrapped = build.group { - build.declare names: [name for name in *stm[2] when ntype(name) == "ref"] - wrapped - } - - wrapped - - unless: (node) => - clause = node[2] - - if ntype(clause) == "assign" - if destructure.has_destructure clause[2] - error "destructure not allowed in unless assignment" - - build.do { - clause - { "if", {"not", clause[2][1]}, unpack node, 3 } - } - - else - { "if", {"not", {"parens", clause}}, unpack node, 3 } - - if: (node, ret) => - -- expand assign in cond - if ntype(node[2]) == "assign" - assign, body = unpack node, 2 - if destructure.has_destructure assign[2] - name = NameProxy "des" - - body = { - destructure.build_assign @, assign[2][1], name - build.group node[3] - } - - return build.do { - build.assign_one name, assign[3][1] - {"if", name, body, unpack node, 4} - } - else - name = assign[2][1] - return build.do { - assign - {"if", name, unpack node, 3} - } - - node = expand_elseif_assign node - - -- apply cascading return decorator - if ret - smart_node node - -- mutate all the bodies - node['then'] = transform_last_stm node['then'], ret - for i = 4, #node - case = node[i] - body_idx = #node[i] - case[body_idx] = transform_last_stm case[body_idx], ret - - node - - with: (node, ret) => - exp, block = unpack node, 2 - - copy_scope = true - local scope_name, named_assign - - if last = last_stm block - ret = false if types.terminating[ntype(last)] - - if ntype(exp) == "assign" - names, values = unpack exp, 2 - first_name = names[1] - - if ntype(first_name) == "ref" - scope_name = first_name - named_assign = exp - exp = values[1] - copy_scope = false - else - scope_name = NameProxy "with" - exp = values[1] - values[1] = scope_name - named_assign = {"assign", names, values} - - elseif @is_local exp - scope_name = exp - copy_scope = false - - scope_name or= NameProxy "with" - - out = build.do { - copy_scope and build.assign_one(scope_name, exp) or NOOP - named_assign or NOOP - Run => @set "scope_var", scope_name - unpack block - } - - if ret - table.insert out[2], ret scope_name - - out - - foreach: (node, _) => - smart_node node - source = unpack node.iter - - destructures = {} - node.names = for i, name in ipairs node.names - if ntype(name) == "table" - with proxy = NameProxy "des" - insert destructures, destructure.build_assign @, name, proxy - else - name - - if next destructures - insert destructures, build.group node.body - node.body = destructures - - if ntype(source) == "unpack" - list = source[2] - - index_name = NameProxy "index" - - list_name = @is_local(list) and list or NameProxy "list" - - slice_var = nil - bounds = if is_slice list - slice = list[#list] - table.remove list - table.remove slice, 1 - - list_name = list if @is_local list - - slice[2] = if slice[2] and slice[2] != "" - max_tmp_name = NameProxy "max" - slice_var = build.assign_one max_tmp_name, slice[2] - {"exp", max_tmp_name, "<", 0 - "and", {"length", list_name}, "+", max_tmp_name - "or", max_tmp_name } - else - {"length", list_name} - - slice - else - {1, {"length", list_name}} - - names = [is_name_proxy(n) and n or LocalName(n) or n for n in *node.names] - - return build.group { - list_name != list and build.assign_one(list_name, list) or NOOP - slice_var or NOOP - build["for"] { - name: index_name - bounds: bounds - body: { - {"assign", names, { NameProxy.index list_name, index_name }} - build.group node.body - } - } - } - - node.body = with_continue_listener node.body - - while: (node) => - smart_node node - node.body = with_continue_listener node.body - - for: (node) => - smart_node node - node.body = with_continue_listener node.body - - switch: (node, ret) => - exp, conds = unpack node, 2 - exp_name = NameProxy "exp" - - -- convert switch conds into if statment conds - convert_cond = (cond) -> - t, case_exps, body = unpack cond - out = {} - insert out, t == "case" and "elseif" or "else" - if t != "else" - cond_exp = {} - for i, case in ipairs case_exps - if i == 1 - insert cond_exp, "exp" - else - insert cond_exp, "or" - - case = {"parens", case} unless value_is_singular case - insert cond_exp, {"exp", case, "==", exp_name} - - insert out, cond_exp - else - body = case_exps - - if ret - body = transform_last_stm body, ret - - insert out, body - - out - - first = true - if_stm = {"if"} - for cond in *conds - if_cond = convert_cond cond - if first - first = false - insert if_stm, if_cond[2] - insert if_stm, if_cond[3] - else - insert if_stm, if_cond - - build.group { - build.assign_one exp_name, exp - if_stm - } - - class: require "moonscript.transform.class" - -} diff --git a/moonscript/transform/statements.lua b/moonscript/transform/statements.lua deleted file mode 100644 index 6a49b77e..00000000 --- a/moonscript/transform/statements.lua +++ /dev/null @@ -1,115 +0,0 @@ -local types = require("moonscript.types") -local ntype, mtype, is_value, NOOP -ntype, mtype, is_value, NOOP = types.ntype, types.mtype, types.is_value, types.NOOP -local comprehension_has_value -comprehension_has_value = require("moonscript.transform.comprehension").comprehension_has_value -local Run -do - local _class_0 - local _base_0 = { - call = function(self, state) - return self.fn(state) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, fn) - self.fn = fn - self[1] = "run" - end, - __base = _base_0, - __name = "Run" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Run = _class_0 -end -local last_stm -last_stm = function(stms) - local last_exp_id = 0 - for i = #stms, 1, -1 do - local stm = stms[i] - if stm and mtype(stm) ~= Run then - if ntype(stm) == "group" then - return last_stm(stm[2]) - end - last_exp_id = i - break - end - end - return stms[last_exp_id], last_exp_id, stms -end -local transform_last_stm -transform_last_stm = function(stms, fn) - local _, last_idx, _stms = last_stm(stms) - if _stms ~= stms then - error("cannot transform last node in group") - end - return (function() - local _accum_0 = { } - local _len_0 = 1 - for i, stm in ipairs(stms) do - if i == last_idx then - _accum_0[_len_0] = { - "transform", - stm, - fn - } - else - _accum_0[_len_0] = stm - end - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() -end -local chain_is_stub -chain_is_stub = function(chain) - local stub = chain[#chain] - return stub and ntype(stub) == "colon" -end -local implicitly_return -implicitly_return = function(scope) - local is_top = true - local fn - fn = function(stm) - local t = ntype(stm) - if t == "decorated" then - stm = scope.transform.statement(stm) - t = ntype(stm) - end - if types.cascading[t] then - is_top = false - return scope.transform.statement(stm, fn) - elseif types.manual_return[t] or not is_value(stm) then - if is_top and t == "return" and stm[2] == "" then - return NOOP - else - return stm - end - else - if t == "comprehension" and not comprehension_has_value(stm) then - return stm - else - return { - "return", - stm - } - end - end - end - return fn -end -return { - Run = Run, - last_stm = last_stm, - transform_last_stm = transform_last_stm, - chain_is_stub = chain_is_stub, - implicitly_return = implicitly_return -} diff --git a/moonscript/transform/statements.moon b/moonscript/transform/statements.moon deleted file mode 100644 index 164e6b58..00000000 --- a/moonscript/transform/statements.moon +++ /dev/null @@ -1,78 +0,0 @@ - -types = require "moonscript.types" -import ntype, mtype, is_value, NOOP from types - -import comprehension_has_value from require "moonscript.transform.comprehension" - --- A Run is a special statement node that lets a function run and mutate the --- state of the compiler -class Run - new: (@fn) => - @[1] = "run" - - call: (state) => - @.fn state - --- extract the last statment from an array of statements --- is group aware --- returns: the last statement, the index, the table it was fetched from -last_stm = (stms) -> - last_exp_id = 0 - for i = #stms, 1, -1 - stm = stms[i] - if stm and mtype(stm) != Run - if ntype(stm) == "group" - return last_stm stm[2] - - last_exp_id = i - break - - stms[last_exp_id], last_exp_id, stms - --- transform the last stm is a list of stms --- will puke on group -transform_last_stm = (stms, fn) -> - _, last_idx, _stms = last_stm stms - - if _stms != stms - error "cannot transform last node in group" - - return for i, stm in ipairs stms - if i == last_idx - {"transform", stm, fn} - else - stm - -chain_is_stub = (chain) -> - stub = chain[#chain] - stub and ntype(stub) == "colon" - -implicitly_return = (scope) -> - is_top = true - fn = (stm) -> - t = ntype stm - - -- expand decorated - if t == "decorated" - stm = scope.transform.statement stm - t = ntype stm - - if types.cascading[t] - is_top = false - scope.transform.statement stm, fn - elseif types.manual_return[t] or not is_value stm - -- remove blank return statement - if is_top and t == "return" and stm[2] == "" - NOOP - else - stm - else - if t == "comprehension" and not comprehension_has_value stm - stm - else - {"return", stm} - - fn - -{:Run, :last_stm, :transform_last_stm, :chain_is_stub, :implicitly_return } - diff --git a/moonscript/transform/transformer.lua b/moonscript/transform/transformer.lua deleted file mode 100644 index 4ea16959..00000000 --- a/moonscript/transform/transformer.lua +++ /dev/null @@ -1,74 +0,0 @@ -local ntype -ntype = require("moonscript.types").ntype -local Transformer -do - local _class_0 - local _base_0 = { - transform_once = function(self, scope, node, ...) - if self.seen_nodes[node] then - return node - end - self.seen_nodes[node] = true - local transformer = self.transformers[ntype(node)] - if transformer then - return transformer(scope, node, ...) or node - else - return node - end - end, - transform = function(self, scope, node, ...) - if self.seen_nodes[node] then - return node - end - self.seen_nodes[node] = true - while true do - local transformer = self.transformers[ntype(node)] - local res - if transformer then - res = transformer(scope, node, ...) or node - else - res = node - end - if res == node then - return node - end - node = res - end - return node - end, - bind = function(self, scope) - return function(...) - return self:transform(scope, ...) - end - end, - __call = function(self, ...) - return self:transform(...) - end, - can_transform = function(self, node) - return self.transformers[ntype(node)] ~= nil - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, transformers) - self.transformers = transformers - self.seen_nodes = setmetatable({ }, { - __mode = "k" - }) - end, - __base = _base_0, - __name = "Transformer" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Transformer = _class_0 -end -return { - Transformer = Transformer -} diff --git a/moonscript/transform/transformer.moon b/moonscript/transform/transformer.moon deleted file mode 100644 index 8a40c3c7..00000000 --- a/moonscript/transform/transformer.moon +++ /dev/null @@ -1,42 +0,0 @@ -import ntype from require "moonscript.types" - -class Transformer - new: (@transformers) => - @seen_nodes = setmetatable {}, __mode: "k" - - transform_once: (scope, node, ...) => - return node if @seen_nodes[node] - @seen_nodes[node] = true - - transformer = @transformers[ntype node] - if transformer - transformer(scope, node, ...) or node - else - node - - transform: (scope, node, ...) => - return node if @seen_nodes[node] - - @seen_nodes[node] = true - while true - transformer = @transformers[ntype node] - res = if transformer - transformer(scope, node, ...) or node - else - node - - return node if res == node - node = res - - node - - bind: (scope) => - (...) -> @transform scope, ... - - __call: (...) => @transform ... - - can_transform: (node) => - @transformers[ntype node] != nil - - -{ :Transformer } diff --git a/moonscript/transform/value.lua b/moonscript/transform/value.lua deleted file mode 100644 index 33aaef99..00000000 --- a/moonscript/transform/value.lua +++ /dev/null @@ -1,265 +0,0 @@ -local Transformer -Transformer = require("moonscript.transform.transformer").Transformer -local build, ntype, smart_node -do - local _obj_0 = require("moonscript.types") - build, ntype, smart_node = _obj_0.build, _obj_0.ntype, _obj_0.smart_node -end -local NameProxy -NameProxy = require("moonscript.transform.names").NameProxy -local Accumulator, default_accumulator -do - local _obj_0 = require("moonscript.transform.accumulator") - Accumulator, default_accumulator = _obj_0.Accumulator, _obj_0.default_accumulator -end -local lua_keywords -lua_keywords = require("moonscript.data").lua_keywords -local Run, transform_last_stm, implicitly_return, chain_is_stub -do - local _obj_0 = require("moonscript.transform.statements") - Run, transform_last_stm, implicitly_return, chain_is_stub = _obj_0.Run, _obj_0.transform_last_stm, _obj_0.implicitly_return, _obj_0.chain_is_stub -end -local construct_comprehension -construct_comprehension = require("moonscript.transform.comprehension").construct_comprehension -local insert -insert = table.insert -local unpack -unpack = require("moonscript.util").unpack -return Transformer({ - ["for"] = default_accumulator, - ["while"] = default_accumulator, - foreach = default_accumulator, - ["do"] = function(self, node) - return build.block_exp(node[2]) - end, - decorated = function(self, node) - return self.transform.statement(node) - end, - class = function(self, node) - return build.block_exp({ - node - }) - end, - string = function(self, node) - local delim = node[2] - local convert_part - convert_part = function(part) - if type(part) == "string" or part == nil then - return { - "string", - delim, - part or "" - } - else - return build.chain({ - base = "tostring", - { - "call", - { - part[2] - } - } - }) - end - end - if #node <= 3 then - if type(node[3]) == "string" then - return node - else - return convert_part(node[3]) - end - end - local e = { - "exp", - convert_part(node[3]) - } - for i = 4, #node do - insert(e, "..") - insert(e, convert_part(node[i])) - end - return e - end, - comprehension = function(self, node) - local a = Accumulator() - node = self.transform.statement(node, function(exp) - return a:mutate_body({ - exp - }) - end) - return a:wrap(node) - end, - tblcomprehension = function(self, node) - local explist, clauses = unpack(node, 2) - local key_exp, value_exp = unpack(explist) - local accum = NameProxy("tbl") - local inner - if value_exp then - local dest = build.chain({ - base = accum, - { - "index", - key_exp - } - }) - inner = { - build.assign_one(dest, value_exp) - } - else - local key_name, val_name = NameProxy("key"), NameProxy("val") - local dest = build.chain({ - base = accum, - { - "index", - key_name - } - }) - inner = { - build.assign({ - names = { - key_name, - val_name - }, - values = { - key_exp - } - }), - build.assign_one(dest, val_name) - } - end - return build.block_exp({ - build.assign_one(accum, build.table()), - construct_comprehension(inner, clauses), - accum - }) - end, - fndef = function(self, node) - smart_node(node) - node.body = transform_last_stm(node.body, implicitly_return(self)) - node.body = { - Run(function(self) - return self:listen("varargs", function() end) - end), - unpack(node.body) - } - return node - end, - ["if"] = function(self, node) - return build.block_exp({ - node - }) - end, - unless = function(self, node) - return build.block_exp({ - node - }) - end, - with = function(self, node) - return build.block_exp({ - node - }) - end, - switch = function(self, node) - return build.block_exp({ - node - }) - end, - chain = function(self, node) - for i = 2, #node do - local part = node[i] - if ntype(part) == "dot" and lua_keywords[part[2]] then - node[i] = { - "index", - { - "string", - '"', - part[2] - } - } - end - end - if ntype(node[2]) == "string" then - node[2] = { - "parens", - node[2] - } - end - if chain_is_stub(node) then - local base_name = NameProxy("base") - local fn_name = NameProxy("fn") - local colon = table.remove(node) - local is_super = ntype(node[2]) == "ref" and node[2][2] == "super" - return build.block_exp({ - build.assign({ - names = { - base_name - }, - values = { - node - } - }), - build.assign({ - names = { - fn_name - }, - values = { - build.chain({ - base = base_name, - { - "dot", - colon[2] - } - }) - } - }), - build.fndef({ - args = { - { - "..." - } - }, - body = { - build.chain({ - base = fn_name, - { - "call", - { - is_super and "self" or base_name, - "..." - } - } - }) - } - }) - }) - end - end, - block_exp = function(self, node) - local body = unpack(node, 2) - local fn = nil - local arg_list = { } - fn = smart_node(build.fndef({ - body = { - Run(function(self) - return self:listen("varargs", function() - insert(arg_list, "...") - insert(fn.args, { - "..." - }) - return self:unlisten("varargs") - end) - end), - unpack(body) - } - })) - return build.chain({ - base = { - "parens", - fn - }, - { - "call", - arg_list - } - }) - end -}) diff --git a/moonscript/transform/value.moon b/moonscript/transform/value.moon deleted file mode 100644 index 04e16ae2..00000000 --- a/moonscript/transform/value.moon +++ /dev/null @@ -1,164 +0,0 @@ -import Transformer from require "moonscript.transform.transformer" -import build, ntype, smart_node from require "moonscript.types" - -import NameProxy from require "moonscript.transform.names" -import Accumulator, default_accumulator from require "moonscript.transform.accumulator" -import lua_keywords from require "moonscript.data" - -import Run, transform_last_stm, implicitly_return, chain_is_stub from require "moonscript.transform.statements" - -import construct_comprehension from require "moonscript.transform.comprehension" - -import insert from table -import unpack from require "moonscript.util" - -Transformer { - for: default_accumulator - while: default_accumulator - foreach: default_accumulator - - do: (node) => - build.block_exp node[2] - - decorated: (node) => - @transform.statement node - - class: (node) => - build.block_exp { node } - - string: (node) => - delim = node[2] - - convert_part = (part) -> - if type(part) == "string" or part == nil - {"string", delim, part or ""} - else - build.chain { base: "tostring", {"call", {part[2]}} } - - -- reduced to single item - if #node <= 3 - return if type(node[3]) == "string" - node - else - convert_part node[3] - - e = {"exp", convert_part node[3]} - - for i=4, #node - insert e, ".." - insert e, convert_part node[i] - e - - comprehension: (node) => - a = Accumulator! - node = @transform.statement node, (exp) -> - a\mutate_body {exp} - a\wrap node - - tblcomprehension: (node) => - explist, clauses = unpack node, 2 - key_exp, value_exp = unpack explist - - accum = NameProxy "tbl" - - inner = if value_exp - dest = build.chain { base: accum, {"index", key_exp} } - { build.assign_one dest, value_exp } - else - -- If we only have single expression then - -- unpack the result into key and value - key_name, val_name = NameProxy"key", NameProxy"val" - dest = build.chain { base: accum, {"index", key_name} } - { - build.assign names: {key_name, val_name}, values: {key_exp} - build.assign_one dest, val_name - } - - build.block_exp { - build.assign_one accum, build.table! - construct_comprehension inner, clauses - accum - } - - fndef: (node) => - smart_node node - node.body = transform_last_stm node.body, implicitly_return self - node.body = { - Run => @listen "varargs", -> -- capture event - unpack node.body - } - - node - - if: (node) => - build.block_exp { node } - - unless: (node) => - build.block_exp { node } - - with: (node) => - build.block_exp { node } - - switch: (node) => - build.block_exp { node } - - -- pull out colon chain - chain: (node) => - -- escape lua keywords used in dot accessors - for i=2,#node - part = node[i] - if ntype(part) == "dot" and lua_keywords[part[2]] - node[i] = { "index", {"string", '"', part[2]} } - - if ntype(node[2]) == "string" - -- add parens if callee is raw string - node[2] = {"parens", node[2] } - - if chain_is_stub node - base_name = NameProxy "base" - fn_name = NameProxy "fn" - colon = table.remove node - - is_super = ntype(node[2]) == "ref" and node[2][2] == "super" - build.block_exp { - build.assign { - names: {base_name} - values: {node} - } - - build.assign { - names: {fn_name} - values: { - build.chain { base: base_name, {"dot", colon[2]} } - } - } - - build.fndef { - args: {{"..."}} - body: { - build.chain { - base: fn_name, {"call", {is_super and "self" or base_name, "..."}} - } - } - } - } - - block_exp: (node) => - body = unpack node, 2 - - fn = nil - arg_list = {} - - fn = smart_node build.fndef body: { - Run => - @listen "varargs", -> - insert arg_list, "..." - insert fn.args, {"..."} - @unlisten "varargs" - - unpack body - } - - build.chain { base: {"parens", fn}, {"call", arg_list} } -} - diff --git a/moonscript/types.lua b/moonscript/types.lua deleted file mode 100644 index e8efc409..00000000 --- a/moonscript/types.lua +++ /dev/null @@ -1,323 +0,0 @@ -local util = require("moonscript.util") -local Set -Set = require("moonscript.data").Set -local insert -insert = table.insert -local unpack -unpack = util.unpack -local manual_return = Set({ - "foreach", - "for", - "while", - "return" -}) -local cascading = Set({ - "if", - "unless", - "with", - "switch", - "class", - "do" -}) -local terminating = Set({ - "return", - "break" -}) -local ntype -ntype = function(node) - local _exp_0 = type(node) - if "nil" == _exp_0 then - return "nil" - elseif "table" == _exp_0 then - return node[1] - else - return "value" - end -end -local mtype -do - local moon_type = util.moon.type - mtype = function(val) - local mt = getmetatable(val) - if mt and mt.smart_node then - return "table" - end - return moon_type(val) - end -end -local value_can_be_statement -value_can_be_statement = function(node) - if not (ntype(node) == "chain") then - return false - end - return ntype(node[#node]) == "call" -end -local is_value -is_value = function(stm) - local compile = require("moonscript.compile") - local transform = require("moonscript.transform") - return compile.Block:is_value(stm) or transform.Value:can_transform(stm) -end -local value_is_singular -value_is_singular = function(node) - return type(node) ~= "table" or node[1] ~= "exp" or #node == 2 -end -local is_slice -is_slice = function(node) - return ntype(node) == "chain" and ntype(node[#node]) == "slice" -end -local t = { } -local node_types = { - class = { - { - "name", - "Tmp" - }, - { - "body", - t - } - }, - fndef = { - { - "args", - t - }, - { - "whitelist", - t - }, - { - "arrow", - "slim" - }, - { - "body", - t - } - }, - foreach = { - { - "names", - t - }, - { - "iter" - }, - { - "body", - t - } - }, - ["for"] = { - { - "name" - }, - { - "bounds", - t - }, - { - "body", - t - } - }, - ["while"] = { - { - "cond", - t - }, - { - "body", - t - } - }, - assign = { - { - "names", - t - }, - { - "values", - t - } - }, - declare = { - { - "names", - t - } - }, - ["if"] = { - { - "cond", - t - }, - { - "then", - t - } - } -} -local build_table -build_table = function() - local key_table = { } - for node_name, args in pairs(node_types) do - local index = { } - for i, tuple in ipairs(args) do - local prop_name = tuple[1] - index[prop_name] = i + 1 - end - key_table[node_name] = index - end - return key_table -end -local key_table = build_table() -local make_builder -make_builder = function(name) - local spec = node_types[name] - if not spec then - error("don't know how to build node: " .. name) - end - return function(props) - if props == nil then - props = { } - end - local node = { - name - } - for i, arg in ipairs(spec) do - local key, default_value = unpack(arg) - local val - if props[key] then - val = props[key] - else - val = default_value - end - if val == t then - val = { } - end - node[i + 1] = val - end - return node - end -end -local build = nil -build = setmetatable({ - group = function(body) - if body == nil then - body = { } - end - return { - "group", - body - } - end, - ["do"] = function(body) - return { - "do", - body - } - end, - assign_one = function(name, value) - return build.assign({ - names = { - name - }, - values = { - value - } - }) - end, - table = function(tbl) - if tbl == nil then - tbl = { } - end - for _index_0 = 1, #tbl do - local tuple = tbl[_index_0] - if type(tuple[1]) == "string" then - tuple[1] = { - "key_literal", - tuple[1] - } - end - end - return { - "table", - tbl - } - end, - block_exp = function(body) - return { - "block_exp", - body - } - end, - chain = function(parts) - local base = parts.base or error("expecting base property for chain") - if type(base) == "string" then - base = { - "ref", - base - } - end - local node = { - "chain", - base - } - for _index_0 = 1, #parts do - local part = parts[_index_0] - insert(node, part) - end - return node - end -}, { - __index = function(self, name) - self[name] = make_builder(name) - return rawget(self, name) - end -}) -local smart_node_mt = setmetatable({ }, { - __index = function(self, node_type) - local index = key_table[node_type] - local mt = { - smart_node = true, - __index = function(node, key) - if index[key] then - return rawget(node, index[key]) - elseif type(key) == "string" then - return error("unknown key: `" .. key .. "` on node type: `" .. ntype(node) .. "`") - end - end, - __newindex = function(node, key, value) - if index[key] then - key = index[key] - end - return rawset(node, key, value) - end - } - self[node_type] = mt - return mt - end -}) -local smart_node -smart_node = function(node) - return setmetatable(node, smart_node_mt[ntype(node)]) -end -local NOOP = { - "noop" -} -return { - ntype = ntype, - smart_node = smart_node, - build = build, - is_value = is_value, - is_slice = is_slice, - manual_return = manual_return, - cascading = cascading, - value_is_singular = value_is_singular, - value_can_be_statement = value_can_be_statement, - mtype = mtype, - terminating = terminating, - NOOP = NOOP -} diff --git a/moonscript/types.moon b/moonscript/types.moon deleted file mode 100644 index 23f4ed91..00000000 --- a/moonscript/types.moon +++ /dev/null @@ -1,197 +0,0 @@ - -util = require "moonscript.util" -import Set from require "moonscript.data" - -import insert from table -import unpack from util - --- implicit return does not work on these statements -manual_return = Set { - "foreach", "for", "while", "return" -} - --- Assigns and returns are bubbled into their bodies. --- All cascading statement transform functions accept a second arugment that --- is the transformation to apply to the last statement in their body -cascading = Set { - "if", "unless", "with", "switch", "class", "do" -} - -terminating = Set { - "return", "break" -} - --- type of node as string -ntype = (node) -> - switch type node - when "nil" - "nil" - when "table" - node[1] - else - "value" - --- gets the class of a type if possible -mtype = do - moon_type = util.moon.type - -- lets us check a smart node without throwing an error - (val) -> - mt = getmetatable val - return "table" if mt and mt.smart_node - moon_type val - --- can this value be compiled in a line by itself -value_can_be_statement = (node) -> - return false unless ntype(node) == "chain" - -- it's a function call - ntype(node[#node]) == "call" - -is_value = (stm) -> - compile = require "moonscript.compile" - transform = require "moonscript.transform" - - compile.Block\is_value(stm) or transform.Value\can_transform stm - -value_is_singular = (node) -> - type(node) != "table" or node[1] != "exp" or #node == 2 - -is_slice = (node) -> - ntype(node) == "chain" and ntype(node[#node]) == "slice" - -t = {} -node_types = { - class: { - {"name", "Tmp"} - {"body", t} - } - fndef: { - {"args", t} - {"whitelist", t} - {"arrow", "slim"} - {"body", t} - } - foreach: { - {"names", t} - {"iter"} - {"body", t} - } - for: { - {"name"} - {"bounds", t} - {"body", t} - } - while: { - {"cond", t} - {"body", t} - } - assign: { - {"names", t} - {"values", t} - } - declare: { - {"names", t} - } - if: { - {"cond", t} - {"then", t} - } -} - -build_table = -> - key_table = {} - for node_name, args in pairs node_types - index = {} - for i, tuple in ipairs args - prop_name = tuple[1] - index[prop_name] = i + 1 - key_table[node_name] = index - key_table - -key_table = build_table! - - -make_builder = (name) -> - spec = node_types[name] - error "don't know how to build node: "..name if not spec - (props={}) -> - node = { name } - for i, arg in ipairs spec - key, default_value = unpack arg - val = if props[key] then props[key] else default_value - val = {} if val == t - node[i + 1] = val - node - -build = nil -build = setmetatable { - group: (body={}) -> - {"group", body} - - do: (body) -> - {"do", body} - - assign_one: (name, value) -> - build.assign { - names: {name} - values: {value} - } - - table: (tbl={}) -> - -- convert strings to key literals - for tuple in *tbl - if type(tuple[1]) == "string" - tuple[1] = {"key_literal", tuple[1]} - - {"table", tbl} - block_exp: (body) -> - {"block_exp", body} - - chain: (parts) -> - base = parts.base or error"expecting base property for chain" - - if type(base) == "string" - base = {"ref", base} - - node = {"chain", base} - for part in *parts - insert node, part - node -}, { - __index: (name) => - self[name] = make_builder name - rawget self, name -} - -smart_node_mt = setmetatable {}, { - __index: (node_type) => - index = key_table[node_type] - mt = { - smart_node: true - - __index: (node, key) -> - if index[key] - rawget node, index[key] - elseif type(key) == "string" - error "unknown key: `"..key.."` on node type: `"..ntype(node).. "`" - - __newindex: (node, key, value) -> - key = index[key] if index[key] - rawset node, key, value - } - self[node_type] = mt - mt -} - --- makes it so node properties can be accessed by name instead of index -smart_node = (node) -> - setmetatable node, smart_node_mt[ntype node] - -NOOP = {"noop"} - -{ - :ntype, :smart_node, :build, :is_value, :is_slice, :manual_return, - :cascading, :value_is_singular, - :value_can_be_statement, :mtype, :terminating - :NOOP -} - diff --git a/moonscript/util.lua b/moonscript/util.lua deleted file mode 100644 index 83d7e37f..00000000 --- a/moonscript/util.lua +++ /dev/null @@ -1,217 +0,0 @@ -local concat -concat = table.concat -local unpack = unpack or table.unpack -local type = type -local moon = { - is_object = function(value) - return type(value) == "table" and value.__class - end, - is_a = function(thing, t) - if not (type(thing) == "table") then - return false - end - local cls = thing.__class - while cls do - if cls == t then - return true - end - cls = cls.__parent - end - return false - end, - type = function(value) - local base_type = type(value) - if base_type == "table" then - local cls = value.__class - if cls then - return cls - end - end - return base_type - end -} -local pos_to_line -pos_to_line = function(str, pos) - local line = 1 - for _ in str:sub(1, pos):gmatch("\n") do - line = line + 1 - end - return line -end -local trim -trim = function(str) - return str:match("^%s*(.-)%s*$") -end -local get_line -get_line = function(str, line_num) - for line in str:gmatch("([^\n]*)\n?") do - if line_num == 1 then - return line - end - line_num = line_num - 1 - end -end -local get_closest_line -get_closest_line = function(str, line_num) - local line = get_line(str, line_num) - if (not line or trim(line) == "") and line_num > 1 then - return get_closest_line(str, line_num - 1) - else - return line, line_num - end -end -local split -split = function(str, delim) - if str == "" then - return { } - end - str = str .. delim - local _accum_0 = { } - local _len_0 = 1 - for m in str:gmatch("(.-)" .. delim) do - _accum_0[_len_0] = m - _len_0 = _len_0 + 1 - end - return _accum_0 -end -local dump -dump = function(what) - local seen = { } - local _dump - _dump = function(what, depth) - if depth == nil then - depth = 0 - end - local t = type(what) - if t == "string" then - return '"' .. what .. '"\n' - elseif t == "table" then - if seen[what] then - return "recursion(" .. tostring(what) .. ")...\n" - end - seen[what] = true - depth = depth + 1 - local lines - do - local _accum_0 = { } - local _len_0 = 1 - for k, v in pairs(what) do - _accum_0[_len_0] = (" "):rep(depth * 4) .. "[" .. tostring(k) .. "] = " .. _dump(v, depth) - _len_0 = _len_0 + 1 - end - lines = _accum_0 - end - seen[what] = false - local class_name - if type(what.__class) == "table" and type(what.__class.__name) == "string" then - class_name = "<" .. tostring(what.__class.__name) .. ">" - end - return tostring(class_name or "") .. "{\n" .. concat(lines) .. (" "):rep((depth - 1) * 4) .. "}\n" - else - return tostring(what) .. "\n" - end - end - return _dump(what) -end -local debug_posmap -debug_posmap = function(posmap, moon_code, lua_code) - local tuples - do - local _accum_0 = { } - local _len_0 = 1 - for k, v in pairs(posmap) do - _accum_0[_len_0] = { - k, - v - } - _len_0 = _len_0 + 1 - end - tuples = _accum_0 - end - table.sort(tuples, function(a, b) - return a[1] < b[1] - end) - local lines - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #tuples do - local pair = tuples[_index_0] - local lua_line, pos = unpack(pair) - local moon_line = pos_to_line(moon_code, pos) - local lua_text = get_line(lua_code, lua_line) - local moon_text = get_closest_line(moon_code, moon_line) - local _value_0 = tostring(pos) .. "\t " .. tostring(lua_line) .. ":[ " .. tostring(trim(lua_text)) .. " ] >> " .. tostring(moon_line) .. ":[ " .. tostring(trim(moon_text)) .. " ]" - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - lines = _accum_0 - end - return concat(lines, "\n") -end -local setfenv = setfenv or function(fn, env) - local name - local i = 1 - while true do - name = debug.getupvalue(fn, i) - if not name or name == "_ENV" then - break - end - i = i + 1 - end - if name then - debug.upvaluejoin(fn, i, (function() - return env - end), 1) - end - return fn -end -local getfenv = getfenv or function(fn) - local i = 1 - while true do - local name, val = debug.getupvalue(fn, i) - if not (name) then - break - end - if name == "_ENV" then - return val - end - i = i + 1 - end - return nil -end -local get_options -get_options = function(...) - local count = select("#", ...) - local opts = select(count, ...) - if type(opts) == "table" then - return opts, unpack({ - ... - }, nil, count - 1) - else - return { }, ... - end -end -local safe_module -safe_module = function(name, tbl) - return setmetatable(tbl, { - __index = function(self, key) - return error("Attempted to import non-existent `" .. tostring(key) .. "` from " .. tostring(name)) - end - }) -end -return { - moon = moon, - pos_to_line = pos_to_line, - get_closest_line = get_closest_line, - get_line = get_line, - trim = trim, - split = split, - dump = dump, - debug_posmap = debug_posmap, - getfenv = getfenv, - setfenv = setfenv, - get_options = get_options, - unpack = unpack, - safe_module = safe_module -} diff --git a/moonscript/util.moon b/moonscript/util.moon deleted file mode 100644 index 9969ac4a..00000000 --- a/moonscript/util.moon +++ /dev/null @@ -1,140 +0,0 @@ - -import concat from table - -unpack = unpack or table.unpack -type = type - -moon = - is_object: (value) -> -- is a moonscript object - type(value) == "table" and value.__class - - is_a: (thing, t) -> - return false unless type(thing) == "table" - cls = thing.__class - while cls - if cls == t - return true - cls = cls.__parent - - false - - type: (value) -> -- the moonscript object class - base_type = type value - if base_type == "table" - cls = value.__class - return cls if cls - base_type - --- convet position in text to line number -pos_to_line = (str, pos) -> - line = 1 - for _ in str\sub(1, pos)\gmatch("\n") - line += 1 - line - -trim = (str) -> - str\match "^%s*(.-)%s*$" - -get_line = (str, line_num) -> - -- todo: this returns an extra blank line at the end - for line in str\gmatch "([^\n]*)\n?" - return line if line_num == 1 - line_num -= 1 - -get_closest_line = (str, line_num) -> - line = get_line str, line_num - if (not line or trim(line) == "") and line_num > 1 - get_closest_line(str, line_num - 1) - else - line, line_num - -split = (str, delim) -> - return {} if str == "" - str ..= delim - [m for m in str\gmatch("(.-)"..delim)] - -dump = (what) -> - seen = {} - _dump = (what, depth=0) -> - t = type what - if t == "string" - '"'..what..'"\n' - elseif t == "table" - if seen[what] - return "recursion("..tostring(what) ..")...\n" - seen[what] = true - - depth += 1 - lines = for k,v in pairs what - (" ")\rep(depth*4).."["..tostring(k).."] = ".._dump(v, depth) - - seen[what] = false - - class_name = if type(what.__class) == "table" and type(what.__class.__name) == "string" - "<#{what.__class.__name}>" - - "#{class_name or ""}{\n" .. concat(lines) .. (" ")\rep((depth - 1)*4) .. "}\n" - else - tostring(what).."\n" - - _dump what - - -debug_posmap = (posmap, moon_code, lua_code) -> - tuples = [{k, v} for k, v in pairs posmap] - table.sort tuples, (a, b) -> a[1] < b[1] - - lines = for pair in *tuples - lua_line, pos = unpack pair - moon_line = pos_to_line moon_code, pos - - lua_text = get_line lua_code, lua_line - moon_text = get_closest_line moon_code, moon_line - - "#{pos}\t #{lua_line}:[ #{trim lua_text} ] >> #{moon_line}:[ #{trim moon_text} ]" - - concat(lines, "\n") - -setfenv = setfenv or (fn, env) -> - local name - i = 1 - while true - name = debug.getupvalue fn, i - break if not name or name == "_ENV" - i += 1 - - if name - debug.upvaluejoin fn, i, (-> env), 1 - - fn - -getfenv = getfenv or (fn) -> - i = 1 - while true - name, val = debug.getupvalue fn, i - break unless name - return val if name == "_ENV" - i += 1 - nil - --- moves the last argument to the front if it's a table, or returns empty table --- inserted to the front of args -get_options = (...) -> - count = select "#", ... - opts = select count, ... - if type(opts) == "table" - opts, unpack {...}, nil, count - 1 - else - {}, ... - -safe_module = (name, tbl) -> - setmetatable tbl, { - __index: (key) => - error "Attempted to import non-existent `#{key}` from #{name}" - } - -{ - :moon, :pos_to_line, :get_closest_line, :get_line, :trim, :split, :dump, - :debug_posmap, :getfenv, :setfenv, :get_options, :unpack, :safe_module -} - diff --git a/moonscript/version.lua b/moonscript/version.lua deleted file mode 100644 index 91f885aa..00000000 --- a/moonscript/version.lua +++ /dev/null @@ -1,7 +0,0 @@ -local version = "0.5.0" -return { - version = version, - print_version = function() - return print("MoonScript version " .. tostring(version)) - end -} diff --git a/moonscript/version.moon b/moonscript/version.moon deleted file mode 100644 index 68c483e4..00000000 --- a/moonscript/version.moon +++ /dev/null @@ -1,8 +0,0 @@ - -version = "0.5.0" - -{ - version: version, - print_version: -> - print "MoonScript version #{version}" -} diff --git a/package.sh b/package.sh new file mode 100755 index 00000000..60ac6c9e --- /dev/null +++ b/package.sh @@ -0,0 +1,8 @@ +VERSION=$(lua -e 'io.stdout:write(require"moonscript.version".version)') +FILE=moonscript-${VERSION}.zip + +[ -f "$FILE" ] && rm "$FILE" + +zip "$FILE" moonscript.dll lua51.dll *.exe LICENSE README.txt + +echo "Wrote $FILE" \ No newline at end of file diff --git a/spec/README.md b/spec/README.md deleted file mode 100644 index 3ca43503..00000000 --- a/spec/README.md +++ /dev/null @@ -1,91 +0,0 @@ - -# MoonScript spec guide - -## Testing the right code - -Because MoonScript is written in MoonScript, and MoonScript specs are written -in MoonScript, you need to be aware of which copy of MoonScript is actually -executing the specs. - -A system installed version of MoonScript is recommended to run the specs (and -for development). This means that you'll typically have two versions of -MoonScript available in the load path: - -* The system version -* The version in the current directory - -> A system install is recommended because you'll always want a functioning -> version of MoonScript to compile with in case you break your development -> version. - -When developing you want to make ensure the tests are executing your changes in -the current directory, and not testing the system install. - -Busted itself is MoonScript aware, so it means it should have a functional -MoonScript compiler in order to load the `.moon` test files. This should be the -system install. After booting your specs though, you would like to use the -current directory version of MoonScript to the test - -Because by default Busted will have the system install take precedence over the -loaded version, running `require "moonscript.base"` within a test you won't get -the working directory version of the code that you should be testing. - -The `with_dev` spec helper will ensure that any require calls within the spec -that ask for MoonScript modules. `with_dev` calls a setup and teardown that -replaces `_G.require` with a custom version. - -You'll use it like this: - -```moonscript -import with_dev from require "spec.helpers" -describe "moonscript.base", -> - with_dev! - - it "should load code", -> - -- the local version is loaded - moonscript = require "moonscript" - moonscript.load "print 12" -``` - -Note that `with_dev`'s `require` function will not use the MoonLoader, it will -only load the `.lua` files in the working directory directory, not the `moon` -ones. This means you must compile the working directory version of MoonScript -before running the tests. - -There is a make task to conveniently do all of this: - -``` -make test -``` - -## Building syntax tests - -The test suite has a series of *syntax* tests (`spec/lang_spec.moon`) that -consist of a bunch of `.moon` files and their expected output. These files -should capture a large range of syntax that can be verified to have the correct -output when you make changes to the language. - -If you are adding new syntax, or changing the expected output, then these tests -will fail until you rebuild the expected outputs. You can do this by running -the syntax test suite with the `BUILD` environment variable set. - -There is a make task to conveniently do this: - -``` -make build_test_outputs -``` - -## Performance timing - -The syntax specs have performance timing collection built in. To get these -times run the test suite with the `TIME` environment variable set. - -``` -TIME=1 busted spec/lang_spec.moon -``` - -Any changes to the compiler should not introduce any substantial performance -decreases. - - - diff --git a/spec/class_spec.moon b/spec/class_spec.moon deleted file mode 100644 index 394c59b1..00000000 --- a/spec/class_spec.moon +++ /dev/null @@ -1,297 +0,0 @@ - -describe "class", -> - it "should make a class with constructor", -> - class Thing - new: => - @color = "blue" - - instance = Thing! - - assert.same instance, { color: "blue" } - - it "should have instance methods", -> - class Thing - get_color: => @color - - new: => - @color = "blue" - - instance = Thing! - assert.same instance\get_color!, "blue" - - it "should have base properies from class", -> - class Thing - color: "blue" - get_color: => @color - - instance = Thing! - assert.same instance\get_color!, "blue" - assert.same Thing.color, "blue" - - it "should inherit another class", -> - class Base - get_property: => @[@property] - - new: (@property) => - - class Thing extends Base - color: "green" - - instance = Thing "color" - assert.same instance\get_property!, "green" - - - it "should have class properties", -> - class Base - class Thing extends Base - - instance = Thing! - - assert.same Base.__name, "Base" - assert.same Thing.__name, "Thing" - assert.is_true Thing.__parent == Base - - assert.is_true instance.__class == Thing - - it "should have name when assigned", -> - Thing = class - assert.same Thing.__name, "Thing" - - it "should not expose class properties on instance", -> - class Thing - @height: 10 - - Thing.color = "blue" - - instance = Thing! - assert.same instance.color, nil - assert.same instance.height, nil - - it "should expose new things added to __base", -> - class Thing - - instance = Thing! - Thing.__base.color = "green" - - assert.same instance.color, "green" - - it "should call with correct receiver", -> - local instance - - class Thing - is_class: => assert.is_true @ == Thing - is_instance: => assert.is_true @ == instance - - go: => - @@is_class! - @is_instance! - - instance = Thing! - instance\go! - - it "should have class properies take precedence over base properties", -> - class Thing - @prop: "hello" - prop: "world" - - assert.same "hello", Thing.prop - - describe "super", -> - it "should call super constructor", -> - class Base - new: (@property) => - - class Thing extends Base - new: (@name) => - super "name" - - instance = Thing "the_thing" - - assert.same instance.property, "name" - assert.same instance.name, "the_thing" - - it "should call super method", -> - class Base - _count: 111 - counter: => @_count - - class Thing extends Base - counter: => "%08d"\format super! - - instance = Thing! - assert.same instance\counter!, "00000111" - - it "should call other method from super", -> - class Base - _count: 111 - counter: => - @_count - - class Thing extends Base - other_method: => super\counter! - - instance = Thing! - assert.same instance\other_method!, 111 - - it "should get super class", -> - class Base - class Thing extends Base - get_super: => super - - instance = Thing! - assert.is_true instance\get_super! == Base - - it "should get a bound method from super", -> - class Base - count: 1 - get_count: => @count - - class Thing extends Base - get_count: => "this is wrong" - get_method: => super\get_count - - instance = Thing! - assert.same instance\get_method!!, 1 - - it "class properties take precedence in super class over base", -> - class Thing - @prop: "hello" - prop: "world" - - class OtherThing extends Thing - - assert.same "hello", OtherThing.prop - - it "gets value from base in super class", -> - class Thing - prop: "world" - - class OtherThing extends Thing - assert.same "world", OtherThing.prop - - it "should let parent be replaced on class", -> - class A - @prop: "yeah" - cool: => 1234 - plain: => "a" - - class B - @prop: "okay" - cool: => 9999 - plain: => "b" - - class Thing extends A - cool: => - super! + 1 - - get_super: => - super - - instance = Thing! - - assert.same "a", instance\plain! - assert.same 1235, instance\cool! - assert A == instance\get_super!, "expected super to be B" - - Thing.__parent = B - setmetatable Thing.__base, B.__base - - assert.same "b", instance\plain! - assert.same 10000, instance\cool! - assert B == instance\get_super!, "expected super to be B" - - it "should resolve many levels of super", -> - class One - a: => - 1 - - class Two extends One - a: => - super! + 2 - - class Three extends Two - a: => - super! + 3 - - i = Three! - - assert.same 6, i\a! - - - it "should resolve many levels of super with a gap", -> - class One - a: => - 1 - - class Two extends One - - class Three extends Two - a: => - super! + 3 - - class Four extends Three - a: => - super! + 4 - - i = Four! - - assert.same 8, i\a! - - - it "should call correct class/instance super methods", -> - class Base - doit: => - "instance" - - @doit: => - "class" - - class One extends Base - doit: => super! - @doit: => super! - - assert.same "instance", One!\doit! - assert.same "class", One\doit! - - - it "should resolve many levels of super on class methods", -> - class One - @a: => - 1 - - class Two extends One - - class Three extends Two - @a: => - super! + 3 - - class Four extends Three - @a: => - super! + 4 - - assert.same 8, Four\a! - - it "super should still work when method wrapped", -> - add_some = (opts) -> - => opts.amount + opts[1] @ - - class Base - value: => 1 - - class Sub extends Base - value: add_some { - amount: 12 - => - super! + 100 - } - - class OtherSub extends Base - value: if true - => 5 + super! - else - => 2 + super! - - assert.same 1 + 100 + 12, Sub!\value! - assert.same 6, OtherSub!\value! - - diff --git a/spec/cmd_spec.moon b/spec/cmd_spec.moon deleted file mode 100644 index 039973d5..00000000 --- a/spec/cmd_spec.moon +++ /dev/null @@ -1,130 +0,0 @@ - -import with_dev from require "spec.helpers" - --- TODO: add specs for windows equivalents - -describe "moonc", -> - local moonc - - dev_loaded = with_dev -> - moonc = require "moonscript.cmd.moonc" - - same = (fn, a, b) -> - assert.same b, fn a - - it "should normalize dir", -> - same moonc.normalize_dir, "hello/world/", "hello/world/" - same moonc.normalize_dir, "hello/world//", "hello/world/" - same moonc.normalize_dir, "", "/" -- wrong - same moonc.normalize_dir, "hello", "hello/" - - it "should parse dir", -> - same moonc.parse_dir, "/hello/world/file", "/hello/world/" - same moonc.parse_dir, "/hello/world/", "/hello/world/" - same moonc.parse_dir, "world", "" - same moonc.parse_dir, "", "" - - it "should parse file", -> - same moonc.parse_file, "/hello/world/file", "file" - same moonc.parse_file, "/hello/world/", "" - same moonc.parse_file, "world", "world" - same moonc.parse_file, "", "" - - it "convert path", -> - same moonc.convert_path, "test.moon", "test.lua" - same moonc.convert_path, "/hello/file.moon", "/hello/file.lua" - same moonc.convert_path, "/hello/world/file", "/hello/world/file.lua" - - it "calculate target", -> - p = moonc.path_to_target - - assert.same "test.lua", p "test.moon" - assert.same "hello/world.lua", p "hello/world.moon" - assert.same "compiled/test.lua", p "test.moon", "compiled" - - assert.same "/home/leafo/test.lua", p "/home/leafo/test.moon" - assert.same "compiled/test.lua", p "/home/leafo/test.moon", "compiled" - assert.same "/compiled/test.lua", p "/home/leafo/test.moon", "/compiled/" - - assert.same "moonscript/hello.lua", p "moonscript/hello.moon", nil, "moonscript" - assert.same "out/moonscript/hello.lua", p "moonscript/hello.moon", "out", "moonscript" - - assert.same "out/moonscript/package/hello.lua", - p "moonscript/package/hello.moon", "out", "moonscript/" - - assert.same "/out/moonscript/package/hello.lua", - p "/home/leafo/moonscript/package/hello.moon", "/out", "/home/leafo/moonscript" - - it "should compile file text", -> - assert.same { - [[return print('hello')]] - }, { - moonc.compile_file_text "print'hello'", fname: "test.moon" - } - - describe "watcher", -> - describe "inotify watcher", -> - it "gets dirs", -> - import InotifyWacher from require "moonscript.cmd.watchers" - watcher = InotifyWacher { - {"hello.moon", "hello.lua"} - {"cool/no.moon", "cool/no.lua"} - } - - assert.same { - "./" - "cool/" - }, watcher\get_dirs! - - describe "parse args", -> - it "parses spec", -> - import parse_spec from require "moonscript.cmd.args" - spec = parse_spec "lt:o:X" - assert.same { - X: {} - o: {value: true} - t: {value: true} - l: {} - }, spec - - it "parses arguments", -> - import parse_arguments from require "moonscript.cmd.args" - out, res = parse_arguments { - "ga:p" - print: "p" - }, {"hello", "word", "-gap"} - - assert.same { - g: true - a: true - p: true - }, out - - describe "stubbed lfs", -> - local dirs - - before_each -> - dirs = {} - package.loaded.lfs = nil - dev_loaded["moonscript.cmd.moonc"] = nil - - package.loaded.lfs = { - mkdir: (dir) -> table.insert dirs, dir - attributes: -> "directory" - } - - moonc = require "moonscript.cmd.moonc" - - after_each -> - package.loaded.lfs = nil - dev_loaded["moonscript.cmd.moonc"] = nil - moonc = require "moonscript.cmd.moonc" - - it "should make directory", -> - moonc.mkdir "hello/world/directory" - assert.same { - "hello" - "hello/world" - "hello/world/directory" - }, dirs - diff --git a/spec/compiler_spec.moon b/spec/compiler_spec.moon deleted file mode 100644 index 696e6bb9..00000000 --- a/spec/compiler_spec.moon +++ /dev/null @@ -1,183 +0,0 @@ -import Block from require "moonscript.compile" - -import ref, str from require "spec.factory" - --- no transform step -class SimpleBlock extends Block - new: (...) => - super ... - @transform = { - value: (...) -> ... - statement: (...) -> ... - } - -value = require "moonscript.compile.value" - -describe "moonscript.compile", -> - compile_node = (node) -> - block = SimpleBlock! - block\add block\value node - lines = block._lines\flatten! - lines[#lines] = nil if lines[#lines] == "\n" - table.concat lines - - -- compiling lua ast - describe "value", -> - for {name, node, expected} in *{ - { - "ref" - -> {"ref", "hello_world"} - "hello_world" - } - - { - "number" - -> {"number", "14"} - "14" - } - - { - "minus" - -> {"minus", ref!} - "-val" - } - - { - "explist" - -> { "explist", ref("a"), ref("b"), ref("c")} - "a, b, c" - } - - { - "exp" - -> {"exp", ref("a"), "+", ref("b"), "!=", ref("c")} - "a + b ~= c" - } - - { - "parens" - -> { "parens", ref! } - "(val)" - } - - { - "string (single quote)" - -> {"string", "'", "Hello\\'s world"} - "'Hello\\'s world'" - } - - { - "string (double quote)" - -> {"string", '"', "Hello's world"} - [["Hello's world"]] - - } - - { - "string (lua)" - -> {"string", '[==[', "Hello's world"} - "[==[Hello's world]==]" - } - - { - "self" - -> {"self", ref!} - "self.val" - } - - { - "self_class" - -> {"self_class", ref!} - "self.__class.val" - } - - { - "self_class_colon" - -> {"self_class_colon", ref!} - "self.__class:val" - } - - { - "not" - -> {"not", ref!} - "not val" - } - - { - "length" - -> {"length", ref!} - "#val" - } - - { - "length" - -> {"length", ref!} - "#val" - } - - { - "bitnot" - -> {"bitnot", ref!} - "~val" - } - - { - "chain (single)" - -> {"chain", ref!} - "val" - } - - { - "chain (dot)" - -> {"chain", ref!, {"dot", "zone"} } - "val.zone" - } - - { - "chain (index)" - -> {"chain", ref!, {"index", ref("x") } } - "val[x]" - } - - - { - "chain (call)" - -> {"chain", ref!, {"call", { ref("arg") }} } - "val(arg)" - } - - { - "chain" - -> { - "chain" - ref! - {"dot", "one"} - {"index", str!} - {"colon", "two"} - {"call", { ref("arg") }} - } - 'val.one["dogzone"]:two(arg)' - } - - { - "chain (self receiver)" - -> { - "chain" - {"self", ref!} - {"call", {ref "arg"} } - } - "self:val(arg)" - } - - { - "fndef (empty)" - -> {"fndef", {}, {}, "slim", {}} - "function() end" - } - - } - it "compiles #{name}", -> - node = node! - assert.same expected, compile_node(node) - - diff --git a/spec/comprehension_spec.moon b/spec/comprehension_spec.moon deleted file mode 100644 index d8823728..00000000 --- a/spec/comprehension_spec.moon +++ /dev/null @@ -1,77 +0,0 @@ - -import unpack from require "moonscript.util" - -describe "comprehension", -> - it "should double every number", -> - input = {1,2,3,4,5,6} - output_1 = [i * 2 for _, i in pairs input ] - output_2 = [i * 2 for i in *input ] - - assert.same output_1, {2,4,6,8,10,12} - - it "should create a slice", -> - input = {1,2,3,4,5,6} - - slice_1 = [i for i in *input[1,3]] - slice_2 = [i for i in *input[,3]] - - slice_3 = [i for i in *input[3,]] - slice_4 = [i for i in *input[,]] - - slice_5 = [i for i in *input[,,2]] - slice_6 = [i for i in *input[2,,2]] - - assert.same slice_1, {1,2,3} - assert.same slice_1, slice_2 - assert.same slice_3, {3,4,5,6} - assert.same slice_4, input - - assert.same slice_5, {1,3,5} - assert.same slice_6, {2,4,6} - - it "should be able to assign to self", -> - input = {1,2,3,4} - output = input - output = [i * 2 for i in *output] - - assert.same input, {1,2,3,4} - assert.same output, {2,4,6,8} - - output = input - output = [i * 2 for _,i in ipairs input] - - assert.same input, {1,2,3,4} - assert.same output, {2,4,6,8} - - -describe "table comprehension", -> - it "should copy table", -> - input = { 1,2,3, hello: "world", thing: true } - output = {k,v for k,v in pairs input } - - assert.is_true input != output - assert.same input, output - - it "should support when", -> - input = { - color: "red" - name: "fast" - width: 123 - } - - output = { k,v for k,v in pairs input when k != "color" } - - assert.same output, { name: "fast", width: 123 } - - it "should do unpack", -> - input = {4,9,16,25} - output = {i, math.sqrt i for i in *input} - - assert.same output, { [4]: 2, [9]: 3, [16]: 4, [25]: 5 } - - it "should use multiple return values", -> - input = { {"hello", "world"}, {"foo", "bar"} } - output = { unpack tuple for tuple in *input } - - assert.same output, { foo: "bar", hello: "world" } - diff --git a/spec/coverage_output_handler.moon b/spec/coverage_output_handler.moon deleted file mode 100644 index 0043e462..00000000 --- a/spec/coverage_output_handler.moon +++ /dev/null @@ -1,51 +0,0 @@ - -load_line_table = (chunk_name) -> - import to_lua from require "moonscript.base" - - return unless chunk_name\match "^@" - fname = chunk_name\sub 2 - - file = assert io.open fname - code = file\read "*a" - file\close! - - c, ltable = to_lua code - - return nil, ltable unless c - - line_tables = require "moonscript.line_tables" - line_tables[chunk_name] = ltable - true - -(options) -> - busted = require "busted" - handler = require("busted.outputHandlers.utfTerminal") options - - local spec_name - - coverage = require "moonscript.cmd.coverage" - cov = coverage.CodeCoverage! - - busted.subscribe { "test", "start" }, (context) -> - cov\start! - - busted.subscribe { "test", "end" }, -> - cov\stop! - - busted.subscribe { "suite", "end" }, (context) -> - line_counts = {} - - for chunk_name, counts in pairs cov.line_counts - continue unless chunk_name\match("^@$./") or chunk_name\match "@[^/]" - continue if chunk_name\match "^@spec/" - - if chunk_name\match "%.lua$" - chunk_name = chunk_name\gsub "lua$", "moon" - continue unless load_line_table chunk_name - - line_counts[chunk_name] = counts - - cov.line_counts = line_counts - cov\format_results! - - handler diff --git a/spec/destructure_spec.moon b/spec/destructure_spec.moon deleted file mode 100644 index fe300425..00000000 --- a/spec/destructure_spec.moon +++ /dev/null @@ -1,32 +0,0 @@ -describe "destructure", -> - it "should unpack array", -> - input = {1,2,3} - - {a,b,c} = {1,2,3} - {d,e,f} = input - - assert.same a, 1 - assert.same b, 2 - assert.same c, 3 - - assert.same d, 1 - assert.same e, 2 - assert.same f, 3 - - it "should destructure", -> - futurists = - sculptor: "Umberto Boccioni" - painter: "Vladimir Burliuk" - poet: - name: "F.T. Marinetti" - address: { - "Via Roma 42R" - "Bellagio, Italy 22021" - } - - {poet: {:name, address: {street, city}}} = futurists - - assert.same name, "F.T. Marinetti" - assert.same street, "Via Roma 42R" - assert.same city, "Bellagio, Italy 22021" - diff --git a/spec/error_inputs/first.moon b/spec/error_inputs/first.moon deleted file mode 100644 index c8d45fa4..00000000 --- a/spec/error_inputs/first.moon +++ /dev/null @@ -1,26 +0,0 @@ - -hello_world = false - -print = -> - -if hello_world - print "sackman" - x = 5 + 5 - print something.what - - -if hello_world - print 343434 - print bott.dady - - -if not hello_world - if true - x = 5+2 - x = 5+2 - x = 5+2 - - if true - print what.heck - - diff --git a/spec/error_inputs/second.moon b/spec/error_inputs/second.moon deleted file mode 100644 index d9b7e689..00000000 --- a/spec/error_inputs/second.moon +++ /dev/null @@ -1,19 +0,0 @@ - -print = -> - -if false - true - true - true - true - print hello -else - true - true - true - true - print "hello world" - print doesnt.exist - - - diff --git a/spec/error_inputs/third.moon b/spec/error_inputs/third.moon deleted file mode 100644 index b3c1e2e9..00000000 --- a/spec/error_inputs/third.moon +++ /dev/null @@ -1,20 +0,0 @@ - -print = -> - -if (-> - print "hello world" - print "who is this") - true - true - true - true - print dead.world - print "okay now" - print "this is wrong" - print "this is wrong" - print "this is wrong" - print "this is wrong" - print "this is wrong" - print "this is wrong" - print "this is wrong" - diff --git a/spec/error_rewriting_spec.moon b/spec/error_rewriting_spec.moon deleted file mode 100644 index c3616116..00000000 --- a/spec/error_rewriting_spec.moon +++ /dev/null @@ -1,71 +0,0 @@ - -import unindent, with_dev from require "spec.helpers" - -describe "moonscript.errors", -> - local moonscript, errors, util, to_lua - - -- with_dev -> - moonscript = require "moonscript.base" - errors = require "moonscript.errors" - util = require "moonscript.util" - - {:to_lua} = moonscript - - get_rewritten_line_no = (fname) -> - fname = "spec/error_inputs/#{fname}.moon" - chunk = moonscript.loadfile fname - - success, err = pcall chunk - error "`#{fname}` is supposed to have runtime error!" if success - - source = tonumber err\match "^.-:(%d+):" - - line_table = assert require("moonscript.line_tables")["@#{fname}"], "missing line table" - errors.reverse_line_number fname, line_table, source, {} - - describe "error rewriting", -> - tests = { - "first": 24 - "second": 16 - "third": 11 - } - - for name, expected_no in pairs tests - it "should rewrite line number", -> - assert.same get_rewritten_line_no(name), expected_no - - describe "line map", -> - it "should create line table", -> - moon_code = unindent [[ - print "hello world" - if something - print "cats" - ]] - - lua_code, posmap = assert to_lua moon_code - -- print util.debug_posmap(posmap, moon_code, lua_code) - assert.same { 1, 23, 36, 21 }, posmap - - it "should create line table for multiline string", -> - moon_code = unindent [[ - print "one" - x = [==[ - one - two - thre - yes - no - ]==] - print "two" - ]] - - lua_code, posmap = assert to_lua moon_code - -- print util.debug_posmap(posmap, moon_code, lua_code) - assert.same {[1]: 1, [2]: 13, [7]: 13, [8]: 57}, posmap - - describe "error reporting", -> - it "should compile bad code twice", -> - code, err = to_lua "{b=5}" - assert.truthy err - code, err2 = to_lua "{b=5}" - assert.same err, err2 diff --git a/spec/factory.moon b/spec/factory.moon deleted file mode 100644 index a6f3d76c..00000000 --- a/spec/factory.moon +++ /dev/null @@ -1,13 +0,0 @@ - --- ast factory - -ref = (name="val") -> - {"ref", name} - -str = (contents="dogzone", delim='"') -> - {"string", delim, contents} - -{ - :ref - :str -} diff --git a/spec/helpers.moon b/spec/helpers.moon deleted file mode 100644 index caf885c2..00000000 --- a/spec/helpers.moon +++ /dev/null @@ -1,54 +0,0 @@ - --- remove front indentation from a multiline string, making it suitable to be --- parsed -unindent = (str) -> - indent = str\match "^%s+" - return str unless indent - (str\gsub("\n#{indent}", "\n")\gsub("%s+$", "")\gsub "^%s+", "") - -in_dev = false - --- this will ensure any moonscript modules included come from the local --- directory -with_dev = (fn) -> - error "already in dev mode" if in_dev - - -- a package loader that only looks in currect directory - import make_loader from require "loadkit" - loader = make_loader "lua", nil, "./?.lua" - - import setup, teardown from require "busted" - - old_require = _G.require - dev_cache = {} - - setup -> - _G.require = (mod) -> - mod = switch mod - when "moonscript" - "moonscript.init" - when "moon" - "moon.init" - - return dev_cache[mod] if dev_cache[mod] - - testable = mod\match("moonscript%.") or mod == "moonscript" or - mod\match("moon%.") or mod == "moon" - - if testable - fname = assert loader(mod), "failed to find module: #{mod}" - dev_cache[mod] = assert(loadfile fname)! - return dev_cache[mod] - - old_require mod - - if fn - fn! - - teardown -> - _G.require = old_require - in_dev = false - - dev_cache - -{ :unindent, :with_dev } diff --git a/spec/import_spec.moon b/spec/import_spec.moon deleted file mode 100644 index bb1472cd..00000000 --- a/spec/import_spec.moon +++ /dev/null @@ -1,26 +0,0 @@ -describe "import", -> - it "should import from table", -> - import sort, insert from table - t = { 4,2,6 } - insert t, 1 - sort t - - assert.same t, {1,2,4,6} - - it "should import from local", -> - thing = { var: 10, hello: "world", func: => @var } - import hello, \func from thing - - assert.same hello, thing.hello - assert.same func!, thing.var - - it "should not call source multiple times", -> - count = 0 - source = -> - count += 1 - { hello: "world", foo: "bar" } - - import hello, foo from source! - - assert.same count, 1 - diff --git a/spec/inputs/ambiguous.moon b/spec/inputs/ambiguous.moon deleted file mode 100644 index 66109c11..00000000 --- a/spec/inputs/ambiguous.moon +++ /dev/null @@ -1,8 +0,0 @@ -a = 'b' -c = d -(a b) c d -import c from d -(a b) c d -(c d) a b -a, b = c, d -(d a) c diff --git a/spec/inputs/ambiguous_tables.moon b/spec/inputs/ambiguous_tables.moon deleted file mode 100644 index c2c7ea8c..00000000 --- a/spec/inputs/ambiguous_tables.moon +++ /dev/null @@ -1,6 +0,0 @@ -x = { -hello -(one) -(two) -three() -} diff --git a/spec/inputs/assign.moon b/spec/inputs/assign.moon deleted file mode 100644 index 1e5e7a6f..00000000 --- a/spec/inputs/assign.moon +++ /dev/null @@ -1,30 +0,0 @@ - --> - joop = 2302 - - (hi) -> - d = 100 - hi = 1021 - - a,b,c,d = 1,2,3,4 - - hello[232], (5+5)[121], hello, x[99] = 100, 200, 300 - - joop = 12 - -joop = 2345 - -a, b = if hello - "hello" -else - "nothing", "yeah" - - -a, b = if hello - if yeah then "one", "two" else "mmhh" -else - print "the other" - "nothing", "yeah" - - - diff --git a/spec/inputs/bubbling.moon b/spec/inputs/bubbling.moon deleted file mode 100644 index d1004f9e..00000000 --- a/spec/inputs/bubbling.moon +++ /dev/null @@ -1,28 +0,0 @@ - --- vararg bubbling -f = (...) -> #{...} - -dont_bubble = -> - [x for x in ((...)-> print ...)("hello")] - -k = [x for x in ((...)-> print ...)("hello")] - -j = for i=1,10 - (...) -> print ... - --- bubble me - -m = (...) -> - [x for x in *{...} when f(...) > 4] - -x = for i in *{...} do i -y = [x for x in *{...}] -z = [x for x in hallo when f(...) > 4] - - -a = for i=1,10 do ... - -b = for i=1,10 - -> print ... - - diff --git a/spec/inputs/class.moon b/spec/inputs/class.moon deleted file mode 100644 index 9a980557..00000000 --- a/spec/inputs/class.moon +++ /dev/null @@ -1,213 +0,0 @@ - -class Hello - new: (@test, @world) => - print "creating object.." - hello: => - print @test, @world - __tostring: => "hello world" - -x = Hello 1,2 -x\hello() - -print x - -class Simple - cool: => print "cool" - -class Yikes extends Simple - new: => print "created hello" - -x = Yikes() -x\cool() - - -class Hi - new: (arg) => - print "init arg", arg - - cool: (num) => - print "num", num - - -class Simple extends Hi - new: => super "man" - cool: => super 120302 - -x = Simple() -x\cool() - -print x.__class == Simple - - -class Okay - -- what is going on - something: 20323 - -- yeaha - - -class Biggie extends Okay - something: => - super 1,2,3,4 - super.something another_self, 1,2,3,4 - assert super == Okay - - -class Yeah - okay: => - super\something 1,2,3,4 - - -class What - something: => print "val:", @val - -class Hello extends What - val: 2323 - something: => super\something - -with Hello! - x = \something! - print x - x! - -class CoolSuper - hi: => - super(1,2,3,4) 1,2,3,4 - super.something 1,2,3,4 - super.something(1,2,3,4).world - super\yeah"world".okay hi, hi, hi - something.super - super.super.super.super - super\hello - nil - - --- selfing -x = @hello -x = @@hello - -@hello "world" -@@hello "world" - -@@one @@two(4,5) @three, @four - -xx = (@hello, @@world, cool) -> - - --- class properties -class ClassMan - @yeah: 343 - blue: => - @hello: 3434, @world: 23423 - green: => - @red: => - - -x = @ -y = @@ - -@ something - -@@ something - -@ = @ + @ / @ - -@ = 343 -@.hello 2,3,4 - -hello[@].world - - -class Whacko - @hello - if something - print "hello world" - - hello = "world" - @another = "day" - - print "yeah" if something -- this is briken - - -print "hello" - -yyy = -> - class Cool - nil - - --- - -class a.b.c.D - nil - - -class a.b["hello"] - nil - -class (-> require "moon")!.Something extends Hello.World - nil - --- - -a = class -b = class Something -c = class Something extends Hello -d = class extends World - -print (class WhatsUp).__name - --- - -export ^ -class Something - nil - - --- - --- hoisting -class Something - val = 23 - {:insert} = table - new: => print insert, val -- prints nil 23 - --- - -class X - new: hi - - --- - -class Cool extends Thing - dang: => - { - hello: -> super! - world: -> super.one - } - --- - -class Whack extends Thing - dang: do_something => - super! - ---- - -class Wowha extends Thing - @butt: -> - super! - super.hello - super\hello! - super\hello - - - @zone: cool { - -> - super! - super.hello - super\hello! - super\hello - } - -nil diff --git a/spec/inputs/comprehension.moon b/spec/inputs/comprehension.moon deleted file mode 100644 index 1609d79e..00000000 --- a/spec/inputs/comprehension.moon +++ /dev/null @@ -1,52 +0,0 @@ - --- see lists.moon for list comprehension tests - -items = {1,2,3,4,5,6} -out = {k,k*2 for k in items} - - -x = hello: "world", okay: 2323 - -copy = {k,v for k,v in pairs x when k != "okay"} - --- - -{ unpack(x) for x in yes } -{ unpack(x) for x in *yes } - -{ xxxx for x in yes } -{ unpack [a*i for i, a in ipairs x] for x in *{{1,2}, {3,4}} } - - --- - -n1 = [i for i=1,10] -n2 = [i for i=1,10 when i % 2 == 1] - -aa = [{x,y} for x=1,10 for y=5,14] -bb = [y for thing in y for i=1,10] -cc = [y for i=1,10 for thing in y] -dd = [y for i=1,10 when cool for thing in y when x > 3 when c + 3] - -{"hello", "world" for i=1,10} - --- - -j = [a for {a,b,c} in things] -k = [a for {a,b,c} in *things] -i = [hello for {:hello, :world} in *things] - -hj = {a,c for {a,b,c} in things} -hk = {a,c for {a,b,c} in *things} -hi = {hello,world for {:hello, :world} in *things} - -ok(a,b,c) for {a,b,c} in things - --- - -[item for item in *items[1 + 2,3+4]] -[item for item in *items[hello! * 4, 2 - thing[4]]] - - - -nil diff --git a/spec/inputs/cond.moon b/spec/inputs/cond.moon deleted file mode 100644 index 18e42b91..00000000 --- a/spec/inputs/cond.moon +++ /dev/null @@ -1,190 +0,0 @@ - -you_cool = false - -if cool - if you_cool - one - else if eatdic - yeah - else - two - three -else - no - -if cool then no -if cool then no else yes - -if cool then wow cool else - noso cool - -if working - if cool then if cool then okay else what else nah - - -if yeah then no day elseif cool me then okay ya else u way -if yeah then no dad else if cool you then okay bah else p way - - -if (->)() then what ever - -if nil then flip me else - it be,rad - - -if things great then no way elseif okay sure - what here - - -if things then no chance -elseif okay - what now - - -if things - yes man -elseif okay person then hi there else hmm sure - -if lets go - print "greetings" -elseif "just us" - print "will smith" else show 5555555 - --- - -if something = 10 - print something -else - print "else" - -hello = if something = 10 - print something -else - print "else" - - -hello = 5 + if something = 10 - print something - ---- - -z = false - -if false - one -elseif x = true - two -elseif z = true - three -else - four - - -out = if false - one -elseif x = true - two -elseif z = true - three -else - four - -kzy = -> - if something = true - 1 - elseif another = false - 2 - ---- - -unless true - print "cool!" - -unless true and false - print "cool!" - -unless false then print "cool!" -unless false then print "cool!" else print "no way!" - -unless nil - print "hello" -else - print "world" - --- - -x = unless true - print "cool!" - -x = unless true and false - print "cool!" - -y = unless false then print "cool!" -y = unless false then print "cool!" else print "no way!" - -z = unless nil - print "hello" -else - print "world" - -print unless true - print "cool!" - -print unless true and false - print "cool!" - -print unless false then print "cool!" -print unless false then print "cool!" else print "no way!" - -print unless nil - print "hello" -else - print "world" - --- - -print "hello" unless value - -dddd = {1,2,3} unless value - - --- - -do - j = 100 - unless j = hi! - error "not j!" - ----------------- - -a = 12 -a,c,b = "cool" if something - - - ---- - -j = if 1 - if 2 - 3 -else 6 - - -m = if 1 - - - - if 2 - - - 3 - - -else 6 - - - -nil - - - diff --git a/spec/inputs/destructure.moon b/spec/inputs/destructure.moon deleted file mode 100644 index beb79d67..00000000 --- a/spec/inputs/destructure.moon +++ /dev/null @@ -1,100 +0,0 @@ - -do - {a, b} = hello - - {{a}, b, {c}} = hello - - { :hello, :world } = value - -do - { yes: no, thing } = world - - {:a,:b,:c,:d} = yeah - - {a} = one, two - {b}, c = one - {d}, e = one, two - - x, {y} = one, two - - xx, yy = 1, 2 - {yy, xx} = {xx, yy} - - {a, :b, c, :d, e, :f, g} = tbl - ---- - -do - futurists = - sculptor: "Umberto Boccioni" - painter: "Vladimir Burliuk" - poet: - name: "F.T. Marinetti" - address: { - "Via Roma 42R" - "Bellagio, Italy 22021" - } - - {poet: {:name, address: {street, city}}} = futurists - --- - -do - { @world } = x - { a.b, c.y, func!.z } = x - - { world: @world } = x - --- - -do - thing = {{1,2}, {3,4}} - - for {x,y} in *thing - print x,y - - --- - -do - with {a,b} = thing - print a, b - - --- - -do - thing = nil - if {a} = thing - print a - else - print "nothing" - - thang = {1,2} - if {a,b} = thang - print a,b - - if {a,b} = thing - print a,b - elseif {c,d} = thang - print c,d - else - print "NO" - --- - -do - z = "yeah" - {a,b,c} = z - -do - {a,b,c} = z - -(z) -> - {a,b,c} = z - -do - z = "oo" - (k) -> - {a,b,c} = z - diff --git a/spec/inputs/do.moon b/spec/inputs/do.moon deleted file mode 100644 index 334e68f3..00000000 --- a/spec/inputs/do.moon +++ /dev/null @@ -1,27 +0,0 @@ - -do - print "hello" - print "world" - -x = do - print "hello" - print "world" - -y = do - things = "shhh" - -> "hello: " .. things - --> if something then do "yeah" - -t = { - y: do - number = 100 - (x) -> x + number -} - -(y=(do - x = 10 + 2 - x), k=do - "nothing") -> do - "uhhh" - diff --git a/spec/inputs/export.moon b/spec/inputs/export.moon deleted file mode 100644 index 0a563798..00000000 --- a/spec/inputs/export.moon +++ /dev/null @@ -1,77 +0,0 @@ - -do - export a,b,c = 223, 343 - export cool = "dad" - -do - export class Something - umm: "cool" - -do - export a,b,c - a,b,c,d = "hello" - - -do - What = if this - 232 - else - 4343 - - export ^ - - another = 3434 - Another = 7890 - - if inner then Yeah = "10000" - - What = if this - 232 - else - 4343 - - -do - export * - - What = if this - 232 - else - 4343 - - x,y,z = 1,2,3 - - y = -> - hallo = 3434 - - with tmp - j = 2000 - - -do - export * - x = 3434 - if y then - x = 10 - -do - export * - if y then - x = 10 - x = 3434 - -do - do - export * - - k = 1212 - - do - h = 100 - - y = -> - h = 100 - k = 100 - - h = 100 - diff --git a/spec/inputs/funcs.moon b/spec/inputs/funcs.moon deleted file mode 100644 index 08a29b64..00000000 --- a/spec/inputs/funcs.moon +++ /dev/null @@ -1,158 +0,0 @@ - - -x = -> print what - --> - --> -> -> - -go to the barn - -open -> the -> door - -open -> - the door - hello = -> - my func - -h = -> hi - -eat ->, world - - -(->)() - -x = (...) -> - -hello! -hello.world! - -hello!.something -what!["ofefe"] - -what! the! heck! - -(a,b,c,d,e) -> - -(a,a,a,a,a) -> - print a - -(x=23023) -> - -(x=(y=()->) ->) -> - -(x = if something then yeah else no) -> - -something = (hello=100, world=(x=[[yeah cool]])-> print "eat rice") -> - print hello - -(x, y) => -(@x, @y) => -(x=1) => -(@x=1,y,@z="hello world") => - - -x -> return -y -> return 1 -z -> return 1, "hello", "world" -k -> if yes then return else return - --> real_name if something - --- - -d( - -> - print "hello world" - 10 -) - - - -d( - 1,2,3 - 4 - 5 - 6 - - if something - print "okay" - 10 - - 10,20 -) - - -f( - - )( - - )( - what - )(-> - print "srue" - 123) - --- - -x = (a, - b) -> - print "what" - - -y = (a="hi", - b=23) -> - print "what" - -z = ( - a="hi", - b=23) -> - print "what" - - -j = (f,g,m, - a="hi", - b=23 -) -> - print "what" - - -y = (a="hi", - b=23, - ...) -> - print "what" - - -y = (a="hi", - b=23, - ... -) -> - print "what" - --- - -args = (a - b) -> - print "what" - - -args = (a="hi" - b=23) -> - print "what" - -args = ( - a="hi" - b=23) -> - print "what" - - -args = (f,g,m - a="hi" - b=23 -) -> - print "what" - - - - -nil diff --git a/spec/inputs/import.moon b/spec/inputs/import.moon deleted file mode 100644 index d86d7243..00000000 --- a/spec/inputs/import.moon +++ /dev/null @@ -1,48 +0,0 @@ - - -import hello from yeah -import hello, world from table["cool"] - -import a, \b, c from items - - -import master, \ghost from find "mytable" - - -a, yumm = 3434, "hello" - - -_table_0 = 232 - -import something from a table - - -if indent - import okay, \well from tables[100] - -do - import a, b, c from z - -do - import a, - b, c from z - -do - import a - b - c from z - -do - import - a - b - c from z - - -do - import - a - b - c - from z - diff --git a/spec/inputs/lists.moon b/spec/inputs/lists.moon deleted file mode 100644 index c1191857..00000000 --- a/spec/inputs/lists.moon +++ /dev/null @@ -1,72 +0,0 @@ - -hi = [x*2 for _, x in ipairs{1,2,3,4}] - -items = {1,2,3,4,5,6} - -[z for z in ipairs items when z > 4] - -rad = [{a} for a in ipairs { - 1,2,3,4,5,6, -} when good_number a] - - -[z for z in items for j in list when z > 4] - -require "util" - -dump = (x) -> print util.dump x - -range = (count) -> - i = 0 - return coroutine.wrap -> - while i < count - coroutine.yield i - i = i + 1 - -dump [x for x in range 10] -dump [{x, y} for x in range 5 when x > 2 for y in range 5] - -things = [x + y for x in range 10 when x > 5 for y in range 10 when y > 7] - -print x,y for x in ipairs{1,2,4} for y in ipairs{1,2,3} when x != 2 - -print "hello", x for x in items - -[x for x in x] -x = [x for x in x] - -print x,y for x in ipairs{1,2,4} for y in ipairs{1,2,3} when x != 2 - -double = [x*2 for x in *items] - -print x for x in *double - -cut = [x for x in *items when x > 3] - -hello = [x + y for x in *items for y in *items] - -print z for z in *hello - - --- slice -x = {1, 2, 3, 4, 5, 6, 7} -print y for y in *x[2,-5,2] -print y for y in *x[,3] -print y for y in *x[2,] -print y for y in *x[,,2] -print y for y in *x[2,,2] - -a, b, c = 1, 5, 2 -print y for y in *x[a,b,c] - - -normal = (hello) -> - [x for x in yeah] - - -test = x 1,2,3,4,5 -print thing for thing in *test - --> a = b for row in *rows - - diff --git a/spec/inputs/literals.moon b/spec/inputs/literals.moon deleted file mode 100644 index c3a24a6f..00000000 --- a/spec/inputs/literals.moon +++ /dev/null @@ -1,46 +0,0 @@ - - -121 -121.2323 -121.2323e-1 -121.2323e13434 -2323E34 -0x12323 - -0xfF2323 -0xabcdef -0xABCDEF - -.2323 -.2323e-1 -.2323e13434 - - -1LL -1ULL -9332LL -9332 -0x2aLL -0x2aULL - -[[ hello world ]] - -[=[ hello world ]=] -[====[ hello world ]====] - -"another world" - -'what world' - - -" -hello world -" - -'yeah -what is going on -here is something cool' - - -nil - diff --git a/spec/inputs/local.moon b/spec/inputs/local.moon deleted file mode 100644 index fec78b18..00000000 --- a/spec/inputs/local.moon +++ /dev/null @@ -1,94 +0,0 @@ - -do - local a - local a,b,c - - b,g = 23232 - - -do - x = 1212 - something = -> - local x - x = 1212 - -do - local * - y = 2323 - z = 2323 - -do - local * - print "Nothing Here!" - -do - local ^ - x = 3434 - y = 3434 - X = 3434 - Y = "yeah" - -do - local ^ - x,y = "a", "b" - -do - local * - x,y = "a", "b" - - -do - local * - if something - x = 2323 - -do - local * - do - x = "one" - - x = 100 - - do - x = "two" - -do - local * - k = if what - 10 - x = 100 - - {:a,:b, :c} = y - - -do - local * - - a = 100 - print "hi" - b = 200 - - local * - c = 100 - print "hi" - d = 200 - d = 2323 - - -do - local ^ - lowercase = 5 - Uppercase = 3 - - class One - Five = 6 - - class Two - class No - -do - local * - -- this generates a nil value in the body - for a in *{} do a - -g = 2323 -- test if anything leaked diff --git a/spec/inputs/loops.moon b/spec/inputs/loops.moon deleted file mode 100644 index a704e562..00000000 --- a/spec/inputs/loops.moon +++ /dev/null @@ -1,133 +0,0 @@ - -for x=1,10 - print "yeah" - -for x=1,#something - print "yeah" - -for y=100,60,-3 - print "count down", y - -for a=1,10 do print "okay" - -for a=1,10 - for b = 2,43 - print a,b - -for i in iter - for j in yeah - x = 343 + i + j - print i, j - -for x in *something - print x - -for k,v in pairs hello do print k,v - -for x in y, z - print x - -for x in y, z, k - print x - - -x = -> - for x in y - y - -hello = {1,2,3,4,5} - -x = for y in *hello - if y % 2 == 0 - y - -x = -> - for x in *hello - y - -t = for i=10,20 do i * 2 - -hmm = 0 -y = for j = 3,30, 8 - hmm += 1 - j * hmm - --> - for k=10,40 - "okay" - --> - return for k=10,40 - "okay" - -while true do print "name" - -while 5 + 5 - print "okay world" - working man - -while also do - i work too - "okay" - -i = 0 -x = while i < 10 - i += 1 - --- values that can'e be coerced - -x = for thing in *3 - y = "hello" - -x = for x=1,2 - y = "hello" - - --- continue - -while true - continue if false - print "yes" - break if true - print "no" - - -for x=1,10 - continue if x > 3 and x < 7 - print x - - -list = for x=1,10 - continue if x > 3 and x < 7 - x - - -for a in *{1,2,3,4,5,6} - continue if a == 1 - continue if a == 3 - print a - - - -for x=1,10 - continue if x % 2 == 0 - for y = 2,12 - continue if y % 3 == 0 - - -while true - continue if false - break - -while true - continue if false - return 22 - --- - -do - xxx = {1,2,3,4} - for thing in *xxx - print thing - - diff --git a/spec/inputs/operators.moon b/spec/inputs/operators.moon deleted file mode 100644 index 142ef622..00000000 --- a/spec/inputs/operators.moon +++ /dev/null @@ -1,72 +0,0 @@ - --- binary ops -x = 1 + 3 - -y = 1 + - 3 - -z = 1 + - 3 + - 4 - --- - -k = b and c and - g - - -h = thing and - -> - print "hello world" - --- TODO: should fail, indent still set to previous line so it thinks body is --- indented -i = thing or - -> - print "hello world" - -p = thing and - -> -print "hello world" - -s = thing or - -> and 234 - - --- -u = { - color: 1 and 2 and - 3 - 4 - 4 -} - -v = { - color: 1 and - -> - "yeah" - "great" - oksy: 3 ^ -2 -} - --- parens - -nno = ( - yeah + 2 ) - -nn = ( - yeah + 2 -) - -n = hello( - b -) -> - -hello a, - ( - yeah + - 2 - ) - - okay - diff --git a/spec/inputs/return.moon b/spec/inputs/return.moon deleted file mode 100644 index 61d3dcad..00000000 --- a/spec/inputs/return.moon +++ /dev/null @@ -1,55 +0,0 @@ --- testing `return` propagation - --> x for x in *things --> [x for x in *things] - - --- doesn't make sense on purpose -do - return x for x in *things - -do - return [x for x in *things] - -do - return {x,y for x,y in *things} - --> - if a - if a - a - else - b - elseif b - if a - a - else - b - else - if a - a - else - b - - -do - return if a - if a - a - else - b - elseif b - if a - a - else - b - else - if a - a - else - b - --> a\b -do a\b - - diff --git a/spec/inputs/string.moon b/spec/inputs/string.moon deleted file mode 100644 index 897056a5..00000000 --- a/spec/inputs/string.moon +++ /dev/null @@ -1,66 +0,0 @@ - -hi = "hello" -hello = "what the heckyes" -print hi - -umm = 'umm' - -here, another = "yeah", 'world' - -aye = "YU'M" -you '"hmmm" I said' - -print aye, you - -another = [[ hello world ]] - - -hi_there = [[ - hi there -]] - -well = [==[ "helo" ]==] - -hola = [===[ - eat noots]===] - -mm = [[well trhere]] - -oo = "" - -x = "\\" -x = "a\\b" -x = "\\\n" -x = "\"" - --- - -a = "hello #{hello} hello" -b = "#{hello} hello" -c = "hello #{5+1}" -d = "#{hello world}" -e = "#{1} #{2} #{3}" - -f = [[hello #{world} world]] - --- - -a = 'hello #{hello} hello' -b = '#{hello} hello' -c = 'hello #{hello}' - - --- - -"hello" -"hello"\format 1 -"hello"\format(1,2,3) -"hello"\format(1,2,3) 1,2,3 - -"hello"\world! -"hello"\format!.hello 1,2,3 -"hello"\format 1,2,3 - -something"hello"\world! -something "hello"\world! - diff --git a/spec/inputs/stub.moon b/spec/inputs/stub.moon deleted file mode 100644 index f8f6c3fd..00000000 --- a/spec/inputs/stub.moon +++ /dev/null @@ -1,16 +0,0 @@ - - -x = { - val: 100 - hello: => - print @val -} - -fn = x\val -print fn! -print x\val! - - --- ... should be bubbled up anon functions -x = hello(...)\world - diff --git a/spec/inputs/switch.moon b/spec/inputs/switch.moon deleted file mode 100644 index 3bc179b3..00000000 --- a/spec/inputs/switch.moon +++ /dev/null @@ -1,64 +0,0 @@ - -switch value - when "cool" - print "hello world" - - -switch value - when "cool" - print "hello world" - else - print "okay rad" - - -switch value - when "cool" - print "hello world" - when "yeah" - [[FFFF]] + [[MMMM]] - when 2323 + 32434 - print "okay" - else - print "okay rad" - -out = switch value - when "cool" then print "hello world" - else print "okay rad" - -out = switch value - when "cool" then xxxx - when "umm" then 34340 - else error "this failed big time" - -with something - switch \value! - when .okay - "world" - else - "yesh" - -fix this -call_func switch something - when 1 then "yes" - else "no" - --- - -switch hi - when hello or world - greene - --- - -switch hi - when "one", "two" - print "cool" - when "dad" - no - -switch hi - when 3+1, hello!, (-> 4)! - yello - else - print "cool" - diff --git a/spec/inputs/syntax.moon b/spec/inputs/syntax.moon deleted file mode 100644 index b5b92a84..00000000 --- a/spec/inputs/syntax.moon +++ /dev/null @@ -1,275 +0,0 @@ -#!/this/is/ignored - -a = 1 + 2* 3 / 6 - -a, bunch, go, here = another, world - -func arg1, arg2, another, arg3 - -here, we = () ->, yeah -the, different = () -> approach; yeah - -dad() -dad(lord) -hello(one,two)() -(5 + 5)(world) - -fun(a)(b) - -fun(a) b - -fun(a) b, bad hello - -hello world what are you doing here - - -what(the)[3243] world, yeck heck - -hairy[hands][are](gross) okay okay[world] - -(get[something] + 5)[years] - -i,x = 200, 300 - -yeah = (1 + 5) * 3 -yeah = ((1+5)*3)/2 -yeah = ((1+5)*3)/2 + i % 100 - -whoa = (1+2) * (3+4) * (4+5) - --> - if something - return 1,2,4 - - print "hello" - --> - if hello - "heloo", "world" - else - no, way - - --> 1,2,34 - -return 5 + () -> 4 + 2 - -return 5 + (() -> 4) + 2 - -print 5 + () -> - 34 - good nads - - -something 'else', "ya" - -something'else' -something"else" - -something[[hey]] * 2 -something[======[hey]======] * 2 - - -something'else', 2 -something"else", 2 -something[[else]], 2 - -something 'else', 2 -something "else", 2 -something [[else]], 2 - -here(we)"go"[12123] - --- this runs -something = - test: 12323 - what: -> print "hello world" - -print something.test - -frick = hello: "world" - -argon = - num: 100 - world: (self) -> - print self.num - return { - something: -> print "hi from something" - } - somethin: (self, str) -> - print "string is", str - return world: (a,b) -> print "sum", a + b - -something.what() -argon\world().something() - -argon\somethin"200".world(1,2) - -x = -434 - -x = -hello world one two - -hi = -"herfef" - -x = -[x for x in x] - -print "hello" if cool -print "hello" unless cool -print "hello" unless 1212 and 3434 -- hello -print "hello" for i=1,10 - -print "nutjob" - -if hello then 343 - -print "what" if cool else whack - -arg = {...} - -x = (...) -> - dump {...} - - -x = not true - -y = not(5+5) - - -y = #"hello" - -x = #{#{},#{1},#{1,2}} - -hello, world - -something\hello(what) a,b -something\hello what -something.hello\world a,b -something.hello\world(1,2,3) a,b - - -x = 1232 -x += 10 + 3 -j -= "hello" -y *= 2 -y /= 100 -m %= 2 -hello ..= "world" - -@@something += 10 -@something += 10 - -@@then += 10 -@then += 10 - -a["hello"] += 10 -a["hello#{tostring ff}"] += 10 -a[four].x += 10 - -x = 0 -(if ntype(v) == "fndef" then x += 1) for v in *values - - -hello = - something: world - if: "hello" - else: 3434 - function: "okay" - good: 230203 - - -div class: "cool" - -5 + what wack -what whack + 5 - -5 - what wack -what whack - 5 - -x = hello - world - something - -((something = with what - \cool 100) -> - print something)! - -if something - 03589 - --- okay what about this - -else - 3434 - - -if something - yeah - - -elseif "ymmm" - - print "cool" - -else - - okay - - --- test names containing keywords -x = notsomething -y = ifsomething -z = x and b -z = x andb - - --- undelimited tables - -while 10 > something - something: "world" - print "yeah" - -x = - okay: sure - -yeah - okay: man - sure: sir - -hello "no comma" - yeah: dada - another: world - -hello "comma", - something: hello_world - frick: you - --- creates two tables -another hello, one, - two, three, four, yeah: man - okay: yeah - --- -a += 3 - 5 -a *= 3 + 5 -a *= 3 -a >>= 3 -a <<= 3 -a /= func "cool" - ---- - -x.then = "hello" -x.while.true = "hello" - --- - -x or= "hello" -x and= "hello" - --- - -z = a-b -z = a -b -z = a - b -z = a- b - - --- cooool diff --git a/spec/inputs/tables.moon b/spec/inputs/tables.moon deleted file mode 100644 index 2bf66d70..00000000 --- a/spec/inputs/tables.moon +++ /dev/null @@ -1,161 +0,0 @@ - -backpack = - something: - yeah: 200 - they: -> - print "hello" - yor_feet"small" - pretty: hair - gold: hmm - yow: 1000 - - eat: goo - yeah: dudd - - -start = - something: "cold" - -bathe = - on: "fire" - -another = - [4]: 232 - ["good food"]: "is the best" - -fwip = - something: hello"what", number: 2323, - what: yo "momma", "yeah", - fruit: basket - nuts: day - - -frick = hello: "world" - -frack, best = hello: "world", rice: 3434, "what" - -ya = { 1,2,3, key: 100, 343, "hello", umm: 232 } - - -x = { 1,2, - 4343, 343 ,343 } - - -g, p = { - 1,2, nowy: "yes", 3,4, - hey: 232, another: "day" -}, 234 - -annother = { - 1,2,3 - 3,4,5 - 6,7,8 -} - -yeah = { - [232]: 3434, "helo" - ice: "cake" -} - --- confusing stuff... -whatabout = { - hello world, another - what, about, now - - hello"world", yeah - hello "world", yeah -} - -x = - -- yeah - something: => "hello" - cool: -- umm - --so ething - bed: { - 2323,2323 - } - red: 2343 -- here - -- what - name: (node) => @value node -- here - -- comment me --- okay - - -x = { :something, something: something } - -y = { - :hi, :there, :how, :you - :thing -} - -call_me "hello", :x, :y, :z - -t = { - a: 'a' - [b]: 'b' -} - -xam = { - hello: 1234 - "hello": 12354 - ["hello"]: 12354 -} - - -kam = { - hello: 12 - goodcheese: - "mmm" - - yeah: - 12 + 232 - - lets: - keepit going: true, - okay: "yeah" - - more: - { - 1, [x for x=1,10] - } - - [{"one", "two"}]: - one_thing => -} - --- TODO: both of these have undesirable output -keepit going: true, - okay: "yeah", - workd: "okay" - -thing what: - "great", no: - "more" - okay: 123 - - --- -thing what: - "great", no: - "more" -okay: 123 -- a anon table - - --- - -k = { "hello": "world" } -k = { 'hello': 'world' } -k = { "hello": 'world', "hat": "zat" } - -please "hello": "world" -k = "hello": "world", "one": "zone" - -f = "one", "two": three, "four" -f = "two": three, "four" -f = { "one", "two": three, "four" } - - -j = "one", "two": three, "four": five, 6, 7 - - -nil diff --git a/spec/inputs/unless_else.moon b/spec/inputs/unless_else.moon deleted file mode 100644 index fe96c0bd..00000000 --- a/spec/inputs/unless_else.moon +++ /dev/null @@ -1,5 +0,0 @@ -if a - unless b - print "hi" - elseif c - print "not hi" diff --git a/spec/inputs/using.moon b/spec/inputs/using.moon deleted file mode 100644 index 55a16a78..00000000 --- a/spec/inputs/using.moon +++ /dev/null @@ -1,21 +0,0 @@ - -hello = "hello" -world = "world" - -(using nil) -> - hello = 3223 - -(a using nil) -> - hello = 3223 - a = 323 - -(a,b,c using a,b,c) -> - a,b,c = 1,2,3 - world = 12321 - -(a,e,f using a,b,c, hello) -> - a,b,c = 1,2,3 - hello = 12321 - world = "yeah" - - diff --git a/spec/inputs/whitespace.moon b/spec/inputs/whitespace.moon deleted file mode 100644 index 4a2ff1fa..00000000 --- a/spec/inputs/whitespace.moon +++ /dev/null @@ -1,102 +0,0 @@ - -{ - 1, 2 -} - -{ 1, 2 -} - -{ 1, 2 } - -{1,2} - -{ -1,2 - -} - -{ something 1,2, - 4,5,6, - 3,4,5 -} - -{ - a 1,2,3, - 4,5,6 - 1,2,3 -} - - -{ - b 1,2,3, - 4,5,6 - 1,2,3, - 1,2,3 -} - -{ 1,2,3 } - -{ c 1,2,3, -} - - -hello 1,2,3,4, - 1,2,3,4,4,5 - -x 1, - 2, 3, - 4, 5, 6 - - -hello 1,2,3, - world 4,5,6, - 5,6,7,8 - -hello 1,2,3, - world 4,5,6, - 5,6,7,8, - 9,9 - - -{ - hello 1,2, - 3,4, - 5, 6 -} - -x = { - hello 1,2,3,4, - 5,6,7 - 1,2,3,4 -} - -if hello 1,2,3, - world, - world - print "hello" - -if hello 1,2,3, - world, - world - print "hello" - - --- - -a( - one, two, three -) - -b( - one, - two, - three -) - - -c(one, two, - three, four) - --- - -nil diff --git a/spec/inputs/with.moon b/spec/inputs/with.moon deleted file mode 100644 index ae3c8c05..00000000 --- a/spec/inputs/with.moon +++ /dev/null @@ -1,118 +0,0 @@ - -do - a = -> - with something - print .hello - print hi - print "world" - -do - with leaf - .world! - .world 1,2,3 - - g = .what.is.this - - .hi 1,2,3 - - \hi(1,2).world 2323 - - \hi "yeah", "man" - .world = 200 - -do - zyzyzy = with something - .set_state "hello world" - -do - x = 5 + with Something! - \write "hello world" - - -do - x = { - hello: with yeah - \okay! - } - -do - with foo - \prop"something".hello - .prop\send(one) - .prop\send one - - --- - -do - with a, b -- b is lost - print .world - - mod = with _M = {} - .Thing = "hi" - - -- operate on a only - with a, b = something, pooh - print .world - - x = with a, b = 1, 2 - print a + b - - print with a, b = 1, 2 - print a + b - - -- assignment lhs must be evaluated in the order they appear - p = with hello!.x, world!.y = 1, 2 - print a + b - --- - -do - x = "hello" - with x - x\upper! - -do - with k = "jo" - print \upper! - -do - with a,b,c = "", "", "" - print \upper! - -do - a = "bunk" - with a,b,c = "", "", "" - print \upper! - -do - with j - print \upper! - -do - with k.j = "jo" - print \upper! - -do - with a - print .b - -- nested `with`s should change the scope correctly - with .c - print .d - -do - with a - -- nested `with`s with assignments should change the scope correctly - with .b = 2 - print .c - -do - -> - with hi - return .a, .b - - -do - with dad - .if "yes" - y = .end.of.function diff --git a/spec/lang_spec.moon b/spec/lang_spec.moon deleted file mode 100644 index b0fa1bab..00000000 --- a/spec/lang_spec.moon +++ /dev/null @@ -1,139 +0,0 @@ -lfs = require "lfs" - -import with_dev from require "spec.helpers" - -pattern = ... - -unpack = table.unpack or unpack - -options = { - in_dir: "spec/inputs", - out_dir: "spec/outputs", - input_pattern: "(.*)%.moon$", - output_ext: ".lua" - - show_timings: os.getenv "TIME" - - diff: { - tool: "git diff --no-index --color" --color-words" - filter: (str) -> - -- strip the first four lines - table.concat [l for l in *([line for line in str\gmatch("[^\n]+")])[5,]], "\n" - } -} - -timings = {} - -gettime = nil - -pcall -> - require "socket" - gettime = socket.gettime - -gettime or= os.clock - -benchmark = (fn) -> - if gettime - start = gettime! - res = {fn!} - gettime! - start, unpack res - else - nil, fn! - -read_all = (fname) -> - if f = io.open(fname, "r") - with f\read "*a" - f\close! - -diff_file = (a_fname, b_fname) -> - out = io.popen(options.diff.tool .. " ".. a_fname .. " " .. b_fname, "r")\read "*a" - if options.diff.filter - out = options.diff.filter out - out - -diff_str = (expected, got) -> - a_tmp = os.tmpname! .. ".expected" - b_tmp = os.tmpname! .. ".got" - - with io.open(a_tmp, "w") - \write expected - \close! - - with io.open(b_tmp, "w") - \write got - \close! - - with diff_file a_tmp, b_tmp - os.remove a_tmp - os.remove b_tmp - -string_assert = (expected, got) -> - if expected != got - diff = diff_str expected, got - error "string equality assert failed" if os.getenv "HIDE_DIFF" - error "string equality assert failed:\n" .. diff - -input_fname = (base) -> - options.in_dir .. "/" .. base .. ".moon" - -output_fname = (base) -> - options.out_dir .. "/" .. base .. options.output_ext - -inputs = for file in lfs.dir options.in_dir - with match = file\match options.input_pattern - continue unless match - -table.sort inputs - -describe "input tests", -> - local parse, compile - - with_dev -> - parse = require "moonscript.parse" - compile = require "moonscript.compile" - - for name in *inputs - input = input_fname name - it input .. " #input", -> - file_str = read_all input_fname name - - parse_time, tree, err = benchmark -> parse.string file_str - error err if err - compile_time, code, err, pos = benchmark -> compile.tree tree - error compile.format_error err, pos, file_str unless code - - table.insert timings, {name, parse_time, compile_time} - - if os.getenv "BUILD" - with io.open output_fname(name), "w" - \write code - \close! - else - expected_str = read_all output_fname name - error "Test not built: " .. input_fname(name) unless expected_str - - string_assert expected_str, code - - nil - - if options.show_timings - teardown -> - format_time = (sec) -> ("%.3fms")\format(sec*1000) - col_width = math.max unpack [#t[1] for t in *timings] - - print "\nTimings:" - total_parse, total_compile = 0, 0 - for tuple in *timings - name, parse_time, compile_time = unpack tuple - name = name .. (" ")\rep col_width - #name - total_parse += parse_time - total_compile += compile_time - - print " * " .. name, - "p: " .. format_time(parse_time), - "c: " .. format_time(compile_time) - - print "\nTotal:" - print " parse:", format_time total_parse - print " compile:", format_time total_compile - diff --git a/spec/loops_spec.moon b/spec/loops_spec.moon deleted file mode 100644 index 68b5f97f..00000000 --- a/spec/loops_spec.moon +++ /dev/null @@ -1,9 +0,0 @@ - -describe "loops", -> - it "should continue", -> - input = {1,2,3,4,5,6} - output = for x in *input - continue if x % 2 == 1 - x - - assert.same output, { 2,4,6 } diff --git a/spec/moon_spec.moon b/spec/moon_spec.moon deleted file mode 100644 index 773e53c0..00000000 --- a/spec/moon_spec.moon +++ /dev/null @@ -1,121 +0,0 @@ --- test moon library - -import with_dev from require "spec.helpers" - -describe "moon", -> - local moon - - with_dev -> - moon = require "moon" - - it "should determine correct type", -> - class Test - - things = { - Test, Test!, 1, true, nil, "hello" - } - - types = [moon.type t for t in *things] - assert.same types, { Test, Test, "number", "boolean", "nil", "string" } - - it "should get upvalue", -> - fn = do - hello = "world" - -> hello - - assert.same moon.debug.upvalue(fn, "hello"), "world" - - it "should set upvalue", -> - fn = do - hello = "world" - -> hello - - moon.debug.upvalue fn, "hello", "foobar" - assert.same fn!, "foobar" - - it "should run with scope", -> - scope = hello: -> - spy.on scope, "hello" - moon.run_with_scope (-> hello!), scope - - assert.spy(scope.hello).was.called! - - - it "should have access to old environment", -> - scope = {} - res = moon.run_with_scope (-> math), scope - - assert.same res, math - - it "should created bound proxy", -> - class Hello - state: 10 - method: (val) => "the state: #{@state}, the val: #{val}" - - hello = Hello! - bound = moon.bind_methods hello - - assert.same bound.method("xxx"), "the state: 10, the val: xxx" - - it "should create defaulted table", -> - fib = moon.defaultbl {[0]: 0, [1]: 1}, (i) => self[i - 1] + self[i - 2] - fib[7] - - assert.same fib, { [0]: 0, 1, 1, 2, 3, 5, 8, 13 } - - it "should extend", -> - t1 = { hello: "world's", cool: "shortest" } - t2 = { cool: "boots", cowboy: "hat" } - - out = moon.extend t1, t2 - - assert.same { out.hello, out.cool, out.cowboy }, { "world's", "shortest", "hat"} - - it "should make a copy", -> - x = { "hello", yeah: "man" } - y = moon.copy x - - x[1] = "yikes" - x.yeah = "woman" - - assert.same y, { "hello", yeah: "man" } - - - it "should mixin", -> - class TestModule - new: (@var) => - show_var: => "var is: #{@var}" - - class Second - new: => - moon.mixin self, TestModule, "hi" - - obj = Second! - - assert.same obj\show_var!, "var is: hi" - - it "should mixin object", -> - class First - val: 10 - get_val: => "the val: #{@val}" - - class Second - val: 20 - new: => - moon.mixin_object @, First!, { "get_val" } - - obj = Second! - assert.same obj\get_val!, "the val: 10" - - it "should mixin table", -> - a = { hello: "world", cat: "dog" } - b = { cat: "mouse", foo: "bar" } - moon.mixin_table a, b - - assert.same a, { hello: "world", cat: "mouse", foo: "bar"} - - it "should fold", -> - numbers = {4,3,5,6,7,2,3} - sum = moon.fold numbers, (a,b) -> a + b - - assert.same sum, 30 diff --git a/spec/moonscript_spec.moon b/spec/moonscript_spec.moon deleted file mode 100644 index b7e5271b..00000000 --- a/spec/moonscript_spec.moon +++ /dev/null @@ -1,12 +0,0 @@ --- moonscript module - -import with_dev from require "spec.helpers" - -describe "moonscript.base", -> - with_dev! - - it "should create moonpath", -> - path = ";./?.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/usr/lib/lua/5.1/?.luac;/home/leafo/.luarocks/lua/5.1/?.lua" - import create_moonpath from require "moonscript.base" - assert.same "./?.moon;/usr/share/lua/5.1/?.moon;/usr/share/lua/5.1/?/init.moon;/home/leafo/.luarocks/lua/5.1/?.moon", create_moonpath(path) - diff --git a/spec/outputs/ambiguous.lua b/spec/outputs/ambiguous.lua deleted file mode 100644 index 2330da40..00000000 --- a/spec/outputs/ambiguous.lua +++ /dev/null @@ -1,9 +0,0 @@ -local a = 'b' -local c = d; -(a(b))(c(d)) -c = d.c; -(a(b))(c(d)); -(c(d))(a(b)) -local b -a, b = c, d -return (d(a))(c) \ No newline at end of file diff --git a/spec/outputs/ambiguous_tables.lua b/spec/outputs/ambiguous_tables.lua deleted file mode 100644 index 8af0aaab..00000000 --- a/spec/outputs/ambiguous_tables.lua +++ /dev/null @@ -1,6 +0,0 @@ -local x = { - hello, - (one), - (two), - three() -} \ No newline at end of file diff --git a/spec/outputs/assign.lua b/spec/outputs/assign.lua deleted file mode 100644 index cddfda05..00000000 --- a/spec/outputs/assign.lua +++ /dev/null @@ -1,30 +0,0 @@ -local _ -_ = function() - local joop = 2302 - return function(hi) - local d = 100 - hi = 1021 - local a, b, c - a, b, c, d = 1, 2, 3, 4 - local hello - hello[232], (5 + 5)[121], hello, x[99] = 100, 200, 300 - joop = 12 - end -end -local joop = 2345 -local a, b -if hello then - a, b = "hello" -else - a, b = "nothing", "yeah" -end -if hello then - if yeah then - a, b = "one", "two" - else - a, b = "mmhh" - end -else - print("the other") - a, b = "nothing", "yeah" -end \ No newline at end of file diff --git a/spec/outputs/bubbling.lua b/spec/outputs/bubbling.lua deleted file mode 100644 index 036d5fb7..00000000 --- a/spec/outputs/bubbling.lua +++ /dev/null @@ -1,120 +0,0 @@ -local f -f = function(...) - return #{ - ... - } -end -local dont_bubble -dont_bubble = function() - local _accum_0 = { } - local _len_0 = 1 - for x in (function(...) - return print(...) - end)("hello") do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end -local k -do - local _accum_0 = { } - local _len_0 = 1 - for x in (function(...) - return print(...) - end)("hello") do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - k = _accum_0 -end -local j -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - _accum_0[_len_0] = function(...) - return print(...) - end - _len_0 = _len_0 + 1 - end - j = _accum_0 -end -local m -m = function(...) - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = { - ... - } - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - if f(...) > 4 then - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - end - return _accum_0 -end -local x -do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = { - ... - } - for _index_0 = 1, #_list_0 do - local i = _list_0[_index_0] - _accum_0[_len_0] = i - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -local y -do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = { - ... - } - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - y = _accum_0 -end -local z -do - local _accum_0 = { } - local _len_0 = 1 - for x in hallo do - if f(...) > 4 then - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - end - z = _accum_0 -end -local a -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - _accum_0[_len_0] = ... - _len_0 = _len_0 + 1 - end - a = _accum_0 -end -local b -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - _accum_0[_len_0] = function() - return print(...) - end - _len_0 = _len_0 + 1 - end - b = _accum_0 -end \ No newline at end of file diff --git a/spec/outputs/class.lua b/spec/outputs/class.lua deleted file mode 100644 index 018760a0..00000000 --- a/spec/outputs/class.lua +++ /dev/null @@ -1,913 +0,0 @@ -local Hello -do - local _class_0 - local _base_0 = { - hello = function(self) - return print(self.test, self.world) - end, - __tostring = function(self) - return "hello world" - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, test, world) - self.test, self.world = test, world - return print("creating object..") - end, - __base = _base_0, - __name = "Hello" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Hello = _class_0 -end -local x = Hello(1, 2) -x:hello() -print(x) -local Simple -do - local _class_0 - local _base_0 = { - cool = function(self) - return print("cool") - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Simple" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Simple = _class_0 -end -local Yikes -do - local _class_0 - local _parent_0 = Simple - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - return print("created hello") - end, - __base = _base_0, - __name = "Yikes", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Yikes = _class_0 -end -x = Yikes() -x:cool() -local Hi -do - local _class_0 - local _base_0 = { - cool = function(self, num) - return print("num", num) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, arg) - return print("init arg", arg) - end, - __base = _base_0, - __name = "Hi" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Hi = _class_0 -end -do - local _class_0 - local _parent_0 = Hi - local _base_0 = { - cool = function(self) - return _class_0.__parent.__base.cool(self, 120302) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - return _class_0.__parent.__init(self, "man") - end, - __base = _base_0, - __name = "Simple", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Simple = _class_0 -end -x = Simple() -x:cool() -print(x.__class == Simple) -local Okay -do - local _class_0 - local _base_0 = { - something = 20323 - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Okay" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Okay = _class_0 -end -local Biggie -do - local _class_0 - local _parent_0 = Okay - local _base_0 = { - something = function(self) - _class_0.__parent.__base.something(self, 1, 2, 3, 4) - _class_0.__parent.something(another_self, 1, 2, 3, 4) - return assert(_class_0.__parent == Okay) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Biggie", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Biggie = _class_0 -end -local Yeah -do - local _class_0 - local _base_0 = { - okay = function(self) - return _class_0.__parent.something(self, 1, 2, 3, 4) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Yeah" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Yeah = _class_0 -end -local What -do - local _class_0 - local _base_0 = { - something = function(self) - return print("val:", self.val) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "What" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - What = _class_0 -end -do - local _class_0 - local _parent_0 = What - local _base_0 = { - val = 2323, - something = function(self) - local _base_1 = _class_0.__parent - local _fn_0 = _base_1.something - return function(...) - return _fn_0(self, ...) - end - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Hello", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Hello = _class_0 -end -do - local _with_0 = Hello() - x = _with_0:something() - print(x) - x() -end -local CoolSuper -do - local _class_0 - local _base_0 = { - hi = function(self) - _class_0.__parent.__base.hi(self, 1, 2, 3, 4)(1, 2, 3, 4) - _class_0.__parent.something(1, 2, 3, 4) - local _ = _class_0.__parent.something(1, 2, 3, 4).world - _class_0.__parent.yeah(self, "world").okay(hi, hi, hi) - _ = something.super - _ = _class_0.__parent.super.super.super - do - local _base_1 = _class_0.__parent - local _fn_0 = _base_1.hello - _ = function(...) - return _fn_0(self, ...) - end - end - return nil - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "CoolSuper" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - CoolSuper = _class_0 -end -x = self.hello -x = self.__class.hello -self:hello("world") -self.__class:hello("world") -self.__class:one(self.__class:two(4, 5)(self.three, self.four)) -local xx -xx = function(hello, world, cool) - self.hello, self.__class.world = hello, world -end -local ClassMan -do - local _class_0 - local _base_0 = { - blue = function(self) end, - green = function(self) end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "ClassMan" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - self.yeah = 343 - self.hello = 3434 - self.world = 23423 - self.red = function(self) end - ClassMan = _class_0 -end -x = self -local y = self.__class -self(something) -self.__class(something) -local self = self + self / self -self = 343 -self.hello(2, 3, 4) -local _ = hello[self].world -local Whacko -do - local _class_0 - local hello - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Whacko" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = self.hello - if something then - print("hello world") - end - hello = "world" - self.another = "day" - if something then - print("yeah") - end - Whacko = _class_0 -end -print("hello") -local yyy -yyy = function() - local Cool - do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Cool" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = nil - Cool = _class_0 - return _class_0 - end -end -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "D" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = nil - a.b.c.D = _class_0 -end -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "hello" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = nil - a.b["hello"] = _class_0 -end -do - local _class_0 - local _parent_0 = Hello.World - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Something", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = nil - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - (function() - return require("moon") - end)().Something = _class_0 -end -local a -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "a" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - a = _class_0 -end -local b -local Something -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Something" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Something = _class_0 - b = _class_0 -end -local c -do - local _class_0 - local _parent_0 = Hello - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Something", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Something = _class_0 - c = _class_0 -end -local d -do - local _class_0 - local _parent_0 = World - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "d", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - d = _class_0 -end -print(((function() - local WhatsUp - do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "WhatsUp" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - WhatsUp = _class_0 - return _class_0 - end -end)()).__name) -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Something" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - _ = nil - Something = _class_0 -end -do - local _class_0 - local val, insert - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - return print(insert, val) - end, - __base = _base_0, - __name = "Something" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - val = 23 - insert = table.insert - Something = _class_0 -end -do - local _class_0 - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = hi, - __base = _base_0, - __name = "X" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - X = _class_0 -end -do - local _class_0 - local _parent_0 = Thing - local _base_0 = { - dang = function(self) - return { - hello = function() - return _class_0.__parent.__base.dang(self) - end, - world = function() - return _class_0.__parent.one - end - } - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Cool", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Cool = _class_0 -end -do - local _class_0 - local _parent_0 = Thing - local _base_0 = { - dang = do_something(function(self) - return _class_0.__parent.__base.dang(self) - end) - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Whack", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Whack = _class_0 -end -do - local _class_0 - local _parent_0 = Thing - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, ...) - return _class_0.__parent.__init(self, ...) - end, - __base = _base_0, - __name = "Wowha", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - else - return val - end - end, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - self.butt = function() - _class_0.__parent.butt(self) - _ = _class_0.__parent.hello - _class_0.__parent.hello(self) - local _base_1 = _class_0.__parent - local _fn_0 = _base_1.hello - return function(...) - return _fn_0(self, ...) - end - end - self.zone = cool({ - function() - _class_0.__parent.zone(self) - _ = _class_0.__parent.hello - _class_0.__parent.hello(self) - local _base_1 = _class_0.__parent - local _fn_0 = _base_1.hello - return function(...) - return _fn_0(self, ...) - end - end - }) - if _parent_0.__inherited then - _parent_0.__inherited(_parent_0, _class_0) - end - Wowha = _class_0 -end -return nil \ No newline at end of file diff --git a/spec/outputs/comprehension.lua b/spec/outputs/comprehension.lua deleted file mode 100644 index 15a93890..00000000 --- a/spec/outputs/comprehension.lua +++ /dev/null @@ -1,260 +0,0 @@ -local items = { - 1, - 2, - 3, - 4, - 5, - 6 -} -local out -do - local _tbl_0 = { } - for k in items do - _tbl_0[k] = k * 2 - end - out = _tbl_0 -end -local x = { - hello = "world", - okay = 2323 -} -local copy -do - local _tbl_0 = { } - for k, v in pairs(x) do - if k ~= "okay" then - _tbl_0[k] = v - end - end - copy = _tbl_0 -end -local _ -do - local _tbl_0 = { } - for x in yes do - local _key_0, _val_0 = unpack(x) - _tbl_0[_key_0] = _val_0 - end - _ = _tbl_0 -end -do - local _tbl_0 = { } - local _list_0 = yes - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - local _key_0, _val_0 = unpack(x) - _tbl_0[_key_0] = _val_0 - end - _ = _tbl_0 -end -do - local _tbl_0 = { } - for x in yes do - local _key_0, _val_0 = xxxx - _tbl_0[_key_0] = _val_0 - end - _ = _tbl_0 -end -do - local _tbl_0 = { } - local _list_0 = { - { - 1, - 2 - }, - { - 3, - 4 - } - } - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - local _key_0, _val_0 = unpack((function() - local _accum_0 = { } - local _len_0 = 1 - for i, a in ipairs(x) do - _accum_0[_len_0] = a * i - _len_0 = _len_0 + 1 - end - return _accum_0 - end)()) - _tbl_0[_key_0] = _val_0 - end - _ = _tbl_0 -end -local n1 -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - _accum_0[_len_0] = i - _len_0 = _len_0 + 1 - end - n1 = _accum_0 -end -local n2 -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - if i % 2 == 1 then - _accum_0[_len_0] = i - _len_0 = _len_0 + 1 - end - end - n2 = _accum_0 -end -local aa -do - local _accum_0 = { } - local _len_0 = 1 - for x = 1, 10 do - for y = 5, 14 do - _accum_0[_len_0] = { - x, - y - } - _len_0 = _len_0 + 1 - end - end - aa = _accum_0 -end -local bb -do - local _accum_0 = { } - local _len_0 = 1 - for thing in y do - for i = 1, 10 do - _accum_0[_len_0] = y - _len_0 = _len_0 + 1 - end - end - bb = _accum_0 -end -local cc -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - for thing in y do - _accum_0[_len_0] = y - _len_0 = _len_0 + 1 - end - end - cc = _accum_0 -end -local dd -do - local _accum_0 = { } - local _len_0 = 1 - for i = 1, 10 do - if cool then - for thing in y do - if x > 3 then - if c + 3 then - _accum_0[_len_0] = y - _len_0 = _len_0 + 1 - end - end - end - end - end - dd = _accum_0 -end -do - local _tbl_0 = { } - for i = 1, 10 do - _tbl_0["hello"] = "world" - end - _ = _tbl_0 -end -local j -do - local _accum_0 = { } - local _len_0 = 1 - for _des_0 in things do - local a, b, c - a, b, c = _des_0[1], _des_0[2], _des_0[3] - _accum_0[_len_0] = a - _len_0 = _len_0 + 1 - end - j = _accum_0 -end -local k -do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = things - for _index_0 = 1, #_list_0 do - local _des_0 = _list_0[_index_0] - local a, b, c - a, b, c = _des_0[1], _des_0[2], _des_0[3] - _accum_0[_len_0] = a - _len_0 = _len_0 + 1 - end - k = _accum_0 -end -local i -do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = things - for _index_0 = 1, #_list_0 do - local _des_0 = _list_0[_index_0] - local hello, world - hello, world = _des_0.hello, _des_0.world - _accum_0[_len_0] = hello - _len_0 = _len_0 + 1 - end - i = _accum_0 -end -local hj -do - local _tbl_0 = { } - for _des_0 in things do - local a, b, c - a, b, c = _des_0[1], _des_0[2], _des_0[3] - _tbl_0[a] = c - end - hj = _tbl_0 -end -local hk -do - local _tbl_0 = { } - local _list_0 = things - for _index_0 = 1, #_list_0 do - local _des_0 = _list_0[_index_0] - local a, b, c - a, b, c = _des_0[1], _des_0[2], _des_0[3] - _tbl_0[a] = c - end - hk = _tbl_0 -end -local hi -do - local _tbl_0 = { } - local _list_0 = things - for _index_0 = 1, #_list_0 do - local _des_0 = _list_0[_index_0] - local hello, world - hello, world = _des_0.hello, _des_0.world - _tbl_0[hello] = world - end - hi = _tbl_0 -end -for _des_0 in things do - local a, b, c - a, b, c = _des_0[1], _des_0[2], _des_0[3] - ok(a, b, c) -end -local _max_0 = 3 + 4 -for _index_0 = 1 + 2, _max_0 < 0 and #items + _max_0 or _max_0 do - local item = items[_index_0] - _ = item -end -local _max_1 = 2 - thing[4] -for _index_0 = hello() * 4, _max_1 < 0 and #items + _max_1 or _max_1 do - local item = items[_index_0] - _ = item -end -return nil \ No newline at end of file diff --git a/spec/outputs/cond.lua b/spec/outputs/cond.lua deleted file mode 100644 index 35e7ac56..00000000 --- a/spec/outputs/cond.lua +++ /dev/null @@ -1,279 +0,0 @@ -local you_cool = false -if cool then - if you_cool then - local _ = one - else - if eatdic then - local _ = yeah - else - local _ = two - _ = three - end - end -else - local _ = no -end -if cool then - local _ = no -end -if cool then - local _ = no -else - local _ = yes -end -if cool then - wow(cool) -else - noso(cool) -end -if working then - if cool then - if cool then - local _ = okay - else - local _ = what - end - else - local _ = nah - end -end -if yeah then - no(day) -elseif cool(me) then - okay(ya) -else - u(way) -end -if yeah then - no(dad) -else - if cool(you) then - okay(bah) - else - p(way) - end -end -if (function() end)() then - what(ever) -end -if nil then - flip(me) -else - it(be, rad) -end -if things(great) then - no(way) -elseif okay(sure) then - what(here) -end -if things then - no(chance) -elseif okay then - what(now) -end -if things then - yes(man) -elseif okay(person) then - hi(there) -else - hmm(sure) -end -if lets(go) then - print("greetings") -elseif "just us" then - print("will smith") -else - show(5555555) -end -do - local something = 10 - if something then - print(something) - else - print("else") - end -end -local hello -do - local something = 10 - if something then - hello = print(something) - else - hello = print("else") - end -end -hello = 5 + (function() - do - local something = 10 - if something then - return print(something) - end - end -end)() -local z = false -if false then - local _ = one -else - do - local x = true - if x then - local _ = two - else - do - z = true - if z then - local _ = three - else - local _ = four - end - end - end - end -end -local out -if false then - out = one -else - do - local x = true - if x then - out = two - else - do - z = true - if z then - out = three - else - out = four - end - end - end - end -end -local kzy -kzy = function() - do - local something = true - if something then - return 1 - else - do - local another = false - if another then - return 2 - end - end - end - end -end -if not (true) then - print("cool!") -end -if not (true and false) then - print("cool!") -end -if not (false) then - print("cool!") -end -if not (false) then - print("cool!") -else - print("no way!") -end -if not (nil) then - print("hello") -else - print("world") -end -local x -if not (true) then - x = print("cool!") -end -if not (true and false) then - x = print("cool!") -end -local y -if not (false) then - y = print("cool!") -end -if not (false) then - y = print("cool!") -else - y = print("no way!") -end -if not (nil) then - z = print("hello") -else - z = print("world") -end -print((function() - if not (true) then - return print("cool!") - end -end)()) -print((function() - if not (true and false) then - return print("cool!") - end -end)()) -print((function() - if not (false) then - return print("cool!") - end -end)()) -print((function() - if not (false) then - return print("cool!") - else - return print("no way!") - end -end)()) -print((function() - if not (nil) then - return print("hello") - else - return print("world") - end -end)()) -if not (value) then - print("hello") -end -local dddd -if not (value) then - dddd = { - 1, - 2, - 3 - } -end -do - local j = 100 - do - j = hi() - if not j then - error("not j!") - end - end -end -local a = 12 -local c, b -if something then - a, c, b = "cool" -end -local j -if 1 then - if 2 then - j = 3 - end -else - j = 6 -end -local m -if 1 then - if 2 then - m = 3 - end -else - m = 6 -end -return nil \ No newline at end of file diff --git a/spec/outputs/destructure.lua b/spec/outputs/destructure.lua deleted file mode 100644 index 8254e3c9..00000000 --- a/spec/outputs/destructure.lua +++ /dev/null @@ -1,168 +0,0 @@ -do - local a, b - do - local _obj_0 = hello - a, b = _obj_0[1], _obj_0[2] - end - local c - do - local _obj_0 = hello - a, b, c = _obj_0[1][1], _obj_0[2], _obj_0[3][1] - end - local hello, world - do - local _obj_0 = value - hello, world = _obj_0.hello, _obj_0.world - end -end -do - local no, thing - do - local _obj_0 = world - no, thing = _obj_0.yes, _obj_0[1] - end - local a, b, c, d - do - local _obj_0 = yeah - a, b, c, d = _obj_0.a, _obj_0.b, _obj_0.c, _obj_0.d - end - a = one[1] - local _ = two - b = one[1] - c = nil - d = one[1] - local e = two - local x = one - local y - y = two[1] - local xx, yy = 1, 2 - do - local _obj_0 = { - xx, - yy - } - yy, xx = _obj_0[1], _obj_0[2] - end - local f, g - do - local _obj_0 = tbl - a, b, c, d, e, f, g = _obj_0[1], _obj_0.b, _obj_0[2], _obj_0.d, _obj_0[3], _obj_0.f, _obj_0[4] - end -end -do - local futurists = { - sculptor = "Umberto Boccioni", - painter = "Vladimir Burliuk", - poet = { - name = "F.T. Marinetti", - address = { - "Via Roma 42R", - "Bellagio, Italy 22021" - } - } - } - local name, street, city - name, street, city = futurists.poet.name, futurists.poet.address[1], futurists.poet.address[2] -end -do - self.world = x[1] - do - local _obj_0 = x - a.b, c.y, func().z = _obj_0[1], _obj_0[2], _obj_0[3] - end - self.world = x.world -end -do - local thing = { - { - 1, - 2 - }, - { - 3, - 4 - } - } - for _index_0 = 1, #thing do - local _des_0 = thing[_index_0] - local x, y - x, y = _des_0[1], _des_0[2] - print(x, y) - end -end -do - do - local _with_0 = thing - local a, b - a, b = _with_0[1], _with_0[2] - print(a, b) - end -end -do - local thing = nil - do - local _des_0 = thing - if _des_0 then - local a - a = _des_0[1] - print(a) - else - print("nothing") - end - end - local thang = { - 1, - 2 - } - do - local _des_0 = thang - if _des_0 then - local a, b - a, b = _des_0[1], _des_0[2] - print(a, b) - end - end - do - local _des_0 = thing - if _des_0 then - local a, b - a, b = _des_0[1], _des_0[2] - print(a, b) - else - do - local _des_1 = thang - if _des_1 then - local c, d - c, d = _des_1[1], _des_1[2] - print(c, d) - else - print("NO") - end - end - end - end -end -do - local z = "yeah" - local a, b, c - a, b, c = z[1], z[2], z[3] -end -do - local a, b, c - do - local _obj_0 = z - a, b, c = _obj_0[1], _obj_0[2], _obj_0[3] - end -end -local _ -_ = function(z) - local a, b, c - a, b, c = z[1], z[2], z[3] -end -do - local z = "oo" - return function(k) - local a, b, c - a, b, c = z[1], z[2], z[3] - end -end \ No newline at end of file diff --git a/spec/outputs/do.lua b/spec/outputs/do.lua deleted file mode 100644 index bfd7090b..00000000 --- a/spec/outputs/do.lua +++ /dev/null @@ -1,48 +0,0 @@ -do - print("hello") - print("world") -end -local x -do - print("hello") - x = print("world") -end -local y -do - local things = "shhh" - y = function() - return "hello: " .. things - end -end -local _ -_ = function() - if something then - do - return "yeah" - end - end -end -local t = { - y = (function() - local number = 100 - return function(x) - return x + number - end - end)() -} -return function(y, k) - if y == nil then - y = ((function() - x = 10 + 2 - return x - end)()) - end - if k == nil then - do - k = "nothing" - end - end - do - return "uhhh" - end -end \ No newline at end of file diff --git a/spec/outputs/export.lua b/spec/outputs/export.lua deleted file mode 100644 index 08fb4ce8..00000000 --- a/spec/outputs/export.lua +++ /dev/null @@ -1,88 +0,0 @@ -do - a, b, c = 223, 343 - cool = "dad" -end -do - do - local _class_0 - local _base_0 = { - umm = "cool" - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Something" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - Something = _class_0 - end -end -do - local d - a, b, c, d = "hello" -end -do - local What - if this then - What = 232 - else - What = 4343 - end - local another = 3434 - Another = 7890 - if inner then - local Yeah = "10000" - end - if this then - What = 232 - else - What = 4343 - end -end -do - if this then - What = 232 - else - What = 4343 - end - x, y, z = 1, 2, 3 - y = function() - local hallo = 3434 - end - do - local j = 2000 - end -end -do - x = 3434 - if y then - x = 10 - end -end -do - if y then - local x = 10 - end - x = 3434 -end -do - do - k = 1212 - do - local h = 100 - end - y = function() - local h = 100 - k = 100 - end - end - local h = 100 -end \ No newline at end of file diff --git a/spec/outputs/funcs.lua b/spec/outputs/funcs.lua deleted file mode 100644 index f5e2cf3c..00000000 --- a/spec/outputs/funcs.lua +++ /dev/null @@ -1,210 +0,0 @@ -local x -x = function() - return print(what) -end -local _ -_ = function() end -_ = function() - return function() - return function() end - end -end -go(to(the(barn))) -open(function() - return the(function() - return door - end) -end) -open(function() - the(door) - local hello - hello = function() - return my(func) - end -end) -local h -h = function() - return hi -end -eat(function() end, world); -(function() end)() -x = function(...) end -hello() -hello.world() -_ = hello().something -_ = what()["ofefe"] -what()(the()(heck())) -_ = function(a, b, c, d, e) end -_ = function(a, a, a, a, a) - return print(a) -end -_ = function(x) - if x == nil then - x = 23023 - end -end -_ = function(x) - if x == nil then - x = function(y) - if y == nil then - y = function() end - end - end - end -end -_ = function(x) - if x == nil then - if something then - x = yeah - else - x = no - end - end -end -local something -something = function(hello, world) - if hello == nil then - hello = 100 - end - if world == nil then - world = function(x) - if x == nil then - x = [[yeah cool]] - end - return print("eat rice") - end - end - return print(hello) -end -_ = function(self, x, y) end -_ = function(self, x, y) - self.x, self.y = x, y -end -_ = function(self, x) - if x == nil then - x = 1 - end -end -_ = function(self, x, y, z) - if x == nil then - x = 1 - end - if z == nil then - z = "hello world" - end - self.x, self.z = x, z -end -x(function() end) -y(function() - return 1 -end) -z(function() - return 1, "hello", "world" -end) -k(function() - if yes then - return - else - return - end -end) -_ = function() - if something then - return real_name - end -end -d(function() - return print("hello world") -end, 10) -d(1, 2, 3, 4, 5, 6, (function() - if something then - print("okay") - return 10 - end -end)(), 10, 20) -f()()(what)(function() - return print("srue") -end, 123) -x = function(a, b) - return print("what") -end -local y -y = function(a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -local z -z = function(a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -local j -j = function(f, g, m, a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -y = function(a, b, ...) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -y = function(a, b, ...) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -local args -args = function(a, b) - return print("what") -end -args = function(a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -args = function(a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -args = function(f, g, m, a, b) - if a == nil then - a = "hi" - end - if b == nil then - b = 23 - end - return print("what") -end -return nil \ No newline at end of file diff --git a/spec/outputs/import.lua b/spec/outputs/import.lua deleted file mode 100644 index 4c6520eb..00000000 --- a/spec/outputs/import.lua +++ /dev/null @@ -1,77 +0,0 @@ -local hello -hello = yeah.hello -local world -do - local _obj_0 = table["cool"] - hello, world = _obj_0.hello, _obj_0.world -end -local a, b, c -do - local _obj_0 = items - a, b, c = _obj_0.a, (function() - local _base_0 = _obj_0 - local _fn_0 = _base_0.b - return function(...) - return _fn_0(_base_0, ...) - end - end)(), _obj_0.c -end -local master, ghost -do - local _obj_0 = find("mytable") - master, ghost = _obj_0.master, (function() - local _base_0 = _obj_0 - local _fn_0 = _base_0.ghost - return function(...) - return _fn_0(_base_0, ...) - end - end)() -end -local yumm -a, yumm = 3434, "hello" -local _table_0 = 232 -local something -something = a(table).something -if indent then - local okay, well - do - local _obj_0 = tables[100] - okay, well = _obj_0.okay, (function() - local _base_0 = _obj_0 - local _fn_0 = _base_0.well - return function(...) - return _fn_0(_base_0, ...) - end - end)() - end -end -do - do - local _obj_0 = z - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end -do - do - local _obj_0 = z - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end -do - do - local _obj_0 = z - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end -do - do - local _obj_0 = z - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end -do - do - local _obj_0 = z - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end \ No newline at end of file diff --git a/spec/outputs/lists.lua b/spec/outputs/lists.lua deleted file mode 100644 index abb167eb..00000000 --- a/spec/outputs/lists.lua +++ /dev/null @@ -1,263 +0,0 @@ -local hi -do - local _accum_0 = { } - local _len_0 = 1 - for _, x in ipairs({ - 1, - 2, - 3, - 4 - }) do - _accum_0[_len_0] = x * 2 - _len_0 = _len_0 + 1 - end - hi = _accum_0 -end -local items = { - 1, - 2, - 3, - 4, - 5, - 6 -} -for z in ipairs(items) do - if z > 4 then - local _ = z - end -end -local rad -do - local _accum_0 = { } - local _len_0 = 1 - for a in ipairs({ - 1, - 2, - 3, - 4, - 5, - 6 - }) do - if good_number(a) then - _accum_0[_len_0] = { - a - } - _len_0 = _len_0 + 1 - end - end - rad = _accum_0 -end -for z in items do - for j in list do - if z > 4 then - local _ = z - end - end -end -require("util") -local dump -dump = function(x) - return print(util.dump(x)) -end -local range -range = function(count) - local i = 0 - return coroutine.wrap(function() - while i < count do - coroutine.yield(i) - i = i + 1 - end - end) -end -dump((function() - local _accum_0 = { } - local _len_0 = 1 - for x in range(10) do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end)()) -dump((function() - local _accum_0 = { } - local _len_0 = 1 - for x in range(5) do - if x > 2 then - for y in range(5) do - _accum_0[_len_0] = { - x, - y - } - _len_0 = _len_0 + 1 - end - end - end - return _accum_0 -end)()) -local things -do - local _accum_0 = { } - local _len_0 = 1 - for x in range(10) do - if x > 5 then - for y in range(10) do - if y > 7 then - _accum_0[_len_0] = x + y - _len_0 = _len_0 + 1 - end - end - end - end - things = _accum_0 -end -for x in ipairs({ - 1, - 2, - 4 -}) do - for y in ipairs({ - 1, - 2, - 3 - }) do - if x ~= 2 then - print(x, y) - end - end -end -for x in items do - print("hello", x) -end -for x in x do - local _ = x -end -local x -do - local _accum_0 = { } - local _len_0 = 1 - for x in x do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -for x in ipairs({ - 1, - 2, - 4 -}) do - for y in ipairs({ - 1, - 2, - 3 - }) do - if x ~= 2 then - print(x, y) - end - end -end -local double -do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #items do - local x = items[_index_0] - _accum_0[_len_0] = x * 2 - _len_0 = _len_0 + 1 - end - double = _accum_0 -end -for _index_0 = 1, #double do - local x = double[_index_0] - print(x) -end -local cut -do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #items do - local x = items[_index_0] - if x > 3 then - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - end - cut = _accum_0 -end -local hello -do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #items do - local x = items[_index_0] - for _index_1 = 1, #items do - local y = items[_index_1] - _accum_0[_len_0] = x + y - _len_0 = _len_0 + 1 - end - end - hello = _accum_0 -end -for _index_0 = 1, #hello do - local z = hello[_index_0] - print(z) -end -x = { - 1, - 2, - 3, - 4, - 5, - 6, - 7 -} -local _max_0 = -5 -for _index_0 = 2, _max_0 < 0 and #x + _max_0 or _max_0, 2 do - local y = x[_index_0] - print(y) -end -local _max_1 = 3 -for _index_0 = 1, _max_1 < 0 and #x + _max_1 or _max_1 do - local y = x[_index_0] - print(y) -end -for _index_0 = 2, #x do - local y = x[_index_0] - print(y) -end -for _index_0 = 1, #x, 2 do - local y = x[_index_0] - print(y) -end -for _index_0 = 2, #x, 2 do - local y = x[_index_0] - print(y) -end -local a, b, c = 1, 5, 2 -local _max_2 = b -for _index_0 = a, _max_2 < 0 and #x + _max_2 or _max_2, c do - local y = x[_index_0] - print(y) -end -local normal -normal = function(hello) - local _accum_0 = { } - local _len_0 = 1 - for x in yeah do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end -local test = x(1, 2, 3, 4, 5) -for _index_0 = 1, #test do - local thing = test[_index_0] - print(thing) -end -return function() - local _list_0 = rows - for _index_0 = 1, #_list_0 do - local row = _list_0[_index_0] - a = b - end -end \ No newline at end of file diff --git a/spec/outputs/literals.lua b/spec/outputs/literals.lua deleted file mode 100644 index d8fc7e2b..00000000 --- a/spec/outputs/literals.lua +++ /dev/null @@ -1,26 +0,0 @@ -local _ = 121 -_ = 121.2323 -_ = 121.2323e-1 -_ = 121.2323e13434 -_ = 2323E34 -_ = 0x12323 -_ = 0xfF2323 -_ = 0xabcdef -_ = 0xABCDEF -_ = .2323 -_ = .2323e-1 -_ = .2323e13434 -_ = 1LL -_ = 1ULL -_ = 9332LL -_ = 9332 -_ = 0x2aLL -_ = 0x2aULL -_ = [[ hello world ]] -_ = [=[ hello world ]=] -_ = [====[ hello world ]====] -_ = "another world" -_ = 'what world' -_ = "\nhello world\n" -_ = 'yeah\nwhat is going on\nhere is something cool' -return nil \ No newline at end of file diff --git a/spec/outputs/local.lua b/spec/outputs/local.lua deleted file mode 100644 index 3ee8623e..00000000 --- a/spec/outputs/local.lua +++ /dev/null @@ -1,147 +0,0 @@ -do - local a - local a, b, c - local g - b, g = 23232 -end -do - local x = 1212 - local something - something = function() - local x - x = 1212 - end -end -do - local y, z - y = 2323 - z = 2323 -end -do - print("Nothing Here!") -end -do - local X, Y - local x = 3434 - local y = 3434 - X = 3434 - Y = "yeah" -end -do - local x, y = "a", "b" -end -do - local x, y - x, y = "a", "b" -end -do - if something then - local x = 2323 - end -end -do - local x - do - x = "one" - end - x = 100 - do - x = "two" - end -end -do - local k, x, a, b, c - if what then - k = 10 - end - x = 100 - do - local _obj_0 = y - a, b, c = _obj_0.a, _obj_0.b, _obj_0.c - end -end -do - local a, b, c, d - a = 100 - print("hi") - b = 200 - c = 100 - print("hi") - d = 200 - d = 2323 -end -do - local Uppercase, One, Two - local lowercase = 5 - Uppercase = 3 - do - local _class_0 - local Five - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "One" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - Five = 6 - One = _class_0 - end - do - local _class_0 - local No - local _base_0 = { } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Two" - }, { - __index = _base_0, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_0) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_0.__class = _class_0 - local self = _class_0 - do - local _class_1 - local _base_1 = { } - _base_1.__index = _base_1 - _class_1 = setmetatable({ - __init = function() end, - __base = _base_1, - __name = "No" - }, { - __index = _base_1, - __call = function(cls, ...) - local _self_0 = setmetatable({}, _base_1) - cls.__init(_self_0, ...) - return _self_0 - end - }) - _base_1.__class = _class_1 - No = _class_1 - end - Two = _class_0 - end -end -do - local _list_0 = { } - for _index_0 = 1, #_list_0 do - local a = _list_0[_index_0] - local _ = a - end -end -local g = 2323 \ No newline at end of file diff --git a/spec/outputs/loops.lua b/spec/outputs/loops.lua deleted file mode 100644 index 57fe40be..00000000 --- a/spec/outputs/loops.lua +++ /dev/null @@ -1,306 +0,0 @@ -for x = 1, 10 do - print("yeah") -end -for x = 1, #something do - print("yeah") -end -for y = 100, 60, -3 do - print("count down", y) -end -for a = 1, 10 do - print("okay") -end -for a = 1, 10 do - for b = 2, 43 do - print(a, b) - end -end -for i in iter do - for j in yeah do - local x = 343 + i + j - print(i, j) - end -end -local _list_0 = something -for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - print(x) -end -for k, v in pairs(hello) do - print(k, v) -end -for x in y,z do - print(x) -end -for x in y,z,k do - print(x) -end -local x -x = function() - for x in y do - local _ = y - end -end -local hello = { - 1, - 2, - 3, - 4, - 5 -} -do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #hello do - local y = hello[_index_0] - if y % 2 == 0 then - _accum_0[_len_0] = y - end - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -x = function() - for _index_0 = 1, #hello do - local x = hello[_index_0] - local _ = y - end -end -local t -do - local _accum_0 = { } - local _len_0 = 1 - for i = 10, 20 do - _accum_0[_len_0] = i * 2 - _len_0 = _len_0 + 1 - end - t = _accum_0 -end -local hmm = 0 -local y -do - local _accum_0 = { } - local _len_0 = 1 - for j = 3, 30, 8 do - hmm = hmm + 1 - local _value_0 = j * hmm - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - y = _accum_0 -end -local _ -_ = function() - for k = 10, 40 do - _ = "okay" - end -end -_ = function() - return (function() - local _accum_0 = { } - local _len_0 = 1 - for k = 10, 40 do - _accum_0[_len_0] = "okay" - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() -end -while true do - print("name") -end -while 5 + 5 do - print("okay world") - working(man) -end -while also do - i(work(too)) - _ = "okay" -end -local i = 0 -do - local _accum_0 = { } - local _len_0 = 1 - while i < 10 do - local _value_0 - i = i + 1 - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -do - local _accum_0 = { } - local _len_0 = 1 - local _list_1 = 3 - for _index_0 = 1, #_list_1 do - local thing = _list_1[_index_0] - local _value_0 - y = "hello" - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -do - local _accum_0 = { } - local _len_0 = 1 - for x = 1, 2 do - local _value_0 - y = "hello" - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - end - x = _accum_0 -end -while true do - local _continue_0 = false - repeat - if false then - _continue_0 = true - break - end - print("yes") - if true then - break - end - print("no") - _continue_0 = true - until true - if not _continue_0 then - break - end -end -for x = 1, 10 do - local _continue_0 = false - repeat - if x > 3 and x < 7 then - _continue_0 = true - break - end - print(x) - _continue_0 = true - until true - if not _continue_0 then - break - end -end -local list -do - local _accum_0 = { } - local _len_0 = 1 - for x = 1, 10 do - local _continue_0 = false - repeat - if x > 3 and x < 7 then - _continue_0 = true - break - end - local _value_0 = x - _accum_0[_len_0] = _value_0 - _len_0 = _len_0 + 1 - _continue_0 = true - until true - if not _continue_0 then - break - end - end - list = _accum_0 -end -local _list_1 = { - 1, - 2, - 3, - 4, - 5, - 6 -} -for _index_0 = 1, #_list_1 do - local _continue_0 = false - repeat - local a = _list_1[_index_0] - if a == 1 then - _continue_0 = true - break - end - if a == 3 then - _continue_0 = true - break - end - print(a) - _continue_0 = true - until true - if not _continue_0 then - break - end -end -for x = 1, 10 do - local _continue_0 = false - repeat - if x % 2 == 0 then - _continue_0 = true - break - end - for y = 2, 12 do - local _continue_1 = false - repeat - if y % 3 == 0 then - _continue_1 = true - break - end - _continue_1 = true - until true - if not _continue_1 then - break - end - end - _continue_0 = true - until true - if not _continue_0 then - break - end -end -while true do - local _continue_0 = false - repeat - do - if false then - _continue_0 = true - break - end - break - end - _continue_0 = true - until true - if not _continue_0 then - break - end -end -while true do - local _continue_0 = false - repeat - do - if false then - _continue_0 = true - break - end - return 22 - end - _continue_0 = true - until true - if not _continue_0 then - break - end -end -do - local xxx = { - 1, - 2, - 3, - 4 - } - for _index_0 = 1, #xxx do - local thing = xxx[_index_0] - print(thing) - end -end \ No newline at end of file diff --git a/spec/outputs/operators.lua b/spec/outputs/operators.lua deleted file mode 100644 index 9829ef57..00000000 --- a/spec/outputs/operators.lua +++ /dev/null @@ -1,29 +0,0 @@ -local x = 1 + 3 -local y = 1 + 3 -local z = 1 + 3 + 4 -local k = b and c and g -local h = thing and function() - return print("hello world") -end -local i = thing or function() - return print("hello world") -end -local p = thing and function() end -print("hello world") -local s = thing or function() end and 234 -local u = { - color = 1 and 2 and 3, - 4, - 4 -} -local v = { - color = 1 and function() - return "yeah" - end, - "great", - oksy = 3 ^ 2 -} -local nno = (yeah + 2) -local nn = (yeah + 2) -local n = hello(b)(function() end) -return hello(a, (yeah + 2) - okay) \ No newline at end of file diff --git a/spec/outputs/return.lua b/spec/outputs/return.lua deleted file mode 100644 index 4eeaca20..00000000 --- a/spec/outputs/return.lua +++ /dev/null @@ -1,102 +0,0 @@ -local _ -_ = function() - local _list_0 = things - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _ = x - end -end -_ = function() - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = things - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end -do - local _list_0 = things - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - return x - end -end -do - local _accum_0 = { } - local _len_0 = 1 - local _list_0 = things - for _index_0 = 1, #_list_0 do - local x = _list_0[_index_0] - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end -do - local _tbl_0 = { } - local _list_0 = things - for _index_0 = 1, #_list_0 do - local x, y = _list_0[_index_0] - _tbl_0[x] = y - end - return _tbl_0 -end -_ = function() - if a then - if a then - return a - else - return b - end - elseif b then - if a then - return a - else - return b - end - else - if a then - return a - else - return b - end - end -end -do - if a then - if a then - return a - else - return b - end - elseif b then - if a then - return a - else - return b - end - else - if a then - return a - else - return b - end - end -end -_ = function() - local _base_0 = a - local _fn_0 = _base_0.b - return function(...) - return _fn_0(_base_0, ...) - end -end -do - local _base_0 = a - local _fn_0 = _base_0.b - return function(...) - return _fn_0(_base_0, ...) - end -end \ No newline at end of file diff --git a/spec/outputs/string.lua b/spec/outputs/string.lua deleted file mode 100644 index a928c5d3..00000000 --- a/spec/outputs/string.lua +++ /dev/null @@ -1,37 +0,0 @@ -local hi = "hello" -local hello = "what the heckyes" -print(hi) -local umm = 'umm' -local here, another = "yeah", 'world' -local aye = "YU'M" -you('"hmmm" I said') -print(aye, you) -another = [[ hello world ]] -local hi_there = [[ hi there -]] -local well = [==[ "helo" ]==] -local hola = [===[ eat noots]===] -local mm = [[well trhere]] -local oo = "" -local x = "\\" -x = "a\\b" -x = "\\\n" -x = "\"" -local a = "hello " .. tostring(hello) .. " hello" -local b = tostring(hello) .. " hello" -local c = "hello " .. tostring(5 + 1) -local d = tostring(hello(world)) -local e = tostring(1) .. " " .. tostring(2) .. " " .. tostring(3) -local f = [[hello #{world} world]] -a = 'hello #{hello} hello' -b = '#{hello} hello' -c = 'hello #{hello}' -local _ = "hello"; -("hello"):format(1); -("hello"):format(1, 2, 3); -("hello"):format(1, 2, 3)(1, 2, 3); -("hello"):world(); -("hello"):format().hello(1, 2, 3); -("hello"):format(1, 2, 3) -something("hello"):world() -return something(("hello"):world()) \ No newline at end of file diff --git a/spec/outputs/stub.lua b/spec/outputs/stub.lua deleted file mode 100644 index 4ceac088..00000000 --- a/spec/outputs/stub.lua +++ /dev/null @@ -1,23 +0,0 @@ -local x = { - val = 100, - hello = function(self) - return print(self.val) - end -} -local fn -do - local _base_0 = x - local _fn_0 = _base_0.val - fn = function(...) - return _fn_0(_base_0, ...) - end -end -print(fn()) -print(x:val()) -do - local _base_0 = hello(...) - local _fn_0 = _base_0.world - x = function(...) - return _fn_0(_base_0, ...) - end -end \ No newline at end of file diff --git a/spec/outputs/switch.lua b/spec/outputs/switch.lua deleted file mode 100644 index 764c530f..00000000 --- a/spec/outputs/switch.lua +++ /dev/null @@ -1,71 +0,0 @@ -local _exp_0 = value -if "cool" == _exp_0 then - print("hello world") -end -local _exp_1 = value -if "cool" == _exp_1 then - print("hello world") -else - print("okay rad") -end -local _exp_2 = value -if "cool" == _exp_2 then - print("hello world") -elseif "yeah" == _exp_2 then - local _ = [[FFFF]] + [[MMMM]] -elseif (2323 + 32434) == _exp_2 then - print("okay") -else - print("okay rad") -end -local out -local _exp_3 = value -if "cool" == _exp_3 then - out = print("hello world") -else - out = print("okay rad") -end -local _exp_4 = value -if "cool" == _exp_4 then - out = xxxx -elseif "umm" == _exp_4 then - out = 34340 -else - out = error("this failed big time") -end -do - local _with_0 = something - local _exp_5 = _with_0:value() - if _with_0.okay == _exp_5 then - local _ = "world" - else - local _ = "yesh" - end -end -fix(this) -call_func((function() - local _exp_5 = something - if 1 == _exp_5 then - return "yes" - else - return "no" - end -end)()) -local _exp_5 = hi -if (hello or world) == _exp_5 then - local _ = greene -end -local _exp_6 = hi -if "one" == _exp_6 or "two" == _exp_6 then - print("cool") -elseif "dad" == _exp_6 then - local _ = no -end -local _exp_7 = hi -if (3 + 1) == _exp_7 or hello() == _exp_7 or (function() - return 4 -end)() == _exp_7 then - return yello -else - return print("cool") -end \ No newline at end of file diff --git a/spec/outputs/syntax.lua b/spec/outputs/syntax.lua deleted file mode 100644 index 8667f348..00000000 --- a/spec/outputs/syntax.lua +++ /dev/null @@ -1,262 +0,0 @@ -local a = 1 + 2 * 3 / 6 -local bunch, go, here -a, bunch, go, here = another, world -func(arg1, arg2, another, arg3) -local we -here, we = function() end, yeah -local the, different -the, different = function() - return approach -end, yeah -dad() -dad(lord) -hello(one, two)(); -(5 + 5)(world) -fun(a)(b) -fun(a)(b) -fun(a)(b, bad(hello)) -hello(world(what(are(you(doing(here)))))) -what(the)[3243](world, yeck(heck)) -hairy[hands][are](gross)(okay(okay[world])) -local _ = (get[something] + 5)[years] -local i, x = 200, 300 -local yeah = (1 + 5) * 3 -yeah = ((1 + 5) * 3) / 2 -yeah = ((1 + 5) * 3) / 2 + i % 100 -local whoa = (1 + 2) * (3 + 4) * (4 + 5) -_ = function() - if something then - return 1, 2, 4 - end - return print("hello") -end -_ = function() - if hello then - return "heloo", "world" - else - return no, way - end -end -_ = function() - return 1, 2, 34 -end -return 5 + function() - return 4 + 2 -end -return 5 + (function() - return 4 -end) + 2 -print(5 + function() - _ = 34 - return good(nads) -end) -something('else', "ya") -something('else') -something("else") -_ = something([[hey]]) * 2 -_ = something([======[hey]======]) * 2 -_ = something('else'), 2 -_ = something("else"), 2 -_ = something([[else]]), 2 -something('else', 2) -something("else", 2) -something([[else]], 2) -_ = here(we)("go")[12123] -local something = { - test = 12323, - what = function() - return print("hello world") - end -} -print(something.test) -local frick = { - hello = "world" -} -local argon = { - num = 100, - world = function(self) - print(self.num) - return { - something = function() - return print("hi from something") - end - } - end, - somethin = function(self, str) - print("string is", str) - return { - world = function(a, b) - return print("sum", a + b) - end - } - end -} -something.what() -argon:world().something() -argon:somethin("200").world(1, 2) -x = -434 -x = -hello(world(one(two))) -local hi = -"herfef" -x = -(function() - local _accum_0 = { } - local _len_0 = 1 - for x in x do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 -end)() -if cool then - print("hello") -end -if not (cool) then - print("hello") -end -if not (1212 and 3434) then - print("hello") -end -for i = 1, 10 do - print("hello") -end -print("nutjob") -if hello then - _ = 343 -end -if cool then - print("what") -else - _ = whack -end -local arg = { - ... -} -x = function(...) - return dump({ - ... - }) -end -x = not true -local y = not (5 + 5) -y = #"hello" -x = #{ - #{ }, - #{ - 1 - }, - #{ - 1, - 2 - } -} -_ = hello, world -something:hello(what)(a, b) -something:hello(what) -something.hello:world(a, b) -something.hello:world(1, 2, 3)(a, b) -x = 1232 -x = x + (10 + 3) -local j = j - "hello" -y = y * 2 -y = y / 100 -local m = m % 2 -local hello = hello .. "world" -self.__class.something = self.__class.something + 10 -self.something = self.something + 10 -self.__class["then"] = self.__class["then"] + 10 -self["then"] = self["then"] + 10 -local _update_0 = "hello" -a[_update_0] = a[_update_0] + 10 -local _update_1 = "hello" .. tostring(tostring(ff)) -a[_update_1] = a[_update_1] + 10 -local _update_2 = four -a[_update_2].x = a[_update_2].x + 10 -x = 0 -local _list_0 = values -for _index_0 = 1, #_list_0 do - local v = _list_0[_index_0] - _ = ((function() - if ntype(v) == "fndef" then - x = x + 1 - end - end)()) -end -hello = { - something = world, - ["if"] = "hello", - ["else"] = 3434, - ["function"] = "okay", - good = 230203 -} -div({ - class = "cool" -}) -_ = 5 + what(wack) -what(whack + 5) -_ = 5 - what(wack) -what(whack - 5) -x = hello - world - something; -(function(something) - if something == nil then - do - local _with_0 = what - _with_0:cool(100) - something = _with_0 - end - end - return print(something) -end)() -if something then - _ = 03589 -else - _ = 3434 -end -if something then - _ = yeah -elseif "ymmm" then - print("cool") -else - _ = okay -end -x = notsomething -y = ifsomething -local z = x and b -z = x(andb) -while 10 > something({ - something = "world" -}) do - print("yeah") -end -x = { - okay = sure -} -yeah({ - okay = man, - sure = sir -}) -hello("no comma", { - yeah = dada, - another = world -}) -hello("comma", { - something = hello_world, - frick = you -}) -another(hello, one, two, three, four, { - yeah = man -}, { - okay = yeah -}) -a = a + (3 - 5) -a = a * (3 + 5) -a = a * 3 -a = a >> 3 -a = a << 3 -a = a / func("cool") -x["then"] = "hello" -x["while"]["true"] = "hello" -x = x or "hello" -x = x and "hello" -z = a - b -z = a(-b) -z = a - b -z = a - b \ No newline at end of file diff --git a/spec/outputs/tables.lua b/spec/outputs/tables.lua deleted file mode 100644 index b6a4f587..00000000 --- a/spec/outputs/tables.lua +++ /dev/null @@ -1,206 +0,0 @@ -local backpack = { - something = { - yeah = 200, - they = function() - print("hello") - return yor_feet("small") - end, - pretty = hair, - gold = hmm - }, - yow = 1000, - eat = goo, - yeah = dudd -} -local start = { - something = "cold" -} -local bathe = { - on = "fire" -} -local another = { - [4] = 232, - ["good food"] = "is the best" -} -local fwip = { - something = hello("what"), - number = 2323, - what = yo("momma", "yeah"), - fruit = basket, - nuts = day -} -local frick = { - hello = "world" -} -local frack, best = { - hello = "world", - rice = 3434 -}, "what" -local ya = { - 1, - 2, - 3, - key = 100, - 343, - "hello", - umm = 232 -} -local x = { - 1, - 2, - 4343, - 343, - 343 -} -local g, p = { - 1, - 2, - nowy = "yes", - 3, - 4, - hey = 232, - another = "day" -}, 234 -local annother = { - 1, - 2, - 3, - 3, - 4, - 5, - 6, - 7, - 8 -} -local yeah = { - [232] = 3434, - "helo", - ice = "cake" -} -local whatabout = { - hello(world, another), - what, - about, - now, - hello("world"), - yeah, - hello("world", yeah) -} -x = { - something = function(self) - return "hello" - end, - cool = { - bed = { - 2323, - 2323 - }, - red = 2343 - }, - name = function(self, node) - return self:value(node) - end -} -x = { - something = something, - something = something -} -local y = { - hi = hi, - there = there, - how = how, - you = you, - thing = thing -} -call_me("hello", { - x = x, - y = y, - z = z -}) -local t = { - a = 'a', - [b] = 'b' -} -local xam = { - hello = 1234, - ["hello"] = 12354, - ["hello"] = 12354 -} -local kam = { - hello = 12, - goodcheese = "mmm", - yeah = 12 + 232, - lets = keepit({ - going = true - }, { - okay = "yeah" - }), - more = { - 1, - (function() - local _accum_0 = { } - local _len_0 = 1 - for x = 1, 10 do - _accum_0[_len_0] = x - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() - }, - [{ - "one", - "two" - }] = one_thing(function(self) end) -} -keepit({ - going = true -}, { - okay = "yeah", - workd = "okay" -}) -thing({ - what = "great", - no = "more" -}, { - okay = 123 -}) -thing({ - what = "great", - no = "more" -}) -local _ = { - okay = 123 -} -local k = { - ["hello"] = "world" -} -k = { - ['hello'] = 'world' -} -k = { - ["hello"] = 'world', - ["hat"] = "zat" -} -please({ - ["hello"] = "world" -}) -k = { - ["hello"] = "world", - ["one"] = "zone" -} -local f = "one", { - ["two"] = three -}, "four" -f = { - ["two"] = three -}, "four" -f = { - "one", - ["two"] = three, - "four" -} -local j = "one", { - ["two"] = three, - ["four"] = five -}, 6, 7 -return nil \ No newline at end of file diff --git a/spec/outputs/unless_else.lua b/spec/outputs/unless_else.lua deleted file mode 100644 index f05e7517..00000000 --- a/spec/outputs/unless_else.lua +++ /dev/null @@ -1,7 +0,0 @@ -if a then - if not (b) then - return print("hi") - elseif c then - return print("not hi") - end -end \ No newline at end of file diff --git a/spec/outputs/using.lua b/spec/outputs/using.lua deleted file mode 100644 index 6111d284..00000000 --- a/spec/outputs/using.lua +++ /dev/null @@ -1,20 +0,0 @@ -local hello = "hello" -local world = "world" -local _ -_ = function() - local hello = 3223 -end -_ = function(a) - local hello = 3223 - a = 323 -end -_ = function(a, b, c) - a, b, c = 1, 2, 3 - local world = 12321 -end -return function(a, e, f) - local b, c - a, b, c = 1, 2, 3 - hello = 12321 - local world = "yeah" -end \ No newline at end of file diff --git a/spec/outputs/whitespace.lua b/spec/outputs/whitespace.lua deleted file mode 100644 index c112a055..00000000 --- a/spec/outputs/whitespace.lua +++ /dev/null @@ -1,80 +0,0 @@ -local _ = { - 1, - 2 -} -_ = { - 1, - 2 -} -_ = { - 1, - 2 -} -_ = { - 1, - 2 -} -_ = { - 1, - 2 -} -_ = { - something(1, 2, 4, 5, 6), - 3, - 4, - 5 -} -_ = { - a(1, 2, 3), - 4, - 5, - 6, - 1, - 2, - 3 -} -_ = { - b(1, 2, 3, 4, 5, 6), - 1, - 2, - 3, - 1, - 2, - 3 -} -_ = { - 1, - 2, - 3 -} -_ = { - c(1, 2, 3) -} -hello(1, 2, 3, 4, 1, 2, 3, 4, 4, 5) -x(1, 2, 3, 4, 5, 6) -hello(1, 2, 3, world(4, 5, 6, 5, 6, 7, 8)) -hello(1, 2, 3, world(4, 5, 6, 5, 6, 7, 8), 9, 9) -_ = { - hello(1, 2), - 3, - 4, - 5, - 6 -} -local x = { - hello(1, 2, 3, 4, 5, 6, 7), - 1, - 2, - 3, - 4 -} -if hello(1, 2, 3, world, world) then - print("hello") -end -if hello(1, 2, 3, world, world) then - print("hello") -end -a(one, two, three) -b(one, two, three) -c(one, two, three, four) -return nil \ No newline at end of file diff --git a/spec/outputs/with.lua b/spec/outputs/with.lua deleted file mode 100644 index 3b2eec3b..00000000 --- a/spec/outputs/with.lua +++ /dev/null @@ -1,172 +0,0 @@ -do - local a - a = function() - do - local _with_0 = something - print(_with_0.hello) - print(hi) - print("world") - return _with_0 - end - end -end -do - do - local _with_0 = leaf - _with_0.world() - _with_0.world(1, 2, 3) - local g = _with_0.what.is.this - _with_0.hi(1, 2, 3) - _with_0:hi(1, 2).world(2323) - _with_0:hi("yeah", "man") - _with_0.world = 200 - end -end -do - local zyzyzy - do - local _with_0 = something - _with_0.set_state("hello world") - zyzyzy = _with_0 - end -end -do - local x = 5 + (function() - do - local _with_0 = Something() - _with_0:write("hello world") - return _with_0 - end - end)() -end -do - local x = { - hello = (function() - do - local _with_0 = yeah - _with_0:okay() - return _with_0 - end - end)() - } -end -do - do - local _with_0 = foo - local _ = _with_0:prop("something").hello - _with_0.prop:send(one) - _with_0.prop:send(one) - end -end -do - do - local _with_0 = a, b - print(_with_0.world) - end - local mod - do - local _M = { } - _M.Thing = "hi" - mod = _M - end - do - local a, b = something, pooh - print(a.world) - end - local x - do - local a, b = 1, 2 - print(a + b) - x = a - end - print((function() - do - local a, b = 1, 2 - print(a + b) - return a - end - end)()) - local p - do - local _with_0 = 1 - hello().x, world().y = _with_0, 2 - print(a + b) - p = _with_0 - end -end -do - local x = "hello" - do - x:upper() - end -end -do - do - local k = "jo" - print(k:upper()) - end -end -do - do - local a, b, c = "", "", "" - print(a:upper()) - end -end -do - local a = "bunk" - do - local b, c - a, b, c = "", "", "" - print(a:upper()) - end -end -do - do - local _with_0 = j - print(_with_0:upper()) - end -end -do - do - local _with_0 = "jo" - k.j = _with_0 - print(_with_0:upper()) - end -end -do - do - local _with_0 = a - print(_with_0.b) - do - local _with_1 = _with_0.c - print(_with_1.d) - end - end -end -do - do - local _with_0 = a - do - local _with_1 = 2 - _with_0.b = _with_1 - print(_with_1.c) - end - end -end -do - local _ - _ = function() - do - local _with_0 = hi - return _with_0.a, _with_0.b - end - end -end -do - do - local _with_0 = dad - _with_0["if"]("yes") - local y = _with_0["end"].of["function"] - return _with_0 - end -end \ No newline at end of file diff --git a/spec/transform_spec.moon b/spec/transform_spec.moon deleted file mode 100644 index 9bb06a92..00000000 --- a/spec/transform_spec.moon +++ /dev/null @@ -1,257 +0,0 @@ - -import with_dev from require "spec.helpers" - - -describe "moonscript.transform.destructure", -> - local extract_assign_names, split_assign, Block - - with_dev -> - { :extract_assign_names, :split_assign } = require "moonscript.transform.destructure" - {:Block} = require "moonscript.compile" - - describe "split_assign #fff", -> - -- {:hello} = world - it "simple assignment", -> - node = { - "assign" - { - { "table", { - {{"key_literal", "hello"}, {"ref", "hello"}} - } - } - } - { - {"ref", "world"} - } - } - - out = split_assign Block!, node - - assert.same { "group", { - { "group", { - { "declare", { {"ref", "hello"} } } - { "assign", { {"ref", "hello"} }, { {"chain", {"ref", "world"}, {"dot", "hello"}} } } - }} - }}, out - - -- {:a, :b} = world! - -- a complex value should never be repeated to avoid double execution - it "complex value", -> - node = { - "assign" - { - { "table", { - {{"key_literal", "a"}, {"ref", "a"}} - {{"key_literal", "b"}, {"ref", "b"}} - } - } - } - { - {"chain", {"ref", "world"}, {"call", {}}} - } - } - - out = split_assign Block!, node - - -- the temp name the result is stored into - tmp = {"temp_name", prefix: "obj"} - - assert.same { "group", { - { "group", { - { "declare", { {"ref", "a"}, {"ref", "b"} } } - - { "do", { - {"assign", { tmp }, { {"chain", {"ref", "world"}, {"call", {}}} } } - {"assign", { {"ref", "a"}, {"ref", "b"} }, { {"chain", tmp, {"dot", "a"}}, {"chain", tmp, {"dot", "b"}} } } - }} - }} - }}, out - - -- a, {:hello} = one, two - it "multiple assigns", -> - node = { - "assign" - { - {"ref", "a"} - { "table", { - {{"key_literal", "hello"}, {"ref", "hello"}} - } - } - } - { - {"ref", "one"} - {"ref", "two"} - } - } - - out = split_assign Block!, node - - assert.same { "group", { - {"assign", { {"ref", "a"} }, { {"ref", "one"} }} - - { "group", { - { "declare", { {"ref", "hello"} } } - { "assign", { {"ref", "hello"} }, { {"chain", {"ref", "two"}, {"dot", "hello"}} } } - }} - }}, out - - -- {:hello}, a = one, two - it "multiple assigns swapped", -> - node = { - "assign" - { - { "table", { - {{"key_literal", "hello"}, {"ref", "hello"}} - } - } - {"ref", "a"} - } - { - {"ref", "one"} - {"ref", "two"} - } - } - - out = split_assign Block!, node - - assert.same { "group", { - { "group", { - { "declare", { {"ref", "hello"} } } - { "assign", { {"ref", "hello"} }, { {"chain", {"ref", "one"}, {"dot", "hello"}} } } - }} - - {"assign", { {"ref", "a"} }, { {"ref", "two"} }} - }}, out - - - it "extracts names from table destructure", -> - des = { - "table" - { - {{"key_literal", "hi"}, {"ref", "hi"}} - {{"key_literal", "world"}, {"ref", "world"}} - } - } - - assert.same { - { - {"ref", "hi"} -- target - { - {"dot", "hi"} - } -- chain suffix - } - - { - {"ref", "world"} - { - {"dot", "world"} - } - } - - }, extract_assign_names des - - it "extracts names from array destructure", -> - des = { - "table" - { - {{"ref", "hi"}} - } - } - - assert.same { - { - {"ref", "hi"} - { - {"index", {"number", 1}} - } - } - }, extract_assign_names des - -describe "moonscript.transform.statements", -> - local last_stm, transform_last_stm, Run - - with_dev -> - { :last_stm, :transform_last_stm, :Run } = require "moonscript.transform.statements" - - describe "last_stm", -> - it "gets last statement from empty list", -> - assert.same nil, (last_stm {}) - - it "gets last statement", -> - stms = { - {"ref", "butt_world"} - {"ref", "hello_world"} - } - - stm, idx, t = last_stm stms - assert stms[2] == stm - assert.same 2, idx - assert stms == t - - it "gets last statement ignoring run", -> - stms = { - {"ref", "butt_world"} - {"ref", "hello_world"} - Run => print "hi" - } - - stm, idx, t = last_stm stms - assert stms[2] == stm - assert.same 2, idx - assert stms == t - - it "gets last from within group", -> - stms = { - {"ref", "butt_world"} - {"group", { - {"ref", "hello_world"} - {"ref", "cool_world"} - }} - } - - last = stms[2][2][2] - - stm, idx, t = last_stm stms - assert stm == last, "should get last" - assert.same 2, idx - assert t == stms[2][2], "should get correct table" - - describe "transform_last_stm", -> - - it "transforms empty stms", -> - before = {} - after = transform_last_stm before, (n) -> {"wrapped", n} - - assert.same before, after - assert before != after - - it "transforms stms", -> - before = { - {"ref", "butt_world"} - {"ref", "hello_world"} - } - - transformer = (n) -> n - after = transform_last_stm before, transformer - - assert.same { - {"ref", "butt_world"} - {"transform", {"ref", "hello_world"}, transformer} - }, after - - it "transforms empty stms ignoring runs", -> - before = { - {"ref", "butt_world"} - {"ref", "hello_world"} - Run => print "hi" - } - - transformer = (n) -> n - after = transform_last_stm before, transformer - - assert.same { - {"ref", "butt_world"} - {"transform", {"ref", "hello_world"}, transformer} - before[3] - }, after - diff --git a/test.moon b/test.moon new file mode 100644 index 00000000..87b7d511 --- /dev/null +++ b/test.moon @@ -0,0 +1 @@ +print "It works! (#{require("moonscript.version").version})" diff --git a/thoughts b/thoughts deleted file mode 100644 index dfd6b69d..00000000 --- a/thoughts +++ /dev/null @@ -1,31 +0,0 @@ -# TODO -# -# -# - -- don't reuse _, put a local on it, so we don't keep around trash - --- swithc X with Func - -- error with stray comma at end of line - -* multiline comments -* table slices (almost) - -* combine for and if line decorators - -* allow return anywhere in block - --- all function literals have a string that is their function definition - --- super should work here: - -thing = Thing! -thing.method = -> - super 1,2,3 - --- goes to - -thing.method = function(self) do - self.__class:method(1,2,3) -end